X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=dgit;h=41375195d6cdd997ff79ff8aff572930647af1bf;hb=b02768d1fe0704c4a7e48012aeee4628c8d10afa;hp=940c89b5cb608c1cf69e046a6659b4ecf8d68b32;hpb=1957bfa6d464f8a331a82c19532d4d53c7b1e541;p=dgit.git diff --git a/dgit b/dgit index 940c89b5..41375195 100755 --- a/dgit +++ b/dgit @@ -68,9 +68,13 @@ our $csuite; sub lbranch () { return "$branchprefix/$csuite"; } my $lbranch_re = '^refs/heads/'.$branchprefix.'/([^/.]+)$'; sub lref () { return "refs/heads/".lbranch(); } -sub lrref () { return "refs/remotes/$remotename/$csuite"; } +sub lrref () { return "refs/remotes/$remotename/$branchprefix/$csuite"; } sub rrref () { return "refs/$branchprefix/$csuite"; } -sub debiantag ($) { return "debian/$_[0]"; } +sub debiantag ($) { + my ($v) = @_; + $v =~ y/~:/_%/; + return "debian/$v"; +} sub dscfn ($) { return "${package}_$_[0].dsc"; } @@ -100,6 +104,7 @@ sub url_get { my $what = $_[$#_]; print "downloading $what...\n"; my $r = $ua->get(@_) or die $!; + return undef if $r->code == 404; $r->is_success or fail "failed to fetch $what: ".$r->status_line; return $r->decoded_content(); } @@ -196,6 +201,10 @@ important dgit options: -c= set git config option (used directly by dgit too) END +our $later_warning_msg = < 'debian', 'dgit.default.username' => '', 'dgit.default.archive-query-default-component' => 'main', 'dgit.default.ssh' => 'ssh', - 'dgit-distro.debian.git-host' => 'dgit.debian.net', + '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', @@ -364,26 +373,27 @@ sub canonicalise_suite_sshdakls ($$) { sub madison_parse ($) { my ($rmad) = @_; - if (!length $rmad) { - return (); - } - $rmad =~ m{^ \s*( [^ \t|]+ )\s* \| - \s*( [^ \t|]+ )\s* \| - \s*( [^ \t|/]+ )(?:/([^ \t|/]+))? \s* \| - \s*( [^ \t|]+ )\s* }x or die "$rmad $?"; - $1 eq $package or die "$rmad $package ?"; - my $vsn = $2; - my $newsuite = $3; - my $component; - if (defined $4) { - $component = $4; - } else { - $component = access_cfg('archive-query-default-component'); + my @out; + foreach my $l (split /\n/, $rmad) { + $l =~ m{^ \s*( [^ \t|]+ )\s* \| + \s*( [^ \t|]+ )\s* \| + \s*( [^ \t|/]+ )(?:/([^ \t|/]+))? \s* \| + \s*( [^ \t|]+ )\s* }x or die "$rmad $?"; + $1 eq $package or die "$rmad $package ?"; + my $vsn = $2; + my $newsuite = $3; + 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"; + push @out, [$vsn,$subpath,$newsuite]; } - $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); + return sort { -version_compare_string($a->[0],$b->[0]); } @out; } sub canonicalise_suite_madison ($$) { @@ -392,7 +402,7 @@ sub canonicalise_suite_madison ($$) { "unable to canonicalise suite using package $package". " which does not appear to exist in suite $isuite;". " --existing-package may help"; - return $r[2]; + return $r[0][2]; } sub canonicalise_suite () { @@ -404,17 +414,24 @@ sub canonicalise_suite () { } sub get_archive_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) if $debug>1; - $dsc = parsecontrolfh($dscfh,$dscurl, allow_pgp=>1); - print DEBUG Dumper($dsc) if $debug>1; - my $fmt = getfield $dsc, 'Format'; - fail "unsupported source format $fmt, sorry" unless $format_ok{$fmt}; + my @vsns = archive_query('archive_query'); + foreach my $vinfo (@vsns) { + my ($vsn,$subpath) = @$vinfo; + $dscurl = access_cfg('mirror').$subpath; + $dscdata = url_get($dscurl); + next unless defined $dscdata; + $dscurl = access_cfg('mirror').$subpath; + $dscdata = url_get($dscurl); + my $dscfh = new IO::File \$dscdata, '<' or die $!; + print DEBUG Dumper($dscdata) if $debug>1; + $dsc = parsecontrolfh($dscfh,$dscurl, allow_pgp=>1); + print DEBUG Dumper($dsc) if $debug>1; + my $fmt = getfield $dsc, 'Format'; + fail "unsupported source format $fmt, sorry" unless $format_ok{$fmt}; + return $dsc; + } + return undef; } sub check_for_git () { @@ -561,9 +578,10 @@ END $outputhash = make_commit qw(../commit2.tmp); } elsif ($vcmp > 0) { print STDERR <0; + $!=0; $?=0; system @cmd; + return if !$! && !$?; + if (!$! && $?==256) { + fail "working tree is dirty (does not match HEAD)"; + } else { + failedcmd @cmd; + } } sub commit_quilty_patch ($) { @@ -803,6 +839,9 @@ sub dopush () { print "[new .dsc left in $dscfn.tmp]\n"; } if ($sign) { + if (!defined $keyid) { + $keyid = access_cfg('keyid','RETURN-UNDEF'); + } my @tag_cmd = (@git, qw(tag -s -m), "Release $dversion for $csuite [dgit]"); push @tag_cmd, qw(-u),$keyid if defined $keyid; @@ -900,8 +939,9 @@ sub cmd_push { if (fetch_from_archive()) { is_fast_fwd(lrref(), 'HEAD') or die; } else { - fail "package appears to be new in this suite;". - " if this is intentional, use --new"; + $new_package or + fail "package appears to be new in this suite;". + " if this is intentional, use --new"; } dopush(); }