chiark / gitweb /
dgit-repos-server etc.: Rework argument & distros-dir passing (no overall functional...
[dgit.git] / infra / dgit-repos-server
index d3d711f178ab99fda55dbe849fd77114f98b6e01..93f6481e35a1a2a605adcb6f7a82bd615bd1a7e8 100755 (executable)
@@ -2,10 +2,13 @@
 # dgit-repos-server
 #
 # usages:
-#  .../dgit-repos-server DISTRO SUITES KEYRING-AUTH-SPEC \
-#      DGIT-REPOS-DIR POLICY-HOOK-SCRIPT --ssh
-#  .../dgit-repos-server DISTRO SUITES KEYRING-AUTH-SPEC \
-#      DGIT-REPOS-DIR POLICY-HOOK-SCRIPT --cron
+#   dgit-repos-server DISTRO DISTRO-DIR AUTH-SPEC [<settings>] --ssh
+#   dgit-repos-server DISTRO DISTRO-DIR AUTH-SPEC [<settings>] --cron
+# settings
+#   --repos=GIT-REPOS-DIR      default DISTRO-DIR/repos/
+#   --suites=SUITES-FILE       default DISTRO-DIR/suites
+#   --policy-hook=POLICY-HOOK  default DISTRO-DIR/policy-hook
+# (DISTRO-DIR is not used other than as default)
 # internal usage:
 #  .../dgit-repos-server --pre-receive-hook PACKAGE
 #
@@ -16,7 +19,7 @@
 # SUITES is the name of a file which lists the permissible suites
 # one per line (#-comments and blank lines ignored)
 #
-# KEYRING-AUTH-SPEC is a :-separated list of
+# AUTH-SPEC is a :-separated list of
 #   KEYRING.GPG,AUTH-SPEC
 # where AUTH-SPEC is one of
 #   a
@@ -783,6 +786,17 @@ sub argval () {
     return $v;
 }
 
+our %indistrodir = (
+    # keys are used for DGIT_DRS_XXX too
+    'repos' => \$dgitrepos,
+    'suites' => \$suitesfile,
+    'policy-hook' => \$policyhook,
+    );
+
+our @hookenvs = qw(distro suitesfile policyhook keyrings dgitrepos);
+
+# workrepo and destrepo handled ad-hoc
+
 sub parseargsdispatch () {
     die unless @ARGV;
 
@@ -799,13 +813,9 @@ sub parseargsdispatch () {
        shift @ARGV;
        @ARGV == 1 or die;
        $package = shift @ARGV;
-       defined($distro = $ENV{'DGIT_DRS_DISTRO'}) or die;
-       defined($dgitrepos = $ENV{'DGIT_DRS_REPOS'}) or die;
-       defined($suitesfile = $ENV{'DGIT_DRS_SUITES'}) or die;
+       ${ $main::{$_} } = $ENV{"DGIT_DRS_\U$_"} foreach @hookenvs;
        defined($workrepo = $ENV{'DGIT_DRS_WORK'}) or die;
        defined($destrepo = $ENV{'DGIT_DRS_DEST'}) or die;
-       defined($keyrings = $ENV{'DGIT_DRS_KEYRINGS'}) or die $!;
-       defined($policyhook = $ENV{'DGIT_DRS_POLICYHOOK'}) or die $!;
        open STDOUT, ">&STDERR" or die $!;
        eval {
            stunthook();
@@ -817,11 +827,20 @@ sub parseargsdispatch () {
        exit 0;
     }
 
-    $ENV{'DGIT_DRS_DISTRO'} = $distro = argval();
-    $ENV{'DGIT_DRS_SUITES'} = $suitesfile = argval();
-    $ENV{'DGIT_DRS_KEYRINGS'} = $keyrings = argval();
-    $ENV{'DGIT_DRS_REPOS'} = $dgitrepos = argval();
-    $ENV{'DGIT_DRS_POLICYHOOK'} = $policyhook = argval();
+    $distro = $ENV{'DGIT_DRS_DISTRO'}     = argval();
+    my $distrodir                         = argval();
+    $keyrings = $ENV{'DGIT_DRS_KEYRINGS'} = argval();
+
+    foreach my $dk (keys %indistrodir) {
+       ${ $indistrodir{$dk} } = "$distrodir/$dk";
+    }
+
+    while (@ARGV && $ARGV[0] =~ m/^--([-0-9a-z]+)=/ && $indistrodir{$1}) {
+       ${ $indistrodir{$1} } = $'; #';
+       shift @ARGV;
+    }
+
+    $ENV{"DGIT_DRS_\U$_"} = ${ $main::{$_} } foreach @hookenvs;
 
     die unless @ARGV==1 && $ARGV[0] eq '--ssh';