summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdgit41
1 files changed, 40 insertions, 1 deletions
diff --git a/dgit b/dgit
index a1ca045..ef81599 100755
--- a/dgit
+++ b/dgit
@@ -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;