chiark / gitweb /
Test suite: Use t-make-hook-link for mirroring
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 247b2432c2d7ab95ad07b86a498639f2bbbc61fa..9e2e66e4841b4adb690225fab1def69b6229df6d 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -547,16 +547,31 @@ sub access_quirk () {
     return ('none',undef);
 }
 
-our $access_forpush = 0;
+our $access_forpush;
 
-sub pushing () {
-    $access_forpush = 1;
+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 () {
+    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 () {
     # Returns list of distros to try, in order
     #
@@ -3041,6 +3056,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';