WebKitTools:
authorddkilzer <ddkilzer@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Jun 2006 06:01:41 +0000 (06:01 +0000)
committerddkilzer <ddkilzer@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Jun 2006 06:01:41 +0000 (06:01 +0000)
        Reviewed by Darin.

        http://bugzilla.opendarwin.org/show_bug.cgi?id=9570
        Teach prepare-ChangeLog to operate on a list of files or directories

        * Scripts/prepare-ChangeLog: Accept a list of files and/or directories when running.
        * Scripts/svn-create-patch: Code refactoring.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15025 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKitTools/ChangeLog
WebKitTools/Scripts/prepare-ChangeLog
WebKitTools/Scripts/svn-create-patch

index 1b118491bf7a88fa45abf36e811a956e3892f0e7..26d91b11672c963fc8c54fe67ed70140d04717b8 100644 (file)
@@ -1,3 +1,13 @@
+2006-06-24  David Kilzer  <ddkilzer@kilzer.net>
+
+        Reviewed by Darin.
+
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=9570
+        Teach prepare-ChangeLog to operate on a list of files or directories
+
+        * Scripts/prepare-ChangeLog: Accept a list of files and/or directories when running.
+        * Scripts/svn-create-patch: Code refactoring.
+
 2006-06-24  James G. Speth  <speth@end.com>
 
         Reviewed by Darin.
index c0be272a2daaa4a975c4d061938836db975b3408..68e6da07dee9076413d1d6eed3a63f2423c5f756 100755 (executable)
@@ -58,6 +58,13 @@ use File::Spec;
 use File::Temp;
 use Getopt::Long;
 
+sub canonicalizePath($);
+sub get_function_line_ranges($$);
+sub get_function_line_ranges_for_c($$);
+sub get_function_line_ranges_for_java($$);
+sub method_decl_to_selector($);
+sub processPaths(\@);
+
 my $openChangeLogs = 0;
 my $showHelp = 0;
 my $spewDiff = $ENV{"PREPARE_CHANGELOG_DIFF"};
@@ -67,13 +74,15 @@ my $parseOptionsResult =
                "open|o!" => \$openChangeLogs);
 if (!$parseOptionsResult || $showHelp)
   {
-    print STDERR basename($0) . " [-d|--diff] [-h|--help] [-o|--open]\n";
+    print STDERR basename($0) . " [-d|--diff] [-h|--help] [-o|--open] [svndir1 [svndir2 ...]]\n";
     print STDERR "  -d|--diff  Spew diff to stdout when running\n";
     print STDERR "  -h|--help  Show this help message\n";
     print STDERR "  -o|--open  Open ChangeLogs in an editor when done\n";
     exit 1;
   }
 
+my %paths = processPaths(@ARGV);
+
 # Find the list of modified files
 my @changed_files;
 my $changed_files_string;
@@ -99,7 +108,8 @@ my $diffTempFile = $DIFFOUT->filename();
 my @diffFiles;
 
 print STDERR "  Running 'svn diff' to find changed, added, or removed files.\n";
-open SVNDIFF, "$SVN diff --diff-cmd diff -x -N |" or die "The svn diff failed: $!.\n";
+open SVNDIFF, "$SVN diff --diff-cmd diff -x -N '" . join("' '", keys %paths) . "'|"
+    or die "The svn diff failed: $!.\n";
 while (<SVNDIFF>)
   {
     print $DIFFOUT $_;
@@ -336,7 +346,30 @@ if ($openChangeLogs && $logs)
 # Done.
 exit;
 
-sub get_function_line_ranges
+sub canonicalizePath($)
+  {
+    my ($file) = @_;
+
+    # Remove extra slashes and '.' directories in path
+    $file = File::Spec->canonpath($file);
+
+    # Remove '..' directories in path
+    my @dirs = ();
+    foreach my $dir (File::Spec->splitdir($file))
+      {
+        if ($dir eq '..' && $#dirs >= 0 && $dirs[$#dirs] ne '..')
+          {
+            pop(@dirs);
+          }
+        else
+          {
+            push(@dirs, $dir);
+          }
+      }
+    return ($#dirs >= 0) ? File::Spec->catdir(@dirs) : ".";
+  }
+
+sub get_function_line_ranges($$)
   {
     my ($file_handle, $file_name) = @_;
 
@@ -349,7 +382,7 @@ sub get_function_line_ranges
   }
 
 
-sub method_decl_to_selector
+sub method_decl_to_selector($)
   {
     (my $method_decl) = @_;
 
@@ -385,7 +418,7 @@ sub method_decl_to_selector
 #
 # Result is a list of triples: [ start_line, end_line, function_name ].
 
-sub get_function_line_ranges_for_c
+sub get_function_line_ranges_for_c($$)
   {
     my ($file_handle, $file_name) = @_;
 
@@ -691,7 +724,7 @@ sub get_function_line_ranges_for_c
 #
 # Result is a list of triples: [ start_line, end_line, function_name ].
 
-sub get_function_line_ranges_for_java
+sub get_function_line_ranges_for_java($$)
   {
     my ($file_handle, $file_name) = @_;
 
@@ -900,3 +933,43 @@ sub get_function_line_ranges_for_java
 
     return @ranges;
   }
+
+sub processPaths(\@)
+  {
+    my ($paths) = @_;
+    return ("." => 1) if (!@{$paths});
+
+    my %result = ();
+
+    for my $file (@{$paths})
+      {
+        die "can't handle absolute paths like \"$file\"\n" if File::Spec->file_name_is_absolute($file);
+        die "can't handle empty string path\n" if $file eq "";
+        die "can't handle path with single quote in the name like \"$file\"\n" if $file =~ /'/; # ' (keep Xcode syntax highlighting happy)
+
+        my $untouchedFile = $file;
+
+        $file = canonicalizePath($file);
+
+        die "can't handle paths with .. like \"$untouchedFile\"\n" if $file =~ m|/\.\./|;
+
+        $result{$file} = 1;
+      }
+
+    return ("." => 1) if ($result{"."});
+
+    # Remove any paths that also have a parent listed.
+    for my $path (keys %result)
+      {
+        for (my $parent = dirname($path); $parent ne '.'; $parent = dirname($parent))
+         {
+            if ($result{$parent})
+              {
+                delete $result{$path};
+                last;
+              }
+          }
+      }
+
+    return %result;
+  }
index 44990c6f975cad06e3322460f8070ab7c0394ad4..0e3c6b7483a531fe258819f8aa6886f7c624da0f 100755 (executable)
@@ -58,50 +58,16 @@ sub generateFileList($\%\%);
 sub numericcmp($$);
 sub outputBinaryContent($);
 sub pathcmp($$);
+sub processPaths(\@);
 sub splitpath($);
 
 my $showHelp;
 if (!GetOptions("help" => \$showHelp) || $showHelp) {
-    print STDERR basename($0) . " [-h|--help] svndir1 [svndir2 ...]\n";
+    print STDERR basename($0) . " [-h|--help] [svndir1 [svndir2 ...]]\n";
     exit 1;
 }
 
-my $startDir = getcwd();
-my %paths;
-
-# Create list of paths to diff.
-if (!@ARGV) {
-    $paths{"."} = 1;
-} else {
-    for my $file (@ARGV) {
-        die "can't handle absolute paths like \"$file\"\n" if File::Spec->file_name_is_absolute($file);
-        die "can't handle empty string path\n" if $file eq "";
-        die "can't handle path with single quote in the name like \"$file\"\n" if $file =~ /'/; # ' (keep Xcode syntax highlighting happy)
-
-        my $untouchedFile = $file;
-
-        $file = canonicalizePath($file);
-
-        die "can't handle paths with .. like \"$untouchedFile\"\n" if $file =~ m|/\.\./|;
-
-        $paths{$file} = 1;
-    }
-
-    if ($paths{"."}) {
-        %paths = ();
-        $paths{"."} = 1;
-    } else {
-        # Remove any paths that also have a parent listed.
-        for my $path (keys %paths) {
-            for (my $parent = dirname($path); $parent ne '.'; $parent = dirname($parent)) {
-                if ($paths{$parent}) {
-                    delete $paths{$path};
-                    last;
-                }
-            }
-        }
-    }
-}
+my %paths = processPaths(@ARGV);
 
 # Generate a list of files requiring diffs
 my %textFiles;
@@ -247,6 +213,42 @@ sub pathcmp($$)
     return numericcmp($namea, $nameb);
 }
 
+sub processPaths(\@)
+{
+    my ($paths) = @_;
+    return ("." => 1) if (!@{$paths});
+
+    my %result = ();
+
+    for my $file (@{$paths}) {
+        die "can't handle absolute paths like \"$file\"\n" if File::Spec->file_name_is_absolute($file);
+        die "can't handle empty string path\n" if $file eq "";
+        die "can't handle path with single quote in the name like \"$file\"\n" if $file =~ /'/; # ' (keep Xcode syntax highlighting happy)
+
+        my $untouchedFile = $file;
+
+        $file = canonicalizePath($file);
+
+        die "can't handle paths with .. like \"$untouchedFile\"\n" if $file =~ m|/\.\./|;
+
+        $result{$file} = 1;
+    }
+
+    return ("." => 1) if ($result{"."});
+
+    # Remove any paths that also have a parent listed.
+    for my $path (keys %result) {
+        for (my $parent = dirname($path); $parent ne '.'; $parent = dirname($parent)) {
+            if ($result{$parent}) {
+                delete $result{$path};
+                last;
+            }
+        }
+    }
+
+    return %result;
+}
+
 # Break up a path into the directory (with slash) and base name.
 sub splitpath($)
 {