From: Ian Jackson Date: Sun, 3 Aug 2014 16:17:19 +0000 (+0100) Subject: Clone removes destination directory on error. Closes:#736153. X-Git-Tag: debian/0.22~35 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=commitdiff_plain;h=2f62e59376dcfddcaeff1826f5de91041336a239;ds=sidebyside Clone removes destination directory on error. Closes:#736153. --- diff --git a/debian/changelog b/debian/changelog index 9a5d4774..6ccbdde8 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. diff --git a/dgit b/dgit index 86613399..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 { @@ -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 \`$_'"; } diff --git a/dgit.1 b/dgit.1 index 8b1c7f9c..712f36dc 100644 --- a/dgit.1 +++ b/dgit.1 @@ -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