>>10
(defvar cygwin-umask
 (string-to-int
  (shell-command-to-string "printf %d 0`umask`"))
 "cygwin 上で設定された umask の値")

(defun cygwin-correct-file-mode ()
 "シェルスクリプトならばファイルモードを 777、それ以外ならば 666 に設定する。その際、シェルの umask を参照するので、実際は 755 や 644 などになると思われる。"
 (interactive)
 (save-restriction
  (widen)
  (let* ((shell-script-p
      (string= "#!" (buffer-substring 1 (min 3 (point-max)))))
      (mode-777 511)
      (mode-666 438)
      (mode (logand (if shell-script-p mode-777 mode-666)
             (lognot cygwin-umask)))
      (command (format "chmod %03o %s" mode (buffer-file-name))))
   (shell-command-to-string command)
   (message command))))

(add-hook 'after-save-hook 'cygwin-correct-file-mode)

ちょっと作ってみた。セーブがちと遅くなっていやんだが…
あと、emacs-lisp で string -> octal の素早い変換の仕方ってなんかないのかな。