X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=a2f3eae095f8ec45881b55f08088e946ba7ad22f;hp=23c5f812a50a7411e8664155f7dea09f1c41fec1;hb=f6adbeeb7dd31aed580439d23ce551dd4fc4023c;hpb=12dc1b71aa58bd4d044077b4f921580cedb0c347 diff --git a/dgit b/dgit index 23c5f812..a2f3eae0 100755 --- a/dgit +++ b/dgit @@ -24,6 +24,7 @@ use Data::Dumper; use LWP::UserAgent; use Dpkg::Control::Hash; use File::Path; +use Dpkg::Version; use POSIX; our $suite = 'sid'; @@ -32,6 +33,8 @@ our $package; our $sign = 1; our $dryrun = 0; our $changesfile; +our $new_package = 0; +our $existing_package = 'dpkg'; our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); @@ -41,6 +44,7 @@ our (@dput) = qw(dput); our (@debsign) = qw(debsign); our $keyid; +our $debug = 0; open DEBUG, ">/dev/null" or die $!; our %opts_opt_map = ('dget' => \@dget, @@ -48,7 +52,7 @@ 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"; } @@ -95,21 +99,23 @@ sub printcmd { } 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; { local $/ = undef; $d =
; }
die if P->error;
- close P or return undef;
+ if (!close P) { print DEBUG "=>!$?\n" if $debug>0; return undef; }
chomp $d;
+ $d =~ m/^.*/;
+ print DEBUG "=> \`$&'",(length $' ? '...' : ''),"\n" if $debug>0; #';
return $d;
}
@@ -133,6 +139,7 @@ sub runcmd_ordryrun {
our %defcfg = ('dgit.default.distro' => 'debian',
'dgit.default.username' => '',
+ 'dgit.default.archive-query-default-component' => 'main',
'dgit.default.ssh' => 'ssh',
'dgit-distro.debian.git-host' => 'git.debian.org',
'dgit-distro.debian.git-proto' => 'git+ssh://',
@@ -143,9 +150,12 @@ our %defcfg = ('dgit.default.distro' => 'debian',
sub cfg {
foreach my $c (@_) {
- my $v = cmdoutput_errok(@git, qw(config --), $c);
+ my $v;
+ {
+ local ($debug) = $debug-1;
+ $v = cmdoutput_errok(@git, qw(config --), $c);
+ };
if ($?==0) {
- chomp $v;
return $v;
} elsif ($?!=256) {
die "$c $?";
@@ -156,10 +166,14 @@ sub cfg {
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;
@@ -197,14 +211,25 @@ sub parsechangelog {
return $c;
}
-our $rmad;
-
-sub askmadison () {
- $rmad ||= cmdoutput qw(rmadison -asource),"-s$suite",$package;
- $rmad =~ m/^ \s*( [^ \t|]+ )\s* \|
- \s*( [^ \t|]+ )\s* \|
+our %rmad;
+
+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{$package} ||= cmdoutput
+ qw(rmadison -asource),"-s$suite","-u$url",$package;
+ my $rmad = $rmad{$package};
+ if (!length $rmad) {
+ return ();
+ }
+ $rmad =~ m{^ \s*( [^ \t|]+ )\s* \|
\s*( [^ \t|]+ )\s* \|
- \s*( [^ \t|]+ )\s* /x or die "$rmad $?";
+ \s*( [^ \t|/]+ )(?:/([^ \t|/]+))? \s* \|
+ \s*( [^ \t|]+ )\s* }x or die "$rmad $?";
$1 eq $package or die "$rmad $package ?";
my $vsn = $2;
if ($suite ne $3) {
@@ -212,26 +237,32 @@ sub askmadison () {
print "canonical suite name for $suite is $3\n";
$suite = $3;
}
- $4 eq 'source' or die "$rmad ?";
- return $vsn;
+ my $component;
+ if (defined $4) {
+ $component = $4;
+ } else {
+ $component = access_cfg('archive-query-default-component');
+ }
+ $5 eq 'source' or die "$rmad ?";
+ my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1);
+ my $subpath = "/pool/$component/$prefix/$package/${package}_$vsn.dsc";
+ return ($vsn,$subpath);
}
sub canonicalise_suite () {
- askmadison();
+ archive_query() or die;
}
sub get_archive_dsc () {
- my $vsn = askmadison();
- # fixme madison does not show us the component
- my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1);
- $dscurl = access_cfg('mirror').
- "/pool/main/$prefix/$package/${package}_$vsn.dsc";
+ my ($vsn,$subpath) = archive_query();
+ if (!defined $vsn) { $dsc=undef; return undef; }
+ $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};
}
@@ -244,7 +275,6 @@ sub check_for_git () {
(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 {
@@ -290,7 +320,7 @@ sub mktree_in_ud_from_only_subdir () {
symlink '../../../../objects','.git/objects' or die $!;
runcmd @git, qw(add -Af);
my $tree = cmdoutput @git, qw(write-tree);
- chomp $tree; $tree =~ m/^\w+$/ or die "$tree ?";
+ $tree =~ m/^\w+$/ or die "$tree ?";
return ($tree,$dir);
}
@@ -306,6 +336,11 @@ sub is_orig_file ($) {
m/\.orig(?:-\w+)?\.tar\.\w+$/;
}
+sub make_commit ($) {
+ my ($file) = @_;
+ return cmdoutput @git, qw(hash-object -w -t commit), $file;
+}
+
sub generate_commit_from_dsc () {
prep_ud();
chdir $ud or die $!;
@@ -332,48 +367,56 @@ sub generate_commit_from_dsc () {
my $authline = "$author $date";
$authline =~ m/^[^<>]+ \<\S+\> \d+ [-+]\d+$/ or die $authline;
open C, ">../commit.tmp" or die $!;
- print C "tree $tree\n" or die $!;
- print C "parent $upload_hash\n" or die $! if $upload_hash;
print C <