diff options
author | Magali Lemes <magalilemes00@gmail.com> | 2020-12-03 10:56:03 -0300 |
---|---|---|
committer | Ricardo Wurmus <rekado@elephly.net> | 2022-07-04 10:34:52 +0200 |
commit | fa61849b40c7e94772833316d4eff20853831893 (patch) | |
tree | 1a6290938e053dd6a65cf1eb39b6276e4936671e | |
parent | 2a4de119d0817963a2712226236b02bb986069ed (diff) | |
download | guix-fa61849b40c7e94772833316d4eff20853831893.tar.gz |
Add 'guix git log'.
* guix/scripts/git/log.scm: New file. * guix/scripts/git.scm (%sub-commands): Add "log".
-rw-r--r-- | guix/scripts/git.scm | 2 | ||||
-rw-r--r-- | guix/scripts/git/log.scm | 98 |
2 files changed, 99 insertions, 1 deletions
diff --git a/guix/scripts/git.scm b/guix/scripts/git.scm index 4436d8a6e0..8fcd0ccca8 100644 --- a/guix/scripts/git.scm +++ b/guix/scripts/git.scm @@ -38,7 +38,7 @@ Operate on Git repositories.\n")) (newline) (show-bug-report-information)) -(define %sub-commands '("authenticate")) +(define %sub-commands '("authenticate" "log")) (define (resolve-sub-command name) (let ((module (resolve-interface diff --git a/guix/scripts/git/log.scm b/guix/scripts/git/log.scm new file mode 100644 index 0000000000..63f1913e78 --- /dev/null +++ b/guix/scripts/git/log.scm @@ -0,0 +1,98 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020 Magali Lemes <magalilemes00@gmail.com> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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. +;;; +;;; GNU Guix 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 GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix scripts git log) + #:use-module (git) + #:use-module ((guix channels) + #:select (%default-guix-channel + channel-url)) + #:use-module ((guix git) #:select (url-cache-directory)) + #:use-module (guix scripts) + #:use-module (guix ui) + #:use-module (ice-9 format) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (srfi srfi-37) + #:export (guix-git-log)) + + +(define %options + (list (option '(#\h "help") #f #f + (lambda args + (show-help) + (exit 0))) + + (option '("checkout-path") #f #f + (lambda (opt name arg result) + (alist-cons 'checkout-path? #t result))) + (option '("oneline") #f #f + (lambda (opt name arg result) + (alist-cons 'oneline? #t result))))) + +(define %default-options + '()) + +(define (show-help) + (display (G_ "Usage: guix git log [OPTIONS...] +Show Guix commit logs.\n")) + (display (G_ " + --checkout-path show checkout path")) + (display (G_ " + --oneline show short hash and summary of five first commits")) + (display (G_ " + -h, --help display this help and exit")) + (newline) + (show-bug-report-information)) + +(define (show-checkout-path) + (display (url-cache-directory (channel-url %default-guix-channel))) + (newline)) + +(define commit-short-id + (compose (cut string-take <> 7) oid->string commit-id)) + +(define (show-commit commit) + (format #t (G_ "~a ~a~%") (commit-short-id commit) (commit-summary commit))) + +;; currently showing 5 latest commits +(define (get-commits path) + (let* ((repository (repository-open path)) + (latest-commit (commit-lookup repository (reference-target (repository-head repository))))) + (for-each show-commit (take + (let loop ((commit latest-commit) + (res (list latest-commit))) + (match (commit-parents commit) + (() (reverse res)) + ((head . tail) + (loop head (cons head res))))) + 5)))) + +(define (guix-git-log . args) + (define options + (parse-command-line args %options (list %default-options))) + + (let ((checkout-path? (assoc-ref options 'checkout-path?)) + (oneline? (assoc-ref options 'oneline?))) + (with-error-handling + (cond + (checkout-path? + (show-checkout-path)) + (oneline? + (let ((cache (url-cache-directory (channel-url %default-guix-channel)))) + (get-commits cache))))))) |