M-x git-change-branch checkout branch, and ask for confirmation
if a new one is to be created
One could also use a new submenu in the Git menu for this.
---
Karl Hasselström [off-list ref] writes:
On 2008-02-13 17:30:02 +0100, Karl Hasselström wrote:
quoted
Why the prefix? Wouldn't it be easier to just have one "switch
branch" prompt that would tab complete existing branch names, and
I didn't think of the other way, that seem simpler. Here is a
corrected patch
* if the user enters a name that's not the name of an existing
branch, display a prompt like this
Creating new branch "foo". Where should it start?
Tab complete on existing tags and branches, but accept any
committish. Create the new branch and switch to it.
Mmm seem cool, but I have no time for now. Patch are welcome,
otherwise I might look at it this weekend or next week.
Also one might want to do detached head checkout, it wont work for
now, but should not be very hard to do.
--
Rémi Vanicat
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..bf0601d 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
+
+if new is non-nil, creating it if needed
+otherwise just checkout it"
+ (interactive
+ (let ((branch (completing-read "Branch: " (git-list-branch))))
+ (list branch
+ (and (not (assoc branch (git-list-branch)))
+ (or (y-or-n-p "create a new branch? ")
+ (error "branch does not exist"))))))
+ (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