• Emacs と Perl を使って,XML-RPC 経由で Movable Type のエントリを編集するツールを配布しています.良かったら持っていってください.( 2004/10/24 update) mapae logo
  • Movable Type で footnote*1 を生成する plugin を配布しています.良かったら持っていってください.( 2004/03/04 update )
  • その他の配布物等

*1: 脚注.よ〜するに,こ〜ゆ〜やつです.

magit もろもろ

| コメント(0) | トラックバック(0)

magit にブランチ削除が無いのは、多分ポリシか何かだとは思う *1のだが、やっぱりあった方が便利なので追加しておく。その他、個人的に使う機能とか。

相変わらずのやっつけなので、後で見直す。

;;;
;;; nym magit helper
;;;
;;; .emacs:
;;; (eval-after-load 'magit
;;;   '(progn
;;;      (global-set-key (kbd "M-g") 'magit-nym:activate)
;;;      (define-key magit-mode-map (kbd "M-b") 'magit-nym:delete-branch)
;;;      (define-key magit-mode-map (kbd "M-r") 'magit-nym:any-command)
;;;      (define-key magit-mode-map (kbd "N b") 'magit-nym:svn-edit-create-branch)
;;;      (define-key magit-mode-map (kbd "N M-b") 'magit-nym:svn-edit-delete-branch)
;;;      ))

(defun magit-nym:activate ()
  (interactive)
  (let* ((topdir (and default-directory
                       (magit-get-top-dir default-directory)))
         (buff (and topdir
                    (get-buffer
                     (concat "*magit: "
                             (file-name-nondirectory
                              (directory-file-name topdir))
                             "*")))))
    (cond (buff (switch-to-buffer buff) t)
          (topdir (magit-status topdir) t)
          (t (message "not in git directory") nil))))

(defun magit-nym:any-command (command)
  (interactive "MCommand: ")
  (get-buffer-create "*magit-process*")
  (magit-display-process)
  (magit-run-shell
   (reduce
    (lambda (a b) (concat a " " b))
    (append
     (cons magit-git-executable
           magit-git-standard-options)
     (list (replace-regexp-in-string "%" "%%" command))))))

(defun magit-nym:delete-branch (force)
  (interactive "P")
  (let ((branch (magit-read-rev
                 (concat (if force "Force ") "Delete branch"))))
    (magit-run-git "branch" (if force "-D" "-d") branch)))
  
;; svn
(defun magit-nym:svn-find-uri (branch)
  (let* ((top (magit-get-top-dir default-directory)))
    (and top
         (file-directory-p
          (concat (file-name-as-directory top) ".git/svn/"))
         (loop for l in
               (magit-git-lines
                "log -1 --first-parent --grep=%s --format=format:%s %s"
                "^git-svn-id:[[:blank:]]\\{1,\\}.*@[[:digit:]]\\{1,\\}[[:blank:]]"
                "%b" branch)
               if (string-match
                   "^git-svn-id:[[:blank:]]+\\(.*\\)@[[:digit:]]+[[:blank:]]" l)
               return (match-string 1 l)
               finally '(nil)))))

(defun magit-nym:svn-find-root-uri (&optional svn-id)
  (magit-get "svn-remote" (or svn-id "svn") "url"))

(defun magit-nym:svn-find-svn-branches (&optional svn-id)
  (loop for b in (magit-git-lines
                  "config --get-all svn-remote.%s.branches"
                  (or svn-id "svn"))
      when (string-match "/\\*:" b)
      collect (substring b 0 (match-beginning 0))))

(defun magit-nym:svn-edit-create-branch (newbranch)
  (interactive "MSVN create branch: ")
  (let* ((branches (magit-nym:svn-find-svn-branches))
         (dest (and branches
                    (if (= (length branches) 1) (car branches)
                      (completing-read "Destination: " branches)))))
    (if (not dest) (message "svn branch not found")
      (magit-log-edit-set-field 'svn-action "svn-create-branch")
      (magit-log-edit-set-field 'branch newbranch)
      (magit-log-edit-set-field 'destination dest)
      (magit-pop-to-log-edit "svn create branch"))))
  
(defun magit-nym:svn-edit-delete-branch (&optional branch)
  (interactive)
  (setq branch (or branch (magit-read-rev "SVN delete branch")))
  (let ((uri (magit-nym:svn-find-uri branch)))
    (if (not uri) (message "svn branch not found")
      (magit-log-edit-set-field 'svn-action "svn-delete-branch")
      (magit-log-edit-set-field 'uri uri)
      (magit-log-edit-set-field 'branch branch)
      (magit-pop-to-log-edit "svn delete branch"))))

(defadvice magit-log-edit-commit (around 
                                  magit-nym:log-edit-commit-svn-delete
                                  activate)
  (let* ((fields (magit-log-edit-get-fields))
         (action (cdr (assq 'svn-action fields)))
         (uri    (cdr (assq 'uri fields)))
         (branch (cdr (assq 'branch fields)))
         (destination (cdr (assq 'destination fields)))
         )
    (cond
     (action
      (unless branch
        (error "no branch specified"))
      (magit-log-edit-push-to-comment-ring (buffer-string))
      (magit-log-edit-set-fields nil)
      (magit-log-edit-cleanup)
      (cond
       ((equal action "svn-delete-branch") ; svn delete branch
        (if (string-match "^remotes/\\(.*\\)$" branch)
            (setq branch (match-string 1 branch))
          (error "remote tracking branch only!!"))
        (magit-run-with-input (current-buffer) "svn" "delete" "-F" "-" uri)
        (and (magit-run-git "branch" "-r" "-d" branch)
             (message "finished."))
        )
       ((equal action "svn-create-branch") ; svn create branch
        (and (magit-run-with-input
              (current-buffer)
              "svn" "copy" "-F" "-"
              (magit-nym:svn-find-uri "HEAD")
              (apply 'concat
                     (mapcar
                      'file-name-as-directory
                      (list (magit-nym:svn-find-root-uri)
                            destination
                            "/" branch)))))
             (magit-run-git "svn" "fetch")
             (message "finished.")
             ))
     (erase-buffer)
      (bury-buffer)
      (when magit-pre-log-edit-window-configuration
        (set-window-configuration magit-pre-log-edit-window-configuration)
        (setq magit-pre-log-edit-window-configuration nil)))
     (t ad-do-it)
     )))

(defadvice magit-get-svn-branch-name (around
                                      magit-nym:get-svn-branch-name
                                      activate)
  (let* ((uri (magit-nym:svn-find-uri "HEAD"))
         (sb (and uri (file-name-nondirectory uri)))
         (tb (and sb (find (concat "remotes/svn/" sb)
                           (magit-list-interesting-revisions)
                           :test 'equal))))
    (if tb (setq ad-return-value
                 (replace-regexp-in-string "^remotes/" "" tb))
      ad-do-it)))

*1: 実装上はたいしたこと無いと思うので

トラックバック(0)

トラックバックURL: http://d.nym.jp/mt/trackback/2075

コメントする

最近のコメント

アーカイブ

Author

nym <n...@nym.jp>
Powered by Movable Type 5.01