diff --git a/src/hackerbase.scm b/src/hackerbase.scm index b0395e6..4624a40 100644 --- a/src/hackerbase.scm +++ b/src/hackerbase.scm @@ -41,7 +41,9 @@ util-mail logging progress - period) + period + util-git + util-dict-list) ;; Command-line options and configurable parameters (define -needs-bank- (make-parameter #f)) @@ -162,6 +164,8 @@ (-notify-months- 3) (-needs-bank- #t) (-action- 'notify)) + (-status () "Show members directory status" + (-action- 'status)) ) ;; Print banner @@ -342,6 +346,17 @@ (make+send-reminder-email (car lst)) (make+print-reminder-email (car lst))) (loop (cdr lst)))))))) + ((status) + (let ((status (git-status (*members-directory*)))) + (newline) + (print "Repository " (*members-directory*) " status:") + (if (ldict-ref status 'clean) + (print " Repository up-to-date.") + (let loop ((keys '(unknown untracked modified))) + (when (not (null? keys)) + (when (ldict-contains? status (car keys)) + (print " " (car keys) ": " (length (ldict-ref status (car keys))))) + (loop (cdr keys))))))) (else (print "Nothing to do.")) diff --git a/src/util-git.scm b/src/util-git.scm index 7fc096b..795193a 100644 --- a/src/util-git.scm +++ b/src/util-git.scm @@ -29,6 +29,7 @@ util-git ( git + git-status ) (import scheme @@ -79,19 +80,21 @@ ;; Returns a dictionary of unknown, modified, deleted and added files (define (git-status repo) - (let loop ((lines ((git repo) 'status '--porcelain)) - (res (make-ldict))) - (if (null? lines) - res - (let* ((line (car lines)) - (st (substring line 0 2)) - (fname (substring line 4)) - (status (or (assoc st git-status-types) - 'unknown))) - (loop (cdr lines) - (ldict-set res - status - (cons fname - (ldict-ref res status '())))))))) + (let* ((lines ((git repo) 'status '--porcelain)) + (clean? (null? lines))) + (let loop ((lines lines) + (res (make-ldict `((clean . ,clean?))))) + (if (null? lines) + res + (let* ((line (car lines)) + (st (substring line 0 2)) + (fname (substring line 4)) + (status (or (assoc st git-status-types) + 'unknown))) + (loop (cdr lines) + (ldict-set res + status + (cons fname + (ldict-ref res status '()))))))))) )