diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-11-07 23:12:42 +0000 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-11-07 23:55:31 +0000 |
commit | 2aa37b1e612e040ce9a661b4e016dc4bb6bd0b08 (patch) | |
tree | 386e484c854f5259fb34490b2288be30c33d9e2d /dgit | |
parent | 862997ec70c49b644de04639f6f68bc8309e3d56 (diff) |
Cope when an orig tarball is a tarbomb.
Ie, if it contains other than one single directory toplevel.
Closes:#843422.
Specifically:
* We change the unpack directory to _unpack-tar in unpack, rather
than ../unpack-tar. This means that mktree_in_ud DTRT in that
directory, rather than in its supposed only subdiredctory
* We do write-tree on the whole tarball.
* Then if the tarball had only one subdir in it, we fish the
subtree's tree object out of the git tree object.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Diffstat (limited to 'dgit')
-rwxr-xr-x | dgit | 26 |
1 files changed, 18 insertions, 8 deletions
@@ -2128,14 +2128,14 @@ sub generate_commits_from_dsc () { $input = $compr_fh; } - rmtree "../unpack-tar"; - mkdir "../unpack-tar" or die $!; + rmtree "_unpack-tar"; + mkdir "_unpack-tar" or die $!; my @tarcmd = qw(tar -x -f - --no-same-owner --no-same-permissions --no-acls --no-xattrs --no-selinux); my $tar_pid = fork // die $!; if (!$tar_pid) { - chdir "../unpack-tar" or die $!; + chdir "_unpack-tar" or die $!; open STDIN, "<&", $input or die $!; exec @tarcmd; die "dgit (child): exec $tarcmd[0]: $!"; @@ -2149,11 +2149,21 @@ sub generate_commits_from_dsc () { # finally, we have the results in "tarball", but maybe # with the wrong permissions - runcmd qw(chmod -R +rwX ../unpack-tar); - changedir "../unpack-tar"; - my ($tree) = mktree_in_ud_from_only_subdir(1); - changedir "../../unpack"; - rmtree "../unpack-tar"; + runcmd qw(chmod -R +rwX _unpack-tar); + changedir "_unpack-tar"; + remove_stray_gits(); + mktree_in_ud_here(); + + my ($tree) = git_add_write_tree(); + my $tentries = cmdoutput @git, qw(ls-tree -z), $tree; + if ($tentries =~ m/^\d+ tree (\w+)\t[^\000]+\000$/s) { + $tree = $1; + printdebug "one subtree $1\n"; + } else { + printdebug "multiple subtrees\n"; + } + changedir ".."; + rmtree "_unpack-tar"; my $ent = [ $f, $tree ]; push @tartrees, { |