diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-10-23 20:19:50 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-10-30 19:50:47 +0000 |
commit | 612c3e10d7d797a48798fa82578760eea2231103 (patch) | |
tree | adaa655729987ed356d43467f7d0c7c4b8e952b4 | |
parent | 430373447bdb92261b328cd31fdf078e76cf3f70 (diff) |
import-dsc: Introduce ff checking
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-rwxr-xr-x | dgit | 41 |
1 files changed, 40 insertions, 1 deletions
@@ -5281,7 +5281,11 @@ sub cmd_import_dsc { badusage "dry run makes no sense with import-dsc" unless act_local(); - my $info = "$dscfn"; + my $force = $dstbranch =~ s/^\+// ? +1 : + $dstbranch =~ s/^\.\.// ? -1 : + 0; + my $info = $force ? " $&" : ''; + $info = "$dscfn$info"; my $specbranch = $dstbranch; $dstbranch = "refs/heads/$dstbranch" unless $dstbranch =~ m#^refs/#; @@ -5294,6 +5298,8 @@ sub cmd_import_dsc { fail "$dstbranch is checked out - will not update it" if defined $chead and $chead eq $dstbranch; + my $oldhash = git_get_ref $dstbranch; + open D, "<", $dscfn or fail "open import .dsc ($dscfn): $!"; $dscdata = do { local $/ = undef; <D>; }; D->error and fail "read $dscfn: $!"; @@ -5315,6 +5321,13 @@ Your git tree does not have that object. Try `git fetch' from a plausible server (browse.dgit.d.o? alioth?), and try the import-dsc again. END } + if ($oldhash && !is_fast_fwd $oldhash, $dgit_commit) { + if ($force > 0) { + progress "Not fast forward, forced update."; + } else { + fail "Not fast forward to $dgit_commit"; + } + } @cmd = (@git, qw(update-ref -m), "dgit import-dsc (Dgit): $info", $dstbranch, $dgit_commit); runcmd @cmd; @@ -5322,6 +5335,13 @@ END return 0; } + fail <<END +Branch $dstbranch already exists +Specify ..$specbranch for a pseudo-merge, binding in existing history +Specify +$specbranch to overwrite, discarding existing history +END + if $oldhash && !$force; + $package = getfield $dsc, 'Source'; my @dfi = dsc_files_info(); foreach my $fi (@dfi) { @@ -5349,6 +5369,25 @@ END my $newhash = $mergeinputs[0]{Commit}; + if ($oldhash) { + if ($force > 0) { + progress "Import, forced update - synthetic orphan git history."; + } elsif ($force < 0) { + progress "Import, merging."; + my $tree = cmdoutput @git, qw(rev-parse), "$newhash:"; + my $version = getfield $dsc, 'Version'; + $newhash = make_commit_text <<END; +tree $tree +parent $newhash +parent $oldhash + +Merge $package ($version) import into $dstbranch +END + } else { + die; # caught earlier + } + } + my @cmd = (@git, qw(update-ref -m), "dgit import-dsc: $info", $dstbranch, $newhash); runcmd @cmd; |