use File::Path;
use POSIX;
-our $mirror = 'http://mirror.relativity.greenend.org.uk/mirror/debian-ftp/';
our $suite = 'sid';
our $package;
our (@debsign) = qw(debsign);
our $keyid;
+our $debug = 0;
open DEBUG, ">/dev/null" or die $!;
our %opts_opt_map = ('dget' => \@dget,
'debsign' => \@debsign);
our $remotename = 'dgit';
-our $ourdscfield = 'Vcs-Git-Master';
+our $ourdscfield = 'Vcs-Dgit-Master';
our $branchprefix = 'dgit';
sub lbranch () { return "$branchprefix/$suite"; }
}
sub runcmd {
- printcmd(\*DEBUG,"+",@_);
+ printcmd(\*DEBUG,"+",@_) if $debug>0;
$!=0; $?=0;
die "@_ $! $?" if system @_;
}
sub cmdoutput_errok {
die Dumper(\@_)." ?" if grep { !defined } @_;
- printcmd(\*DEBUG,"|",@_);
+ printcmd(\*DEBUG,"|",@_) if $debug>0;
open P, "-|", @_ or die $!;
my $d;
$!=0; $?=0;
'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');
+ 'dgit-distro.debian.git-create' => 'ssh-cmd',
+ 'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/');
sub cfg {
foreach my $c (@_) {
- my $v = cmdoutput_errok(qw(git config --), $c);
+ my $v;
+ {
+ local ($debug) = $debug-1;
+ $v = cmdoutput_errok(@git, qw(config --), $c);
+ };
if ($?==0) {
chomp $v;
return $v;
return undef;
}
+sub access_distro () {
+ return cfg("dgit-suite.$suite.distro",
+ "dgit.default.distro");
+}
+
sub access_cfg ($) {
my ($key) = @_;
- my $distro = cfg("dgit-suite.$suite.distro",
- "dgit.default.distro");
+ my $distro = access_distro();
my $value = cfg("dgit-distro.$distro.$key",
"dgit.default.$key");
return $value;
return defined($user) && length($user) ? "$user\@$host" : $host;
}
-sub access_giturl ($) {
+sub access_giturl () {
my $url = access_cfg('git-url');
if (!defined $url) {
$url =
access_gituserhost().
access_cfg('git-path');
}
- return "$url/package.git";
+ return "$url/$package.git";
}
sub parsecontrol {
our $rmad;
-sub askmadison () {
- $rmad ||= cmdoutput qw(rmadison -asource),"-s$suite",$package;
+sub archive_query () {
+ my $query = access_cfg('archive-query');
+ $query ||= "madison:".access_distro();
+ $query =~ s/^(\w+):// or die "$query ?";
+ my $proto = $1;
+ my $url = $'; #';
+ die unless $proto eq 'madison';
+ $rmad ||= cmdoutput qw(rmadison -asource),"-s$suite","-u$url",$package;
$rmad =~ m/^ \s*( [^ \t|]+ )\s* \|
\s*( [^ \t|]+ )\s* \|
\s*( [^ \t|]+ )\s* \|
$suite = $3;
}
$4 eq 'source' or die "$rmad ?";
- return $vsn;
+ my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1);
+ my $subpath = "/pool/main/$prefix/$package/${package}_$vsn.dsc";
+ return ($vsn,$subpath);
}
sub canonicalise_suite () {
- askmadison();
+ archive_query();
}
sub get_archive_dsc () {
- my $vsn = askmadison();
+ my ($vsn,$subpath) = archive_query();
# fixme madison does not show us the component
- my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1);
- $dscurl = "$mirror/pool/main/$prefix/$package/${package}_$vsn.dsc";
+ $dscurl = access_cfg('mirror').$subpath;
$dscdata = url_get($dscurl);
my $dscfh = new IO::File \$dscdata, '<' or die $!;
- print DEBUG Dumper($dscdata);
+ print DEBUG Dumper($dscdata) if $debug>1;
$dsc = Dpkg::Control::Hash->new(allow_pgp=>1);
$dsc->parse($dscfh, 'dsc') or die "parsing of $dscurl failed\n";
- print DEBUG Dumper($dsc);
+ print DEBUG Dumper($dsc) if $debug>1;
my $fmt = $dsc->{Format};
die "unsupported format $fmt, sorry\n" unless $format_ok{$fmt};
}
(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";
+ print DEBUG "got \`$r'\n";
die "$r $! $?" unless $r =~ m/^[01]$/;
return $r+0;
} else {
sub git_fetch_us () {
die "cannot dry run with fetch" if $dryrun;
- runcmd @git, qw(fetch),$remotename,fetchspec();
+ runcmd @git, qw(fetch),access_giturl(),fetchspec();
}
sub fetch_from_archive () {
open H, "> .git/HEAD" or die $!;
print H "ref: ".lref()."\n" or die $!;
close H or die $!;
- runcmd @git, qw(remote add), 'origin', access_giturl($package);
+ runcmd @git, qw(remote add), 'origin', access_giturl();
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 $!";
if (!check_for_git()) {
create_remote_git_repo();
}
- runcmd_ordryrun @git, qw(push),$remotename,"HEAD:".rrref();
+ runcmd_ordryrun @git, qw(push),access_giturl(),"HEAD:".rrref();
if ($sign) {
my @tag_cmd = (@git, qw(tag -s -m),
"Release $dsc->{Version} for $suite [dgit]");
push @debsign_cmd, $changesfile;
runcmd_ordryrun @debsign_cmd;
}
- runcmd_ordryrun @git, qw(push),$remotename,"refs/tags/$tag";
- runcmd_ordryrun @dput, $changesfile;
+ runcmd_ordryrun @git, qw(push),access_giturl(),"refs/tags/$tag";
+ my $host = access_cfg('upload-host');
+ my @hostarg = defined($host) ? ($host,) : ();
+ runcmd_ordryrun @dput, @hostarg, $changesfile;
}
sub cmd_clone {
$dryrun=1;
} elsif (s/^-D/-/) {
open DEBUG, ">&STDERR" or die $!;
+ $debug++;
} elsif (s/^-c(.*=.*)//s) {
- push @git, $1;
+ push @git, '-c', $1;
} elsif (s/^-C(.*)//s) {
$changesfile = $1;
} elsif (s/^-k(.*)//s) {