diff --git a/src/Makefile b/src/Makefile index 9aa85ab..76ed725 100644 --- a/src/Makefile +++ b/src/Makefile @@ -356,7 +356,8 @@ SPECIFICATION-SOURCES=specification.scm period.import.scm specification.o: specification.import.scm specification.import.scm: $(SPECIFICATION-SOURCES) -UTIL-GIT-SOURCES=util-git.scm util-io.import.scm +UTIL-GIT-SOURCES=util-git.scm util-io.import.scm \ + util-dict-list.import.scm util-git.o: util-git.import.scm util-git.import.scm: $(UTIL-GIT-SOURCES) diff --git a/src/util-git.scm b/src/util-git.scm index dfcf35c..7fc096b 100644 --- a/src/util-git.scm +++ b/src/util-git.scm @@ -33,7 +33,8 @@ (import scheme (chicken base) - util-io) + util-io + util-dict-list) ;; Valid git operating modes (define git-modes @@ -71,13 +72,26 @@ (lambda args (invoke-git repo args)))))) + ;; Known status types + (define git-status-types + '((" M" 'modified) + ("??" 'untracked))) + ;; 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 - (loop (cdr 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 '())))))))) )