git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Optimized cvsexportcommit: calling 'cvs status' once instead of once per touched file.

From
Steffen Prohaska <prohaska@zib.de>
Date
May 9, 2007, 23:06 UTC
Message-ID
<11787519961666-git-send-email-prohaska@zib.de>
In-Reply-To
<380B28A3-5CD0-4371-A717-1D2629E6302D@zib.de>
Runtime is now independent of the number of modified files.

The old implementation executed 'cvs status' for each file touched by the patch to be applied. The new code calls 'cvs status' only once with all touched files and parses cvs's output to collect all available status information.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 git-cvsexportcommit.perl |   45 ++++++++++++++++++++++++++++++---------------
 1 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index 6ed4719..21d49f6 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -160,36 +160,51 @@ foreach my $p (@afiles) {
     }
 }
 
+# ... check dirs,
 foreach my $d (@dirs) {
     if (-e $d) {
 	$dirty = 1;
 	warn "$d exists and is not a directory!\n";
     }
 }
-foreach my $f (@afiles) {
-    # This should return only one value
-    if ($f =~ m,(.*)/[^/]*$,) {
-	my $p = $1;
-	next if (grep { $_ eq $p } @dirs);
+
+# ... query status of all files that we have a directory for and parse output of 'cvs status' to %cvsstat.
+my @canstatusfiles;
+foreach my $f (@files) {
+    my $path = dirname $f;
+    next if (grep { $_ eq $path } @dirs);
+    push @canstatusfiles, $f;
+}
+  
+my %cvsstat;
+if (@canstatusfiles) {
+    my @cvsoutput;
+    @cvsoutput= safe_pipe_capture(@cvs, 'status', @canstatusfiles);
+    my $matchcount = 0;
+    foreach my $l (@cvsoutput) {
+        chomp $l;
+        if ( $l =~ /^File:/ and  $l =~ /Status: (.*)$/ ) { 
+            $cvsstat{$canstatusfiles[$matchcount]} = $1;
+            $matchcount++;
+        }
     }
-    my @status = grep(m/^File/,  safe_pipe_capture(@cvs, '-q', 'status' ,$f));
-    if (@status > 1) { warn 'Strange! cvs status returned more than one line?'};
-    if (-d dirname $f and $status[0] !~ m/Status: Unknown$/
-	and $status[0] !~ m/^File: no file /) {
+}
+
+# ... validate new files,
+foreach my $f (@afiles) {
+    if (defined ($cvsstat{$f}) and $cvsstat{$f} ne "Unknown") {
  	$dirty = 1;
 	warn "File $f is already known in your CVS checkout -- perhaps it has been added by another user. Or this may indicate that it exists on a different branch. If this is the case, use -f to force the merge.\n";
-	warn "Status was: $status[0]\n";
+	warn "Status was: $cvsstat{$f}\n";
     }
 }
-
+# ... validate known files. 
 foreach my $f (@files) {
     next if grep { $_ eq $f } @afiles;
     # TODO:we need to handle removed in cvs
-    my @status = grep(m/^File/,  safe_pipe_capture(@cvs, '-q', 'status' ,$f));
-    if (@status > 1) { warn 'Strange! cvs status returned more than one line?'};
-    unless ($status[0] =~ m/Status: Up-to-date$/) {
+    unless (defined ($cvsstat{$f}) and $cvsstat{$f} eq "Up-to-date") {
 	$dirty = 1;
-	warn "File $f not up to date in your CVS checkout!\n";
+	warn "File $f not up to date but has status '$cvsstat{$f}' in your CVS checkout!\n";
     }
 }
 if ($dirty) {
-- 
1.5.1.2
Previous: Steffen ProhaskaNext: Martin Langhoff
Message 10 of 15 in “Optimized cvsexportcommit: calling 'cvs status' only once instead of once per changed file.”
  1. Optimized cvsexportcommit: calling 'cvs status' only once instead of once per changed file.Steffen Prohaska, May 8, 2007
  2. Steffen ProhaskaMay 9, 2007
  3. Optimized cvsexportcommit: calling 'cvs status' only once instead of once per changed file.Steffen Prohaska, May 9, 2007
  4. Johannes SchindelinMay 9, 2007
  5. Steffen ProhaskaMay 9, 2007
  6. Johannes SchindelinMay 9, 2007
  7. Steffen ProhaskaMay 9, 2007
  8. Robin RosenbergMay 9, 2007
  9. Steffen ProhaskaMay 9, 2007
  10. Optimized cvsexportcommit: calling 'cvs status' once instead of once per touched file.Steffen Prohaska, May 9, 2007
  11. Martin LanghoffMay 10, 2007
  12. Junio C HamanoMay 10, 2007
  13. RFH for [PATCH] Optimized cvsexportcommit: calling 'cvs status' only once instead of once per changed file.Junio C Hamano, May 13, 2007
  14. Robin RosenbergMay 13, 2007
  15. Martin LanghoffMay 14, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.