[PATCH 2 of 7] command: creation of obsolete marker
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Mon May 14 11:10:23 CDT 2012
# HG changeset patch
# User Pierre-Yves.David at ens-lyon.org
# Date 1337007994 -7200
# Node ID 5f8d61f6111dd069abf4eb7aef0a51aca4c9ece9
# Parent 76b72def92ce1da2f62189287d9e45e17af714ee
command: creation of obsolete marker
* add metadata encoding/decoding ability
* add a method to obsstore to help creating marker
* add a debug command to create marker
diff -r 76b72def92ce -r 5f8d61f6111d mercurial/commands.py
--- a/mercurial/commands.py Mon May 14 17:05:06 2012 +0200
+++ b/mercurial/commands.py Mon May 14 17:06:34 2012 +0200
@@ -2007,6 +2007,21 @@
flags = repo.known([bin(s) for s in ids])
ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
+ at command('debugmarkeradd', [] + commitopts2,
+ _('OBSOLETED [REPLACEMENT] [REPL...'))
+def debugmarkeradd(ui, repo, obsoleted, *replacements, **opts):
+ """create arbitrary obsolete marker"""
+ metadata = {}
+ if 'date' in opts:
+ metadata['date'] = opts['date']
+ metadata['user'] = opts['user'] or ui.username()
+ repls = tuple(bin(rp) for rp in replacements)
+ l = repo.lock()
+ try:
+ repo.obsstore.create(bin(obsoleted), repls, 0, metadata)
+ finally:
+ l.release()
+
@command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'))
def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
'''access the pushkey key/value protocol
diff -r 76b72def92ce -r 5f8d61f6111d mercurial/obsolete.py
--- a/mercurial/obsolete.py Mon May 14 17:05:06 2012 +0200
+++ b/mercurial/obsolete.py Mon May 14 17:06:34 2012 +0200
@@ -100,6 +100,22 @@
f.close()
+def encodemeta(meta):
+ """return encoded metadata "(<key>:<value>\0)+"
+
+ Assume no ':' in key and no '\0' in both key and value."""
+ return '\0'.join(['%s:%s' % (k, meta[k]) for k in sorted(meta)])
+
+def decodemeta(data):
+ """return dict from encoded version "(<key>:<value>\0)+"
+
+ Assume no ':' in key and no '\0' in both key and value."""
+ d = {}
+ for l in data.split('\0'):
+ if l:
+ key, value = l.split(':')
+ d[key] = value
+ return d
class obsstore(object):
"""store all obsolete marker
@@ -120,6 +136,26 @@
#: node -> set of marker using this node as a replacement.
self.replacements = {}
+ def create(self, obs, repls=(), flag=0, metadata=None):
+ """obsolete: add a obsolete.forgemarker function
+
+ * ensuring it is hashable
+ * check mandatory metadata
+ * encode metadata
+ """
+ if metadata is None:
+ metadata = {}
+ if 'date' not in metadata:
+ metadata['date'] = '%f %i' % util.makedate()
+ if 'user' not in metadata:
+ raise util.Abort('No username specified')
+ for key, value in metadata.iteritems():
+ if ':' in key or '\0' in key or '\0' in value:
+ raise ValueError('meta contains forbiden char %r: %r'
+ % (key, value))
+ marker = (str(obs), tuple(repls), int(flag), encodemeta(metadata))
+ self.add(marker)
+
def add(self, marker):
"""Add a new marker to the store
diff -r 76b72def92ce -r 5f8d61f6111d tests/test-debugcomplete.t
--- a/tests/test-debugcomplete.t Mon May 14 17:05:06 2012 +0200
+++ b/tests/test-debugcomplete.t Mon May 14 17:06:34 2012 +0200
@@ -86,6 +86,7 @@
debugindexdot
debuginstall
debugknown
+ debugmarkeradd
debugpushkey
debugpvec
debugrebuildstate
@@ -236,6 +237,7 @@
debugindexdot:
debuginstall:
debugknown:
+ debugmarkeradd: date, user
debugpushkey:
debugpvec:
debugrebuildstate: rev
diff -r 76b72def92ce -r 5f8d61f6111d tests/test-obsolete.t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-obsolete.t Mon May 14 17:06:34 2012 +0200
@@ -0,0 +1,49 @@
+
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+ $ getid() {
+ > hg id --debug -ir "desc('$1')"
+ > }
+
+
+ $ hg init tmpa
+ $ cd tmpa
+
+Killing a single changeset without replacement
+
+ $ mkcommit kill_me
+ $ hg debugmarkeradd -d '0 0' `getid kill_me` -u babar
+ $ cd ..
+
+Killing a single changeset with replacement
+
+ $ hg init tmpb
+ $ cd tmpb
+ $ mkcommit a
+ $ mkcommit b
+ $ mkcommit original_c
+ $ hg up "desc('b')"
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit new_c
+ created new head
+ $ hg debugmarkeradd `getid original_c` `getid new_c` -d '56 12'
+
+do it again (it read the obsstore before adding new changeset)
+
+ $ hg up '.^'
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit new_2_c
+ created new head
+ $ hg debugmarkeradd -d '1337 0' `getid new_c` `getid new_2_c`
+
+Register two markers with a missing node
+
+ $ hg up '.^'
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit new_3_c
+ created new head
+ $ hg debugmarkeradd -d '1338 0' `getid new_2_c` 1337133713371337133713371337133713371337
+ $ hg debugmarkeradd -d '1339 0' 1337133713371337133713371337133713371337 `getid new_3_c`
More information about the Mercurial-devel
mailing list