X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=892cde2baf84b63c41fff2b42547c335814f24a0;hp=2d47dbfebcf201ce6e465e449de15e38e96ccf39;hb=b1f6740e928e0deeb680b12a59d5b12899063320;hpb=7cc77250e68bee4283757b7516e0a70f77904086 diff --git a/dgit b/dgit index 2d47dbfe..892cde2b 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; @@ -230,13 +230,13 @@ 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', '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 (@_) { @@ -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 @@ -488,7 +490,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 +593,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 +643,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 = $&; @@ -763,7 +765,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"; @@ -832,7 +834,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"; @@ -951,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) { @@ -992,18 +994,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 --- @@ -1016,6 +1023,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(); } @@ -1038,19 +1052,32 @@ 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 $cleanmode 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 $cleanmode ne 'dpkg-source'; + build_prep(); 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(); } @@ -1060,15 +1087,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 {