chiark / gitweb /
When source package contains things called .git (even files, and even in subdirectori...
[dgit.git] / dgit
diff --git a/dgit b/dgit
index faffba6202a0cc6d0f6616a494aae807355eaa70..109f79c74ce6d6c178a2bceb8e10ef204cd6a598 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -547,10 +547,29 @@ sub access_quirk () {
     return ('none',undef);
 }
 
-our $access_pushing = 0;
+our $access_forpush;
+
+sub access_forpush_config () {
+    my $d = access_basedistro();
+    my $v = cfg("dgit-distro.$d.readonly", 'RETURN-UNDEF');
+    $v //= 'a';
+    return
+       $v =~ m/^[ty1]/ ? 0 : # force readonly,    forpush = 0
+       $v =~ m/^[fn0]/ ? 1 : # force nonreadonly, forpush = 1
+       $v =~ m/^[a]/  ? '' : # auto,              forpush = ''
+       badcfg "readonly needs t (true, y, 1) or f (false, n, 0) or a (auto)";
+}
+
+sub access_forpush () {
+    $access_forpush //= access_forpush_config();
+    return $access_forpush;
+}
 
 sub pushing () {
-    $access_pushing = 1;
+    die "$access_forpush ?" if ($access_forpush // 1) ne 1;
+    badcfg "pushing but distro is configured readonly"
+       if access_forpush_config() eq '0';
+    $access_forpush = 1;
 }
 
 sub access_distros () {
@@ -568,7 +587,7 @@ sub access_distros () {
     unshift @l, $instead_distro;
     @l = grep { defined } @l;
 
-    if ($access_pushing) {
+    if (access_forpush()) {
        @l = map { ("$_/push", $_) } @l;
     }
     @l;
@@ -1127,7 +1146,21 @@ sub mktree_in_ud_from_only_subdir () {
     $dirs[0] =~ m#^([^/]+)/\.$# or die;
     my $dir = $1;
     changedir $dir;
-    fail "source package contains .git directory" if stat_exists '.git';
+
+    my @gitscmd = qw(find -name .git -prune -print0);
+    debugcmd "|",@gitscmd;
+    open GITS, "-|", @gitscmd or failedcmd @gitscmd;
+    {
+       local $/="\0";
+       while (<GITS>) {
+           chomp or die;
+           print STDERR "$us: warning: removing from source package: ",
+               (messagequote $_), "\n";
+           rmtree $_;
+       }
+    }
+    $!=0; $?=0; close GITS or failedcmd @gitscmd;
+
     mktree_in_ud_here();
     my $format=get_source_format();
     if (madformat($format)) {
@@ -3037,6 +3070,7 @@ my $cmd = shift @ARGV;
 $cmd =~ y/-/_/;
 
 if (!defined $quilt_mode) {
+    local $access_forpush;
     $quilt_mode = cfg('dgit.force.quilt-mode', 'RETURN-UNDEF')
        // access_cfg('quilt-mode', 'RETURN-UNDEF')
        // 'linear';