[PATCH V4] cvsps: fix computation of parent revisions when log caching is on

Emanuele Giaquinta emanuele.giaquinta at gmail.com
Mon Oct 12 12:54:35 UTC 2015


# HG changeset patch
# User Emanuele Giaquinta <emanuele.giaquinta at gmail.com>
# Date 1444206832 -10800
#      Wed Oct 07 11:33:52 2015 +0300
# Node ID 3847b5ad84f58be794dd18976e0ad9167558929d
# Parent  6e715040c1725b5debce888c4f7d3fdbf55cc900
cvsps: fix computation of parent revisions when log caching is on

cvsps computes the parent revisions of log entries by walking the cvs log
sorted by (rcs, revision) and by iteratively maintaining a 'versions'
dictionary which maps a (rcs, branch) pair onto the last revision seen for that
pair. When log caching is on and a log cache exists, cvsps fails to set the
parent revisions of new log entries because it does not iterate over the log
cache in the parents computation. A complication is that a file rcs can change
(move to/from the attic), with respect to its value in the log cache, if the
file is removed/added back. This patch adds an iteration over the log cache to
update the rcs of cached log entries, if changed, and to properly populate the
'versions' dictionary.

diff -r 6e715040c172 -r 3847b5ad84f5 hgext/convert/cvsps.py
--- a/hgext/convert/cvsps.py	Fri Oct 09 03:53:47 2015 +0900
+++ b/hgext/convert/cvsps.py	Wed Oct 07 11:33:52 2015 +0300
@@ -207,6 +207,7 @@
     # state machine begins here
     tags = {}     # dictionary of revisions on current file with their tags
     branchmap = {} # mapping between branch names and revision numbers
+    rcsmap = {}
     state = 0
     store = False # set when a new record can be appended
 
@@ -439,6 +440,8 @@
 
             log.append(e)
 
+            rcsmap[e.rcs.replace('/Attic/', '/')] = e.rcs
+
             if len(log) % 100 == 0:
                 ui.status(util.ellipsis('%d %s' % (len(log), e.file), 80)+'\n')
 
@@ -446,6 +449,13 @@
 
     # find parent revisions of individual files
     versions = {}
+    for e in sorted(oldlog, key=lambda x: (x.rcs, x.revision)):
+        rcs = e.rcs.replace('/Attic/', '/')
+        if rcs in rcsmap:
+            e.rcs = rcsmap[rcs]
+        branch = e.revision[:-1]
+        versions[(e.rcs, branch)] = e.revision
+
     for e in log:
         branch = e.revision[:-1]
         p = versions.get((e.rcs, branch), None)
diff -r 6e715040c172 -r 3847b5ad84f5 tests/test-convert-cvs.t
--- a/tests/test-convert-cvs.t	Fri Oct 09 03:53:47 2015 +0900
+++ b/tests/test-convert-cvs.t	Wed Oct 07 11:33:52 2015 +0300
@@ -333,13 +333,29 @@
 testing debugcvsps
 
   $ cd src
-  $ hg debugcvsps --fuzz=2
+  $ hg debugcvsps --fuzz=2 -x >/dev/null
+
+commit a new revision changing a and removing b/c
+
+  $ cvscall -q update -A
+  U a
+  U b/c
+  $ sleep 1
+  $ echo h >> a
+  $ cvscall -Q remove -f b/c
+  $ cvscall -q commit -mci | grep '<--'
+  $TESTTMP/cvsrepo/src/a,v  <--  a
+  $TESTTMP/cvsrepo/src/b/c,v  <--  *c (glob)
+
+update and verify the cvsps cache
+
+  $ hg debugcvsps --fuzz=2 -u
   collecting CVS rlog
-  11 log entries
-  cvslog hook: 11 entries
+  13 log entries
+  cvslog hook: 13 entries
   creating changesets
-  10 changeset entries
-  cvschangesets hook: 10 changesets
+  11 changeset entries
+  cvschangesets hook: 11 changesets
   ---------------------
   PatchSet 1 
   Date: * (glob)
@@ -466,5 +482,18 @@
   Members: 
   	b/c:1.1.2.1->1.1.2.2 
   
+  ---------------------
+  PatchSet 11 
+  Date: * (glob)
+  Author: * (glob)
+  Branch: HEAD
+  Tag: (none) 
+  Log:
+  ci
+  
+  Members: 
+  	a:1.2->1.3 
+  	b/c:1.3->1.4(DEAD) 
+  
 
   $ cd ..


More information about the Mercurial-devel mailing list