# guix skempo -rw-r--r-- 2.3 KiB View raw
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
(declare-function log-edit-show-diff "log-edit" ())

(defun av-skempo--guix-package-name ()
  ""
  (unless (get-buffer "*vc-diff*")
    (save-excursion (log-edit-show-diff)))
  (with-current-buffer "*vc-diff*"
    (goto-char (point-min))
    (when (re-search-forward "\n[ +](define-public \\(\\S-+\\)" nil 'noerror)
      (match-string-no-properties 1))))

(defun av-skempo--guix-package-version ()
  ""
  (unless (get-buffer "*vc-diff*")
    (save-excursion (log-edit-show-diff)))
  (with-current-buffer "*vc-diff*"
    (goto-char (point-min))
    (search-forward "\n (define-public" nil 'noerror)
    ;; (search-forward "+" nil 'noerror)
    (cl-flet ((string-after (str)
                (save-excursion
                  (when (and (re-search-forward
                              (concat "^\\+?[[:space:]]*\\(?:(let \\)*(?(" str) nil 'noerror)
                             (looking-at-p "\""))
                    (let ((end (save-excursion (search-forward "\")" nil 'noerror))))
                      (when end
                        (forward-char)
                        (buffer-substring-no-properties (point) (- end 2))))))))
      (let ((commit (if-let ((raw (string-after "commit ")))
                        (substring raw 0 8)))
            (revision (string-after "revision "))
            (version (string-after "version ")))
        (if (and commit revision)
            (concat version "-" revision "-" commit)
          version)))))

(defun av-skempo--git-edited-file-names ()
  ""
  (split-string
   (shell-command-to-string "git diff-index --name-only HEAD") "\n" t))

(skempo-define-skeleton guixnew (:tag t :abbrev t :mode log-edit-mode)
  (skeleton-read "Namespace: " "rrr")
  '(setq PACKAGE-NAME (av-skempo--guix-package-name))
  '(setq GUIX-PACKAGE-FILE (av-skempo--git-edited-file-names))
  str ": Add " PACKAGE-NAME "." > "\n\n"
  "* " (car GUIX-PACKAGE-FILE) " (" PACKAGE-NAME "): New variable." > "\n")

(skempo-define-skeleton guixup (:tag t :abbrev t :mode log-edit-mode)
  (skeleton-read "Namespace: " "rrr")
  '(setq PACKAGE-NAME (av-skempo--guix-package-name))
  '(setq GUIX-EDITED-FILES (av-skempo--git-edited-file-names))
  '(setq PACKAGE-VERSION (av-skempo--guix-package-version))
  str ": " PACKAGE-NAME ": Update to " PACKAGE-VERSION "."> "\n\n"
  "* " (car GUIX-EDITED-FILES) " (" PACKAGE-NAME "): Update to " PACKAGE-VERSION "." > "\n")