[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] scratch/dired-git-info e4090fa 01/33: Initial commit
From: |
Clemens Radermacher |
Subject: |
[elpa] scratch/dired-git-info e4090fa 01/33: Initial commit |
Date: |
Sun, 17 Feb 2019 13:03:27 -0500 (EST) |
branch: scratch/dired-git-info
commit e4090fabdcc0c356a3ece9dbc21ef08148ddacbf
Author: Clemens Radermacher <address@hidden>
Commit: Clemens Radermacher <address@hidden>
Initial commit
---
README.org | 11 ++
dired-git-info.el | 335 ++++++++++++++++++++++++++++++++++++++++++++++++++
images/screenshot.png | Bin 0 -> 75006 bytes
3 files changed, 346 insertions(+)
diff --git a/README.org b/README.org
new file mode 100644
index 0000000..323c74f
--- /dev/null
+++ b/README.org
@@ -0,0 +1,11 @@
+* Description
+
+[[./images/screenshot.png]]
+
+* Config
+
+#+BEGIN_SRC elisp
+(add-to-list 'load-path "/path/to/file")
+(with-eval-after-load 'dired
+ (define-key dired-mode-map ")" 'dgi-toggle-git-info))
+#+END_SRC
diff --git a/dired-git-info.el b/dired-git-info.el
new file mode 100644
index 0000000..b226b39
--- /dev/null
+++ b/dired-git-info.el
@@ -0,0 +1,335 @@
+;;; dired-git-info.el --- Show git info in dired -*- lexical-binding: t; -*-
+;; Copyright (C) 2019 Clemens Radermacher
+
+;; Author: Clemens Radermacher <address@hidden>
+;; Package-Requires: ((emacs "25"))
+;; Version: 0.1
+;; Keywords: files
+;; URL: https://github.com/clemera/dired-git-info
+
+;; 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
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Command to show last commit message and date (info shown is configurable)
+;; of files in dired buffer of a git project.
+;;
+
+;;; Code:
+
+
+(defvar dgi-commit-ovs nil
+ "Overlays which show the commit messages.")
+
+(defface dgi-commit-message-face
+ '((t (:inherit font-lock-comment-face)))
+ "Face for commit message overlays.")
+
+(defvar dgi-commit-message-format "%s (%cr)"
+ "Format of the commit messages.
+
+The placeholders are (from git-log PRETTY FORMATS):
+
+ · %H: commit hash
+
+ · %h: abbreviated commit hash
+
+ · %T: tree hash
+
+ · %t: abbreviated tree hash
+
+ · %P: parent hashes
+
+ · %p: abbreviated parent hashes
+
+ · %an: author name
+
+ · %aN: author name (respecting .mailmap, see git-shortlog(1) or
+ git-blame(1))
+
+ · %ae: author email
+
+ · %aE: author email (respecting .mailmap, see git-shortlog(1) or
+ git-blame(1))
+
+ · %ad: author date (format respects --date= option)
+
+ · %aD: author date, RFC2822 style
+
+ · %ar: author date, relative
+
+ · %at: author date, UNIX timestamp
+
+ · %ai: author date, ISO 8601-like format
+
+ · %aI: author date, strict ISO 8601 format
+
+ · %cn: committer name
+
+ · %cN: committer name (respecting .mailmap, see git-shortlog(1) or
+ git- blame(1))
+
+ · %ce: committer email
+
+ · %cE: committer email (respecting .mailmap, see git-shortlog(1) or
+ git- blame(1))
+
+ · %cd: committer date (format respects --date= option)
+
+ · %cD: committer date, RFC2822 style
+
+ · %cr: committer date, relative
+
+ · %ct: committer date, UNIX timestamp
+
+ · %ci: committer date, ISO 8601-like format
+
+ · %cI: committer date, strict ISO 8601 format
+
+ · %d: ref names, like the --decorate option of git-log(1)
+
+ · %D: ref names without the\" (\", \")\" wrapping.
+
+ · %e: encoding
+
+ · %s: subject
+
+ · %f: sanitized subject line, suitable for a filename
+
+ · %b: body
+
+ · %B: raw body (unwrapped subject and body)
+
+ · %N: commit notes
+
+ · %GG: raw verification message from GPG for a signed commit
+
+ · %G?: show \"G\" for a good (valid) signature, \"B\" for
+ a bad signature, \"U\" for a good signature with
+ unknown validity, \"X\" for a good signature that
+ has expired, \"Y\" for a good signature made by an
+ expired key, \"R\" for a good signature made by a
+ revoked key, \"E\" if the signature cannot be
+ checked (e.g. missing key) and \"N\" for no
+ signature
+
+ · %GS: show the name of the signer for a signed commit
+
+ · %GK: show the key used to sign a signed commit
+
+ · %gD: reflog selector, e.g., refs/address@hidden or
+ refs/address@hidden minutes ago}; the format follows the
+ rules described for the -g option. The portion
+ before the @ is the refname as given on the
+ command line (so git log -g refs/heads/master
+ would yield refs/heads/address@hidden).
+
+ · %gd: shortened reflog selector; same as %gD, but the
+ refname portion is shortened for human
+ readability (so refs/heads/master becomes just
+ master).
+
+ · %gn: reflog identity name
+
+ · %gN: reflog identity name (respecting .mailmap, see
+ git-shortlog(1) or git- blame(1))
+
+ · %ge: reflog identity email
+
+ · %gE: reflog identity email (respecting .mailmap, see
+ git-shortlog(1) or git- blame(1))
+
+ · %gs: reflog subject
+
+ · %Cred: switch color to red
+
+ · %Cgreen: switch color to green
+
+ · %Cblue: switch color to blue
+
+ · %Creset: reset color
+
+ · %C(...): color specification, as described under
+ Values in the \"CONFIGURATION FILE\" section of
+ git-config(1). By default, colors are shown only
+ when enabled for log output (by color.diff,
+ color.ui, or --color, and respecting the auto
+ settings of the former if we are going to a
+ terminal). %C(auto,...) is accepted as a
+ historical synonym for the default (e.g.,
+ %C(auto,red)). Specifying %C(always,...) will show
+ the colors even when color is not otherwise
+ enabled (though consider just using
+ `--color=always to enable color for the whole
+ output, including this format and anything else
+ git might color). auto alone (i.e. %C(auto)) will
+ turn on auto coloring on the next placeholders
+ until the color is switched again.
+
+ · %m: left (<), right (>) or boundary (-) mark
+
+ · %n: newline
+
+ · %%: a raw %
+
+ · %x00: print a byte from a hex code
+
+ · %w([<w>[,<i1>[,<i2>]]]): switch line wrapping, like the -w option
of git-
+ shortlog(1).
+
+ · %<(<N>[,trunc|ltrunc|mtrunc]): make the next
+ placeholder take at least N columns, padding
+ spaces on the right if necessary. Optionally
+ truncate at the beginning (ltrunc), the
+ middle (mtrunc) or the end (trunc) if the output
+ is longer than N columns. Note that truncating
+ only works correctly with N >= 2.
+
+ · %<|(<N>): make the next placeholder take at least
+ until Nth columns, padding spaces on the right if
+ necessary
+
+ · %>(<N>), %>|(<N>): similar to %<(<N>), %<|(<N>)
+ respectively, but padding spaces on the left
+
+ · %>>(<N>), %>>|(<N>): similar to %>(<N>), %>|(<N>)
+ respectively, except that if the next placeholder
+ takes more spaces than given and there are spaces
+ on its left, use those spaces
+
+
+ · %><(<N>), %><|(<N>): similar to %<(<N>), %<|(<N>)
+ respectively, but padding both sides (i.e. the
+ text is centered)
+
+ · %(trailers[:options]): display the trailers of the
+ body as interpreted by git-interpret-trailers(1).
+ The trailers string may be followed by a colon and
+ zero or more comma-separated options. If the only
+ option is given, omit non-trailer lines from the
+ trailer block. If the unfold option is given,
+ behave as if interpret-trailer’s --unfold option
+ was given. E.g., %(trailers:only,unfold) to do
+ both.
+
+ Note Some placeholders may depend on other options
+ given to the revision traversal engine. For example,
+ the %g* reflog options will insert an empty string
+ unless we are traversing reflog entries (e.g., by git
+ log -g). The %d and %D placeholders will use
+ the \"short\" decoration format if --decorate was not
+ already provided on the command line.
+
+ If you add a + (plus sign) after % of a placeholder, a
+ line-feed is inserted immediately before the expansion if
+ and only if the placeholder expands to a non-empty string.
+
+ If you add a - (minus sign) after % of a placeholder, all
+ consecutive line-feeds immediately preceding the expansion
+ are deleted if and only if the placeholder expands to an
+ empty string.
+
+ If you add a ` ` (space) after % of a placeholder, a space
+ is inserted immediately before the expansion if and only
+ if the placeholder expands to a non-empty string.")
+
+
+(defun dgi-command-to-string (program &rest args)
+ "Execute PROGRAM with arguments ARGS and return output string."
+ (with-output-to-string
+ (with-current-buffer standard-output
+ (apply #'process-file program nil t nil args))))
+
+(defun dgi-get-commit-info (&optional file gitf)
+ "Get commit message info.
+
+FILE default to current dired file. GITF determines the commit
+info format and defaults to `dgi-commit-message-format'."
+ (when (locate-dominating-file "." ".git")
+ (let* ((file (or file (dired-get-file-for-visit)))
+ (lfile (and file
+ ;; get the actual displayed name, to make it work with
+ ;; dired collapse for example
+ (save-excursion
+ (dired-goto-file file)
+ (buffer-substring (point) (line-end-position))))))
+ (when (and lfile
+ (not (member lfile '(".." "."))))
+ (let ((msg (dgi-command-to-string
+ "git" "log" "-1"
+ (concat "--pretty="
+ (or gitf dgi-commit-message-format))
+ lfile)))
+ (when (and msg (not (string= "" msg)))
+ (substring msg
+ ;; skip newline
+ 0 -1)))))))
+
+(defmacro dgi-save-marked (&rest body)
+ "Execute BODY and restore marks afterwards."
+ `(let ((marked (save-excursion
+ (goto-char (point-min))
+ (dired-get-marked-files))))
+ (save-excursion
+ (unwind-protect
+ (progn ,@body)
+ (let ((inhibit-message t))
+ (dired-unmark-all-marks)
+ (dolist (file marked)
+ (dired-goto-file file)
+ (dired-mark 1)))))))
+
+(defun dgi-toggle-git-info ()
+ "Toggle git message info in current dired buffer."
+ (interactive)
+ (if dgi-commit-ovs
+ (dgi-cleanup)
+ (let* ((files (dgi-save-marked
+ (dired-unmark-all-marks)
+ (dired-toggle-marks)
+ (sort (dired-get-marked-files)
+ (lambda (a b)
+ (> (length (file-name-nondirectory a))
+ (length (file-name-nondirectory b)))))))
+ (minspc (1+ (length (file-name-nondirectory (car files))))))
+ (save-excursion
+ (dolist (file files)
+ (let ((msg (dgi-get-commit-info file)))
+ (when msg
+ (let ((spc (make-string
+ (- minspc (length (file-name-nondirectory file)))
+ ?\s)))
+ (dired-goto-file file)
+ (goto-char (line-end-position))
+ (let ((ov (make-overlay (point) (1+ (point))))
+ (ovs (concat spc
+ (propertize
+ msg 'face 'dgi-commit-message-face)
+ "\n")))
+ (push ov dgi-commit-ovs)
+ ;; I don't use after-string because I didn't get it to work
+ ;; in combination with hl-line-mode overlay
+ (overlay-put ov 'display ovs)
+ ;; hl line mode should have priority
+ (overlay-put ov 'priority -60))))))))))
+
+(defun dgi-cleanup ()
+ (dolist (ov dgi-commit-ovs)
+ (delete-overlay ov))
+ (setq dgi-commit-ovs nil))
+
+
+
+(provide 'dired-git-info)
+;;; dgi.el ends here
diff --git a/images/screenshot.png b/images/screenshot.png
new file mode 100644
index 0000000..8523d3e
Binary files /dev/null and b/images/screenshot.png differ
- [elpa] branch scratch/dired-git-info created (now cd60dd4), Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info fb1b475 02/33: Rename internal symbols accord. to elisp conventions, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 19d9570 04/33: Fix macro name, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 64901c7 11/33: Show error if not in a repo, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 2374729 06/33: Update config instructions, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 03c1711 19/33: Fixes according to checkdoc, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 2d57f89 12/33: Check for non existing files, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info e4090fa 01/33: Initial commit,
Clemens Radermacher <=
- [elpa] scratch/dired-git-info 23b3d1e 18/33: Improve auto hide details, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info f7b5920 26/33: Improve dgi--get-commit-messages, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 2e986ce 25/33: Allow command to run for dired derived modes, as well, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 11a6cce 05/33: Update install instructions, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 7803b82 16/33: Only mention some common options for message format docstring, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info f2117c8 28/33: Add .gitignore, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 1c4ff64 23/33: Remove redundant :group declarations, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info cd60dd4 33/33: Check visible part of file names for right formatting, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 3280075 22/33: Update descriptions, Clemens Radermacher, 2019/02/17
- [elpa] scratch/dired-git-info 069695c 10/33: Update screenshot, Clemens Radermacher, 2019/02/17