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 f7c0b7d..26ce6a9 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 a158eef..7e464fe 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 51940ca..84e5469 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.