X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=d2a52f6231935b2d1066cce8b811e63f12389588;hp=b6e79e36bca1ca1b1cd1cd124c0593c626bd275e;hb=e52f5e192421e79c6d59f33bc1dcd40272e7e91b;hpb=98cc9f5ee0e1a448c10dbee264fa8ada8d023e54 diff --git a/dgit b/dgit index b6e79e36..d2a52f62 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; @@ -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 (@_) { @@ -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'); @@ -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", @@ -644,7 +641,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->{$field}; + last if defined $dsc_hash; + } if (defined $dsc_hash) { $dsc_hash =~ m/\w+/ or fail "invalid hash in .dsc \`$dsc_hash'"; $dsc_hash = $&; @@ -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(); @@ -822,7 +832,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"; @@ -839,6 +849,12 @@ 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(); @@ -960,6 +976,75 @@ 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 <>', ".pc/applied-patches") { + $!==&ENOENT or die $!; + } else { + close P; + } + + commit_quilty_patch(); +} + +sub quilt_fixup_editor () { + my $descfn = $ENV{$fakeeditorenv}; + my $editing = $ARGV[$#ARGV]; + open I1, '<', $descfn or die "$descfn: $!"; + open I2, '<', $editing or die "$editing: $!"; + unlink $editing or die "$editing: $!"; + open 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 +1052,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 +1066,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'; + $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 +1125,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 +1200,10 @@ sub parseopts () { } } +if ($ENV{$fakeeditorenv}) { + quilt_fixup_editor(); +} + parseopts(); print STDERR "DRY RUN ONLY\n" if $dryrun; if (!@ARGV) {