[PATCH] Add function to checkout a branch in git.el
One can now:
- checkout an existing branch with M-x git-change-branch
- create and checkout a new branch with C-u M-x git-change-branch
- do all this from the Git menu
---
It could also be interesting to add some key biding for those
Also one might want to update the *git-status* buffer after checkout,
but this is not done by this patch
contrib/emacs/git.el | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el
index a8bf0ef..404c8e6 100644
--- a/contrib/emacs/git.el
+++ b/contrib/emacs/git.el
@@ -1138,6 +1138,50 @@ Return the list of files that haven't been handled."
(when (eq (window-buffer) (current-buffer))
(shrink-window-if-larger-than-buffer)))
+(defun git-list-branch ()
+ "Return a list of available branch"
+ ;; should I check if I'm in a git repository ?
+ (let ((branchs ()))
+ (with-temp-buffer
+ (git-run-command-buffer (current-buffer) "branch")
+ (goto-char (point-min))
+ (while (re-search-forward "^\\([ *]\\) \\([^\n]*\\)$" () t)
+ (push (list (match-string 2)
+ (string= (match-string 1) "*"))
+ branchs)))
+ (nreverse branchs)))
+
+(defun git-change-branch (branch &optional new)
+ "Switch to another branch
+
+With a prefix argument, switch to a new branch, ortherwise use
+an existing one"
+ (interactive
+ (if current-prefix-arg
+ (list (read-from-minibuffer "Branch: ")
+ current-prefix-arg)
+ (list (completing-read "Branch: " (git-list-branch) () t)
+ current-prefix-arg)))
+ (with-temp-buffer
+ (if new
+ (git-call-process-display-error "checkout" "-b" branch)
+ (git-call-process-display-error "checkout" branch))
+ (goto-char (point-min))))
+
+(defun git-change-new-branch-menu (branch)
+ "Switch to new branch"
+ (interactive "MBranch: ")
+ (git-change-branch branch 't))
+
+(defun git-change-branch-menu-filter (rest)
+ "define the change branch menu"
+ (append
+ (mapcar
+ (lambda (branch)
+ `[,(car branch) (git-change-branch ,(car branch)) t])
+ (git-list-branch))
+ (list ["change to new" git-change-new-branch-menu t])))
+
(defun git-diff-file ()
"Diff the marked file(s) against HEAD."
(interactive)
@@ -1486,6 +1530,7 @@ amended version of it."
["Diff Against Merge Head" git-diff-file-merge-head t]
["Diff Against Mine" git-diff-file-mine t]
["Diff Against Other" git-diff-file-other t])
+ ("Change branch" :filter git-change-branch-menu-filter)
"--------"
["Add File" git-add-file t]
["Revert File" git-revert-file t]
--
1.5.4.1.101.gacba