Skip to content

Commit

Permalink
playing around with parsing git commit info lines
Browse files Browse the repository at this point in the history
(for something like blame mode)
  • Loading branch information
rakete committed Aug 18, 2012
1 parent 109e638 commit 2f1d796
Showing 1 changed file with 62 additions and 36 deletions.
98 changes: 62 additions & 36 deletions git-overlay.el
Expand Up @@ -125,40 +125,66 @@
(point)))) 'face '((:background "#4f354f")))
(setq hunk-line (+ hunk-line 1)))))))))))))





(setq git-parsed-commits (make-hash-table :test 'equal))

(defun git-get-line-commit-info ()
(with-temp-buffer
(let ((saved-directory default-directory))
(cd "/home/lazor/org")
(= (apply 'call-process "git" nil (current-buffer) nil (list "blame" "--porcelain" "--" "projects.org")) 0)
(goto-char (point-min))
(when (re-search-forward "org-mode Integration" nil t)
(when (re-search-backward "^\\([0-9a-f]\\{40\\}\\) \\([0-9]+\\) \\([0-9]+\\) \\([0-9]+\\)$" nil t)
(let ((p (point-at-bol))
(s (match-string-no-properties 1))
(beg nil)
(end nil))
(while (and s (re-search-backward s nil t))
(setq p (point-at-bol)))
(end-of-line)
(setq beg p)
(setq end (if (re-search-forward "^\\([0-9a-f]\\{40\\}\\) \\([0-9]+\\) \\([0-9]+\\) \\([0-9]+\\)$" nil t)
(point-at-bol)
(point-max)))
(print (parse-commit-info (buffer-substring-no-properties beg end)))
)))
(cd saved-directory))))

(defun parse-commit-info (str)
(let ((r '()))
(dolist (line (split-string str "\n" t) r)
(cond ((string-match "author \\(.*\\)" line)
(add-to-list 'r `("author" . ,(match-string 1 line))))
((string-match "author-mail \\(.*\\)" line)
(add-to-list 'r `("author-mail" . ,(match-string 1 line))))
((string-match "commiter \\(.*\\)" line)
(add-to-list 'r `("commiter" . ,(match-string 1 line))))
((string-match "commiter-mail \\(.*\\)" line)
(add-to-list 'r `("commiter-mail" . ,(match-string 1 line))))
))))

(provide 'git-overlay)
(interactive)
(save-excursion
(save-window-excursion
(let ((line (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
(buf (current-buffer))
(line-number (line-number-at-pos (point))))
(with-temp-buffer
(when (buffer-file-name buf)
(= (apply 'call-process "git" nil (current-buffer) nil (list "blame" "--porcelain" "--" (buffer-file-name buf))) 0)
(goto-char (point-min))
(while (re-search-forward "^\\([0-9a-f]\\{40\\}\\) \\([0-9]+\\) \\([0-9]+\\)\\(?: \\([0-9]+\\)\\)?$" nil t)
(let ((commit-line-number (read (match-string 3)))
(commit-number-of-lines (read (or (match-string 4) "nil")))
(commit-revision (match-string 1)))
(when commit-number-of-lines
(parse-commit-info commit-revision))
(when (eq line-number commit-line-number)
(print (gethash commit-revision git-parsed-commits))))
)))))))

(defun parse-commit-info (revision &optional commit-alist)
(setq commit-alist (gethash revision git-parsed-commits nil))
(unless commit-alist
(add-to-list 'commit-alist `(revision . ,revision))
(while (and (not (looking-at "^\\([0-9a-f]\\{40\\}\\) \\([0-9]+\\) \\([0-9]+\\)\\(?: \\([0-9]+\\)\\)?$"))
(not (eobp)))
(cond ((looking-at "author \\(.*\\)$")
(add-to-list 'commit-alist `(author . ,(match-string 1))))
((looking-at "author-mail \\(.*\\)$")
(add-to-list 'commit-alist `(author-mail . ,(match-string 1))))
((looking-at "author-time \\(.*\\)$")
(add-to-list 'commit-alist `(author-time . ,(match-string 1))))
((looking-at "author-tz \\(.*\\)$")
(add-to-list 'commit-alist `(author-tz . ,(match-string 1))))
((looking-at "commiter \\(.*\\)$")
(add-to-list 'commit-alist `(commiter . ,(match-string 1))))
((looking-at "commiter-mail \\(.*\\)$")
(add-to-list 'commit-alist `(commiter-mail . ,(match-string 1))))
((looking-at "commiter-time \\(.*\\)$")
(add-to-list 'commit-alist `(commiter-time . ,(match-string 1))))
((looking-at "commiter-tz \\(.*\\)$")
(add-to-list 'commit-alist `(commiter-tz . ,(match-string 1))))
((looking-at "summary \\(.*\\)$")
(add-to-list 'commit-alist `(summary . ,(match-string 1))))
((looking-at "previous \\(.*\\)$")
(add-to-list 'commit-alist `(previous . ,(match-string 1))))
((looking-at "filename \\(.*\\)$")
(add-to-list 'commit-alist `(filename . ,(match-string 1))))
)
(next-line)
(goto-char (point-at-bol)))
(puthash revision commit-alist git-parsed-commits))
commit-alist)

(provide 'git-overlay)

0 comments on commit 2f1d796

Please sign in to comment.