Mercurial > hg
view tests/test-revlog-ancestry.py @ 24624:6f0e6fa9fdd7
dirs._addpath: don't mutate Python strings after exposing them (issue4589)
One of the rules of Python strings is that they're immutable. dirs._addpath
breaks this assumption for performance, which is fine as long as it is done
safely -- once a string is no longer internal-only it shouldn't be mutated.
Unfortunately, we weren't being safe here -- we were mutating 'key' even after
adding it to a dictionary.
This only really affects other C code that reads strings, so it's somewhat hard
to write a test for this without poking into the internal representation of the
string via ctypes or similar. There is currently no C code that reads the
output of the string, but there will likely be some soon as the bug indicates.
There's no significant difference in performance.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Mon, 06 Apr 2015 10:46:44 -0700 |
parents | f88c60e740a1 |
children | 43c00ca887d1 |
line wrap: on
line source
import os from mercurial import hg, ui, merge u = ui.ui() repo = hg.repository(u, 'test1', create=1) os.chdir('test1') def commit(text, time): repo.commit(text=text, date="%d 0" % time) def addcommit(name, time): f = open(name, 'w') f.write('%s\n' % name) f.close() repo[None].add([name]) commit(name, time) def update(rev): merge.update(repo, rev, False, True, False) def merge_(rev): merge.update(repo, rev, True, False, False) if __name__ == '__main__': addcommit("A", 0) addcommit("B", 1) update(0) addcommit("C", 2) merge_(1) commit("D", 3) update(2) addcommit("E", 4) addcommit("F", 5) update(3) addcommit("G", 6) merge_(5) commit("H", 7) update(5) addcommit("I", 8) # Ancestors print 'Ancestors of 5' for r in repo.changelog.ancestors([5]): print r, print '\nAncestors of 6 and 5' for r in repo.changelog.ancestors([6, 5]): print r, print '\nAncestors of 5 and 4' for r in repo.changelog.ancestors([5, 4]): print r, print '\nAncestors of 7, stop at 6' for r in repo.changelog.ancestors([7], 6): print r, print '\nAncestors of 7, including revs' for r in repo.changelog.ancestors([7], inclusive=True): print r, print '\nAncestors of 7, 5 and 3, including revs' for r in repo.changelog.ancestors([7, 5, 3], inclusive=True): print r, # Descendants print '\n\nDescendants of 5' for r in repo.changelog.descendants([5]): print r, print '\nDescendants of 5 and 3' for r in repo.changelog.descendants([5, 3]): print r, print '\nDescendants of 5 and 4' for r in repo.changelog.descendants([5, 4]): print r,