diff mbox

scripts: hash: Add --exclude-.git option.

Message ID 87bn01y1pk.fsf@gnu.org
State New
Headers show

Commit Message

Jan Nieuwenhuizen Sept. 6, 2016, 6:36 a.m. UTC
Ludovic Courtès writes:

Hi!

>> Added an -g/--exclude-.git option for guix hash.  It is very specific:
>> it skips toplevel .git directory.  WDYT?
>
> Good idea!

Thanks...

> What about --exclude-vcs/-x?  Tar uses that name, although with slightly
> different semantics (info "(tar) exclude").

Yes, I like this even better than my 2nd --exclude=FILE patch.

> Rather make the lambda a top-level procedure, like:
>
>   (define (vcs-file? file stat)
>     (case (stat:type stat)
>       ((directory)
>        (member (basename file) '(".git" ".svn" "CVS" …)))
>       (else
>        #f)))

Nice!

> Could you send an updated patch?

Sure, attached.

> Thank you for making our lives easier!  :-)

:-)  Exactly, the mv .git ../dot-git ... drill was getting boring.

Greetings,
Jan

Comments

Ludovic Courtès Sept. 6, 2016, 12:26 p.m. UTC | #1
Jan Nieuwenhuizen <janneke@gnu.org> skribis:

>> What about --exclude-vcs/-x?  Tar uses that name, although with slightly
>> different semantics (info "(tar) exclude").
>
> Yes, I like this even better than my 2nd --exclude=FILE patch.

I prefer --exclude-vcs too because that’s the main use case, so it’s
best to have a shortcut.

> From 060f9123acd4c6771e976c5442361285f8c8bc89 Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Tue, 6 Sep 2016 08:28:33 +0200
> Subject: [PATCH] scripts: hash: Add --exclude-vcs option.
>
> * guix/scripts/hash.scm (show-help): Add help text for --exclude-vcs option.
> (%options): Add --exclude-vcs option.
> (guix-hash): Handle exclude-vcs option.
> * doc/guix.texi ("Invoking guix hash"): Update doc.
> * tests/guix-hash.sh: Add test.

OK for me!  If there are no objections, I’ll commit this one.

Ludo’.
Ludovic Courtès Sept. 7, 2016, 10:02 a.m. UTC | #2
Jan Nieuwenhuizen <janneke@gnu.org> skribis:

> From 060f9123acd4c6771e976c5442361285f8c8bc89 Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Tue, 6 Sep 2016 08:28:33 +0200
> Subject: [PATCH] scripts: hash: Add --exclude-vcs option.
>
> * guix/scripts/hash.scm (show-help): Add help text for --exclude-vcs option.
> (%options): Add --exclude-vcs option.
> (guix-hash): Handle exclude-vcs option.
> * doc/guix.texi ("Invoking guix hash"): Update doc.
> * tests/guix-hash.sh: Add test.

Pushed as 392a4e122350367c4b4ac331db5ec28360c7f38c with minor edits to
guix.texi, thanks!

Ludo’.
diff mbox

Patch

From 060f9123acd4c6771e976c5442361285f8c8bc89 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 6 Sep 2016 08:28:33 +0200
Subject: [PATCH] scripts: hash: Add --exclude-vcs option.

* guix/scripts/hash.scm (show-help): Add help text for --exclude-vcs option.
(%options): Add --exclude-vcs option.
(guix-hash): Handle exclude-vcs option.
* doc/guix.texi ("Invoking guix hash"): Update doc.
* tests/guix-hash.sh: Add test.
---
 doc/guix.texi         | 15 ++++++++++++++-
 guix/scripts/hash.scm | 25 ++++++++++++++++++++-----
 tests/guix-hash.sh    | 16 ++++++++++++++++
 3 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 5330238..68a0707 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -4616,10 +4616,18 @@  The general syntax is:
 guix hash @var{option} @var{file}
 @end example
 
-@command{guix hash} has the following option:
+@command{guix hash} has the following options:
 
 @table @code
 
+@item --exclude-vcs
+@itemx -x
+Exclude version control system-directories (.bzr, .git, .hg, .svn, CVS)
+when computing a recursive hash, e.g.:
+@example
+$ guix hash -r -x .
+@end example
+
 @item --format=@var{fmt}
 @itemx -f @var{fmt}
 Write the hash in the format specified by @var{fmt}.
@@ -4655,6 +4663,11 @@  $ cd foo
 $ rm -rf .git
 $ guix hash -r .
 @end example
+@noindent
+or simply use the -x (--exclude-vcs) option
+@example
+$ guix hash -r -x .
+@end example
 @end table
 
 @node Invoking guix import
diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm
index d440953..a57602a 100644
--- a/guix/scripts/hash.scm
+++ b/guix/scripts/hash.scm
@@ -1,6 +1,7 @@ 
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -49,6 +50,8 @@  Return the cryptographic hash of FILE.
 Supported formats: 'nix-base32' (default), 'base32', and 'base16' ('hex'
 and 'hexadecimal' can be used as well).\n"))
   (format #t (_ "
+  -x, --exclude-vcs      exclude version control directories"))
+  (format #t (_ "
   -f, --format=FMT       write the hash in the given format"))
   (format #t (_ "
   -r, --recursive        compute the hash on FILE recursively"))
@@ -62,7 +65,10 @@  and 'hexadecimal' can be used as well).\n"))
 
 (define %options
   ;; Specification of the command-line options.
-  (list (option '(#\f "format") #t #f
+  (list (option '(#\x "exclude-vcs") #f #f
+                (lambda (opt name arg result)
+                  (alist-cons 'exclude-vcs? #t result)))
+        (option '(#\f "format") #t #f
                 (lambda (opt name arg result)
                   (define fmt-proc
                     (match arg
@@ -81,7 +87,6 @@  and 'hexadecimal' can be used as well).\n"))
         (option '(#\r "recursive") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'recursive? #t result)))
-
         (option '(#\h "help") #f #f
                 (lambda args
                   (show-help)
@@ -107,13 +112,23 @@  and 'hexadecimal' can be used as well).\n"))
                   (alist-cons 'argument arg result))
                 %default-options))
 
+  (define (vcs-file? file stat)
+    (case (stat:type stat)
+      ((directory)
+       (member (basename file) '(".bzr" ".git" ".hg" ".svn" "CVS")))
+      (else
+       #f)))
+
   (let* ((opts (parse-options))
          (args (filter-map (match-lambda
                             (('argument . value)
                              value)
                             (_ #f))
                            (reverse opts)))
-         (fmt  (assq-ref opts 'format)))
+         (fmt  (assq-ref opts 'format))
+         (select? (if (assq-ref opts 'exclude-vcs?)
+                      (negate vcs-file?)
+                      (const #t))))
 
     (define (file-hash file)
       ;; Compute the hash of FILE.
@@ -121,7 +136,7 @@  and 'hexadecimal' can be used as well).\n"))
       (with-error-handling
         (if (assoc-ref opts 'recursive?)
             (let-values (((port get-hash) (open-sha256-port)))
-              (write-file file port)
+              (write-file file port #:select? select?)
               (flush-output-port port)
               (get-hash))
             (call-with-input-file file port-sha256))))
diff --git a/tests/guix-hash.sh b/tests/guix-hash.sh
index 23df01d..44213d5 100644
--- a/tests/guix-hash.sh
+++ b/tests/guix-hash.sh
@@ -1,5 +1,6 @@ 
 # GNU Guix --- Functional package management for GNU
 # Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 #
 # This file is part of GNU Guix.
 #
@@ -46,3 +47,18 @@  then false; else true; fi
 # the archive format doesn't support.
 if guix hash -r /dev/null
 then false; else true; fi
+
+# Adding a .git directory
+mkdir "$tmpdir/.git"
+touch "$tmpdir/.git/foo"
+
+# ...changes the hash
+test `guix hash -r $tmpdir` = 0a50z04zyzf7pidwxv0nwbj82pgzbrhdy9562kncnvkcfvb48m59
+
+# ...but remains the same when using `-x'
+test `guix hash -r $tmpdir -x` = 10k1lw41wyrjf9mxydi0is5nkpynlsvgslinics4ppir13g7d74p
+
+# Without '-r', this should fail.
+if guix hash "$tmpdir"
+then false; else true; fi
+
-- 
2.9.3