# HG changeset patch # User Emanuele Giaquinta # Date 2015-10-07 08:33:52 # Node ID c60dfcc0abf2fadad062511a6c17837c8a1271f7 # Parent 502b56a9e8973e0e19608bf360bc95372c6450cf 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 --git a/hgext/convert/cvsps.py b/hgext/convert/cvsps.py --- a/hgext/convert/cvsps.py +++ b/hgext/convert/cvsps.py @@ -207,6 +207,7 @@ def createlog(ui, directory=None, root=" # 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 @@ def createlog(ui, directory=None, root=" 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 @@ def createlog(ui, directory=None, root=" # 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 --git a/tests/test-convert-cvs.t b/tests/test-convert-cvs.t --- a/tests/test-convert-cvs.t +++ b/tests/test-convert-cvs.t @@ -333,13 +333,29 @@ convert again 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 @@ testing debugcvsps 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 ..