commit 0a3316a6bbe71808e10cf1f5140690a111ba66c1 from: Omar Polo date: Mon Feb 22 10:37:25 2021 UTC implement log-view-mode commit - 887e069968be5495bd7a5190270e1d718dbeff0f commit + 0a3316a6bbe71808e10cf1f5140690a111ba66c1 blob - 93ea4b2aac3fdbc5fd5f7fdd5e178e839191a49b blob + aaecfe60defa7b8542eb4df286636a16b71c439a --- vc-got.el +++ vc-got.el @@ -73,7 +73,7 @@ ;; * log-outgoing DONE ;; * log-incoming DONE ;; - log-search DONE -;; - log-view-mode NOT IMPLEMENTED +;; - log-view-mode DONE ;; - show-log-entry NOT IMPLEMENTED ;; - comment-history NOT IMPLEMENTED ;; - update-changelog NOT IMPLEMENTED @@ -203,14 +203,18 @@ Return nil if the command failed or if PATH isn't incl worktree." (let (process-file-side-effects) (vc-got-with-worktree (or path default-directory) - (zerop - (vc-got--call "log" - (when limit (list "-l" (format "%s" limit))) - (when start-commit (list "-c" start-commit)) - (when stop-commit (list "-x" stop-commit)) - (when search-pattern (list "-s" search-pattern)) - (when reverse '("-R")) - path))))) + (when (zerop + (save-excursion + (vc-got--call "log" + (when limit (list "-l" (format "%s" limit))) + (when start-commit (list "-c" start-commit)) + (when stop-commit (list "-x" stop-commit)) + (when search-pattern (list "-s" search-pattern)) + (when reverse '("-R")) + path))) + (save-excursion + (delete-matching-lines "^-----------------------------------------------$") + t))))) (defun vc-got--status (status-codes dir-or-file &optional files) "Return a list of lists '(FILE STATUS STAGE-STATUS). @@ -651,6 +655,29 @@ START-REVISION." (let ((inhibit-read-only t)) (vc-got--log nil nil nil nil pattern)))) +(define-derived-mode vc-got-log-view-mode log-view-mode "Got-Log-View" + "Got-specific log-view mode. +Heavily inspired by `vc-git-log-view-mode'." + (require 'add-log) + (setq-local + log-view-file-re regexp-unmatchable + log-view-per-file-logs nil + log-view-message-re "^commit +\\([0-9a-z]+\\)" + + log-view-font-lock-keywords + (append + `((,log-view-message-re (1 'change-log-acknowledgment))) + ;; Handle the case: + ;; user: foo@bar + '(("^from: \\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)" + (1 'change-log-email)) + ;; Handle the case: + ;; user: FirstName LastName + ("^from: \\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]" + (1 'change-log-name) + (2 'change-log-email)) + ("^date: \\(.+\\)" (1 'change-log-date)))))) + ;; TODO: async ;; TODO: return 0 or 1 (defun vc-got-diff (files &optional rev1 rev2 buffer _async)