The following commit has been merged in the master branch:
commit f215ebacf1183e33da3287533c8eec60cc5af418
Author: Guillem Jover <[email protected]>
Date:   Sun Dec 30 02:49:36 2012 +0100

    scripts: Do not use "nested" functions as they are global
    
    Even if these functions are defined inside another function, they are
    still global, make them proper global functions by moving the definition
    outside of the outter function and mark them explicitly as being private
    by using an underscore prefix. There's no point in making these
    anonymous nested functions, as they do not need to access any variable
    from the outter functions.
    
    Fixes Subroutines::ProhibitNestedSubs.
    
    Warned-by: perlcritic

diff --git a/scripts/Dpkg/Changelog/Entry.pm b/scripts/Dpkg/Changelog/Entry.pm
index e434103..506716d 100644
--- a/scripts/Dpkg/Changelog/Entry.pm
+++ b/scripts/Dpkg/Changelog/Entry.pm
@@ -81,19 +81,20 @@ filehandle.
 
 =cut
 
+sub _format_output_block {
+    my $lines = shift;
+    return join('', map { $_ . "\n" } @{$lines});
+}
+
 sub output {
     my ($self, $fh) = @_;
     my $str = '';
-    sub _block {
-       my $lines = shift;
-       return join('', map { $_ . "\n" } @{$lines});
-    }
     $str .= $self->{header} . "\n" if defined($self->{header});
-    $str .= _block($self->{blank_after_header});
-    $str .= _block($self->{changes});
-    $str .= _block($self->{blank_after_changes});
+    $str .= _format_output_block($self->{blank_after_header});
+    $str .= _format_output_block($self->{changes});
+    $str .= _format_output_block($self->{blank_after_changes});
     $str .= $self->{trailer} . "\n" if defined($self->{trailer});
-    $str .= _block($self->{blank_after_trailer});
+    $str .= _format_output_block($self->{blank_after_trailer});
     print $fh $str if defined $fh;
     return $str;
 }
diff --git a/scripts/Dpkg/Shlibs/SymbolFile.pm 
b/scripts/Dpkg/Shlibs/SymbolFile.pm
index 7b6eb2b..c5204b8 100644
--- a/scripts/Dpkg/Shlibs/SymbolFile.pm
+++ b/scripts/Dpkg/Shlibs/SymbolFile.pm
@@ -189,15 +189,15 @@ sub add_symbol {
     }
 }
 
+sub _new_symbol {
+    my $base = shift || 'Dpkg::Shlibs::Symbol';
+    return (ref $base) ? $base->clone(@_) : $base->new(@_);
+}
+
 # Parameter seen is only used for recursive calls
 sub parse {
     my ($self, $fh, $file, $seen, $obj_ref, $base_symbol) = @_;
 
-    sub new_symbol {
-        my $base = shift || 'Dpkg::Shlibs::Symbol';
-        return (ref $base) ? $base->clone(@_) : $base->new(@_);
-    }
-
     if (defined($seen)) {
        return if exists $seen->{$file}; # Avoid include loops
     } else {
@@ -219,7 +219,7 @@ sub parse {
            }
            # Symbol specification
            my $deprecated = ($1) ? $1 : 0;
-           my $sym = new_symbol($base_symbol, deprecated => $deprecated);
+           my $sym = _new_symbol($base_symbol, deprecated => $deprecated);
            if ($self->create_symbol($2, base => $sym)) {
                $self->add_symbol($sym, $$obj_ref);
            } else {
@@ -231,7 +231,7 @@ sub parse {
            my $dir = $file;
            my $new_base_symbol;
            if (defined $tagspec) {
-                $new_base_symbol = new_symbol($base_symbol);
+                $new_base_symbol = _new_symbol($base_symbol);
                $new_base_symbol->parse_tagspec($tagspec);
            }
            $dir =~ s{[^/]+$}{}; # Strip filename
diff --git a/scripts/Dpkg/Source/Package/V2.pm 
b/scripts/Dpkg/Source/Package/V2.pm
index de12747..1021d9e 100644
--- a/scripts/Dpkg/Source/Package/V2.pm
+++ b/scripts/Dpkg/Source/Package/V2.pm
@@ -602,22 +602,25 @@ sub register_patch {
     return $patch;
 }
 
+sub _is_bad_patch_name {
+    my ($dir, $patch_name) = @_;
+
+    return 1 if not defined($patch_name);
+    return 1 if not length($patch_name);
+
+    my $patch = File::Spec->catfile($dir, "debian", "patches", $patch_name);
+    if (-e $patch) {
+        warning(_g("cannot register changes in %s, this patch already exists"),
+                $patch);
+        return 1;
+    }
+    return 0;
+}
+
 sub do_commit {
     my ($self, $dir) = @_;
     my ($patch_name, $tmpdiff) = @{$self->{'options'}{'ARGV'}};
 
-    sub bad_patch_name {
-        my ($dir, $patch_name) = @_;
-        return 1 if not defined($patch_name);
-        return 1 if not length($patch_name);
-        my $patch = File::Spec->catfile($dir, "debian", "patches", 
$patch_name);
-        if (-e $patch) {
-            warning(_g("cannot register changes in %s, this patch already 
exists"), $patch);
-            return 1;
-        }
-        return 0;
-    }
-
     $self->prepare_build($dir);
 
     # Try to fix up a broken relative filename for the patch
@@ -645,7 +648,7 @@ sub do_commit {
         info(_g("there are no local changes to record"));
         return;
     }
-    while (bad_patch_name($dir, $patch_name)) {
+    while (_is_bad_patch_name($dir, $patch_name)) {
         # Ask the patch name interactively
         print STDOUT _g("Enter the desired patch name: ");
         chomp($patch_name = <STDIN>);
diff --git a/scripts/Dpkg/Source/Package/V3/quilt.pm 
b/scripts/Dpkg/Source/Package/V3/quilt.pm
index 3b7d0e3..f32a499 100644
--- a/scripts/Dpkg/Source/Package/V3/quilt.pm
+++ b/scripts/Dpkg/Source/Package/V3/quilt.pm
@@ -214,25 +214,27 @@ sub check_patches_applied {
     $self->apply_patches($dir, usage => 'preparation', verbose => 1);
 }
 
-sub register_patch {
-    my ($self, $dir, $tmpdiff, $patch_name) = @_;
+sub _add_line {
+    my ($file, $line) = @_;
 
-    sub add_line {
-        my ($file, $line) = @_;
-        open(my $file_fh, ">>", $file) || syserr(_g("cannot write %s"), $file);
-        print $file_fh "$line\n";
-        close($file_fh);
-    }
+    open(my $file_fh, ">>", $file) || syserr(_g("cannot write %s"), $file);
+    print $file_fh "$line\n";
+    close($file_fh);
+}
 
-    sub drop_line {
-        my ($file, $re) = @_;
-        open(my $file_fh, "<", $file) || syserr(_g("cannot read %s"), $file);
-        my @lines = <$file_fh>;
-        close($file_fh);
-        open($file_fh, ">", $file) || syserr(_g("cannot write %s"), $file);
-        print($file_fh $_) foreach grep { not /^\Q$re\E\s*$/ } @lines;
-        close($file_fh);
-    }
+sub _drop_line {
+    my ($file, $re) = @_;
+
+    open(my $file_fh, "<", $file) || syserr(_g("cannot read %s"), $file);
+    my @lines = <$file_fh>;
+    close($file_fh);
+    open($file_fh, ">", $file) || syserr(_g("cannot write %s"), $file);
+    print($file_fh $_) foreach grep { not /^\Q$re\E\s*$/ } @lines;
+    close($file_fh);
+}
+
+sub register_patch {
+    my ($self, $dir, $tmpdiff, $patch_name) = @_;
 
     my $quilt = $self->build_quilt_object($dir);
 
@@ -255,8 +257,8 @@ sub register_patch {
         $quilt->setup_db();
         # Add patch to series file
         if (not $has_patch) {
-            add_line($series, $patch_name);
-            add_line($applied, $patch_name);
+            _add_line($series, $patch_name);
+            _add_line($applied, $patch_name);
             $quilt->load_series();
             $quilt->load_db();
         }
@@ -268,8 +270,8 @@ sub register_patch {
     } else {
         # Remove auto_patch from series
         if ($has_patch) {
-            drop_line($series, $patch_name);
-            drop_line($applied, $patch_name);
+            _drop_line($series, $patch_name);
+            _drop_line($applied, $patch_name);
             erasedir($quilt->get_db_file($patch_name));
             $quilt->load_db();
             $quilt->load_series();
diff --git a/scripts/Dpkg/Source/Patch.pm b/scripts/Dpkg/Source/Patch.pm
index bca6442..104bde6 100644
--- a/scripts/Dpkg/Source/Patch.pm
+++ b/scripts/Dpkg/Source/Patch.pm
@@ -310,6 +310,63 @@ sub _fail_not_same_type {
     $self->register_error();
 }
 
+sub _getline {
+    my $handle = shift;
+
+    my $line = <$handle>;
+    if (defined $line) {
+        # Strip end-of-line chars
+        chomp($line);
+        $line =~ s/\r$//;
+    }
+    return $line;
+}
+
+# Strip timestamp
+sub _strip_ts {
+    my $header = shift;
+
+    # Tab is the official separator, it's always used when
+    # filename contain spaces. Try it first, otherwise strip on space
+    # if there's no tab
+    $header =~ s/\s.*// unless ($header =~ s/\t.*//);
+    return $header;
+}
+
+sub _intuit_file_patched {
+    my ($old, $new) = @_;
+
+    return $new unless defined $old;
+    return $old unless defined $new;
+    return $new if -e $new and not -e $old;
+    return $old if -e $old and not -e $new;
+
+    # We don't consider the case where both files are non-existent and
+    # where patch picks the one with the fewest directories to create
+    # since dpkg-source will pre-create the required directories
+
+    # Precalculate metrics used by patch
+    my ($tmp_o, $tmp_n) = ($old, $new);
+    my ($len_o, $len_n) = (length($old), length($new));
+    $tmp_o =~ s{[/\\]+}{/}g;
+    $tmp_n =~ s{[/\\]+}{/}g;
+    my $nb_comp_o = ($tmp_o =~ tr{/}{/});
+    my $nb_comp_n = ($tmp_n =~ tr{/}{/});
+    $tmp_o =~ s{^.*/}{};
+    $tmp_n =~ s{^.*/}{};
+    my ($blen_o, $blen_n) = (length($tmp_o), length($tmp_n));
+
+    # Decide like patch would
+    if ($nb_comp_o != $nb_comp_n) {
+        return ($nb_comp_o < $nb_comp_n) ? $old : $new;
+    } elsif ($blen_o != $blen_n) {
+        return ($blen_o < $blen_n) ? $old : $new;
+    } elsif ($len_o != $len_n) {
+        return ($len_o < $len_n) ? $old : $new;
+    }
+    return $old;
+}
+
 # check diff for sanity, find directories to create as a side effect
 sub analyze {
     my ($self, $destdir, %opts) = @_;
@@ -322,55 +379,7 @@ sub analyze {
     my $patch_header = '';
     my $diff_count = 0;
 
-    sub getline {
-        my $handle = shift;
-        my $line = <$handle>;
-        if (defined $line) {
-            # Strip end-of-line chars
-            chomp($line);
-            $line =~ s/\r$//;
-        }
-        return $line;
-    }
-    sub strip_ts { # Strip timestamp
-        my $header = shift;
-        # Tab is the official separator, it's always used when
-        # filename contain spaces. Try it first, otherwise strip on space
-        # if there's no tab
-        $header =~ s/\s.*// unless ($header =~ s/\t.*//);
-        return $header;
-    }
-    sub intuit_file_patched {
-       my ($old, $new) = @_;
-       return $new unless defined $old;
-       return $old unless defined $new;
-       return $new if -e $new and not -e $old;
-       return $old if -e $old and not -e $new;
-       # We don't consider the case where both files are non-existent and
-       # where patch picks the one with the fewest directories to create
-       # since dpkg-source will pre-create the required directories
-       #
-       # Precalculate metrics used by patch
-       my ($tmp_o, $tmp_n) = ($old, $new);
-       my ($len_o, $len_n) = (length($old), length($new));
-       $tmp_o =~ s{[/\\]+}{/}g;
-       $tmp_n =~ s{[/\\]+}{/}g;
-       my $nb_comp_o = ($tmp_o =~ tr{/}{/});
-       my $nb_comp_n = ($tmp_n =~ tr{/}{/});
-       $tmp_o =~ s{^.*/}{};
-       $tmp_n =~ s{^.*/}{};
-       my ($blen_o, $blen_n) = (length($tmp_o), length($tmp_n));
-       # Decide like patch would
-       if ($nb_comp_o != $nb_comp_n) {
-           return ($nb_comp_o < $nb_comp_n) ? $old : $new;
-       } elsif ($blen_o != $blen_n) {
-           return ($blen_o < $blen_n) ? $old : $new;
-       } elsif ($len_o != $len_n) {
-           return ($len_o < $len_n) ? $old : $new;
-       }
-       return $old;
-    }
-    $_ = getline($self);
+    $_ = _getline($self);
 
   HUNK:
     while (defined($_) || not eof($self)) {
@@ -382,26 +391,26 @@ sub analyze {
            } else {
                $patch_header .= "$_\n";
            }
-           last HUNK if not defined($_ = getline($self));
+           last HUNK if not defined($_ = _getline($self));
        }
        $diff_count++;
        # read file header (---/+++ pair)
        unless(s/^--- //) {
            error(_g("expected ^--- in line %d of diff `%s'"), $., $diff);
        }
-        $path{'old'} = $_ = strip_ts($_);
+        $path{'old'} = $_ = _strip_ts($_);
        $fn{'old'} = $_ if $_ ne '/dev/null' and s{^[^/]*/+}{$destdir/};
        if (/\.dpkg-orig$/) {
            error(_g("diff `%s' patches file with name ending .dpkg-orig"), 
$diff);
        }
 
-       unless (defined($_ = getline($self))) {
+       unless (defined($_ = _getline($self))) {
            error(_g("diff `%s' finishes in middle of ---/+++ (line %d)"), 
$diff, $.);
        }
        unless (s/^\+\+\+ //) {
            error(_g("line after --- isn't as expected in diff `%s' (line 
%d)"), $diff, $.);
        }
-        $path{'new'} = $_ = strip_ts($_);
+        $path{'new'} = $_ = _strip_ts($_);
        $fn{'new'} = $_ if $_ ne '/dev/null' and s{^[^/]*/+}{$destdir/};
 
        unless (defined $fn{'old'} or defined $fn{'new'}) {
@@ -437,7 +446,7 @@ sub analyze {
                         $diff, $fn{'old'}, $.) unless -e $fn{'old'};
             }
         }
-       my $fn = intuit_file_patched($fn{'old'}, $fn{'new'});
+       my $fn = _intuit_file_patched($fn{'old'}, $fn{'new'});
 
        my $dirname = $fn;
        if ($dirname =~ s{/[^/]+$}{} && not -d $dirname) {
@@ -458,14 +467,14 @@ sub analyze {
 
        # read hunks
        my $hunk = 0;
-       while (defined($_ = getline($self))) {
+       while (defined($_ = _getline($self))) {
            # read hunk header (@@)
            next if /^\\ /;
            last unless (/^@@ -\d+(,(\d+))? \+\d+(,(\d+))? @\@( .*)?$/);
            my ($olines, $nlines) = ($1 ? $2 : 1, $3 ? $4 : 1);
            # read hunk
            while ($olines || $nlines) {
-               unless (defined($_ = getline($self))) {
+               unless (defined($_ = _getline($self))) {
                     if (($olines == $nlines) and ($olines < 3)) {
                         warning(_g("unexpected end of diff `%s'"), $diff)
                             if $opts{"verbose"};
diff --git a/scripts/Dpkg/Version.pm b/scripts/Dpkg/Version.pm
index d4944c8..2957404 100644
--- a/scripts/Dpkg/Version.pm
+++ b/scripts/Dpkg/Version.pm
@@ -281,21 +281,23 @@ of the character is used to sort between characters.
 
 =cut
 
-sub version_compare_string($$) {
-    sub order {
-        my ($x) = @_;
-       if ($x eq '~') {
-           return -1;
-       } elsif ($x =~ /^\d$/) {
-           return $x * 1 + 1;
-       } elsif ($x =~ /^[A-Za-z]$/) {
-           return ord($x);
-       } else {
-           return ord($x) + 256;
-       }
+sub _version_order {
+    my ($x) = @_;
+
+    if ($x eq '~') {
+        return -1;
+    } elsif ($x =~ /^\d$/) {
+        return $x * 1 + 1;
+    } elsif ($x =~ /^[A-Za-z]$/) {
+        return ord($x);
+    } else {
+        return ord($x) + 256;
     }
-    my @a = map(order($_), split(//, shift));
-    my @b = map(order($_), split(//, shift));
+}
+
+sub version_compare_string($$) {
+    my @a = map(_version_order($_), split(//, shift));
+    my @b = map(_version_order($_), split(//, shift));
     while (1) {
         my ($a, $b) = (shift @a, shift @b);
         return 0 if not defined($a) and not defined($b);
diff --git a/test/100_critic.t b/test/100_critic.t
index fd62ad9..3e91080 100644
--- a/test/100_critic.t
+++ b/test/100_critic.t
@@ -62,6 +62,7 @@ my @policies = qw(
     Modules::RequireExplicitPackage
     Modules::RequireFilenameMatchesPackage
     Subroutines::ProhibitExplicitReturnUndef
+    Subroutines::ProhibitNestedSubs
     TestingAndDebugging::ProhibitNoStrict
     TestingAndDebugging::ProhibitNoWarnings
     TestingAndDebugging::RequireUseStrict

-- 
dpkg's main repository


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

Reply via email to