X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=5fc937898d77ca14c1c031eecd933adbd81606b4;hp=1fd15d73ae63bedd54959abf82401310a3b1f8a6;hb=17652b53bde8d7aa85a7cdd8fc6d7abcc94b2946;hpb=7474327d959d0478a501d9a222876d00384bd7d2 diff --git a/dgit b/dgit index 1fd15d73..5fc93789 100755 --- a/dgit +++ b/dgit @@ -33,6 +33,7 @@ our $sign = 1; our $dryrun = 0; our $changesfile; our $new_package = 0; +our $existing_package = 'dpkg'; our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); @@ -110,8 +111,10 @@ sub cmdoutput_errok { $!=0; $?=0; { local $/ = undef; $d =

; } die if P->error; - close P or return undef; + if (!close P) { print DEBUG "=>!$?\n" if $debug>0; return undef; } chomp $d; + $d =~ m/^.*/; + print DEBUG "=> \`$&'",(length $' ? '...' : ''),"\n" if $debug>0; #'; return $d; } @@ -152,7 +155,6 @@ sub cfg { $v = cmdoutput_errok(@git, qw(config --), $c); }; if ($?==0) { - chomp $v; return $v; } elsif ($?!=256) { die "$c $?"; @@ -208,7 +210,7 @@ sub parsechangelog { return $c; } -our $rmad; +our %rmad; sub archive_query () { my $query = access_cfg('archive-query'); @@ -217,13 +219,15 @@ sub archive_query () { my $proto = $1; my $url = $'; #'; die unless $proto eq 'madison'; - $rmad ||= cmdoutput qw(rmadison -asource),"-s$suite","-u$url",$package; + $rmad{$package} ||= cmdoutput + qw(rmadison -asource),"-s$suite","-u$url",$package; + my $rmad = $rmad{$package}; if (!length $rmad) { return (); } $rmad =~ m{^ \s*( [^ \t|]+ )\s* \| \s*( [^ \t|]+ )\s* \| - \s*( [^ \t|/]+ )(?:/([^ \t|/]+)) \s* \| + \s*( [^ \t|/]+ )(?:/([^ \t|/]+))? \s* \| \s*( [^ \t|]+ )\s* }x or die "$rmad $?"; $1 eq $package or die "$rmad $package ?"; my $vsn = $2; @@ -245,7 +249,7 @@ sub archive_query () { } sub canonicalise_suite () { - archive_query(); + archive_query() or die; } sub get_archive_dsc () { @@ -316,7 +320,7 @@ sub mktree_in_ud_from_only_subdir () { symlink '../../../../objects','.git/objects' or die $!; runcmd @git, qw(add -Af); my $tree = cmdoutput @git, qw(write-tree); - chomp $tree; $tree =~ m/^\w+$/ or die "$tree ?"; + $tree =~ m/^\w+$/ or die "$tree ?"; return ($tree,$dir); } @@ -366,7 +370,7 @@ committer $authline $clogp->{Changes} -# imported by dgit from the archive +# imported from the archive END close C or die $!; my $commithash = cmdoutput @git, qw(hash-object -w -t commit ../commit.tmp); @@ -428,7 +432,7 @@ sub rev_parse ($) { sub is_fast_fwd ($$) { my ($ancestor,$child) = @_; - my $mb = cmdoutput @git, qw(merge-base), $dsc_hash, $upload_hash; + my $mb = cmdoutput @git, qw(merge-base), $ancestor, $child; return rev_parse($mb) eq rev_parse($ancestor); } @@ -450,15 +454,17 @@ sub fetch_from_archive () { print "last upload to archive has NO git hash\n"; } - $!=0; $upload_hash = - cmdoutput_errok @git, qw(show-ref --heads), lrref(); - if ($?==0) { - die unless chomp $upload_hash; - } elsif ($?==256) { + my $lrref_fn = ".git/".lrref(); + if (open H, $lrref_fn) { + $upload_hash = ; + chomp $upload_hash; + die "$lrref_fn $upload_hash ?" unless $upload_hash =~ m/^\w+$/; + } elsif ($! == &ENOENT) { $upload_hash = ''; } else { - die $?; + die "$lrref_fn $!"; } + print DEBUG "last upload hash $upload_hash\n"; my $hash; if (defined $dsc_hash) { die "missing git history even though dsc has hash" @@ -576,6 +582,7 @@ sub dopush () { } sub cmd_clone { + parseopts(); my $dstdir; die if defined $package; if (@ARGV==1) { @@ -595,7 +602,6 @@ sub cmd_clone { sub branchsuite () { my $branch = cmdoutput_errok @git, qw(symbolic-ref HEAD); - chomp $branch; if ($branch =~ m#$lbranch_re#o) { return $1; } else { @@ -625,23 +631,26 @@ sub fetchpullargs () { } sub cmd_fetch { + parseopts(); fetchpullargs(); fetch(); } sub cmd_pull { + parseopts(); fetchpullargs(); pull(); } sub cmd_push { + parseopts(); die if defined $package; my $clogp = parsechangelog(); $package = $clogp->{Source}; if (@ARGV==0) { $suite = $clogp->{Distribution}; if ($new_package) { - local ($package) = 'dpkg'; + local ($package) = $existing_package; # this is a hack canonicalise_suite(); } } else { @@ -656,15 +665,16 @@ sub cmd_push { } sub cmd_build { + # we pass further options and args to git-buildpackage die if defined $package; my $clogp = parsechangelog(); $suite = $clogp->{Distribution}; $package = $clogp->{Source}; - canonicalise_suite(); runcmd_ordryrun qw(git-buildpackage -us -uc --git-no-sign-tags), - "--git-debian-branch=".lbranch(), - @ARGV; + '--git-builder=dpkg-buildpackage -i\.git/ -I.git', + "--git-debian-branch=".lbranch(), + @ARGV; } sub parseopts () { @@ -684,6 +694,8 @@ sub parseopts () { $om->[0] = $2; } elsif (m/^--(\w+):(.*)/s && ($om = $opts_opt_map{$1})) { push @$om, $2; + } elsif (m/^--existing-package=(.*)/s) { + $existing_package = $1; } else { die "$_ ?"; } @@ -713,6 +725,5 @@ sub parseopts () { parseopts(); die unless @ARGV; my $cmd = shift @ARGV; -parseopts(); { no strict qw(refs); &{"cmd_$cmd"}(); }