X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=37b235b33e4a4741b16c328304915bf1d95f41f3;hp=7fd7f0d6c4f4de729115a5554e7d86fb0e0679e9;hb=5616b78952e95f848c30600f23ca34db0bd4148b;hpb=334d6fab1c067448d73eeaf03bd62ef09ababf6e diff --git a/dgit b/dgit index 7fd7f0d6..37b235b3 100755 --- a/dgit +++ b/dgit @@ -24,6 +24,7 @@ use Data::Dumper; use LWP::UserAgent; use Dpkg::Control::Hash; use File::Path; +use File::Basename; use Dpkg::Version; use POSIX; @@ -36,6 +37,7 @@ our $dryrun = 0; our $changesfile; our $new_package = 0; our $existing_package = 'dpkg'; +our $clean = 'dpkg-source'; our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); @@ -45,14 +47,19 @@ our (@dput) = qw(dput); our (@debsign) = qw(debsign); our (@sbuild) = qw(sbuild -A); our (@dpkgbuildpackage) = qw(dpkg-buildpackage -i\.git/ -I.git); +our (@dpkgsource) = qw(dpkg-source -i\.git/ -I.git); +our (@dpkggenchanges) = qw(dpkg-genchanges); our (@mergechanges) = qw(mergechanges -f); - +our (@changesopts) = (''); our %opts_opt_map = ('dget' => \@dget, 'dput' => \@dput, 'debsign' => \@debsign, 'sbuild' => \@sbuild, + 'dpkg-source' => \@dpkgsource, 'dpkg-buildpackage' => \@dpkgbuildpackage, + 'dpkg-genchanges' => \@dpkggenchanges, + 'ch' => \@changesopts, 'mergechanges' => \@mergechanges); our $keyid; @@ -68,7 +75,7 @@ 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 ($) { my ($v) = @_; @@ -78,6 +85,8 @@ sub debiantag ($) { sub dscfn ($) { return "${package}_$_[0].dsc"; } +sub changesopts () { return @changesopts[1..$#changesopts]; } + our $us = 'dgit'; sub fail { die "$us: @_\n"; } @@ -104,6 +113,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(); } @@ -200,6 +210,10 @@ important dgit options: -c= set git config option (used directly by dgit too) END +our $later_warning_msg = <[0],$b->[0]); } @out; } sub canonicalise_suite_madison ($$) { @@ -396,7 +411,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 () { @@ -408,17 +423,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 () { @@ -443,9 +465,7 @@ sub create_remote_git_repo () { 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"); + " cp -a _template $package.git"); } else { badcfg "unknown git-create \`$how'"; } @@ -565,9 +585,10 @@ END $outputhash = make_commit qw(../commit2.tmp); } elsif ($vcmp > 0) { print STDERR <$1; shift; exec "$@"','x', + $sourcechanges, + @dpkggenchanges, qw(-S), changesopts(); + } +} + +sub cmd_build_source { + badusage "build-source takes no additional arguments" if @ARGV; + build_source(); + printdone "source built, results in $dscfn and $sourcechanges"; +} + +sub cmd_sbuild { + build_source(); chdir ".." or die $!; - my $sourcechanges = "${package}_${version}_source.changes"; - my $dscfn = dscfn($version); my $pat = "${package}_${version}_*.changes"; if (!$dryrun) { stat $dscfn or fail "$dscfn (in parent directory): $!"; @@ -988,14 +1061,21 @@ sub parseopts () { helponly(); } elsif (m/^--new$/) { $new_package=1; - } elsif (m/^--(\w+)=(.*)/s && ($om = $opts_opt_map{$1})) { + } elsif (m/^--(\w+)=(.*)/s && + ($om = $opts_opt_map{$1}) && + length $om->[0]) { $om->[0] = $2; - } elsif (m/^--(\w+):(.*)/s && ($om = $opts_opt_map{$1})) { + } elsif (m/^--(\w+):(.*)/s && + ($om = $opts_opt_map{$1})) { push @$om, $2; } elsif (m/^--existing-package=(.*)/s) { $existing_package = $1; } elsif (m/^--distro=(.*)/s) { $idistro = $1; + } elsif (m/^--clean=(dpkg-source|git|none)$/s) { + $cleanmode = $1; + } elsif (m/^--clean=(.*)$/s) { + badusage "unknown cleaning mode \`$1'"; } else { badusage "unknown long option \`$_'"; } @@ -1010,6 +1090,9 @@ sub parseopts () { $debug++; } elsif (s/^-N/-/) { $new_package=1; + } elsif (m/^-[vm]/) { + push @changesopts, $_; + $_ = ''; } elsif (s/^-c(.*=.*)//s) { push @git, '-c', $1; } elsif (s/^-d(.*)//s) {