Changes
[emacs.git] / .emacs.d / elisp / org / org-git-link.el
index 2f5990f..ad0ce71 100644 (file)
@@ -1,10 +1,12 @@
 ;;; org-git-link.el --- Provide org links to specific file version
 
-;; Copyright (C) 2009-2013  Reimar Finken
+;; Copyright (C) 2009-2014  Reimar Finken
 
 ;; Author: Reimar Finken <reimar.finken@gmx.de>
 ;; Keywords: files, calendar, hypermedia
 
+;; This file is not part of GNU Emacs.
+
 ;; This program is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; the Free Software Foundation, either version 3 of the License, or
   (let* ((strlist (org-git-split-string str))
          (filepath (first strlist))
          (commit (second strlist))
+         (line (third strlist))
          (dirlist (org-git-find-gitdir (file-truename filepath)))
          (gitdir (first dirlist))
          (relpath (second dirlist)))
-    (org-git-open-file-internal gitdir (concat commit ":" relpath))))
+    (org-git-open-file-internal gitdir (concat commit ":" relpath))
+    (when line (goto-line (string-to-int line)))))
 
 \f
 ;; Utility functions (file names etc)
       (list (expand-file-name ".git" dir) relpath))))
 
 
-(if (featurep 'xemacs)
-    (defalias 'org-git-gitrepos-p 'org-git-find-gitdir)
-  (defalias 'org-git-gitrepos-p 'org-git-find-gitdir
-  "Return non-nil if path is in git repository"))
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (defalias 'org-git-gitrepos-p 'org-git-find-gitdir)
+    (defalias 'org-git-gitrepos-p 'org-git-find-gitdir
+      "Return non-nil if path is in git repository")))
 
 ;; splitting the link string
 
 ;; Both link open functions are called with a string of
-;; consisting of two parts separated by a double colon (::).
+;; consisting of three parts separated by a double colon (::).
 (defun org-git-split-string (str)
-  "Given a string of the form \"str1::str2\", return a list of
-  two substrings \'(\"str1\" \"str2\"). If the double colon is mising, take str2 to be the empty string."
+  "Given a string of the form \"str1::str2::str3\", return a list of
+  three substrings \'(\"str1\" \"str2\" \"str3\"). If there are less
+than two double colons, str2 and/or str3 may be set the empty string."
   (let ((strlist (split-string str "::")))
     (cond ((= 1 (length strlist))
-           (list (car strlist) ""))
+           (list (car strlist) "" ""))
           ((= 2 (length strlist))
+           (append strlist (list "")))
+          ((= 3 (length strlist))
            strlist)
-          (t (error "org-git-split-string: only one :: allowed: %s" str)))))
+          (t (error "org-git-split-string: only one or two :: allowed: %s" str)))))
 
 ;; finding the file name part of a commit
 (defun org-git-link-filename (str)
   (concat branch "@{" timestring "}"))
 
 
-(defun org-git-create-git-link (file)
+(defun org-git-create-git-link (file &optional line)
   "Create git link part to file at specific time"
   (interactive "FFile: ")
   (let* ((gitdir (first (org-git-find-gitdir (file-truename file))))
          (branchname (org-git-get-current-branch gitdir))
          (timestring (format-time-string "%Y-%m-%d" (current-time))))
-    (concat "git:" file "::" (org-git-create-searchstring branchname timestring))))
+    (concat "git:" file "::" (org-git-create-searchstring branchname timestring)
+           (if line (format "::%s" line) ""))))
 
 (defun org-git-store-link ()
   "Store git link to current file."
   (when (buffer-file-name)
-    (let ((file (abbreviate-file-name (buffer-file-name))))
+    (let ((file (abbreviate-file-name (buffer-file-name)))
+         (line (line-number-at-pos)))
       (when (org-git-gitrepos-p file)
        (org-store-link-props
         :type "git"
-        :link (org-git-create-git-link file))))))
+        :link (org-git-create-git-link file line))))))
 
 (add-hook 'org-store-link-functions 'org-git-store-link)
 
   (unless
       (zerop (call-process org-git-program nil buffer nil
                            "--no-pager" (concat "--git-dir=" gitdir) "show" object))
-    (error "git error: %s " (save-excursion (set-buffer buffer)
-                                            (buffer-string)))))
+    (error "git error: %s " (with-current-buffer buffer (buffer-string)))))
 
 (defun org-git-blob-sha (gitdir object)
   "Return sha of the referenced object"