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);
}
sub cmdoutput_errok {
+ die Dumper(\@_)." ?" if grep { !defined } @_;
printcmd(\*DEBUG,"|",@_);
open P, "-|", @_ or die $!;
my $d;
}
}
+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;
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);
}
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 () {
$!=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"
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();
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 $!";
}
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) {
sub cmd_clone {
my $dstdir;
+ die if defined $package;
if (@ARGV==1) {
($package) = @ARGV;
} elsif (@ARGV==2 && $ARGV[1] =~ m#^\w#) {
}
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) {
}
sub cmd_push {
+ die if defined $package;
my $clogp = parsechangelog();
$package = $clogp->{Source};
if (@ARGV==0) {
}
sub cmd_build {
+ die if defined $package;
my $clogp = parsechangelog();
$suite = $clogp->{Distribution};
$package = $clogp->{Source};