diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-10-23 19:18:03 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-10-30 19:50:47 +0000 |
commit | 808b73e0d25838e98cb19d0f71e62abc145cbd21 (patch) | |
tree | 524b2fe3c6427d7ee3580522c2702472a25ba04b | |
parent | cb1a4dcdcdb0bb00d38eb38a8b0285f8e81965b5 (diff) |
import-dsc: New feature
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-rwxr-xr-x | dgit | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -5274,6 +5274,74 @@ sub cmd_quilt_fixup { build_maybe_quilt_fixup(); } +sub cmd_import_dsc { + badusage "usage: dgit import-dsc .../PATH/TO/.DSC BRANCH" unless @ARGV==2; + my ($dscfn, $dstbranch) = @ARGV; + + badusage "dry run makes no sense with import-dsc" unless act_local(); + + $dstbranch = "refs/heads/$dstbranch" unless $dstbranch =~ m#^refs/#; + $dstbranch = cmdoutput @git, qw(check-ref-format --normalize), $dstbranch; + + open D, "<", $dscfn or fail "open import .dsc ($dscfn): $!"; + $dscdata = do { local $/ = undef; <D>; }; + D->error and fail "read $dscfn: $!"; + close C; + parse_dscdata(); + + my $dgit_commit = $dsc->{$ourdscfield[0]}; + if (defined $dgit_commit && + !forceing [qw(import-dsc-with-dgit-field)]) { + $dgit_commit =~ m/\w+/ or fail "invalid hash in .dsc"; + progress "dgit: import-dsc of .dsc with Dgit field, using git hash"; + my @cmd = (qw(sh -ec), + "echo $dgit_commit | git cat-file --batch-check"); + my $objgot = cmdoutput @cmd; + if ($objgot =~ m#^\w+ missing\b#) { + fail <<END +.dsc contains Dgit field referring to object $dgit_commit +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 + } + @cmd = (@git, qw(update-ref -m), "dgit import-dsc (Dgit): $dscfn", + $dstbranch, $dgit_commit); + runcmd @cmd; + progress "dgit: import-dsc updated git ref $dstbranch"; + return 0; + } + + $package = getfield $dsc, 'Source'; + my @dfi = dsc_files_info(); + foreach my $fi (@dfi) { + my $f = $fi->{Filename}; + my $here = "../$f"; + next if lstat $here; + fail "stat $here: $!" unless $! == ENOENT; + my $there = $dscfn; + if ($dscfn =~ m#^(?:\./+)?\.\./+#) { + $there = $'; + } elsif ($dscfn =~ m#^/#) { + $there = $dscfn; + } else { + fail "cannot import $dscfn which seems to be inside working tree!"; + } + $there =~ s#/+[^/]+$## or + fail "cannot import $dscfn which seems to not have a basename"; + $there .= "/$f"; + symlink $there, $here or fail "symlink $there to $here: $!"; + progress "made symlink $here -> $there"; + print STDERR Dumper($fi); + } + my @mergeinputs = generate_commits_from_dsc(); + die unless @mergeinputs == 1; + + my @cmd = (@git, qw(update-ref -m), "dgit import-dsc: $dscfn", + $dstbranch, $mergeinputs[0]{Commit}); + runcmd @cmd; + progress "dgit: import-dsc results are in in git ref $dstbranch"; +} + sub cmd_archive_api_query { badusage "need only 1 subpath argument" unless @ARGV==1; my ($subpath) = @ARGV; |