X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=42fa30688d3d81d1bc36ff98c80900e4719a7153;hp=6369856c4d77d498814e4a0237b6738d1795903c;hb=2f62e59376dcfddcaeff1826f5de91041336a239;hpb=d16fb35f5d57b0337c2372de3a63430c17fb1226 diff --git a/dgit b/dgit index 6369856c..42fa3068 100755 --- a/dgit +++ b/dgit @@ -44,6 +44,7 @@ our $buildproductsdir = '..'; our $new_package = 0; our $ignoredirty = 0; our $noquilt = 0; +our $rmonerror = 1; our $existing_package = 'dpkg'; our $cleanmode = 'dpkg-source'; our $changes_since_version; @@ -120,6 +121,15 @@ sub dscfn ($) { our $us = 'dgit'; our $debugprefix = ''; +our @end; +END { + local ($?); + foreach my $f (@end) { + eval { $f->(); }; + warn "$us: cleanup: $@" if length $@; + } +}; + sub printdebug { print DEBUG $debugprefix, @_ or die $!; } sub fail { @@ -623,6 +633,12 @@ sub git_get_ref ($) { } } +sub must_getcwd () { + my $d = getcwd(); + defined $d or fail "getcwd failed: $!"; + return $d; +} + our %rmad; sub archive_query ($) { @@ -1480,7 +1496,22 @@ sub cmd_clone { badusage "incorrect arguments to dgit clone"; } $dstdir ||= "$package"; + + my $cwd_remove; + if ($rmonerror && !$dryrun_level) { + $cwd_remove= getcwd(); + unshift @end, sub { + return unless defined $cwd_remove; + if (!chdir "$cwd_remove") { + return if $!==&ENOENT; + die "chdir $cwd_remove: $!"; + } + rmtree($dstdir) or die "remove $dstdir: $!\n"; + }; + } + clone($dstdir); + $cwd_remove = undef; } sub branchsuite () { @@ -1915,7 +1946,7 @@ sub build_source { runcmd_ordryrun_local (@dpkgbuildpackage, qw(-us -uc -S)), changesopts(); } else { - my $pwd = cmdoutput qw(env - pwd); + my $pwd = must_getcwd(); my $leafdir = basename $pwd; changedir ".."; runcmd_ordryrun_local @dpkgsource, qw(-b --), $leafdir; @@ -2043,6 +2074,9 @@ sub parseopts () { } elsif (m/^--no-quilt-fixup$/s) { push @ropts, $_; $noquilt = 1; + } elsif (m/^--no-rm-on-error$/s) { + push @ropts, $_; + $rmonerror = 0; } else { badusage "unknown long option \`$_'"; }