X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=dgit;h=ab3d593ec0e751a4deb08406042cc816d39af21b;hb=1ce58351167dc6e9410f07bc4989f7c21940ba22;hp=c66a001482120f40932a3b300d4f4704783c1a2d;hpb=713eaae4d3f172cca513f90c2a0a00501f440bd6;p=dgit.git diff --git a/dgit b/dgit index c66a0014..ab3d593e 100755 --- a/dgit +++ b/dgit @@ -24,15 +24,17 @@ use Data::Dumper; use LWP::UserAgent; use Dpkg::Control::Hash; use File::Path; +use Dpkg::Version; use POSIX; -our $mirror = 'http://mirror.relativity.greenend.org.uk/mirror/debian-ftp/'; -our $suite = 'sid'; +our $isuite = 'unstable'; 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)"); @@ -42,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, @@ -49,18 +52,19 @@ our %opts_opt_map = ('dget' => \@dget, 'debsign' => \@debsign); our $remotename = 'dgit'; -our $ourdscfield = 'Vcs-Git-Master'; +our $ourdscfield = 'Vcs-Dgit-Master'; our $branchprefix = 'dgit'; +our $csuite; -sub lbranch () { return "$branchprefix/$suite"; } +sub lbranch () { return "$branchprefix/$csuite"; } my $lbranch_re = '^refs/heads/'.$branchprefix.'/([^/.]+)$'; sub lref () { return "refs/heads/".lbranch(); } -sub lrref () { return "refs/remotes/$remotename/$suite"; } -sub rrref () { return "refs/$branchprefix/$suite"; } +sub lrref () { return "refs/remotes/$remotename/$csuite"; } +sub rrref () { return "refs/$branchprefix/$csuite"; } sub debiantag ($) { return "debian/$_[0]"; } sub fetchspec () { - local $suite = '*'; + local $csuite = '*'; return "+".rrref().":".lrref(); } @@ -96,21 +100,31 @@ sub printcmd { } sub runcmd { - printcmd(\*DEBUG,"+",@_); + printcmd(\*DEBUG,"+",@_) if $debug>0; $!=0; $?=0; die "@_ $! $?" if system @_; } +sub printdone { + if (!$dryrun) { + print "dgit ok: @_\n"; + } else { + print "would be ok: @_ (but dry run only)\n"; + } +} + 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;
}
@@ -134,18 +148,26 @@ 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://',
'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.sshdakls-host' => 'coccia.debian.org',
+ 'dgit-distro.debian.sshdakls-dir' =>
+ '/srv/ftp-master.debian.org/ftp/dists',
+ 'dgit-distro.debian.mirror' => 'http://http.debian.net/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,21 +178,30 @@ sub cfg {
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");
+sub access_distro () {
+ return cfg("dgit-suite.$isuite.distro",
+ "dgit.default.distro");
+}
+
+sub access_cfg (@) {
+ my (@keys) = @_;
+ my $distro = access_distro();
+ my $value = cfg(map { ("dgit-distro.$distro.$_",
+ "dgit.default.$_") } @keys);
return $value;
}
-sub access_gituserhost () {
- my $user = access_cfg('git-user');
- my $host = access_cfg('git-host');
+sub access_someuserhost ($) {
+ my ($some) = @_;
+ my $user = access_cfg("$some-user",'username');
+ my $host = access_cfg("$some-host");
return defined($user) && length($user) ? "$user\@$host" : $host;
}
+sub access_gituserhost () {
+ return access_someuserhost('git');
+}
+
sub access_giturl () {
my $url = access_cfg('git-url');
if (!defined $url) {
@@ -197,40 +228,106 @@ sub parsechangelog {
return $c;
}
-our $rmad;
+our %rmad;
-sub askmadison () {
- $rmad ||= cmdoutput qw(rmadison -asource),"-s$suite",$package;
- $rmad =~ m/^ \s*( [^ \t|]+ )\s* \|
- \s*( [^ \t|]+ )\s* \|
+sub archive_query ($) {
+ my ($method) = @_;
+ my $query = access_cfg('archive-query');
+ if (!$query) {
+ my $distro = access_distro();
+ if ($distro eq 'debian') {
+ $query = "sshdakls:".
+ access_someuserhost('sshdakls').':'.
+ access_cfg('sshdakls-dir');
+ } else {
+ $query = "madison:$distro";
+ }
+ }
+ $query =~ s/^(\w+):// or die "$query ?";
+ my $proto = $1;
+ my $data = $'; #';
+ { no strict qw(refs); &{"${method}_${proto}"}($proto,$data); }
+}
+
+sub archive_query_madison ($$) {
+ my ($proto,$data) = @_;
+ die unless $proto eq 'madison';
+ $rmad{$package} ||= cmdoutput
+ qw(rmadison -asource),"-s$isuite","-u$data",$package;
+ my $rmad = $rmad{$package};
+ return madison_parse($rmad);
+}
+
+sub archive_query_sshdakls ($$) {
+ my ($proto,$data) = @_;
+ $data =~ s/:.*// or die "$data ?";
+ my $dakls = cmdoutput
+ access_cfg('ssh'), $data, qw(dak ls -asource),"-s$isuite",$package;
+ return madison_parse($dakls);
+}
+
+sub canonicalise_suite_sshdakls ($$) {
+ my ($proto,$data) = @_;
+ $data =~ m/:/ or die "$data ?";
+ my $dakls = cmdoutput
+ access_cfg('ssh'), $`,
+ "set -e; cd $';".
+ " if test -h $isuite; then readlink $isuite; exit 0; fi;".
+ " if test -d $isuite; then echo $isuite; exit 0; fi;".
+ " exit 1";
+ die unless $dakls =~ m/^\w/;
+ return $dakls;
+}
+
+sub madison_parse ($) {
+ my ($rmad) = @_;
+ 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) {
- # madison canonicalises for us
- print "canonical suite name for $suite is $3\n";
- $suite = $3;
+ my $newsuite = $3;
+ my $component;
+ if (defined $4) {
+ $component = $4;
+ } else {
+ $component = access_cfg('archive-query-default-component');
}
- $4 eq 'source' or die "$rmad ?";
- return $vsn;
+ $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,$newsuite);
+}
+
+sub canonicalise_suite_madison ($$) {
+ my @r = archive_query_madison($_[0],$_[1]);
+ @r or die;
+ return $r[2];
}
sub canonicalise_suite () {
- askmadison();
+ $csuite = archive_query('canonicalise_suite');
+ if ($isuite ne $csuite) {
+ # madison canonicalises for us
+ print "canonical suite name for $isuite is $csuite\n";
+ }
}
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 = "$mirror/pool/main/$prefix/$package/${package}_$vsn.dsc";
+ my ($vsn,$subpath) = archive_query('archive_query');
+ canonicalise_suite();
+ 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};
}
@@ -243,7 +340,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 {
@@ -289,7 +385,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);
}
@@ -305,6 +401,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 $!;
@@ -331,48 +432,57 @@ 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 <