X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=60138fea122567892caad6d4b352727d37fda25d;hp=0fb928906f06833c553a8d7fc2c9b47d64f484cc;hb=e6663e4fe6ca8c1a6b155e692d3a7b8b264b95c1;hpb=39c6c123ab730d42ec7c9ed01c30e0175c7691e7 diff --git a/dgit b/dgit index 0fb92890..60138fea 100755 --- 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 =

; 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};