contrib/emacs/vc-git.el: support vc-version-other-window
authorSam Vilain <sam@vilain.net>
Thu, 25 Jan 2007 23:41:23 +0000 (12:41 +1300)
committerJunio C Hamano <junkio@cox.net>
Fri, 26 Jan 2007 03:27:03 +0000 (19:27 -0800)
Currently, the vc-git-checkout function uses `git checkout' to fetch a
file from the git repository to the working copy.  However, it is
completely ignoring the input argument that specifies the destination
file.  `git-checkout' does not support specifying this, so we have to
use `git-cat-file', capture the output in a buffer and then save it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
contrib/emacs/vc-git.el

index 3eb4bd19e921f293f1ed1ab1fd1bcd9f78763c4c..65c455006978932cee3f6f3a4d7d014ff18a6489 100644 (file)
   (let ((name (file-relative-name file)))
     (eq 0 (apply #'call-process "git" nil (get-buffer "*Messages") nil (append args (list name))))))
 
+(defun vc-git--run-command-out (output &rest args)
+  "Run a git command, output to output."
+  (eq 0 (apply #'call-process "git" nil output nil (append args))))
+
 (defun vc-git-registered (file)
   "Check whether FILE is registered with git."
   (with-temp-buffer
     (vc-git--run-command file "commit" "-m" comment "--only" "--")))
 
 (defun vc-git-checkout (file &optional editable rev destfile)
-  (vc-git--run-command file "checkout" (or rev "HEAD")))
+  (if destfile
+      (let ((mybuff (get-buffer-create "vc-git-checkout-tmp")))
+       (let ((rv
+              (vc-git--run-command-out
+               mybuff "cat-file" "blob"
+               (concat (or rev "HEAD")
+                       ":"
+                       (let ((output (vc-git--run-command-string
+                                      (file-relative-name file)
+                                      "ls-files" "--full-name")))
+                         (string-match "\\(.*\\)" output)
+                         (match-string 1 output))
+                       )))
+             )
+         (if rv
+             (save-current-buffer
+               (set-buffer mybuff)
+               (set-visited-file-name destfile t)
+               (save-buffer)
+               )
+           rv)))
+    (vc-git--run-command file "checkout" (or rev "HEAD"))))
 
 (defun vc-git-annotate-command (file buf &optional rev)
   ; FIXME: rev is ignored