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/#;
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: $!";
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;
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) {
my @mergeinputs = generate_commits_from_dsc();
die unless @mergeinputs == 1;
+ 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, $mergeinputs[0]{Commit});
+ $dstbranch, $newhash);
runcmd @cmd;
progress "dgit: import-dsc results are in in git ref $dstbranch";
}