From 4a3ee5d932a383ee0c00703806f1e0d82fedcce0 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 14:10:38 +0100 Subject: wip new arrangements for clean etc. --- dgit | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/dgit b/dgit index f9c46c0..4792c53 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 $build_use_dpkgbuildpackage = 0; our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); @@ -45,6 +47,7 @@ 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 (@mergechanges) = qw(mergechanges -f); @@ -52,6 +55,7 @@ our %opts_opt_map = ('dget' => \@dget, 'dput' => \@dput, 'debsign' => \@debsign, 'sbuild' => \@sbuild, + 'dpkg-source' => \@dpkgsource, 'dpkg-buildpackage' => \@dpkgbuildpackage, 'mergechanges' => \@mergechanges); @@ -975,10 +979,22 @@ sub cmd_sbuild { $package = getfield $clogp, 'Source'; my $isuite = getfield $clogp, 'Distribution'; my $version = getfield $clogp, 'Version'; - runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)); - chdir ".." or die $!; my $sourcechanges = "${package}_${version}_source.changes"; my $dscfn = dscfn($version); + if ($build_use_dpkgbuildpackage) { + runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)); + } else { + my $pwd = cmdoutput qw(env - pwd); + my $leafdir = basename $pwd; + chdir ".." or die $!; + runcmd_ordryrun @dpkgsource, qw(-b --), $leafdir; + chdir $pwd or die $!; + runcmd_ordryrun qw(sh -ec), + 'exec >$1; shift; exec "$@"','x', + $sourcechanges, + qw(dpkg-genchanges -S); + } + chdir ".." or die $!; my $pat = "${package}_${version}_*.changes"; if (!$dryrun) { stat $dscfn or fail "$dscfn (in parent directory): $!"; -- cgit v1.2.3 From 5616b78952e95f848c30600f23ca34db0bd4148b Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 14:42:02 +0100 Subject: New cleaning arrangements (wip). --- debian/changelog | 6 ++++++ dgit | 61 ++++++++++++++++++++++++++++++++++++++++++++----------- dgit.1 | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 110 insertions(+), 19 deletions(-) diff --git a/debian/changelog b/debian/changelog index 87d00e1..50bcfe9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dgit (0.9) unstable; urgency=low + + * New cleaning arrangements (wip). + + -- + dgit (0.8) unstable; urgency=low * Fix comparison of archive's .dsc's hash and git branch head diff --git a/dgit b/dgit index 4792c53..37b235b 100755 --- a/dgit +++ b/dgit @@ -37,7 +37,7 @@ our $dryrun = 0; our $changesfile; our $new_package = 0; our $existing_package = 'dpkg'; -our $build_use_dpkgbuildpackage = 0; +our $clean = 'dpkg-source'; our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); @@ -48,8 +48,9 @@ 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, @@ -57,6 +58,8 @@ our %opts_opt_map = ('dget' => \@dget, 'sbuild' => \@sbuild, 'dpkg-source' => \@dpkgsource, 'dpkg-buildpackage' => \@dpkgbuildpackage, + 'dpkg-genchanges' => \@dpkggenchanges, + 'ch' => \@changesopts, 'mergechanges' => \@mergechanges); our $keyid; @@ -82,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"; } @@ -958,6 +963,7 @@ sub cmd_push { sub cmd_build { # we pass further options and args to git-buildpackage badusage "-p is not allowed with dgit build" if defined $package; + badusage "dgit build implies --clean=dpkg-source" if defined $package; my $clogp = parsechangelog(); $isuite = getfield $clogp, 'Distribution'; $package = getfield $clogp, 'Source'; @@ -968,22 +974,33 @@ sub cmd_build { canonicalise_suite(); push @cmd, "--git-debian-branch=".lbranch(); } + push @cmd, changesopts(); runcmd_ordryrun @cmd, @ARGV; printdone "build successful\n"; } -sub cmd_sbuild { +our $version; +our $sourcechanges; +our $dscfn; + +sub build_source { check_not_dirty(); - badusage "-p is not allowed with dgit sbuild" if defined $package; + badusage "-p is not allowed with this action" if defined $package; my $clogp = parsechangelog(); $package = getfield $clogp, 'Source'; my $isuite = getfield $clogp, 'Distribution'; - my $version = getfield $clogp, 'Version'; - my $sourcechanges = "${package}_${version}_source.changes"; - my $dscfn = dscfn($version); - if ($build_use_dpkgbuildpackage) { - runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)); + $version = getfield $clogp, 'Version'; + $sourcechanges = "${package}_${version}_source.changes"; + $dscfn = dscfn($version); + if ($cleanmode eq 'dpkg-source') { + runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)), changesopts(); } else { + if ($cleanmode eq 'git') { + runcmd_ordryrun @git, qw(clean -xdf); + } elsif ($cleanmode eq 'none') { + } else { + die "$cleanmode ?"; + } my $pwd = cmdoutput qw(env - pwd); my $leafdir = basename $pwd; chdir ".." or die $!; @@ -992,8 +1009,18 @@ sub cmd_sbuild { runcmd_ordryrun qw(sh -ec), 'exec >$1; shift; exec "$@"','x', $sourcechanges, - qw(dpkg-genchanges -S); + @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 $pat = "${package}_${version}_*.changes"; if (!$dryrun) { @@ -1034,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 \`$_'"; } @@ -1056,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) { diff --git a/dgit.1 b/dgit.1 index 652ffbb..322bc3b 100644 --- a/dgit.1 +++ b/dgit.1 @@ -12,7 +12,7 @@ dgit \- git integration with the Debian archive [\fIsuite\fP] .br .B dgit -[\fIdgit\-opts\fP] \fBbuild\fP|\fBsbuild\fP +[\fIdgit\-opts\fP] \fBbuild\fP|\fBsbuild\fP|\fBbuild-source\fP [\fIbuild\-opts\fp] .br .B dgit @@ -33,9 +33,10 @@ as which lives outside the Debian archive (currently, on Alioth). The usual workflow is: 1. clone or fetch; 2. make and commit changes -in git as desired; 3. run dgit build or dgit sbuild, or generate the -source and binary packages for upload some other way; 4. do -pre-upload tests of the proposed upload; 5. run dgit push. +in git as desired; 3. run dgit build, dgit sbuild or dgit +build-source, or generate the source and binary packages for upload +some other way; 4. do pre-upload tests of the proposed upload; 5. run +dgit push. .TP \fBdgit clone\fR \fIpackage\fP [\fIsuite\fP] [\fB./\fP\fIdir|\fB/\fP\fIdir\fR] Consults the archive and dgit-repos to construct the git view of @@ -86,7 +87,22 @@ with some suitable options. Options and argumments after build will be passed on to git-buildpackage. It is not necessary to use dgit build when using dgit; it is OK to use any approach which ensures that the generated source package corresponds to the relevant git -commit. Tagging and signing should be left to dgit push. +commit. + +.B NB +that this function will be changed in the future to use +dpkg-buildpackage directly. + +Tagging, signing and actually uploading should be left to dgit push. +.TP +\fBdgit build-source\fR ... +Builds the source package, and a changes file for a prospective +source-only upload. The output is left in +.IR package \fB_\fR version \fB.dsc\fR +and +.IR package \fB_\fR version \fB_source.changes\fR. + +Tagging, signing and actually uploading should be left to dgit push. .TP \fBdgit sbuild\fR ... Constructs the source package, and uses sbuild to do a binary @@ -96,6 +112,8 @@ to sbuild. Changes files matching .IB package _ version _*.changes in the parent directory will be removed; the output is left in .IR package \fB_\fR version \fB_multi.changes\fR. + +Tagging, signing and actually uploading should be left to dgit push. .TP .B dgit push Does an `upload', pushing the current HEAD to the archive (as a source @@ -288,6 +306,21 @@ Specifies that we should process source package rather than looking in debian/control or debian/changelog. Valid with dgit fetch and dgit pull, only. .TP +.BR --clean=git | -wg +The source tree should be cleaned, before building a source package +with one of the build options, using +.BR "git clean -xdf" . +This will delete all files which are not tracked by git. +.TP +.BR --clean=none | -wn +Do not clean the tree before building a source package. If there are +files which are not in git, a subsequent dgit push will fail. +.TP +.BR --clean=dpkg-source | -wd +Use dpkg-buildpackage to do the build, so that the source package +is cleaned by dpkg-source running the package's clean target. +This is the default. It requires the package's build dependencies. +.TP .BR -N | --new The package may be new in this suite. Without this, dgit will refuse to push. @@ -300,26 +333,41 @@ more output (currently, up to -DD is meaningfully different). Specifies a git configuration option. dgit itself is also controlled by git configuration options. .TP +.RI \fB-v\fR version |\fB-m\fR maintaineraddress +Passed to dpkg-genchanges (eventually). +.TP +.RI \fB--ch:\fR option +Specifies a single additional option to pass, eventually, to +dpkg-genchanges. +.TP .RI \fB--dget=\fR program |\fB--dput=\fR program |... Specifies alternative programs to use instead of .BR dget , .BR dput , .BR debsign , -.BR dpkg-buildpackage +.BR dpkg-source , +.BR dpkg-buildpackage , +.BR dpkg-genchanges , .BR sbuild , or .BR mergechanges . +This applies only when the program is invoked directly by dgit. .TP .RI \fB--dget:\fR option |\fB--dput:\fR option |... Specifies a single additional option to pass to .BR dget , .BR dput , .BR debsign , -.BR dpkg-buildpackage +.BR dpkg-source , +.BR dpkg-buildpackage , +.BR dpkg-genchanges , .BR sbuild , or .BR mergechanges . Can be repeated as necessary. +This applies only when the program is invoked directly by dgit. +Usually, for passing options to dpkg-genchanges, use +.BR --ch: \fIoption\fR. .TP .BR -d "\fIdistro\fR | " --distro= \fIdistro\fR Specifies that the suite to be operated on is part of distro -- cgit v1.2.3 From 98cc9f5ee0e1a448c10dbee264fa8ada8d023e54 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 16:15:23 +0100 Subject: new cleaning arrangements --- dgit | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dgit b/dgit index 37b235b..b6e79e3 100755 --- a/dgit +++ b/dgit @@ -37,7 +37,7 @@ our $dryrun = 0; our $changesfile; our $new_package = 0; our $existing_package = 'dpkg'; -our $clean = 'dpkg-source'; +our $cleanmode = 'dpkg-source'; our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); @@ -1008,7 +1008,7 @@ sub build_source { chdir $pwd or die $!; runcmd_ordryrun qw(sh -ec), 'exec >$1; shift; exec "$@"','x', - $sourcechanges, + "../$sourcechanges", @dpkggenchanges, qw(-S), changesopts(); } } @@ -1101,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 \`$_'"; } -- cgit v1.2.3 From 9a14c7e93fdf2d2bf0fcfa40209f8c56a5abef8e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 16:15:28 +0100 Subject: new cleaning arrangements --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 50bcfe9..a6e6f51 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,6 @@ dgit (0.9) unstable; urgency=low - * New cleaning arrangements (wip). + * New cleaning arrangements. -- -- cgit v1.2.3 From a5ea919cd9bc80267bb1071b41a90e981ada6032 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 17:47:07 +0100 Subject: More comprehensive workaround for `3.0 (quilt)'. --- debian/changelog | 1 + dgit | 124 ++++++++++++++++++++++++++++++++++++++++++++----------- dgit.1 | 70 +++++++++++++++++-------------- 3 files changed, 139 insertions(+), 56 deletions(-) diff --git a/debian/changelog b/debian/changelog index a6e6f51..a0b54f9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ dgit (0.9) unstable; urgency=low * New cleaning arrangements. + * More comprehensive workaround for `3.0 (quilt)'. -- diff --git a/dgit b/dgit index b6e79e3..df4ea91 100755 --- a/dgit +++ b/dgit @@ -757,24 +757,35 @@ sub check_not_dirty () { } } -sub commit_quilty_patch ($) { - my ($vsn) = @_; +sub commit_quilty_patch () { my $output = cmdoutput @git, qw(status --porcelain); - my %fixups = map {$_=>1} - (".pc/debian-changes-$vsn/","debian/patches/debian-changes-$vsn"); - my @files; + my %adds; + my $bad=0; foreach my $l (split /\n/, $output) { - next unless $l =~ s/^\?\? //; - next unless $fixups{$l}; - push @files, $l; + next unless $l =~ m/\S/; + if ($l =~ m{^\?\? (.pc|debian/patches)}) { + $adds{$1}++; + } else { + print STDERR "git status: $l\n"; + $bad++; + } } - print DEBUG "checking for quilty\n", Dumper(\@files); - if (@files == 2) { - my $m = "Commit Debian 3.0 (quilt) metadata"; - print "$m\n"; - runcmd_ordryrun @git, qw(add), @files; - runcmd_ordryrun @git, qw(commit -m), $m; + fail "unexpected output from git status (is tree clean?)" if $bad; + if (!%adds) { + print "nothing quilty to commit, ok.\n"; + return; } + runcmd_ordryrun @git, qw(add), sort keys %adds; + my $m = "Commit Debian 3.0 (quilt) metadata"; + print "$m\n"; + runcmd_ordryrun @git, qw(commit -m), $m; +} + +sub madformat ($) { + my ($format) = @_; + return 0 unless $format eq '3.0 (quilt)'; + print "Format \`$format', urgh\n"; + return 1; } sub dopush () { @@ -794,9 +805,8 @@ sub dopush () { fail "$dsc is for $dscpackage $dversion". " but debian/changelog is for $package $cversion"; print DEBUG "format $format\n"; - if ($format eq '3.0 (quilt)') { - print "Format \`$format', urgh\n"; - commit_quilty_patch($dversion); + if (madformat($format)) { + commit_quilty_patch(); } check_not_dirty(); prep_ud(); @@ -960,6 +970,68 @@ sub cmd_push { dopush(); } +our $version; +our $sourcechanges; +our $dscfn; + +our $fakeeditorenv = 'DGIT_FAKE_EDITOR_QUILT'; + +sub build_maybe_quilt_fixup () { + if (!open F, "debian/source/format") { + die $! unless $!==&ENOENT; + return; + } + $_ = ; + F->error and die $!; + chomp; + return unless madformat($_); + # sigh + my $headref = rev_parse('HEAD'); + my $time = time; + my $patchname = "auto-$version-$headref-$time"; + my $author = cmdoutput @git, qw(log -n1), '--pretty=format:%an <%ae>'; + my $msg = cmdoutput @git, qw(log -n1), "--pretty=format:%s\n%b"; + my $descfn = ".git/dgit/quilt-description.tmp"; + open O, '>', $descfn or die "$descfn: $!"; + $msg =~ s/\n/\n /g; + $msg =~ s/^\s+$/ ./mg; + print O <', $editing or die "$editing: $!"; + while () { print O or die $!; } I1->error and die $!; + my $copying = 0; + while () { + $copying ||= m/^\-\-\- /; + next unless $copying; + print O or die $!; + } + I2->error and die $!; + close O or die $1; + exit 0; +} + sub cmd_build { # we pass further options and args to git-buildpackage badusage "-p is not allowed with dgit build" if defined $package; @@ -967,6 +1039,8 @@ sub cmd_build { my $clogp = parsechangelog(); $isuite = getfield $clogp, 'Distribution'; $package = getfield $clogp, 'Source'; + $version = getfield $clogp, 'Version'; + build_maybe_quilt_fixup(); my @cmd = (qw(git-buildpackage -us -uc --git-no-sign-tags), "--git-builder=@dpkgbuildpackage"); @@ -979,19 +1053,16 @@ sub cmd_build { printdone "build successful\n"; } -our $version; -our $sourcechanges; -our $dscfn; - sub build_source { - check_not_dirty(); badusage "-p is not allowed with this action" if defined $package; + check_not_dirty(); my $clogp = parsechangelog(); $package = getfield $clogp, 'Source'; my $isuite = getfield $clogp, 'Distribution'; $version = getfield $clogp, 'Version'; $sourcechanges = "${package}_${version}_source.changes"; $dscfn = dscfn($version); + build_maybe_quilt_fixup(); if ($cleanmode eq 'dpkg-source') { runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)), changesopts(); } else { @@ -1041,9 +1112,10 @@ sub cmd_sbuild { } sub cmd_quilt_fixup { - badusage "incorrect arguments to dgit quilt-fixup"; + badusage "incorrect arguments to dgit quilt-fixup" if @ARGV; my $clogp = parsechangelog(); - commit_quilty_patch((getfield $clogp, 'Version')); + $version = getfield $clogp, 'Version'; + build_maybe_quilt_fixup(); } sub parseopts () { @@ -1115,6 +1187,10 @@ sub parseopts () { } } +if ($ENV{$fakeeditorenv}) { + quilt_fixup_editor(); +} + parseopts(); print STDERR "DRY RUN ONLY\n" if $dryrun; if (!@ARGV) { diff --git a/dgit.1 b/dgit.1 index 322bc3b..1abb7ec 100644 --- a/dgit.1 +++ b/dgit.1 @@ -128,12 +128,6 @@ field, runs debsign to sign the upload (.dsc and .changes), pushes the signed tag, and finally uses dput to upload the .changes to the archive. -For a format `3.0 (quilt)' source package, dgit push -may also have to make a commit on your current branch to contain -quilt metadata. It will do this automatically if necessary. -You can explicitly request that dgit do just this -dgit quilt-fixup. - dgit push always uses the package, suite and version specified in the debian/changelog and the .dsc, which must agree. @@ -141,15 +135,12 @@ If dgit push fails while uploading, it is fine to simply retry the dput on the .changes file at your leisure. .TP .B dgit quilt-fixup -Looks to see if there is quilt patch metadata left over by dpkg-source --b, and if so makes a git commit of it. This is normally done -automatically by dgit push. dgit quilt-fixup takes no additional -arguments. Note that it will only process a patch generated by -dpkg-source for the most recent version (according to the -debia/changelog). - -It is not normally necessary to run dgit quilt-fixup explicitly; -where necessary it is done as part of dgit push. +Looks to see if the tree is one which dpkg-source cannot properly +represent. If it isn't, dgit will fix it up for you (in quilt terms, +by making a new debian/ patch containing your unquilty changes) and +make a commit of the changes it has made. + +This is normally done automatically by dgit build and dgit push. .SH WORKFLOW - SIMPLE It is always possible with dgit to clone or fetch a package, make changes in git (using git-commit) on the suite branch @@ -274,15 +265,34 @@ in git and a fast-forwarding release branch; or you could do your work directly in a merging way on the .BI dgit/ suite branches. If you do this you should probably use a `1.0' format -source package. In the archive, the delta between upstream will be -represented in the single Debian patch. - -Secondly, you can regard your quiltish patch stack in the archive as -primary. You will have to use other tools besides dgit to import and -export this patch stack. For `3.0 (quilt)' packages, dgit has to do -more work to work around some braindamage in way dpkg-source handles -changes made to this format. See also the BUGS section. We recommend -against the use of `3.0 (quilt)'. +source package if you can. In the archive, the delta between upstream +will be represented in the single Debian patch. + +Secondly, you can use `3.0 (quilt)', and regard your quiltish patch +stack in the archive as primary. You will have to use other tools +besides dgit to import and export this patch stack. But see below: +.SH FORMAT 3.0 (QUILT) +For a format `3.0 (quilt)' source package, dgit may have to make a +commit on your current branch to contain metadata used by quilt and +dpkg-source. + +This is because (i) the `3.0 (quilt)' source format cannot represent +certain trees, and (ii) packing up a tree in `3.0 (quilt)' and then +unpacking it does not always yield the same tree. Instead, +dpkg-source insists on the trees having extra quilty metadata and +patch files in the debian/ and .pc/ directories, which dpkg-source +sometimes modifies. + +dgit will automatically work around this braindamage for you when +building and pushing. The only thing you need to know is that dgit +build, sbuild, etc., may make a new commit on your HEAD. If you're +not a quilt user this commit won't contain any changes to files you +care about. + +You can explicitly request that dgit do just this fixup, by running +dgit quilt-fixup. + +We recommend against the use of `3.0 (quilt)'. .SH OPTIONS .TP .BR --dry-run | -n @@ -513,14 +523,10 @@ the .orig.tar.gz could be transported via the git repo as git tags. Doing this is made more complicated by the possibility of a `3.0 (quilt)' package with multiple .orig tarballs. -`3.0 (quilt)' packages have an additional difficulty: if these are -edited in the most normal way, and then fed to dpkg-buildpackage, -dpkg-source will add extra quilt patch metadata to the source tree -during the source package build. This extra metadata is then of -course not included in the git history. So dgit push needs to commit -it for you, to make sure that the git history and archive contents are -identical. That this is necessary is a bug in the `3.0 (quilt)' -format. +dgit's build functions, and dgit push, should not make any changes to +your current HEAD. Sadly this is necessary for packages in the `3.0 +(quilt)' source format. This is ultimately due to design problems in +quilt and dpkg-source. There should be an option which arranges for the `3.0 (quilt)' autocommit to not appear on your HEAD, but instead only in the -- cgit v1.2.3 From 66f4ccc0e2c6667ce720cdd74806b0397f104154 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:01:30 +0100 Subject: In push, double-check the .changes against the changelog. --- debian/changelog | 1 + dgit | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index a0b54f9..aa06a7f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,7 @@ dgit (0.9) unstable; urgency=low * New cleaning arrangements. * More comprehensive workaround for `3.0 (quilt)'. + * In push, double-check the .changes against the changelog. -- diff --git a/dgit b/dgit index df4ea91..6665298 100755 --- a/dgit +++ b/dgit @@ -849,6 +849,11 @@ sub dopush () { ($changesfile) = @cs; } } + my $changes = parsecontrol($changesfile,$changesfile); + foreach my $field (qw(Source Distribution Version)) { + $changes->{$field} eq $clogp->{$field} or + fail "changes field $field \`$changes->{$field}'" + " does not match changelog \`$clogp->{$field}'"; my $tag = debiantag($dversion); if (!check_for_git()) { create_remote_git_repo(); -- cgit v1.2.3 From c469abf955290d0eb901b503c6e6c9433b309706 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:01:52 +0100 Subject: typo --- dgit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dgit b/dgit index 6665298..ff6956e 100755 --- a/dgit +++ b/dgit @@ -852,7 +852,7 @@ sub dopush () { my $changes = parsecontrol($changesfile,$changesfile); foreach my $field (qw(Source Distribution Version)) { $changes->{$field} eq $clogp->{$field} or - fail "changes field $field \`$changes->{$field}'" + fail "changes field $field \`$changes->{$field}'". " does not match changelog \`$clogp->{$field}'"; my $tag = debiantag($dversion); if (!check_for_git()) { -- cgit v1.2.3 From 7b420a182b9f3ee9295997bfea192b7db5609ffe Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:02:07 +0100 Subject: typo --- dgit | 1 + 1 file changed, 1 insertion(+) diff --git a/dgit b/dgit index ff6956e..406589a 100755 --- a/dgit +++ b/dgit @@ -854,6 +854,7 @@ sub dopush () { $changes->{$field} eq $clogp->{$field} or fail "changes field $field \`$changes->{$field}'". " does not match changelog \`$clogp->{$field}'"; + } my $tag = debiantag($dversion); if (!check_for_git()) { create_remote_git_repo(); -- cgit v1.2.3 From 7cc77250e68bee4283757b7516e0a70f77904086 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:06:55 +0100 Subject: fix bug which causes all uploads to go to sid (!) --- dgit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dgit b/dgit index 406589a..2d47dbf 100755 --- a/dgit +++ b/dgit @@ -1064,7 +1064,7 @@ sub build_source { check_not_dirty(); my $clogp = parsechangelog(); $package = getfield $clogp, 'Source'; - my $isuite = getfield $clogp, 'Distribution'; + $isuite = getfield $clogp, 'Distribution'; $version = getfield $clogp, 'Version'; $sourcechanges = "${package}_${version}_source.changes"; $dscfn = dscfn($version); -- cgit v1.2.3 From 10eb7774037c99711c6f8ca70b3ccfce7215b08e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:12:52 +0100 Subject: Better error when source package contains .git. Closes: #720555. --- debian/changelog | 1 + dgit | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index aa06a7f..ac43643 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ dgit (0.9) unstable; urgency=low * New cleaning arrangements. * More comprehensive workaround for `3.0 (quilt)'. * In push, double-check the .changes against the changelog. + * Better error when source package contains .git. Closes: #720555. -- diff --git a/dgit b/dgit index 2d47dbf..645528f 100755 --- a/dgit +++ b/dgit @@ -488,7 +488,7 @@ sub mktree_in_ud_from_only_subdir () { $dirs[0] =~ m#^([^/]+)/\.$# or die; my $dir = $1; chdir $dir or die "$dir $!"; - die if stat '.git'; + fail "source package contains .git directory" if stat '.git'; die $! unless $!==&ENOENT; runcmd qw(git init -q); rmtree('.git/objects'); -- cgit v1.2.3 From bf80f80d5ee38317cff7624dd9b53633e82fccda Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:15:46 +0100 Subject: Change our .dsc field name to `Dgit'. Relevant to #720201. --- debian/changelog | 1 + dgit | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index ac43643..910c34d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,7 @@ dgit (0.9) unstable; urgency=low * More comprehensive workaround for `3.0 (quilt)'. * In push, double-check the .changes against the changelog. * Better error when source package contains .git. Closes: #720555. + * Change our .dsc field name to `Dgit'. Relevant to #720201. -- diff --git a/dgit b/dgit index 645528f..3e7bffc 100755 --- a/dgit +++ b/dgit @@ -68,7 +68,7 @@ our $debug = 0; open DEBUG, ">/dev/null" or die $!; our $remotename = 'dgit'; -our $ourdscfield = 'Vcs-Dgit-Master'; +our @ourdscfield = qw(Dgit Vcs-Dgit-Master); our $branchprefix = 'dgit'; our $csuite; @@ -644,7 +644,10 @@ sub fetch_from_archive () { # ensures that lrref() is what is actually in the archive, # one way or another get_archive_dsc() or return 0; - $dsc_hash = $dsc->{$ourdscfield}; + foreach my $field (@ourdscfield) { + $dsc_hash = $dsc->{$ourdscfield}; + last if defined $dsc_hash; + } if (defined $dsc_hash) { $dsc_hash =~ m/\w+/ or fail "invalid hash in .dsc \`$dsc_hash'"; $dsc_hash = $&; @@ -832,7 +835,7 @@ sub dopush () { # runcmd @git, qw(fetch -p ), "$alioth_git/$package.git", # map { lref($_).":".rref($_) } # (uploadbranch()); - $dsc->{$ourdscfield} = rev_parse('HEAD'); + $dsc->{$ourdscfield[0]} = rev_parse('HEAD'); $dsc->save("../$dscfn.tmp") or die $!; if (!$changesfile) { my $multi = "../${package}_${cversion}_multi.changes"; -- cgit v1.2.3 From 284bf2a83349df4c867642257da14b0d303bbb5f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:16:58 +0100 Subject: fix typo --- dgit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dgit b/dgit index 3e7bffc..88f018d 100755 --- a/dgit +++ b/dgit @@ -645,7 +645,7 @@ sub fetch_from_archive () { # one way or another get_archive_dsc() or return 0; foreach my $field (@ourdscfield) { - $dsc_hash = $dsc->{$ourdscfield}; + $dsc_hash = $dsc->{$field}; last if defined $dsc_hash; } if (defined $dsc_hash) { -- cgit v1.2.3 From fddfa627cb0ced08188eec1711039e4614a16de7 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:37:23 +0100 Subject: Fix bug handling our synthetic merges when we see them in the remote suite branch. --- debian/changelog | 2 ++ dgit | 9 +++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/debian/changelog b/debian/changelog index 910c34d..84cf7de 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,8 @@ dgit (0.9) unstable; urgency=low * In push, double-check the .changes against the changelog. * Better error when source package contains .git. Closes: #720555. * Change our .dsc field name to `Dgit'. Relevant to #720201. + * Fix bug handling our synthetic merges when we see them in + the remote suite branch. -- diff --git a/dgit b/dgit index 88f018d..c0c7b8d 100755 --- a/dgit +++ b/dgit @@ -591,12 +591,9 @@ Last allegedly pushed/uploaded: $oversion (newer or same) $later_warning_msg END $outputhash = $upload_hash; - } elsif ($outputhash ne $upload_hash) { - fail "version in archive ($cversion)". - " is same as version in git". - " to-be-uploaded (upload/) branch ($oversion)". - " but archive version hash no commit hash?!"; - } + } else { + $outputhash = $upload_hash; + } } chdir '../../../..' or die $!; runcmd @git, qw(update-ref -m),"dgit fetch import $cversion", -- cgit v1.2.3 From dc3ada23508f1c40692e15fcb0cf5e06fd541104 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:44:49 +0100 Subject: `3.0 (quilt)' fixup creates .pc/applied-patches since modern dpkg-source creates it even though old ones didn't always. --- debian/changelog | 2 ++ dgit | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index 84cf7de..b1a7cc5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,6 +7,8 @@ dgit (0.9) unstable; urgency=low * Change our .dsc field name to `Dgit'. Relevant to #720201. * Fix bug handling our synthetic merges when we see them in the remote suite branch. + * `3.0 (quilt)' fixup creates .pc/applied-patches since modern + dpkg-source creates it even though old ones didn't always. -- diff --git a/dgit b/dgit index c0c7b8d..3f9dd97 100755 --- a/dgit +++ b/dgit @@ -1016,6 +1016,13 @@ END local $ENV{$fakeeditorenv} = cmdoutput qw(realpath --), $descfn; runcmd_ordryrun @dpkgsource, qw(--commit .), $patchname; } + + if (!open P, '>', ".pc/applied-patches") { + $!==&ENOENT or die $!; + } else { + close P; + } + commit_quilty_patch(); } -- cgit v1.2.3 From b775be20ea45f5cb75d0acc6a6bb86f64e62365f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Aug 2013 18:49:08 +0100 Subject: finalise 0.9 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index b1a7cc5..d381fc3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,7 +10,7 @@ dgit (0.9) unstable; urgency=low * `3.0 (quilt)' fixup creates .pc/applied-patches since modern dpkg-source creates it even though old ones didn't always. - -- + -- Ian Jackson Sat, 24 Aug 2013 18:49:02 +0100 dgit (0.8) unstable; urgency=low -- cgit v1.2.3 From 21c8966d8c2a930f7ead1fd417b11a9606b8a859 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 00:52:53 +0100 Subject: Create .pc/applied-patches - do not empty it (!) --- debian/changelog | 6 ++++++ dgit | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index d381fc3..dee9276 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dgit (0.10) unstable; urgency=low + + * Create .pc/applied-patches - do not empty it (!) + + -- Ian Jackson Sun, 25 Aug 2013 00:51:50 +0100 + dgit (0.9) unstable; urgency=low * New cleaning arrangements. diff --git a/dgit b/dgit index 3f9dd97..7352371 100755 --- a/dgit +++ b/dgit @@ -1017,7 +1017,7 @@ END runcmd_ordryrun @dpkgsource, qw(--commit .), $patchname; } - if (!open P, '>', ".pc/applied-patches") { + if (!open P, '>>', ".pc/applied-patches") { $!==&ENOENT or die $!; } else { close P; -- cgit v1.2.3 From e52f5e192421e79c6d59f33bc1dcd40272e7e91b Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 15:42:28 +0100 Subject: Use "ftp.debian.org" not "http.debian.net" as the default Debian archive. (http.debian.net tends to defeat certain kinds of cacheing, and can also have more skew.) --- debian/changelog | 8 ++++++++ dgit | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index dee9276..1e14862 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +dgit (0.11) unstable; urgency=low + + * Use "ftp.debian.org" not "http.debian.net" as the default Debian + archive. (http.debian.net tends to defeat certain kinds of cacheing, + and can also have more skew.) + + -- + dgit (0.10) unstable; urgency=low * Create .pc/applied-patches - do not empty it (!) diff --git a/dgit b/dgit index 7352371..d2a52f6 100755 --- a/dgit +++ b/dgit @@ -236,7 +236,7 @@ our %defcfg = ('dgit.default.distro' => 'debian', '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/'); + 'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/'); sub cfg { foreach my $c (@_) { -- cgit v1.2.3 From afd3aa8b36b05f6cf01b17d553fc14250afacaec Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 15:57:51 +0100 Subject: Fix bug which would make quilt patch fixup fail if git status produced "M" lines. --- debian/changelog | 2 ++ dgit | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 1e14862..66f74cf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,7 @@ dgit (0.11) unstable; urgency=low + * Fix bug which would make quilt patch fixup fail if git status + produced "M" lines. * Use "ftp.debian.org" not "http.debian.net" as the default Debian archive. (http.debian.net tends to defeat certain kinds of cacheing, and can also have more skew.) diff --git a/dgit b/dgit index d2a52f6..878065f 100755 --- a/dgit +++ b/dgit @@ -763,7 +763,7 @@ sub commit_quilty_patch () { my $bad=0; foreach my $l (split /\n/, $output) { next unless $l =~ m/\S/; - if ($l =~ m{^\?\? (.pc|debian/patches)}) { + if ($l =~ m{^(?:\?\?| M) (.pc|debian/patches)}) { $adds{$1}++; } else { print STDERR "git status: $l\n"; -- cgit v1.2.3 From dac79ba60f22d978a2b3f834358c7f865bcf131a Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 15:59:56 +0100 Subject: Autogenerated quilt patch fixup patch Description contains several recent git commits, rather than implying that the patch corresponds exactly to the top git commit. --- debian/changelog | 3 +++ dgit | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 66f74cf..fea5595 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,9 @@ dgit (0.11) unstable; urgency=low * Fix bug which would make quilt patch fixup fail if git status produced "M" lines. + * Autogenerated quilt patch fixup patch Description contains several + recent git commits, rather than implying that the patch corresponds + exactly to the top git commit. * Use "ftp.debian.org" not "http.debian.net" as the default Debian archive. (http.debian.net tends to defeat certain kinds of cacheing, and can also have more skew.) diff --git a/dgit b/dgit index 878065f..0adf302 100755 --- a/dgit +++ b/dgit @@ -992,18 +992,23 @@ sub build_maybe_quilt_fixup () { chomp; return unless madformat($_); # sigh + my $clogp = parsechangelog(); + my $version = getfield $clogp, 'Version'; + my $author = getfield $clogp, 'Maintainer'; my $headref = rev_parse('HEAD'); my $time = time; + my $ncommits = 3; my $patchname = "auto-$version-$headref-$time"; - my $author = cmdoutput @git, qw(log -n1), '--pretty=format:%an <%ae>'; - my $msg = cmdoutput @git, qw(log -n1), "--pretty=format:%s\n%b"; + my $msg = cmdoutput @git, qw(log), "-n$ncommits"; my $descfn = ".git/dgit/quilt-description.tmp"; open O, '>', $descfn or die "$descfn: $!"; $msg =~ s/\n/\n /g; $msg =~ s/^\s+$/ ./mg; print O <{Version}) + Last (up to) $ncommits git changes, FYI: + . + $msg Author: $author --- -- cgit v1.2.3 From 7c379b92923ec62699b0943831c9085c2e8e1821 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:02:25 +0100 Subject: Location of dgit-repos is now git.debian.org:/git/dgit-repos/repos. Closes: #720525. The rename on the server side will break older versions of dgit. --- debian/changelog | 3 +++ dgit | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index fea5595..7261108 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,8 @@ dgit (0.11) unstable; urgency=low + * Location of dgit-repos is now git.debian.org:/git/dgit-repos/repos. + Closes: #720525. The rename on the server side will break older + versions of dgit. * Fix bug which would make quilt patch fixup fail if git status produced "M" lines. * Autogenerated quilt patch fixup patch Description contains several diff --git a/dgit b/dgit index 0adf302..77a9bb6 100755 --- a/dgit +++ b/dgit @@ -230,7 +230,7 @@ our %defcfg = ('dgit.default.distro' => 'debian', '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-path' => '/git/dgit-repos/repos', 'dgit-distro.debian.git-check' => 'ssh-cmd', 'dgit-distro.debian.git-create' => 'ssh-cmd', 'dgit-distro.debian.sshdakls-host' => 'coccia.debian.org', -- cgit v1.2.3 From a17b1a3b36a31ac8def26e0a5aeca865873c9374 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:13:36 +0100 Subject: Better error message for use of UNRELEASED suite. Closes: #720523. --- debian/changelog | 2 ++ dgit | 2 ++ 2 files changed, 4 insertions(+) diff --git a/debian/changelog b/debian/changelog index 7261108..58de63a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -11,6 +11,8 @@ dgit (0.11) unstable; urgency=low * Use "ftp.debian.org" not "http.debian.net" as the default Debian archive. (http.debian.net tends to defeat certain kinds of cacheing, and can also have more skew.) + * Better error message for use of UNRELEASED suite. Closes: #720523. + * Do not canonicalise suite more than once. Related to: #720526. -- diff --git a/dgit b/dgit index 77a9bb6..55c2b24 100755 --- a/dgit +++ b/dgit @@ -415,6 +415,8 @@ sub canonicalise_suite_madison ($$) { } sub canonicalise_suite () { + return if defined $csuite; + fail "cannot operate on $isuite suite" if $isuite eq 'UNRELEASED'; $csuite = archive_query('canonicalise_suite'); if ($isuite ne $csuite) { # madison canonicalises for us -- cgit v1.2.3 From 137c52ea5d2df0b07c30420697297032842407f4 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:17:22 +0100 Subject: Fix a badly open-coded copy of check_not_dirty. Closes: #720524. --- debian/changelog | 1 + dgit | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 58de63a..cdcf9ec 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,6 +13,7 @@ dgit (0.11) unstable; urgency=low and can also have more skew.) * Better error message for use of UNRELEASED suite. Closes: #720523. * Do not canonicalise suite more than once. Related to: #720526. + * Fix a badly open-coded copy of check_not_dirty. Closes: #720524. -- diff --git a/dgit b/dgit index 55c2b24..693aa18 100755 --- a/dgit +++ b/dgit @@ -953,7 +953,7 @@ sub cmd_pull { sub cmd_push { parseopts(); badusage "-p is not allowed with dgit push" if defined $package; - runcmd @git, qw(diff --quiet HEAD); + check_not_dirty(); my $clogp = parsechangelog(); $package = getfield $clogp, 'Source'; if (@ARGV==0) { -- cgit v1.2.3 From 69c5b89e545bb8276b1bb20f399b8df75607d868 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:21:54 +0100 Subject: Introduce build_prep subroutine and use it where appropriate --- debian/changelog | 2 ++ dgit | 20 +++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/debian/changelog b/debian/changelog index cdcf9ec..5d32b0c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,6 +14,8 @@ dgit (0.11) unstable; urgency=low * Better error message for use of UNRELEASED suite. Closes: #720523. * Do not canonicalise suite more than once. Related to: #720526. * Fix a badly open-coded copy of check_not_dirty. Closes: #720524. + * Fix some bugs in building (eg build-source would fail to do the quilt + fixup). -- diff --git a/dgit b/dgit index 693aa18..1db2cdb 100755 --- a/dgit +++ b/dgit @@ -1052,15 +1052,19 @@ sub quilt_fixup_editor () { exit 0; } -sub cmd_build { - # we pass further options and args to git-buildpackage - badusage "-p is not allowed with dgit build" if defined $package; - badusage "dgit build implies --clean=dpkg-source" if defined $package; +sub build_prep () { + badusage "-p is not allowed when building" if defined $package; + check_not_dirty(); my $clogp = parsechangelog(); $isuite = getfield $clogp, 'Distribution'; $package = getfield $clogp, 'Source'; $version = getfield $clogp, 'Version'; build_maybe_quilt_fixup(); +} + +sub cmd_build { + badusage "dgit build implies --clean=dpkg-source" if defined $package; + build_prep(); my @cmd = (qw(git-buildpackage -us -uc --git-no-sign-tags), "--git-builder=@dpkgbuildpackage"); @@ -1074,15 +1078,9 @@ sub cmd_build { } sub build_source { - badusage "-p is not allowed with this action" if defined $package; - check_not_dirty(); - my $clogp = parsechangelog(); - $package = getfield $clogp, 'Source'; - $isuite = getfield $clogp, 'Distribution'; - $version = getfield $clogp, 'Version'; + build_prep(); $sourcechanges = "${package}_${version}_source.changes"; $dscfn = dscfn($version); - build_maybe_quilt_fixup(); if ($cleanmode eq 'dpkg-source') { runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)), changesopts(); } else { -- cgit v1.2.3 From fcfb9c26e444f643f44789618d1f1ebc25429ac4 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:28:54 +0100 Subject: dgit build uses dpkg-buildpackage --- debian/changelog | 4 +++- dgit | 11 ++++++++++- dgit.1 | 29 ++++++++++++++++++----------- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/debian/changelog b/debian/changelog index 5d32b0c..f3bce71 100644 --- a/debian/changelog +++ b/debian/changelog @@ -11,11 +11,13 @@ dgit (0.11) unstable; urgency=low * Use "ftp.debian.org" not "http.debian.net" as the default Debian archive. (http.debian.net tends to defeat certain kinds of cacheing, and can also have more skew.) + * dgit build uses dpkg-buildpackage; there is a dgit git-build + for using git-buildpackage. * Better error message for use of UNRELEASED suite. Closes: #720523. * Do not canonicalise suite more than once. Related to: #720526. * Fix a badly open-coded copy of check_not_dirty. Closes: #720524. * Fix some bugs in building (eg build-source would fail to do the quilt - fixup). + fixup; the --clean check in build was wrong). -- diff --git a/dgit b/dgit index 1db2cdb..03542c3 100755 --- a/dgit +++ b/dgit @@ -1063,7 +1063,16 @@ sub build_prep () { } sub cmd_build { - badusage "dgit build implies --clean=dpkg-source" if defined $package; + badusage "dgit build implies --clean=dpkg-source" + if $clean ne 'dpkg-source'; + build_prep(); + runcmd_ordryrun @dpkgbuildpackage, qw(-us -uc), changesopts(), @ARGV; + printdone "build successful\n"; +} + +sub cmd_git_build { + badusage "dgit git-build implies --clean=dpkg-source" + if $clean ne 'dpkg-source'; build_prep(); my @cmd = (qw(git-buildpackage -us -uc --git-no-sign-tags), diff --git a/dgit.1 b/dgit.1 index 1abb7ec..9740856 100644 --- a/dgit.1 +++ b/dgit.1 @@ -82,22 +82,20 @@ into the current branch. .TP \fBdgit build\fR ... Runs -.B git-buildpackage +.B dpkg-buildpackage with some suitable options. Options and argumments after build -will be passed on to git-buildpackage. It is not necessary to use +will be passed on to dpkg-buildpackage. It is not necessary to use dgit build when using dgit; it is OK to use any approach which ensures that the generated source package corresponds to the relevant git commit. -.B NB -that this function will be changed in the future to use -dpkg-buildpackage directly. - Tagging, signing and actually uploading should be left to dgit push. .TP \fBdgit build-source\fR ... Builds the source package, and a changes file for a prospective -source-only upload. The output is left in +source-only upload, using +.BR dpkg-source . +The output is left in .IR package \fB_\fR version \fB.dsc\fR and .IR package \fB_\fR version \fB_source.changes\fR. @@ -105,14 +103,23 @@ and Tagging, signing and actually uploading should be left to dgit push. .TP \fBdgit sbuild\fR ... -Constructs the source package, and uses sbuild to do a binary -build, and uses mergechanges to merge the source and binary -changes files. Options and argumments after sbuild will be passed on -to sbuild. Changes files matching +Constructs the source package, uses +.B sbuild +to do a binary build, and uses mergechanges to merge the source and +binary changes files. Options and argumments after sbuild will be +passed on to sbuild. Changes files matching .IB package _ version _*.changes in the parent directory will be removed; the output is left in .IR package \fB_\fR version \fB_multi.changes\fR. +Tagging, signing and actually uploading should be left to dgit push. +.TP +\fBdgit git-build\fR ... +Runs +.B git-buildpackage +with some suitable options. Options and argumments after git-build +will be passed on to git-buildpackage. + Tagging, signing and actually uploading should be left to dgit push. .TP .B dgit push -- cgit v1.2.3 From 3759f1f708f46004df69810a4c7e07714bf00ecc Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:29:34 +0100 Subject: typo fixes --- dgit | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dgit b/dgit index 03542c3..3cb4780 100755 --- a/dgit +++ b/dgit @@ -1064,7 +1064,7 @@ sub build_prep () { sub cmd_build { badusage "dgit build implies --clean=dpkg-source" - if $clean ne 'dpkg-source'; + if $cleanmode ne 'dpkg-source'; build_prep(); runcmd_ordryrun @dpkgbuildpackage, qw(-us -uc), changesopts(), @ARGV; printdone "build successful\n"; @@ -1072,7 +1072,7 @@ sub cmd_build { sub cmd_git_build { badusage "dgit git-build implies --clean=dpkg-source" - if $clean ne 'dpkg-source'; + if $cleanmode ne 'dpkg-source'; build_prep(); my @cmd = (qw(git-buildpackage -us -uc --git-no-sign-tags), -- cgit v1.2.3 From 7fcdc620e03319f71e8516c6f4ab5f322c69c82b Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:34:06 +0100 Subject: Add missing dependency on realpath. --- debian/changelog | 1 + debian/control | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index f3bce71..e67bfe8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,6 +18,7 @@ dgit (0.11) unstable; urgency=low * Fix a badly open-coded copy of check_not_dirty. Closes: #720524. * Fix some bugs in building (eg build-source would fail to do the quilt fixup; the --clean check in build was wrong). + * Add missing dependency on realpath. -- diff --git a/debian/control b/debian/control index 258cc23..7a389aa 100644 --- a/debian/control +++ b/debian/control @@ -7,7 +7,7 @@ Build-Depends: debhelper (>= 9) Package: dgit Depends: perl, libwww-perl, libdpkg-perl, git-core, devscripts, dpkg-dev, - ${misc:Depends} + ${misc:Depends}, realpath Recommends: ssh-client Suggests: sbuild Architecture: all -- cgit v1.2.3 From b1f6740e928e0deeb680b12a59d5b12899063320 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 16:56:08 +0100 Subject: git-build (git-buildpackage wrapper) does not bother canonicalising the suite if --git-ignore-branch is used. --- debian/changelog | 2 ++ dgit | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index e67bfe8..cb21861 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,6 +19,8 @@ dgit (0.11) unstable; urgency=low * Fix some bugs in building (eg build-source would fail to do the quilt fixup; the --clean check in build was wrong). * Add missing dependency on realpath. + * git-build (git-buildpackage wrapper) does not bother canonicalising + the suite if --git-ignore-branch is used. -- diff --git a/dgit b/dgit index 3cb4780..892cde2 100755 --- a/dgit +++ b/dgit @@ -1077,7 +1077,7 @@ sub cmd_git_build { my @cmd = (qw(git-buildpackage -us -uc --git-no-sign-tags), "--git-builder=@dpkgbuildpackage"); - unless (grep { m/^--git-debian-branch/ } @ARGV) { + unless (grep { m/^--git-debian-branch|^--git-ignore-branch/ } @ARGV) { canonicalise_suite(); push @cmd, "--git-debian-branch=".lbranch(); } -- cgit v1.2.3 From 6c76888733aa16153f6490fdf44569f54d316c74 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 25 Aug 2013 17:00:54 +0100 Subject: finalise 0.11 --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index cb21861..e598253 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,7 +22,7 @@ dgit (0.11) unstable; urgency=low * git-build (git-buildpackage wrapper) does not bother canonicalising the suite if --git-ignore-branch is used. - -- + -- Ian Jackson Sun, 25 Aug 2013 17:00:43 +0100 dgit (0.10) unstable; urgency=low -- cgit v1.2.3 From e747d8e856580cd60f4506102560ad16f5f86f8c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 Aug 2013 16:18:26 +0100 Subject: Cope with packages with epoch. Closes: #720897. --- debian/changelog | 6 ++++++ dgit | 23 ++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/debian/changelog b/debian/changelog index e598253..73efd15 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dgit (0.12) unstable; urgency=low + + * Cope with packages with epoch. Closes: #720897. + + -- + dgit (0.11) unstable; urgency=low * Location of dgit-repos is now git.debian.org:/git/dgit-repos/repos. diff --git a/dgit b/dgit index 892cde2..a8077a8 100755 --- a/dgit +++ b/dgit @@ -83,7 +83,16 @@ sub debiantag ($) { return "debian/$v"; } -sub dscfn ($) { return "${package}_$_[0].dsc"; } +sub stripepoch ($) { + my ($vsn) = @_; + $vsn =~ s/^\d+\://; + return $vsn; +} + +sub dscfn ($) { + my ($vsn) = @_; + return "${package}_".(stripepoch $vsn).".dsc"; +} sub changesopts () { return @changesopts[1..$#changesopts]; } @@ -399,7 +408,7 @@ sub madison_parse ($) { } $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"; + my $subpath = "/pool/$component/$prefix/$package/".dscfn($vsn); push @out, [$vsn,$subpath,$newsuite]; } return sort { -version_compare_string($a->[0],$b->[0]); } @out; @@ -837,12 +846,12 @@ sub dopush () { $dsc->{$ourdscfield[0]} = rev_parse('HEAD'); $dsc->save("../$dscfn.tmp") or die $!; if (!$changesfile) { - my $multi = "../${package}_${cversion}_multi.changes"; + my $multi = "../${package}_".(stripepoch $cversion)."_multi.changes"; if (stat "$multi") { $changesfile = $multi; } else { $!==&ENOENT or die "$multi: $!"; - my $pat = "${package}_${cversion}_*.changes"; + my $pat = "${package}_".(stripepoch $cversion)."_*.changes"; my @cs = glob "../$pat"; fail "failed to find unique changes file". " (looked for $pat in .., or $multi);". @@ -1088,7 +1097,7 @@ sub cmd_git_build { sub build_source { build_prep(); - $sourcechanges = "${package}_${version}_source.changes"; + $sourcechanges = "${package}_".(stripepoch $version)."_source.changes"; $dscfn = dscfn($version); if ($cleanmode eq 'dpkg-source') { runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)), changesopts(); @@ -1120,7 +1129,7 @@ sub cmd_build_source { sub cmd_sbuild { build_source(); chdir ".." or die $!; - my $pat = "${package}_${version}_*.changes"; + my $pat = "${package}_".(stripepoch $version)."_*.changes"; if (!$dryrun) { stat $dscfn or fail "$dscfn (in parent directory): $!"; stat $sourcechanges or fail "$sourcechanges (in parent directory): $!"; @@ -1131,7 +1140,7 @@ sub cmd_sbuild { } runcmd_ordryrun @sbuild, @ARGV, qw(-d), $isuite, $dscfn; runcmd_ordryrun @mergechanges, glob $pat; - my $multichanges = "${package}_${version}_multi.changes"; + my $multichanges = "${package}_".(stripepoch $version)."_multi.changes"; if (!$dryrun) { stat $multichanges or fail "$multichanges: $!"; } -- cgit v1.2.3 From 11af4ca5c08cf0b6fc8fa211640be6aa119917d6 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 Aug 2013 16:19:35 +0100 Subject: Add Closes line for #720595 to changelog entry for 0.11. for using git-buildpackage. Closes: #720595. --- debian/changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 73efd15..d550745 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ dgit (0.12) unstable; urgency=low * Cope with packages with epoch. Closes: #720897. + * Add Closes line for #720595 to changelog entry for 0.11. -- @@ -18,7 +19,7 @@ dgit (0.11) unstable; urgency=low archive. (http.debian.net tends to defeat certain kinds of cacheing, and can also have more skew.) * dgit build uses dpkg-buildpackage; there is a dgit git-build - for using git-buildpackage. + for using git-buildpackage. Closes: #720595. * Better error message for use of UNRELEASED suite. Closes: #720523. * Do not canonicalise suite more than once. Related to: #720526. * Fix a badly open-coded copy of check_not_dirty. Closes: #720524. -- cgit v1.2.3 From 2c84b46d621bb5908bbfc64b9fcb12c30ab6b4a2 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 Aug 2013 16:35:58 +0100 Subject: is_fast_fwd simply returns false if no common history (pursuant to #720896) --- dgit | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dgit b/dgit index a8077a8..f582be0 100755 --- a/dgit +++ b/dgit @@ -639,8 +639,14 @@ sub rev_parse ($) { sub is_fast_fwd ($$) { my ($ancestor,$child) = @_; - my $mb = cmdoutput @git, qw(merge-base), $ancestor, $child; - return rev_parse($mb) eq rev_parse($ancestor); + my @cmd = (@git, qw(merge-base), $ancestor, $child); + my $mb = cmdoutput_errok @cmd; + if (defined $mb) { + return rev_parse($mb) eq rev_parse($ancestor); + } else { + $?==256 or failedcmd @cmd; + return 0; + } } sub git_fetch_us () { -- cgit v1.2.3 From d833b697cbd9e0b743b79242209c78651845f559 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 Aug 2013 16:36:23 +0100 Subject: Improve error message for non-fast-forward push. Closes: #720896. --- debian/changelog | 1 + dgit | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index d550745..a30e469 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,7 @@ dgit (0.12) unstable; urgency=low * Cope with packages with epoch. Closes: #720897. * Add Closes line for #720595 to changelog entry for 0.11. + * Improve error message for non-fast-forward push. Closes: #720896. -- diff --git a/dgit b/dgit index f582be0..71b0423 100755 --- a/dgit +++ b/dgit @@ -984,7 +984,10 @@ sub cmd_push { git_fetch_us(); } if (fetch_from_archive()) { - is_fast_fwd(lrref(), 'HEAD') or die; + is_fast_fwd(lrref(), 'HEAD') or + fail "dgit push: HEAD is not a descendant". + " of the archive's version.\n". + "$us: To overwrite it, use git-merge -s ours ".lrref()."."; } else { $new_package or fail "package appears to be new in this suite;". -- cgit v1.2.3 From 7cf634614b9a4ee18a70030e3b340dccd470f908 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 Aug 2013 16:44:47 +0100 Subject: New --ignore-dirty option to skip noncritical check. Closes: #720895. --- debian/changelog | 1 + dgit | 4 ++++ dgit.1 | 10 ++++++++++ 3 files changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index a30e469..0f1cff7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ dgit (0.12) unstable; urgency=low * Cope with packages with epoch. Closes: #720897. * Add Closes line for #720595 to changelog entry for 0.11. * Improve error message for non-fast-forward push. Closes: #720896. + * New --ignore-dirty option to skip noncritical check. Closes: #720895. -- diff --git a/dgit b/dgit index 71b0423..02acfa7 100755 --- a/dgit +++ b/dgit @@ -36,6 +36,7 @@ our $sign = 1; our $dryrun = 0; our $changesfile; our $new_package = 0; +our $ignoredirty = 0; our $existing_package = 'dpkg'; our $cleanmode = 'dpkg-source'; @@ -763,6 +764,7 @@ sub pull () { } sub check_not_dirty () { + return if $ignoredirty; my @cmd = (@git, qw(diff --quiet HEAD)); printcmd(\*DEBUG,"+",@cmd) if $debug>0; $!=0; $?=0; system @cmd; @@ -1193,6 +1195,8 @@ sub parseopts () { $cleanmode = $1; } elsif (m/^--clean=(.*)$/s) { badusage "unknown cleaning mode \`$1'"; + } elsif (m/^--ignore-dirty$/s) { + $ignoredirty = 1; } else { badusage "unknown long option \`$_'"; } diff --git a/dgit.1 b/dgit.1 index 9740856..af18b0f 100644 --- a/dgit.1 +++ b/dgit.1 @@ -342,6 +342,16 @@ This is the default. It requires the package's build dependencies. The package may be new in this suite. Without this, dgit will refuse to push. .TP +.BR --ignore-dirty +Do not complain if the working tree does not match your git HEAD. +This can be useful with build, if you plan to commit later. (dgit +push will still ensure that the .dsc you upload and the git tree +you push are identical, so this option won't make broken pushes.) + +This option may not work properly on `3.0 (quilt)' packages, as in +that case dgit needs to use and perhaps commit parts of your working +tree. +.TP .BI -D Prints debugging information to stderr. Repeating the option produces more output (currently, up to -DD is meaningfully different). -- cgit v1.2.3 From 7de1cca83307cda0d0bf04f8646e23da334f19ef Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 Aug 2013 16:48:47 +0100 Subject: New --no-quilt-fixup option to suppress quilt fixup. RTFM. --- debian/changelog | 1 + dgit | 7 +++++++ dgit.1 | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/debian/changelog b/debian/changelog index 0f1cff7..39bcbc5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,7 @@ dgit (0.12) unstable; urgency=low * Add Closes line for #720595 to changelog entry for 0.11. * Improve error message for non-fast-forward push. Closes: #720896. * New --ignore-dirty option to skip noncritical check. Closes: #720895. + * New --no-quilt-fixup option to suppress quilt fixup. RTFM. -- diff --git a/dgit b/dgit index 02acfa7..9602b98 100755 --- a/dgit +++ b/dgit @@ -37,6 +37,7 @@ our $dryrun = 0; our $changesfile; our $new_package = 0; our $ignoredirty = 0; +our $noquilt = 0; our $existing_package = 'dpkg'; our $cleanmode = 'dpkg-source'; @@ -804,6 +805,10 @@ sub madformat ($) { my ($format) = @_; return 0 unless $format eq '3.0 (quilt)'; print "Format \`$format', urgh\n"; + if ($noquilt) { + print "Not doing any fixup of \`$format' due to --no-quilt-fixup"; + return 0; + } return 1; } @@ -1197,6 +1202,8 @@ sub parseopts () { badusage "unknown cleaning mode \`$1'"; } elsif (m/^--ignore-dirty$/s) { $ignoredirty = 1; + } elsif (m/^--no-quilt-fixup$/s) { + $noquilt = 1; } else { badusage "unknown long option \`$_'"; } diff --git a/dgit.1 b/dgit.1 index af18b0f..f97e458 100644 --- a/dgit.1 +++ b/dgit.1 @@ -352,6 +352,11 @@ This option may not work properly on `3.0 (quilt)' packages, as in that case dgit needs to use and perhaps commit parts of your working tree. .TP +.BR --no-quilt-fixup +Do not fix up source format `3.0 (quilt)' metadata. If you use this +option and the package did in fact need fixing up, dgit push will +fail. +.TP .BI -D Prints debugging information to stderr. Repeating the option produces more output (currently, up to -DD is meaningfully different). -- cgit v1.2.3 From 105e7c8929fb8d65143a1f51b79999481d37362b Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 Aug 2013 16:50:49 +0100 Subject: finalise 0.12 --- debian/changelog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 39bcbc5..39cbff1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,12 +1,12 @@ dgit (0.12) unstable; urgency=low * Cope with packages with epoch. Closes: #720897. - * Add Closes line for #720595 to changelog entry for 0.11. * Improve error message for non-fast-forward push. Closes: #720896. * New --ignore-dirty option to skip noncritical check. Closes: #720895. * New --no-quilt-fixup option to suppress quilt fixup. RTFM. + * Add Closes line for #720595 to changelog entry for 0.11. - -- + -- Ian Jackson Mon, 26 Aug 2013 16:50:39 +0100 dgit (0.11) unstable; urgency=low -- cgit v1.2.3 From adab6c02b46f732060d97dc19b052077b1b0e4b4 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 28 Aug 2013 18:31:37 +0100 Subject: Remove DGET_UNPACK from the environment in case the user has set it. --- debian/changelog | 6 ++++++ dgit | 2 ++ 2 files changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 39cbff1..badf374 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dgit (0.13) unstable; urgency=low + + * Remove DGET_UNPACK from the environment in case the user has set it. + + -- + dgit (0.12) unstable; urgency=low * Cope with packages with epoch. Closes: #720897. diff --git a/dgit b/dgit index 9602b98..e1b0797 100755 --- a/dgit +++ b/dgit @@ -1247,6 +1247,8 @@ if ($ENV{$fakeeditorenv}) { quilt_fixup_editor(); } +delete $ENV{'DGET_UNPACK'}; + parseopts(); print STDERR "DRY RUN ONLY\n" if $dryrun; if (!@ARGV) { -- cgit v1.2.3 From 985e8045f860fb0be72b56b6859034b8c8746db9 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 28 Aug 2013 21:32:14 +0100 Subject: split out dsc_files_info with hash machinery. nfc --- dgit | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/dgit b/dgit index e1b0797..a21cdde 100755 --- a/dgit +++ b/dgit @@ -512,16 +512,37 @@ sub mktree_in_ud_from_only_subdir () { return ($tree,$dir); } -sub dsc_files () { - my $field = $dsc->{'Checksums-Sha256'} || $dsc->{Files}; - defined $field or - fail "missing both Checksums-Sha256 and Files in ". +sub dsc_files_info () { + foreach my $csum (qw(Sha256 Sha1 MD5)) { + my $fname = $csum eq 'MD5' ? 'Files' : "Checksums-$csum"; + my $field = $dsc->{$fname}; + next unless defined $field; + my $digest = uc $csum; + if (!eval "use Digest::$digest; 1;") { + print DEBUG "ignoring $fname because $@\n"; + next; + } + my @out; + foreach (split /\n/, $field) { + next unless m/\S/; + m/^(\w+) (\d+) (\S+)$/ or + fail "could not parse .dsc $fname line \`$_'"; + my $digester = eval "Digest::$digest->new;" or die $@; + push @out, { + Hash => $1, + Bytes => $2, + Filename => $3, + Digester => $digester, + }; + } + return @out; + } + fail "missing any supported Checksums-* or Files field in ". $dsc->get_option('name'); - map { - m/^\w+ \d+ (\S+)$/ or - fail "could not parse .dsc Files/Checksums line \`$_'"; - $1; - } grep m/\S/, split /\n/, $field; +} + +sub dsc_files () { + map { $_->{Filename} } dsc_files_info(); } sub is_orig_file ($) { -- cgit v1.2.3 From 3c24da0438db18fb49b0458b97613bdb9e6797a1 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 28 Aug 2013 21:48:11 +0100 Subject: Remove scary warning from Description. --- debian/changelog | 1 + debian/control | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index badf374..2f80f28 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ dgit (0.13) unstable; urgency=low * Remove DGET_UNPACK from the environment in case the user has set it. + * Remove scary warning from Description. -- diff --git a/debian/control b/debian/control index 7a389aa..986189d 100644 --- a/debian/control +++ b/debian/control @@ -18,6 +18,3 @@ Description: git interoperability with the Debian archive dgit push constructs uploads from git commits . dgit clone and dgit fetch construct git commits from uploads. - . - WARNING: This program is INCOMPLETE and WRONG and should not yet - be used. It is being uploaded to facilitate development. -- cgit v1.2.3 From bd9da469ec0702223270445ced410a54fb3d5158 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 28 Aug 2013 23:03:38 +0100 Subject: Reuse already-downloaded .orig files after checking their hashes. Closes: #720526. (This introduces a dependency on the Digest::SHA.) --- debian/changelog | 2 ++ debian/control | 2 +- dgit | 30 +++++++++++++++++++----------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/debian/changelog b/debian/changelog index 2f80f28..cb80d51 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,7 @@ dgit (0.13) unstable; urgency=low + * Reuse already-downloaded .orig files after checking their hashes. + Closes: #720526. (This introduces a dependency on the Digest::SHA.) * Remove DGET_UNPACK from the environment in case the user has set it. * Remove scary warning from Description. diff --git a/debian/control b/debian/control index 986189d..8f15413 100644 --- a/debian/control +++ b/debian/control @@ -7,7 +7,7 @@ Build-Depends: debhelper (>= 9) Package: dgit Depends: perl, libwww-perl, libdpkg-perl, git-core, devscripts, dpkg-dev, - ${misc:Depends}, realpath + ${misc:Depends}, realpath, libdigest-sha-perl Recommends: ssh-client Suggests: sbuild Architecture: all diff --git a/dgit b/dgit index a21cdde..4550a86 100755 --- a/dgit +++ b/dgit @@ -513,21 +513,19 @@ sub mktree_in_ud_from_only_subdir () { } sub dsc_files_info () { - foreach my $csum (qw(Sha256 Sha1 MD5)) { - my $fname = $csum eq 'MD5' ? 'Files' : "Checksums-$csum"; + foreach my $csumi (['Checksums-Sha256','Digest::SHA', 'new(256)'], + ['Checksums-Sha1', 'Digest::SHA', 'new(1)'], + ['Files', 'Digest::MD5', 'new()']) { + my ($fname, $module, $method) = @$csumi; my $field = $dsc->{$fname}; next unless defined $field; - my $digest = uc $csum; - if (!eval "use Digest::$digest; 1;") { - print DEBUG "ignoring $fname because $@\n"; - next; - } + eval "use $module; 1;" or die $@; my @out; foreach (split /\n/, $field) { next unless m/\S/; m/^(\w+) (\d+) (\S+)$/ or fail "could not parse .dsc $fname line \`$_'"; - my $digester = eval "Digest::$digest->new;" or die $@; + my $digester = eval "$module"."->$method;" or die $@; push @out, { Hash => $1, Bytes => $2, @@ -639,10 +637,20 @@ END } sub ensure_we_have_orig () { - foreach my $f (dsc_files()) { + foreach my $fi (dsc_files_info()) { + my $f = $fi->{Filename}; next unless is_orig_file($f); - if (stat "../$f") { - die "$f ?" unless -f _; + if (open F, "<", "../$f") { + $fi->{Digester}->reset(); + $fi->{Digester}->addfile(*F); + F->error and die $!; + my $got = $fi->{Digester}->hexdigest(); + $got eq $fi->{Hash} or + fail "existing file $f has hash $got but .dsc". + " demands hash $fi->{Hash}". + " (perhaps you should delete this file?)"; + print "using existing $f\n"; + next; } else { die "$f $!" unless $!==&ENOENT; } -- cgit v1.2.3 From 28789232f5edcc1c24bbb4bfe3b5e12119e9886e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 28 Aug 2013 23:08:06 +0100 Subject: Do not always pointlessly fetch the .dsc twice. (That code was erroneously duplicated during editing, apparently.) --- debian/changelog | 2 ++ dgit | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index cb80d51..be670ab 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,8 @@ dgit (0.13) unstable; urgency=low * Reuse already-downloaded .orig files after checking their hashes. Closes: #720526. (This introduces a dependency on the Digest::SHA.) + * Do not always pointlessly fetch the .dsc twice. (That code was + erroneously duplicated during editing, apparently.) * Remove DGET_UNPACK from the environment in case the user has set it. * Remove scary warning from Description. diff --git a/dgit b/dgit index 4550a86..9d1570c 100755 --- a/dgit +++ b/dgit @@ -443,8 +443,6 @@ sub get_archive_dsc () { $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); -- cgit v1.2.3