chiark / gitweb /
more wip, including config stuff
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 0fb928906f06833c553a8d7fc2c9b47d64f484cc..60138fea122567892caad6d4b352727d37fda25d 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);
@@ -107,6 +102,7 @@ sub runcmd {
 }
 
 sub cmdoutput_errok {
+    die Dumper(\@_)." ?" if grep { !defined } @_;
     printcmd(\*DEBUG,"|",@_);
     open P, "-|", @_ or die $!;
     my $d;
@@ -136,6 +132,56 @@ sub runcmd_ordryrun {
     }
 }
 
+our %defcfg = ('dgit.default.distro' => 'debian',
+              'dgit.default.username' => '',
+              'dgit.default.ssh' => 'ssh',
+              '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');
+    if (!defined $url) {
+       $url =
+           access_cfg('git-proto').
+           access_gituserhost().
+           access_cfg('git-path');
+    }
+    return "$url/package.git";
+}             
+
 sub parsecontrol {
     my $c = Dpkg::Control::Hash->new();
     $c->load(@_) or return undef;
@@ -191,18 +237,32 @@ 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_cfg('git-check');
+    if ($how eq 'ssh-cmd') {
+       my $r= cmdoutput
+           (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 ">$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_cfg('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);
@@ -346,7 +406,8 @@ sub is_fast_fwd ($$) {
 }
 
 sub git_fetch_us () {
-    runcmd_ordryrun @git, qw(fetch),$remotename,fetchspec();
+    die "cannot dry run with fetch" if $dryrun;
+    runcmd @git, qw(fetch),$remotename,fetchspec();
 }
 
 sub fetch_from_archive () {
@@ -364,10 +425,13 @@ sub fetch_from_archive () {
 
     $!=0; $upload_hash =
        cmdoutput_errok @git, qw(show-ref --heads), lrref();
-    die $! if $!;
-    die $? unless ($?==0 && chomp $upload_hash) 
-       or ($?==256 && !length $upload_hash);
-    $upload_hash ||= '';
+    if ($?==0) {
+       die unless chomp $upload_hash;
+    } elsif ($?==256) {
+       $upload_hash = '';
+    } else {
+       die $?;
+    }
     my $hash;
     if (defined $dsc_hash) {
        die "missing git history even though dsc has hash"
@@ -402,7 +466,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();
@@ -431,6 +495,7 @@ sub pull () {
 sub dopush () {
     runcmd @git, qw(diff --quiet HEAD);
     my $clogp = parsechangelog();
+    die if defined $package;
     $package = $clogp->{Source};
     my $dscfn = "${package}_$clogp->{Version}.dsc";
     stat "../$dscfn" or die "$dscfn $!";
@@ -463,11 +528,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) {
@@ -487,6 +548,7 @@ sub dopush () {
 
 sub cmd_clone {
     my $dstdir;
+    die if defined $package;
     if (@ARGV==1) {
        ($package) = @ARGV;
     } elsif (@ARGV==2 && $ARGV[1] =~ m#^\w#) {
@@ -513,11 +575,16 @@ sub branchsuite () {
 }
 
 sub fetchpullargs () {
-    my $clogp = parsechangelog();
-    $package = $clogp->{Source};
+    if (!defined $package) {
+       my $sourcep = parsecontrol('debian/control');
+       $package = $sourcep->{Source};
+    }
     if (@ARGV==0) {
        $suite = branchsuite();
-       $suite ||= $clogp->{Distribution};
+       if (!$suite) {
+           my $clogp = parsechangelog();
+           $suite = $clogp->{Distribution};
+       }
        canonicalise_suite();
        print "fetching from suite $suite\n";
     } elsif (@ARGV==1) {
@@ -539,6 +606,7 @@ sub cmd_pull {
 }
 
 sub cmd_push {
+    die if defined $package;
     my $clogp = parsechangelog();
     $package = $clogp->{Source};
     if (@ARGV==0) {
@@ -551,6 +619,7 @@ sub cmd_push {
 }
 
 sub cmd_build {
+    die if defined $package;
     my $clogp = parsechangelog();
     $suite = $clogp->{Distribution};
     $package = $clogp->{Source};