X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=b6e79e36bca1ca1b1cd1cd124c0593c626bd275e;hp=94adcb5fd856349b8a2ec52bb56d1de74738257a;hb=98cc9f5ee0e1a448c10dbee264fa8ada8d023e54;hpb=5a4dc24f3a020c36a4171d5448cf8a0f50c91f75 diff --git a/dgit b/dgit index 94adcb5f..b6e79e36 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 $cleanmode = '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; @@ -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"; } @@ -659,11 +668,12 @@ sub fetch_from_archive () { if (defined $dsc_hash) { fail "missing git history even though dsc has hash -". " could not find commit $dsc_hash". - " (should be in ".access_giturl()."#".rref().")" + " (should be in ".access_giturl()."#".rrref().")" unless $upload_hash; $hash = $dsc_hash; ensure_we_have_orig(); - if (is_fast_fwd($dsc_hash,$upload_hash)) { + if ($dsc_hash eq $upload_hash) { + } elsif (is_fast_fwd($dsc_hash,$upload_hash)) { 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): $!"; @@ -1011,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 \`$_'"; } @@ -1033,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) { @@ -1041,6 +1101,12 @@ sub parseopts () { $changesfile = $1; } elsif (s/^-k(.*)//s) { $keyid=$1; + } elsif (s/^-wn//s) { + $cleanmode = 'none'; + } elsif (s/^-wg//s) { + $cleanmode = 'git'; + } elsif (s/^-wd//s) { + $cleanmode = 'dpkg-source'; } else { badusage "unknown short option \`$_'"; }