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: 実装上はたいしたこと無いと思うので

コメントする