chiark / gitweb /
new config...
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 16 Aug 2013 15:12:44 +0000 (16:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 16 Aug 2013 15:12:44 +0000 (16:12 +0100)
TODO
dgit
dgit.1

diff --git a/TODO b/TODO
index f7c0b7dfc03801be0db3afe04ab739e2151865e4..26ce6a9e0edf85c4da6fcc24f23ff5dca7f33523 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,9 +1,3 @@
-config for repo locations
-
-Archive agility.  Archive needs to specify (a) way to get versions
-and paths in archive for dscs (b) unpriv pull location (c) priv
-push location
-
 Vcs-Git-Master: <commit>
   specifies commit hash corresponding to the thing uploaded
   optional commit hash corresponding to pristine tar??
diff --git a/dgit b/dgit
index a158eefde209e76865088d90de19ba03cf57b622..7e464fe0a34fd08fc076385b980545bef8a20502 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -34,11 +34,6 @@ our $sign = 1;
 our $dryrun = 0;
 our $changesfile;
 
-our $aliothname = 'iwj@git.debian.org';
-our $aliothpath = '/git/dgit-repos';
-our $alioth_git = "git+ssh://$aliothname/$aliothpath";
-our $alioth_sshtestbodge = [$aliothname,$aliothpath];
-
 our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)");
 
 our (@git) = qw(git);
@@ -136,6 +131,53 @@ sub runcmd_ordryrun {
     }
 }
 
+our %defcfg = ('dgit.default.distro' => 'debian',
+              'dgit.default.username' => '',
+              'dgit-distro.debian.git-host' => 'git.debian.org',
+              'dgit-distro.debian.git-proto' => 'git+ssh://',
+              'dgit-distro.debian.git-path' => '/git/dgit-repos',
+              'dgit-distro.debian.git-check' => 'ssh-cmd',
+              'dgit-distro.debian.git-create' => 'ssh-cmd');
+
+sub cfg {
+    foreach my $c (@_) {
+       my $v = cmdoutput_errok qw(git config --), $c;
+       if ($?==0) {
+           chomp $v;
+           return $v;
+       } elsif ($?!=256) {
+           die "$c $?";
+       }
+       my $dv = $defcfg{$c};
+       return $dv if defined $dv;
+    }
+    return undef;
+}
+
+sub access_cfg ($) {
+    my ($key) = @_;
+    my $distro = cfg("dgit-suite.$suite.distro",
+                    "dgit.default.distro"); });
+    my $value = cfg("dgit-distro.$distro.$key",
+                   "dgit.default.$key");
+    return $value;
+}
+
+sub access_gituserhost () {
+    my $user = access_cfg('git-user');
+    my $host = access_cfg('git-host');
+    return defined($user) && length($user) ? "$user\@$host" : $host;
+}
+
+sub access_giturl () {
+    my $url = access_cfg('git-url');
+    return $url if defined $url;
+    return
+       access_cfg('git-proto').
+       access_gituserhost().
+       access_cfg('git-path');
+}             
+
 sub parsecontrol {
     my $c = Dpkg::Control::Hash->new();
     $c->load(@_) or return undef;
@@ -191,18 +233,34 @@ sub get_archive_dsc () {
 
 sub check_for_git () {
     # returns 0 or 1
-    my $cmd= 
-       "ssh $alioth_sshtestbodge->[0] '".
-       " set -e; cd $alioth_sshtestbodge->[1];".
-       " if test -d $package.git; then echo 1; else echo 0; fi".
-       "'";
-    print DEBUG "$cmd\n";
-    open P, "$cmd |" or die $!;
-    $!=0; $?=0;
-    my $r = <P>; close P;
-    print DEBUG ">$r<\n";
-    die "$r $! $?" unless $r =~ m/^[01]$/;
-    return $r+0;
+    my $how = access_config('git-check');
+    if ($how eq 'ssh-cmd') {
+       my $r= cmd_getoutput access_cfg('ssh'),access_gituserhost(),
+           " set -e; cd ".access_cfg('git-path').";".
+           " if test -d $package.git; then echo 1; else echo 0; fi";
+       print DEBUG "$cmd\n";
+       open P, "$cmd |" or die $!;
+       $!=0; $?=0;
+       my $r = <P>; close P;
+       print DEBUG ">$r<\n";
+       die "$r $! $?" unless $r =~ m/^[01]$/;
+       return $r+0;
+    } else {
+       die "unknown git-check $how ?";
+    }
+}
+
+sub create_remote_git_repo () {
+    my $how = access_config('git-create');
+    if ($how eq 'ssh-cmd') {
+       runcmd_ordryrun access_cfg('ssh'),access_gituserhost(),
+           "set -e; cd ".access_cfg('git-path').";".
+           " mkdir -p $package.git;".
+           " cd $package.git;".
+           " if ! test -d objects; then git init --bare; fi";
+    } else {
+       die "unknown git-create $how ?";
+    }
 }
 
 our ($dsc_hash,$upload_hash);
@@ -403,7 +461,7 @@ sub clone ($) {
     open H, "> .git/HEAD" or die $!;
     print H "ref: ".lref()."\n" or die $!;
     close H or die $!;
-    runcmd @git, qw(remote add), 'origin', "$alioth_git/$package.git";
+    runcmd @git, qw(remote add), 'origin', access_giturl($package);
     if (check_for_git()) {
        print "fetching existing git history\n";
        git_fetch_us();
@@ -465,11 +523,7 @@ sub dopush () {
     }
     my $tag = debiantag($dsc->{Version});
     if (!check_for_git()) {
-       runcmd_ordryrun qw(ssh),$alioth_sshtestbodge->[0],
-       "set -e; cd $alioth_sshtestbodge->[1];".
-           " mkdir -p $package.git;".
-           " cd $package.git;".
-           " if ! test -d objects; then git init --bare; fi";
+       create_remote_git_repo();
     }
     runcmd_ordryrun @git, qw(push),$remotename,"HEAD:".rrref();
     if ($sign) {
diff --git a/dgit.1 b/dgit.1
index 51940cab186c946e855f9ccc7b741842e37059aa..84e54695a90b3e8505de7fd68a1a57bdfa2c2e25 100644 (file)
--- a/dgit.1
+++ b/dgit.1
@@ -133,12 +133,37 @@ debsign.  Use repeatedly if multiple additional options are required.
 Specifies the .changes file which is to be uploaded.  By default
 dgit push looks for single .changes file in the parent directory whose
 filename suggests they it is for the right package and version.
+.SH CONFIGURATION
+dgit looks at the following git config keys to control its behaviour.
+You may set them with git-config (either in system-global or per-tree
+configuration), or provide
+.BI -c key = value
+on the dgit command line.
+.TP
+.BI dgit-suite. suite .distro
+.TP
+.BI dgit.default.distro
+.TP
+.BI dgit.default.username
+.TP
+.BI dgit-distro. distro .git-url
+.TP
+.BI dgit-distro. distro .git-host
+.TP
+.BI dgit-distro. distro .git-proto
+.TP
+.BI dgit-distro. distro .git-path
+.TP
+.BI dgit-distro. distro .git-check
+.TP
+.BI dgit-distro. distro .git-create
+.TP
+.BI dgit-distro. distro .ssh
+.TP
+.BR dgit.default. *
+for each
+.BR dgit-distro. \fIdistro\fR . *
 .SH BUGS
-dgit is not nearly configurable enough.  The locations for dgit-repos
-(on alioth) and for the Debian archive are currently hardcoded.
-There is not yet any support for suites which are in different
-distributions to Debian.
-
 dgit will only work with packages in main. The madison http query API
 does not give the component.