The following commit has been merged in the lenny branch:
commit 64c6c2534c479ebea2b2a58e38162d5ca10bd6e4
Author: Raphael Hertzog <[EMAIL PROTECTED]>
Date:   Wed May 28 19:28:50 2008 +0200

    dpkg-source/3.0 (quilt): better integration with quilt
    
    * scripts/Dpkg/Source/Package/V3/quilt.pm: Factorize calls to
    quilt in a new run_quilt() function. And check only once
    if quilt is available while setting the default value of
    without_quilt option. Last but not least, register properly the
    automatically generated patch with quilt import.

diff --git a/ChangeLog b/ChangeLog
index c816cca..8b1b099 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-05-28  Raphael Hertzog  <[EMAIL PROTECTED]>
 
+       * scripts/Dpkg/Source/Package/V3/quilt.pm: Factorize calls to
+       quilt in a new run_quilt() function. And check only once
+       if quilt is available while setting the default value of
+       without_quilt option. Last but not least, register properly the
+       automatically generated patch with quilt import.
+
+2008-05-28  Raphael Hertzog  <[EMAIL PROTECTED]>
+
        * scripts/Dpkg/Source/Patch.pm (check_apply): New function to
        verify if a patch will successfully apply on top of a given
        directory.
diff --git a/scripts/Dpkg/Source/Package/V3/quilt.pm 
b/scripts/Dpkg/Source/Package/V3/quilt.pm
index c02d073..d201c0b 100644
--- a/scripts/Dpkg/Source/Package/V3/quilt.pm
+++ b/scripts/Dpkg/Source/Package/V3/quilt.pm
@@ -38,7 +38,8 @@ our $CURRENT_MINOR_VERSION = "0";
 sub init_options {
     my ($self) = @_;
     $self->SUPER::init_options();
-    $self->{'options'}{'without_quilt'} = 0
+    # By default use quilt, unless it's not available
+    $self->{'options'}{'without_quilt'} = (-x "/usr/bin/quilt") ? 0 : 1
         unless exists $self->{'options'}{'without_quilt'};
 }
 
@@ -97,12 +98,22 @@ sub get_patches {
     return @patches;
 }
 
+sub run_quilt {
+    my ($self, $dir, $params, %more_opts) = @_;
+    $params = [ $params ] unless ref($params) eq "ARRAY";
+    my %opts = (
+        env => { QUILT_PATCHES => 'debian/patches' },
+        'chdir' => $dir,
+        'exec' => [ 'quilt', '--quiltrc', '/dev/null', @$params ],
+        %more_opts
+    );
+    my $pid = fork_and_exec(%opts);
+    return $pid;
+}
+
 sub apply_patches {
     my ($self, $dir, $skip_auto) = @_;
 
-    # Check if quilt is available
-    my $have_quilt = (-x "/usr/bin/quilt") ? 1 : 0;
-
     # Update debian/patches/series symlink if needed to allow quilt usage
     my $series = $self->get_series_file($dir);
     return unless $series; # No series, no patches
@@ -123,22 +134,17 @@ sub apply_patches {
     foreach my $patch ($self->get_patches($dir, $skip_auto)) {
         my $path = File::Spec->catfile($dir, "debian", "patches", $patch);
         my $patch_obj = Dpkg::Source::Patch->new(filename => $path);
-        if ($have_quilt and not $self->{'options'}{'without_quilt'}) {
+        if (not $self->{'options'}{'without_quilt'}) {
             info(_g("applying %s with quilt"), $patch) unless $skip_auto;
             my $analysis = $patch_obj->analyze($dir);
             foreach my $dir (keys %{$analysis->{'dirtocreate'}}) {
                 eval { mkpath($dir); };
                 syserr(_g("cannot create directory %s"), $dir) if $@;
             }
-            my %opts = (
-                env => { QUILT_PATCHES => 'debian/patches' },
-                delete_env => [ 'QUILT_PATCH_OPTS' ],
-                'chdir' => $dir,
-                'exec' => [ 'quilt', '--quiltrc', '/dev/null', 'push', $patch 
],
-                wait_child => 1,
-                to_file => '/dev/null',
-            );
-            fork_and_exec(%opts);
+            $self->run_quilt($dir, ['push', $patch],
+                             delete_env => ['QUILT_PATCH_OPTS'],
+                             wait_child => 1,
+                             to_file => '/dev/null');
             foreach my $fn (keys %{$analysis->{'filepatched'}}) {
                 utime($now, $now, $fn) || $! == ENOENT ||
                     syserr(_g("cannot change timestamp for %s"), $fn);
@@ -173,25 +179,17 @@ sub prepare_build {
 sub check_patches_applied {
     my ($self, $dir) = @_;
     my $applied = File::Spec->catfile($dir, "debian", "patches", 
".dpkg-source-applied");
+    my $auto_patch = $self->get_autopatch_name();
     my @patches ;
-    # First we try to get a list of patches that could be unapplied
-    if (-x "/usr/bin/quilt") {
-        my $auto_patch = $self->get_autopatch_name();
+    # First we try to get a list of patches that are probably not napplied
+    if (not $self->{'options'}{'without_quilt'}) {
         my $pipe;
-        my %opts = (env => { QUILT_PATCHES => 'debian/patches' },
-                    delete_env => [ 'QUILT_PATCH_OPTS' ],
-                    'chdir' => $dir,
-                    'exec' => [ 'quilt', '--quiltrc', '/dev/null', 'unapplied' 
],
-                    error_to_file => "/dev/null",
-                    to_pipe => \$pipe);
-        my $pid = fork_and_exec(%opts);
-        # We skip auto_patch as this one might be applied but not by
-        # quilt... but by the user who made changes live in the tree
-        # and whose changes lead to this patch addition by a previous
-        # dpkg-source run.
-        @patches = grep { chomp; $_ ne $auto_patch } (<$pipe>);
+        my $pid = $self->run_quilt($dir, ['unapplied'], error_to_file => 
'/dev/null',
+                                   to_pipe => \$pipe);
+        @patches = map { chomp; $_ } (<$pipe>);
         close ($pipe) || syserr("close on 'quilt unapplied' pipe");
         wait_child($pid, cmdline => "quilt unapplied", nocheck => 1);
+        subprocerr("quilt unapplied") unless WIFEXITED($?);
     } else {
         @patches = $self->get_patches($dir);
     }
@@ -214,12 +212,24 @@ sub register_autopatch {
     my $series = $self->get_series_file($dir);
     $series ||= File::Spec->catfile($dir, "debian", "patches", "series");
     my $applied = File::Spec->catfile($dir, "debian", "patches", 
".dpkg-source-applied");
-    if (-e "$dir/debian/patches/$auto_patch") {
+    my $patch = File::Spec->catfile($dir, "debian", "patches", $auto_patch);
+    if (-e $patch) {
         # Add auto_patch to series file
         if (not $has_patch) {
-            open(SERIES, ">>", $series) || syserr(_g("cannot write %s"), 
$series);
-            print SERIES "$auto_patch\n";
-            close(SERIES);
+            if ($self->{'options'}{'without_quilt'}) {
+                open(SERIES, ">>", $series) || syserr(_g("cannot write %s"), 
$series);
+                print SERIES "$auto_patch\n";
+                close(SERIES);
+            } else {
+                # Registering the new patch with quilt requires some
+                # trickery: reverse-apply the patch, import it, apply it
+                # again with quilt this time
+                my $patch_obj = Dpkg::Source::Patch->new(filename => $patch);
+                $patch_obj->apply($dir, add_options => ['-R', '-E']);
+                $self->run_quilt($dir, ['import', 
"debian/patches/$auto_patch"],
+                                 wait_child => 1, to_file => '/dev/null');
+                $self->run_quilt($dir, ['push'], wait_child => 1, to_file => 
'/dev/null');
+            }
             open(APPLIED, ">>", $applied) || syserr(_g("cannot write %s"), 
$applied);
             print APPLIED "$auto_patch\n";
             close(APPLIED);
@@ -227,12 +237,17 @@ sub register_autopatch {
     } else {
         # Remove auto_patch from series
         if ($has_patch) {
-            open(SERIES, "<", $series) || syserr(_g("cannot read %s"), 
$series);
-            my @lines = <SERIES>;
-            close(SERIES);
-            open(SERIES, ">", $series) || syserr(_g("cannot write %s"), 
$series);
-            print(SERIES $_) foreach grep { not /^\Q$auto_patch\E\s*$/ } 
@lines;
-            close(SERIES);
+            if ($self->{'options'}{'without_quilt'}) {
+                open(SERIES, "<", $series) || syserr(_g("cannot read %s"), 
$series);
+                my @lines = <SERIES>;
+                close(SERIES);
+                open(SERIES, ">", $series) || syserr(_g("cannot write %s"), 
$series);
+                print(SERIES $_) foreach grep { not /^\Q$auto_patch\E\s*$/ } 
@lines;
+                close(SERIES);
+            } else {
+                $self->run_quilt($dir, ['delete', $auto_patch],
+                                 wait_child => 1, to_file => '/dev/null');
+            }
         }
     }
 }

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to