Преглед изворни кода

dpkg-source: handle better symlinks to orig tarball

* scripts/Dpkg/Path.pm (check_files_are_the_same): Add a new
parameter so that we can use stat() instead of lstat() and
compare if pointed files are the same.
* scripts/Dpkg/Source/Package.pm: Resolve symlinks before deciding
if both original tarballs are the same or not. Use the new
parameter of check_files_are_the_same() for this.
* scripts/Dpkg/Source/Package/V1_0.pm: Remove useless import of
check_files_are_the_same.
Raphael Hertzog пре 18 година
родитељ
комит
639d515a21
5 измењених фајлова са 27 додато и 8 уклоњено
  1. 11 0
      ChangeLog
  2. 2 0
      debian/changelog
  3. 13 6
      scripts/Dpkg/Path.pm
  4. 1 1
      scripts/Dpkg/Source/Package.pm
  5. 0 1
      scripts/Dpkg/Source/Package/V1_0.pm

+ 11 - 0
ChangeLog

@@ -1,3 +1,14 @@
+2008-04-12  Raphael Hertzog  <hertzog@debian.org>
+
+	* scripts/Dpkg/Path.pm (check_files_are_the_same): Add a new
+	parameter so that we can use stat() instead of lstat() and
+	compare if pointed files are the same.
+	* scripts/Dpkg/Source/Package.pm: Resolve symlinks before deciding
+	if both original tarballs are the same or not. Use the new
+	parameter of check_files_are_the_same() for this.
+	* scripts/Dpkg/Source/Package/V1_0.pm: Remove useless import of
+	check_files_are_the_same.
+
 2008-04-12  Sven Joachim  <svenjoac@gmx.de>
 
 	* scripts/Dpkg/Source/Package.pm: Add missing import of

+ 2 - 0
debian/changelog

@@ -2,6 +2,8 @@ dpkg (1.14.18.1) UNRELEASED; urgency=low
 
   * Add missing import of subprocerr in Dpkg::Source::Package. Thanks to Sven
     Joachim for the patch.
+  * Handle symlinks better when deciding if dpkg-source has to copy the
+    original tarball in the current extraction directory. Closes: #475668
 
  -- Raphael Hertzog <hertzog@debian.org>  Sat, 12 Apr 2008 13:56:44 +0200
 

+ 13 - 6
scripts/Dpkg/Path.pm

@@ -106,17 +106,24 @@ sub guess_pkg_root_dir($) {
     return undef;
 }
 
-=item check_files_are_the_same($file1, $file2)
+=item check_files_are_the_same($file1, $file2, $resolve_symlink)
 
 This function verifies that both files are the same by checking that the device
-numbers and the inode numbers returned by lstat() are the same.
+numbers and the inode numbers returned by stat()/lstat() are the same. If
+$resolve_symlink is true then stat() is used, otherwise lstat() is used.
 
 =cut
-sub check_files_are_the_same($$) {
-    my ($file1, $file2) = @_;
+sub check_files_are_the_same($$;$) {
+    my ($file1, $file2, $resolve_symlink) = @_;
     return 0 if ((! -e $file1) || (! -e $file2));
-    my @stat1 = lstat($file1);
-    my @stat2 = lstat($file2);
+    my (@stat1, @stat2);
+    if ($resolve_symlink) {
+        @stat1 = stat($file1);
+        @stat2 = stat($file2);
+    } else {
+        @stat1 = lstat($file1);
+        @stat2 = lstat($file2);
+    }
     my $result = ($stat1[0] == $stat2[0]) && ($stat1[1] == $stat2[1]);
     return $result;
 }

+ 1 - 1
scripts/Dpkg/Source/Package.pm

@@ -305,7 +305,7 @@ sub extract {
         {
             my $src = File::Spec->catfile($self->{'basedir'}, $orig);
             my $dst = File::Spec->catfile($destdir, $orig);
-            if (not check_files_are_the_same($src, $dst)) {
+            if (not check_files_are_the_same($src, $dst, 1)) {
                 system('cp', '--', $src, $dst);
                 subprocerr("cp $src to $dst") if $?;
             }

+ 0 - 1
scripts/Dpkg/Source/Package/V1_0.pm

@@ -31,7 +31,6 @@ use Dpkg::Version qw(check_version);
 use Dpkg::Exit;
 use Dpkg::Source::Functions qw(erasedir);
 use Dpkg::Source::Package::V3_0::native;
-use Dpkg::Path qw(check_files_are_the_same);
 
 use POSIX;
 use File::Basename;