[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#971597: lintian: Incorrect internal file listing for multiple upstream tarballs



Control: tag -1 + patch

On Fri, 02 Oct 2020 at 15:22:21 +0200, Guilhem Moulin wrote:
> Lintian::Processable::Orig produces an incorrect file listing when
> the common prefix of secondary tarballs isn't equal to the component
> name.  dpkg-source(1) reads
> 
>   Extracting
> 
>   The main original tarball is extracted first, then all additional
>   original tarballs are extracted in subdirectories named after the
>   component part of their filename (any pre-existing directory is
>   replaced).
> 
> however Lintian::Processable::Orig's following snippet yields a
> different behavior:
> 
>   # keep common prefix when equal to the source component
>   if ($unwanted ne $component) {
>       $subindex->drop_common_prefix;
>       $subindex->drop_basedir_segment;
>   }

I'm not sure why Lintian::IO::Select:unpack_and_index_piped_tar()
doesn't use ‘--strip-components=1’ for orig tarballs, is it so that
Lintian could check that each orig tarball contains a single prefix?
AFAICT there is no such check right now though, and since all tarballs
are unpacked in the same directory the current logic would break if the
prefix of a secondary orig tarball is an existing file/directory.

Attached is a dirty patch to extract secondary orig tarballs in a
directory named after the component name and later “rebase” the catalog
to match the main base directory.  I guess a better fix would be to move
the logic into Lintian::Index:merge_in() and allow merging children
directories into a parent and/or change Lintian::Index:drop_*() to allow
re-rooting there.

Cheers,
-- 
Guilhem.
--- lintian-0.96/lib/Lintian/Processable/Orig.pm
+++ lintian-0.96/lib/Lintian/Processable/Orig.pm
@@ -90,6 +90,7 @@
 
             # so far, all archives with components had an extra level
             my $component_dir = $index->basedir;
+            $component_dir .= SLASH . $component unless $component eq EMPTY;
 
             my $subindex = Lintian::Index->new;
             $subindex->basedir($component_dir);
@@ -147,11 +148,16 @@
             # inserts missing directories; must occur afterwards
             $subindex->load;
 
-            # keep common prefix when equal to the source component
-            if ($unwanted ne $component) {
+            if ($unwanted ne EMPTY) {
                 $subindex->drop_common_prefix;
                 $subindex->drop_basedir_segment;
             }
+            if ($component ne EMPTY) {
+                for my $item (values %{$subindex->catalog}) {
+                    $item->name($component . SLASH . $item->name);
+                }
+                $subindex->basedir($index->basedir);
+            }
 
             $index->merge_in($subindex);
 

Attachment: signature.asc
Description: PGP signature


Reply to: