chiark / gitweb /
dgit: git_get_config: Use confess, not croak
[dgit.git] / dgit
diff --git a/dgit b/dgit
index db8d1f72bbbc8ed4aedab90868cc03d21970d6bc..4f85e5c1d9aed3d4c4c0a3d531d44a56cd644e6a 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -144,6 +144,7 @@ our %opts_cfg_insertpos = map {
 
 sub parseopts_late_defaults();
 sub setup_gitattrs(;$);
+sub check_gitattrs($$);
 
 our $keyid;
 
@@ -668,7 +669,7 @@ sub git_get_config ($) {
     my ($c) = @_;
     foreach my $src (@gitcfgsources) {
        my $l = $gitcfgs{$src}{$c};
-       croak "$l $c" if $l && !ref $l;
+       confess "internal error ($l $c)" if $l && !ref $l;
        printdebug"C $c ".(defined $l ?
                           join " ", map { messagequote "'$_'" } @$l :
                           "undef")."\n"
@@ -1698,7 +1699,7 @@ sub mktree_in_ud_here () {
     runcmd qw(git config gc.auto 0);
     rmtree('.git/objects');
     symlink '../../../../objects','.git/objects' or die $!;
-    setup_gitattrs();
+    setup_gitattrs(1);
 }
 
 sub git_write_tree () {
@@ -3256,6 +3257,8 @@ END
 
     lrfetchref_used lrfetchref();
 
+    check_gitattrs($hash, "fetched source tree");
+
     unshift @end, $del_lrfetchrefs;
     return $hash;
 }
@@ -3350,7 +3353,7 @@ END
     print GAO <<END or die $!;
 *      dgit-defuse-attrs
 [attr]dgit-defuse-attrs        -text -eol -crlf -ident -filter
-# ^ see dgit(7).  To undo, leave a definition of [attr]dgit-defuse-attrs
+# ^ see GITATTRIBUTES in dgit(7) and dgit setup-new-tree in dgit(1)
 END
     my $gai = open_gitattrs();
     if ($gai) {
@@ -3370,6 +3373,35 @@ sub setup_new_tree () {
     setup_gitattrs();
 }
 
+sub check_gitattrs ($$) {
+    my ($treeish, $what) = @_;
+
+    return if is_gitattrs_setup;
+
+    local $/="\0";
+    my @cmd = (@git, qw(ls-tree -lrz --), "${treeish}:");
+    debugcmd "|",@cmd;
+    my $gafl = new IO::File;
+    open $gafl, "-|", @cmd or die $!;
+    while (<$gafl>) {
+       chomp or die;
+       s/^\d+\s+\w+\s+\w+\s+(\d+)\t// or die;
+       next if $1 == 0;
+       next unless m{(?:^|/)\.gitattributes$};
+
+       # oh dear, found one
+       print STDERR <<END;
+dgit: warning: $what contains .gitattributes
+dgit: .gitattributes have not been defused.  Recommended: dgit setup-new-tree.
+END
+       close $gafl;
+       return;
+    }
+    # tree contains no .gitattributes files
+    $?=0; $!=0; close $gafl or failedcmd @cmd;
+}
+
+
 sub multisuite_suite_child ($$$) {
     my ($tsuite, $merginputs, $fn) = @_;
     # in child, sets things up, calls $fn->(), and returns undef
@@ -3569,6 +3601,7 @@ sub clone ($) {
     mkdir $dstdir or fail "create \`$dstdir': $!";
     changedir $dstdir;
     runcmd @git, qw(init -q);
+    setup_new_tree();
     clone_set_head();
     my $giturl = access_giturl(1);
     if (defined $giturl) {
@@ -3587,7 +3620,6 @@ sub clone ($) {
        $vcsgiturl =~ s/\s+-b\s+\S+//g;
        runcmd @git, qw(remote add vcs-git), $vcsgiturl;
     }
-    setup_new_tree();
     clone_finish($dstdir);
 }
 
@@ -6103,6 +6135,8 @@ sub import_dsc_result {
     my ($dstref, $newhash, $what_log, $what_msg) = @_;
     my @cmd = (@git, qw(update-ref -m), $what_log, $dstref, $newhash);
     runcmd @cmd;
+    check_gitattrs($newhash, "source tree");
+
     progress "dgit: import-dsc: $what_msg";
 }
 
@@ -6307,6 +6341,11 @@ sub cmd_setup_useremail {
     setup_useremail(1);
 }
 
+sub cmd_setup_gitattributes {
+    badusage "no arguments allowed to dgit setup-useremail" if @ARGV;
+    setup_gitattrs(1);
+}
+
 sub cmd_setup_new_tree {
     badusage "no arguments allowed to dgit setup-tree" if @ARGV;
     setup_new_tree();