diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2014-08-03 17:17:19 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2014-08-03 17:31:45 +0100 |
commit | 2f62e59376dcfddcaeff1826f5de91041336a239 (patch) | |
tree | eb063f1302cf2acb1dfac27a35959c0145813d86 | |
parent | a687e0b6a3ac727f4b40f042265093699717251e (diff) |
Clone removes destination directory on error. Closes:#736153.
-rw-r--r-- | debian/changelog | 3 | ||||
-rwxr-xr-x | dgit | 28 | ||||
-rw-r--r-- | dgit.1 | 3 |
3 files changed, 34 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index 9a5d477..6ccbdde 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,8 @@ dgit (0.22~experimental1) experimental; urgency=low + Bugfixes: + * Clone removes destination directory on error. Closes:#736153. + Minor improvements: * Include canonicalised suite name in signed tag message. * Mention cross-version dgit rpush incompatibility in manpage. @@ -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 { @@ -1486,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 () { @@ -2049,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 \`$_'"; } @@ -398,6 +398,9 @@ instead. Furthermore, the specified directory will be emptied, removed and recreated before dgit starts, rather than removed after dgit finishes. The directory specified must be an absolute pathname. +.TP +.BI --no-rm-on-error +Do not delete the destination directory if clone fails. .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 |