# HG changeset patch # User Pierre-Yves.David@ens-lyon.org # Date 1342356712 -7200 # Node ID 5bc3e5dc26370540aa9f0131ffb4dc2cdedf5a71 # Parent ac79690436770ffec12b95cedff9ee3d1907c1d0# Parent c67af39d1ae9ad6879ee47e91e0bf9ce6a4f11aa merge with doc fix diff -r c67af39d1ae9 -r 5bc3e5dc2637 docs/evolve-faq.rst --- a/docs/evolve-faq.rst Sun Jul 15 14:42:21 2012 +0200 +++ b/docs/evolve-faq.rst Sun Jul 15 14:51:52 2012 +0200 @@ -96,9 +96,9 @@ Getting changes out of a commit ------------------------------------------------------------ -the ``hg uncommit`` commands allow you to rewrite the current commit to not -include change for some file. The content of target files are not altered on -disk and back as "modified":: +The ``hg uncommit`` command lets you rewrite the parent commit without +selected changed files. Target files content is not altered and +appears again as "modified":: $ hg st M babar @@ -112,8 +112,7 @@ Split a changeset ----------------------- -I you just want to split whole file, you can just use the ``uncommit`` command. - +To split on file boundaries, just use ``uncommit`` command. If you need fine-grained split, there is no official command for that yet. However, it is easily achieved by manual operation:: @@ -223,8 +222,8 @@ Extinct changesets are hidden using the *hidden* feature of mercurial. -Only ``hg log`` and ``hgview`` support it. ``hg glog`` Only support that since -2.2. Other visual viewer don't. +Only ``hg log``, ``hg glog`` and ``hgview`` support it, other +graphical viewer do not. diff -r c67af39d1ae9 -r 5bc3e5dc2637 docs/from-mq.rst --- a/docs/from-mq.rst Sun Jul 15 14:42:21 2012 +0200 +++ b/docs/from-mq.rst Sun Jul 15 14:51:52 2012 +0200 @@ -84,7 +84,7 @@ hg qref -X ```````````` -To remove change from you current commit use:: +To remove changes from you current commit use:: $ hg uncommit not-ready.txt diff -r c67af39d1ae9 -r 5bc3e5dc2637 docs/tutorials/tutorial.t --- a/docs/tutorials/tutorial.t Sun Jul 15 14:42:21 2012 +0200 +++ b/docs/tutorials/tutorial.t Sun Jul 15 14:51:52 2012 +0200 @@ -223,7 +223,7 @@ adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) - (run 'hg update' to get a working copy) + (run 'hg heads .' to see heads, 'hg merge' to merge) I now have a new heads. Note that this remote head is immutable @@ -585,7 +585,7 @@ | | @ ffa278c50818 (draft): bathroom stuff | | - o | 8a79ae8b029e (draft): bathroom stuff + x | 8a79ae8b029e (draft): bathroom stuff |/ o a2fccc2e7b08 (public): SPAM SPAM | @@ -723,7 +723,7 @@ $ hg log -G o ae45c0c3092a (draft): SPAM SPAM SPAM | - o 437efbcaf700 (draft): animals + x 437efbcaf700 (draft): animals | @ ffa278c50818 (draft): bathroom stuff | diff -r c67af39d1ae9 -r 5bc3e5dc2637 hgext/obsolete.py --- a/hgext/obsolete.py Sun Jul 15 14:42:21 2012 +0200 +++ b/hgext/obsolete.py Sun Jul 15 14:51:52 2012 +0200 @@ -120,14 +120,6 @@ ### Patch changectx ############################# -def obsolete(ctx): - """is the changeset obsolete by other""" - if ctx.node()is None: - return False - return bool(ctx._repo.obsoletedby(ctx.node())) and ctx.phase() - -context.changectx.obsolete = obsolete - def unstable(ctx): """is the changeset unstable (have obsolete ancestor)""" if ctx.node() is None: @@ -428,34 +420,6 @@ except KeyError: pass # rebase not found -# Pushkey mechanism for mutable -######################################### - -def listmarkers(repo): - """List markers over pushkey""" - if not repo.obsstore: - return {} - data = repo.obsstore._writemarkers() - return {'dump': base85.b85encode(data)} - -def pushmarker(repo, key, old, new): - """Push markers over pushkey""" - if key != 'dump': - repo.ui.warn(_('unknown key: %r') % key) - return 0 - if old: - repo.ui.warn(_('unexpected old value') % key) - return 0 - data = base85.b85decode(new) - lock = repo.lock() - try: - repo.obsstore.mergemarkers(data) - return 1 - finally: - lock.release() - -pushkey.register('obsolete', pushmarker, listmarkers) - ### Discovery wrapping ############################# @@ -571,20 +535,6 @@ cmdtable = {} command = cmdutil.command(cmdtable) -@command('debugobsolete', [], _('SUBJECT OBJECT')) -def cmddebugobsolete(ui, repo, subject, object): - """add an obsolete relation between two nodes - - The subject is expected to be a newer version of the object. - """ - lock = repo.lock() - try: - sub = repo[subject] - obj = repo[object] - repo.addobsolete(sub.node(), obj.node()) - finally: - lock.release() - return 0 @command('debugconvertobsolete', [], '') def cmddebugconvertobsolete(ui, repo): @@ -594,69 +544,77 @@ l = repo.lock() some = False try: - repo._importoldobsolete = True - store = repo.obsstore - ### very first format + unlink = [] + tr = repo.transaction('convert-obsolete') try: - f = repo.opener('obsolete-relations') + repo._importoldobsolete = True + store = repo.obsstore + ### very first format try: + f = repo.opener('obsolete-relations') + try: + some = True + for line in f: + subhex, objhex = line.split() + suc = bin(subhex) + prec = bin(objhex) + sucs = (suc==nullid) and [] or [suc] + meta = { + 'date': '%i %i' % util.makedate(), + 'user': ui.username(), + } + try: + store.create(tr, prec, sucs, 0, meta) + cnt += 1 + except ValueError: + repo.ui.write_err("invalid old marker line: %s" + % (line)) + err += 1 + finally: + f.close() + unlink.append(repo.join('obsolete-relations')) + except IOError: + pass + ### second (json) format + data = repo.sopener.tryread('obsoletemarkers') + if data: some = True - for line in f: - subhex, objhex = line.split() - suc = bin(subhex) - prec = bin(objhex) - sucs = (suc==nullid) and [] or [suc] - meta = { - 'date': '%i %i' % util.makedate(), - 'user': ui.username(), - } + for oldmark in json.loads(data): + del oldmark['id'] # dropped for now + del oldmark['reason'] # unused until then + oldobject = str(oldmark.pop('object')) + oldsubjects = [str(s) for s in oldmark.pop('subjects', [])] + LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError) + if len(oldobject) != 40: + try: + oldobject = repo[oldobject].node() + except LOOKUP_ERRORS: + pass + if any(len(s) != 40 for s in oldsubjects): + try: + oldsubjects = [repo[s].node() for s in oldsubjects] + except LOOKUP_ERRORS: + pass + + oldmark['date'] = '%i %i' % tuple(oldmark['date']) + meta = dict((k.encode('utf-8'), v.encode('utf-8')) + for k, v in oldmark.iteritems()) try: - store.create(prec, sucs, 0, meta) + succs = [bin(n) for n in oldsubjects] + succs = [n for n in succs if n != nullid] + store.create(tr, bin(oldobject), succs, + 0, meta) cnt += 1 except ValueError: - repo.ui.write_err("invalid old marker line: %s" - % (line)) + repo.ui.write_err("invalid marker %s -> %s\n" + % (oldobject, oldsubjects)) err += 1 - finally: - f.close() - util.unlink(repo.join('obsolete-relations')) - except IOError: - pass - ### second (json) format - data = repo.sopener.tryread('obsoletemarkers') - if data: - some = True - for oldmark in json.loads(data): - del oldmark['id'] # dropped for now - del oldmark['reason'] # unused until then - oldobject = str(oldmark.pop('object')) - oldsubjects = [str(s) for s in oldmark.pop('subjects', [])] - LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError) - if len(oldobject) != 40: - try: - oldobject = repo[oldobject].node() - except LOOKUP_ERRORS: - pass - if any(len(s) != 40 for s in oldsubjects): - try: - oldsubjects = [repo[s].node() for s in oldsubjects] - except LOOKUP_ERRORS: - pass - - oldmark['date'] = '%i %i' % tuple(oldmark['date']) - meta = dict((k.encode('utf-8'), v.encode('utf-8')) - for k, v in oldmark.iteritems()) - try: - succs = [bin(n) for n in oldsubjects] - succs = [n for n in succs if n != nullid] - store.create(bin(oldobject), succs, - 0, meta) - cnt += 1 - except ValueError: - repo.ui.write_err("invalid marker %s -> %s\n" - % (oldobject, oldsubjects)) - err += 1 - util.unlink(repo.sjoin('obsoletemarkers')) + unlink.append(repo.sjoin('obsoletemarkers')) + tr.close() + for path in unlink: + util.unlink(path) + finally: + tr.release() finally: del repo._importoldobsolete l.release() @@ -695,6 +653,15 @@ ui.warn(_('Working directory parent is obsolete\n')) return res +def wrapmaycreateobsmarker(origfn, ui, repo, *args, **opts): + lock = repo.lock() + try: + res = origfn(ui, repo, *args, **opts) + repo._turn_extinct_secret() + finally: + lock.release() + return res + def warnobserrors(orig, ui, repo, *args, **kwargs): """display warning is the command resulted in more instable changeset""" priorunstables = len(repo.revs('unstable()')) @@ -727,16 +694,18 @@ if new != oldnode: lock = repo.lock() try: - meta = { - 'subjects': [new], - 'object': oldnode, - 'date': util.makedate(), - 'user': ui.username(), - 'reason': 'commit --amend', - } - repo.obsstore.create(oldnode, [new], 0, meta) - repo._clearobsoletecache() - repo._turn_extinct_secret() + tr = repo.transaction('post-amend-obst') + try: + meta = { + 'date': '%i %i' % util.makedate(), + 'user': ui.username(), + } + repo.obsstore.create(tr, oldnode, [new], 0, meta) + tr.close() + repo._clearobsoletecache() + repo._turn_extinct_secret() + finally: + tr.release() finally: lock.release() return new @@ -744,6 +713,7 @@ def uisetup(ui): extensions.wrapcommand(commands.table, "update", wrapmayobsoletewc) extensions.wrapcommand(commands.table, "pull", wrapmayobsoletewc) + extensions.wrapcommand(commands.table, "debugobsolete", wrapmaycreateobsmarker) if util.safehasattr(cmdutil, 'amend'): extensions.wrapfunction(cmdutil, 'amend', wrapcmdutilamend) extensions.wrapfunction(discovery, 'findcommonoutgoing', wrapfindcommonoutgoing) @@ -812,183 +782,6 @@ newer.add(()) return sorted(newer) -### obsolete relation storage -############################# -def add2set(d, key, mark): - """add to a `set` in []""" - d.setdefault(key, []).append(mark) - -def markerid(marker): - KEYS = ['subjects', "object", "date", "user", "reason"] - for key in KEYS: - assert key in marker - keys = sorted(marker.keys()) - a = util.sha1() - for key in keys: - if key == 'subjects': - for sub in sorted(marker[key]): - a.update(sub) - elif key == 'id': - pass - else: - a.update(str(marker[key])) - a.update('\0') - return a.digest() - -# mercurial backport - -def encodemeta(meta): - """Return encoded metadata string to string mapping. - - Assume no ':' in key and no '\0' in both key and value.""" - for key, value in meta.iteritems(): - if ':' in key or '\0' in key: - raise ValueError("':' and '\0' are forbidden in metadata key'") - if '\0' in value: - raise ValueError("':' are forbidden in metadata value'") - return '\0'.join(['%s:%s' % (k, meta[k]) for k in sorted(meta)]) - -def decodemeta(data): - """Return string to string dictionary from encoded version.""" - d = {} - for l in data.split('\0'): - if l: - key, value = l.split(':') - d[key] = value - return d - -# data used for parsing and writing -_fmversion = 0 -_fmfixed = '>BIB20s' -_fmnode = '20s' -_fmfsize = struct.calcsize(_fmfixed) -_fnodesize = struct.calcsize(_fmnode) - -def _readmarkers(data): - """Read and enumerate markers from raw data""" - off = 0 - diskversion = _unpack('>B', data[off:off + 1])[0] - off += 1 - if diskversion != _fmversion: - raise util.Abort(_('parsing obsolete marker: unknown version %r') - % diskversion) - - # Loop on markers - l = len(data) - while off + _fmfsize <= l: - # read fixed part - cur = data[off:off + _fmfsize] - off += _fmfsize - nbsuc, mdsize, flags, pre = _unpack(_fmfixed, cur) - # read replacement - sucs = () - if nbsuc: - s = (_fnodesize * nbsuc) - cur = data[off:off + s] - sucs = _unpack(_fmnode * nbsuc, cur) - off += s - # read metadata - # (metadata will be decoded on demand) - metadata = data[off:off + mdsize] - if len(metadata) != mdsize: - raise util.Abort(_('parsing obsolete marker: metadata is too ' - 'short, %d bytes expected, got %d') - % (len(metadata), mdsize)) - off += mdsize - yield (pre, sucs, flags, metadata) - -class obsstore(object): - """Store obsolete markers - - Markers can be accessed with two mappings: - - precursors: old -> set(new) - - successors: new -> set(old) - """ - - def __init__(self): - self._all = [] - # new markers to serialize - self._new = [] - self.precursors = {} - self.successors = {} - - def __iter__(self): - return iter(self._all) - - def __nonzero__(self): - return bool(self._all) - - def create(self, prec, succs=(), flag=0, metadata=None): - """obsolete: add a new obsolete marker - - * ensuring it is hashable - * check mandatory metadata - * encode metadata - """ - if metadata is None: - metadata = {} - if len(prec) != 20: - raise ValueError(repr(prec)) - for succ in succs: - if len(succ) != 20: - raise ValueError((succs)) - marker = (str(prec), tuple(succs), int(flag), encodemeta(metadata)) - self.add(marker) - - def add(self, marker): - """Add a new marker to the store - - This marker still needs to be written to disk""" - self._new.append(marker) - self._load(marker) - - def loadmarkers(self, data): - """Load all markers in data, mark them as known.""" - for marker in _readmarkers(data): - self._load(marker) - - def mergemarkers(self, data): - other = set(_readmarkers(data)) - local = set(self._all) - new = other - local - for marker in new: - self.add(marker) - - def flushmarkers(self, stream): - """Write all markers to a stream - - After this operation, "new" markers are considered "known".""" - self._writemarkers(stream) - self._new[:] = [] - - def _load(self, marker): - self._all.append(marker) - pre, sucs = marker[:2] - self.precursors.setdefault(pre, set()).add(marker) - for suc in sucs: - self.successors.setdefault(suc, set()).add(marker) - - def _writemarkers(self, stream=None): - # Kept separate from flushmarkers(), it will be reused for - # markers exchange. - if stream is None: - final = [] - w = final.append - else: - w = stream.write - w(_pack('>B', _fmversion)) - for marker in self._all: - pre, sucs, flags, metadata = marker - nbsuc = len(sucs) - format = _fmfixed + (_fmnode * nbsuc) - data = [nbsuc, len(metadata), flags, pre] - data.extend(sucs) - w(_pack(format, *data)) - w(metadata) - if stream is None: - return ''.join(final) - - ### repo subclassing ############################# @@ -1024,31 +817,19 @@ """return the set of node that make obsolete (sub)""" return set(marker[0] for marker in self.obsstore.successors.get(node, [])) - @storecache('obsstore') - def obsstore(self): - if not getattr(self, '_importoldobsolete', False): - data = repo.opener.tryread('obsolete-relations') - if not data: - data = repo.sopener.tryread('obsoletemarkers') - if data: - raise util.Abort('old format of obsolete marker detected!\n' - 'run `hg debugconvertobsolete` once.') - store = obsstore() - data = self.sopener.tryread('obsstore') - if data: - store.loadmarkers(data) - return store - @util.propertycache def _obsoleteset(self): """the set of obsolete revision""" + data = repo.opener.tryread('obsolete-relations') + if not data: + data = repo.sopener.tryread('obsoletemarkers') + if data: + raise util.Abort('old format of obsolete marker detected!\n' + 'run `hg debugconvertobsolete` once.') obs = set() nm = self.changelog.nodemap - for obj in self.obsstore.precursors: - try: # /!\api change in Hg 2.2 (e8d37b78acfb22ae2c1fb126c2)/!\ - rev = nm.get(obj) - except TypeError: #XXX to remove while breaking Hg 2.1 support - rev = nm.get(obj, None) + for prec in self.obsstore.precursors: + rev = nm.get(prec) if rev is not None: obs.add(rev) return obs @@ -1129,16 +910,20 @@ % {'sub': short(sub), 'obj': short(obj)}) lock = self.lock() try: - meta = { - 'date': util.makedate(), - 'user': ui.username(), - 'reason': 'unknown', - } - subs = (sub == nullid) and [] or [sub] - mid = self.obsstore.create(obj, subs, 0, meta) - self._clearobsoletecache() - self._turn_extinct_secret() - return mid + tr = self.transaction('add-obsolete') + try: + meta = { + 'date': '%i %i' % util.makedate(), + 'user': ui.username(), + } + subs = (sub == nullid) and [] or [sub] + mid = self.obsstore.create(tr, obj, subs, 0, meta) + tr.close() + self._clearobsoletecache() + self._turn_extinct_secret() + return mid + finally: + tr.release() finally: lock.release() @@ -1147,7 +932,7 @@ # Assume oldnodes are all descendants of a single rev rootrevs = self.revs('roots(%ln)', oldnodes) assert len(rootrevs) == 1, rootrevs - rootnode = self[rootrevs[0]].node() + #rootnode = self[rootrevs[0]].node() for n in oldnodes: self.addobsolete(newnode, n) @@ -1160,27 +945,6 @@ expobs = [c.node() for c in repo.set(query)] phases.retractboundary(repo, 2, expobs) - ### Disk IO - - def lock(self, *args, **kwargs): - l = olock(*args, **kwargs) - if not getattr(l.releasefn, 'obspatched', False): - oreleasefn = l.releasefn - def releasefn(*args, **kwargs): - if 'obsstore' in vars(self) and self.obsstore._new: - f = self.sopener('obsstore', 'wb', atomictemp=True) - try: - self.obsstore.flushmarkers(f) - f.close() - except: # re-raises - f.discard() - raise - oreleasefn(*args, **kwargs) - releasefn.obspatched = True - l.releasefn = releasefn - return l - - ### pull // push support def pull(self, remote, *args, **kwargs): @@ -1188,13 +952,8 @@ l = repo.lock() try: result = opull(remote, *args, **kwargs) - remoteobs = remote.listkeys('obsolete') - if 'dump' in remoteobs: - data = base85.b85decode(remoteobs['dump']) - self.obsstore.mergemarkers(data) - self._clearobsoletecache() - self._turn_extinct_secret() - return result + self._turn_extinct_secret() + return result finally: l.release() @@ -1202,46 +961,26 @@ """wrapper around pull that pull obsolete relation""" self._turn_extinct_secret() result = opush(remote, *args, **opts) - if 'obsolete' in remote.listkeys('namespaces') and self.obsstore: - data = self.obsstore._writemarkers() - r = remote.pushkey('obsolete', 'dump', '', - base85.b85encode(data)) - if not r: - self.ui.warn(_('failed to push obsolete markers!\n')) self._turn_extinct_secret() - return result ### rollback support # /!\ api change in Hg 2.2 (97efd26eb9576f39590812ea9) /!\ - if util.safehasattr(repo, '_journalfiles'): # Hg 2.2 - def _journalfiles(self): - return o_journalfiles() + (self.sjoin('journal.obsstore'),) + def _journalfiles(self): + return o_journalfiles() + (self.sjoin('journal.obsstore'),) - def _writejournal(self, desc): - """wrapped version of _writejournal that save obsolete data""" - o_writejournal(desc) - filename = 'obsstore' - filepath = self.sjoin(filename) - if os.path.exists(filepath): - journalname = 'journal.' + filename - journalpath = self.sjoin(journalname) - util.copyfile(filepath, journalpath) + def _writejournal(self, desc): + """wrapped version of _writejournal that save obsolete data""" + o_writejournal(desc) + filename = 'obsstore' + filepath = self.sjoin(filename) + if os.path.exists(filepath): + journalname = 'journal.' + filename + journalpath = self.sjoin(journalname) + util.copyfile(filepath, journalpath) - else: # XXX removing this bloc will break Hg 2.1 support - def _writejournal(self, desc): - """wrapped version of _writejournal that save obsolete data""" - entries = list(o_writejournal(desc)) - filename = 'obsstore' - filepath = self.sjoin(filename) - if os.path.exists(filepath): - journalname = 'journal.' + filename - journalpath = self.sjoin(journalname) - util.copyfile(filepath, journalpath) - entries.append(journalpath) - return tuple(entries) def _rollback(self, dryrun, force): """wrapped version of _rollback that restore obsolete data""" diff -r c67af39d1ae9 -r 5bc3e5dc2637 tests/test-evolve.t --- a/tests/test-evolve.t Sun Jul 15 14:42:21 2012 +0200 +++ b/tests/test-evolve.t Sun Jul 15 14:51:52 2012 +0200 @@ -231,15 +231,15 @@ $ glog --hidden o 6:23409eba69a0@default(draft) a nifty feature | - | o 5:e416e48b2742@default(secret) french looks better + | x 5:e416e48b2742@default(secret) french looks better | | | | o 4:f8111a076f09@default(draft) another feature | |/ - | | o 3:524e478d4811@default(secret) fix spelling of Zwei + | | x 3:524e478d4811@default(secret) fix spelling of Zwei | | | - | | o 2:7b36850622b2@default(secret) another feature + | | x 2:7b36850622b2@default(secret) another feature | |/ - | o 1:568a468b60fc@default(draft) a nifty feature + | x 1:568a468b60fc@default(draft) a nifty feature |/ @ 0:e55e0562ee93@default(draft) base diff -r c67af39d1ae9 -r 5bc3e5dc2637 tests/test-obsolete-push.t --- a/tests/test-obsolete-push.t Sun Jul 15 14:42:21 2012 +0200 +++ b/tests/test-obsolete-push.t Sun Jul 15 14:51:52 2012 +0200 @@ -32,9 +32,9 @@ $ glog --hidden @ 2:244232c2222a@default(unstable/secret) C | - | o 1:6c81ed0049f8@default(extinct/secret) B + | x 1:6c81ed0049f8@default(extinct/secret) B |/ - o 0:1994f17a630e@default(suspended/secret) A + x 0:1994f17a630e@default(suspended/secret) A $ hg init ../clone $ cat > ../clone/.hg/hgrc < hg add "$1" > hg ci -m "add $1" > } + $ getid() { + > hg id --debug -ir "$1" + > } $ alias qlog="hg log --template='{rev}\n- {node|short}\n'" $ hg init local @@ -27,7 +30,14 @@ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ mkcommit obsol_c # 3 created new head - $ hg debugobsolete 3 2 + $ getid 2 + 4538525df7e2b9f09423636c61ef63a4cb872a2d + $ getid 3 + 0d3f46688ccc6e756c7e96cf64c391c411309597 + $ hg debugobsolete 4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 + $ hg debugobsolete + 4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 0 {'date': '', 'user': 'test'} + Test that obsolete changeset are hidden @@ -82,7 +92,7 @@ $ hg up 1 -q $ mkcommit "obsol_c'" # 4 (on 1) created new head - $ hg debugobsolete 4 3 + $ hg debugobsolete `getid 3` `getid 4` $ qlog 4 - 725c380fe99b @@ -131,9 +141,9 @@ | | o 4:725c380fe99b@default(stable/draft) add obsol_c' | | - o | 3:0d3f46688ccc@default(suspended/secret) add obsol_c + x | 3:0d3f46688ccc@default(suspended/secret) add obsol_c |/ - | o 2:4538525df7e2@default(extinct/secret) add c + | x 2:4538525df7e2@default(extinct/secret) add c |/ o 1:7c3bad9141dc@default(stable/draft) add b | @@ -182,7 +192,7 @@ $ mkcommit obsol_d # 6 created new head 1 new unstables changesets - $ hg debugobsolete 6 5 + $ hg debugobsolete `getid 5` `getid 6` $ qlog 6 - 95de7fc6918d @@ -238,7 +248,7 @@ $ mkcommit "obsol_d'" # 7 created new head 1 new unstables changesets - $ hg debugobsolete 7 6 + $ hg debugobsolete `getid 6` `getid 7` $ hg pull -R ../other-new . pulling from . searching for changes @@ -322,7 +332,7 @@ $ mkcommit "obsol_d''" created new head 1 new unstables changesets - $ hg debugobsolete 8 7 + $ hg debugobsolete `getid 7` `getid 8` $ cd ../other-new $ hg up -q 3 $ hg pull ../local/ @@ -379,8 +389,10 @@ created new head $ hg id -n 9 - $ hg debugobsolete 9 0 - 83b5778897ad try to obsolete immutable changeset 1f0dee641bb7 + $ hg debugobsolete `getid 0` `getid 9` +83b5778897ad try to obsolete immutable changeset 1f0dee641bb7 +# at core level the warning is not issued +# this is now a big issue now that we have latecomer warning $ qlog -r 'obsolete()' 3 - 0d3f46688ccc @@ -400,7 +412,7 @@ 0 - 1f0dee641bb7 - $ hg debugobsolete null 9 #kill + $ hg debugobsolete `getid 9` #kill $ hg up null -q # to be not based on 9 anymore $ qlog 8 @@ -421,7 +433,7 @@ | | o 4 - 725c380fe99b | | - o | 3 - 0d3f46688ccc + x | 3 - 0d3f46688ccc |/ o 1 - 7c3bad9141dc | @@ -429,21 +441,21 @@ $ hg glog --template='{rev} - {node|short}\n' `(hg --version | grep -q 'version 2.1') || echo '--hidden'` - o 9 - 83b5778897ad + x 9 - 83b5778897ad o 8 - 159dfc9fa5d3 | - | o 7 - 909a0fb57e5d + | x 7 - 909a0fb57e5d |/ - | o 6 - 95de7fc6918d + | x 6 - 95de7fc6918d |/ - | o 5 - a7a6f2b5d8a5 + | x 5 - a7a6f2b5d8a5 |/ | o 4 - 725c380fe99b | | - o | 3 - 0d3f46688ccc + x | 3 - 0d3f46688ccc |/ - | o 2 - 4538525df7e2 + | x 2 - 4538525df7e2 |/ o 1 - 7c3bad9141dc | @@ -477,7 +489,7 @@ $ hg up -q 10 $ mkcommit "obsol_d'''" created new head - $ hg debugobsolete 12 11 + $ hg debugobsolete `getid 11` `getid 12` $ hg push ../other-new --traceback pushing to ../other-new searching for changes @@ -578,7 +590,7 @@ 159dfc9fa5d3 9468a5f5d8b2 1f0dee641bb7 83b5778897ad 4538525df7e2 0d3f46688ccc - 83b5778897ad 000000000000 + 83b5778897ad 909a0fb57e5d 159dfc9fa5d3 9468a5f5d8b2 6db5e282cb91 95de7fc6918d 909a0fb57e5d @@ -595,7 +607,7 @@ branch: default commit: (clean) update: 9 new changesets, 9 branch heads (merge) - $ hg debugobsolete 50f11e5e3a63 a7a6f2b5d8a5 + $ hg debugobsolete `getid a7a6f2b5d8a5` `getid 50f11e5e3a63` $ hg log -r 'conflicting()' changeset: 14:50f11e5e3a63 tag: tip diff -r c67af39d1ae9 -r 5bc3e5dc2637 tests/test-qsync.t --- a/tests/test-qsync.t Sun Jul 15 14:42:21 2012 +0200 +++ b/tests/test-qsync.t Sun Jul 15 14:51:52 2012 +0200 @@ -182,7 +182,6 @@ pulling from ../local2 searching for changes no changes found - (run 'hg update' to get a working copy) $ hg pull --mq ../local2/.hg/patches pulling from ../local2/.hg/patches searching for changes diff -r c67af39d1ae9 -r 5bc3e5dc2637 tests/test-stabilize-order.t --- a/tests/test-stabilize-order.t Sun Jul 15 14:42:21 2012 +0200 +++ b/tests/test-stabilize-order.t Sun Jul 15 14:51:52 2012 +0200 @@ -54,9 +54,9 @@ | | | | o 3:7a7552255fb5@default(draft) addc | | | - | | o 2:ef23d6ef94d6@default(draft) addb + | | x 2:ef23d6ef94d6@default(draft) addb | |/ - | o 1:93418d2c0979@default(draft) adda + | x 1:93418d2c0979@default(draft) adda |/ o 0:c471ef929e6a@default(draft) addroot @@ -77,9 +77,9 @@ | | o 3:7a7552255fb5@default(draft) addc | | - | o 2:ef23d6ef94d6@default(draft) addb + | x 2:ef23d6ef94d6@default(draft) addb | | - | o 1:93418d2c0979@default(draft) adda + | x 1:93418d2c0979@default(draft) adda |/ o 0:c471ef929e6a@default(draft) addroot @@ -135,7 +135,7 @@ | | o 9:5e819fbb0d27@default(draft) addc | | - | o 8:6bf44048e43f@default(draft) addb + | x 8:6bf44048e43f@default(draft) addb |/ o 7:f5ff10856e5a@default(draft) adda | diff -r c67af39d1ae9 -r 5bc3e5dc2637 tests/test-stabilize-result.t --- a/tests/test-stabilize-result.t Sun Jul 15 14:42:21 2012 +0200 +++ b/tests/test-stabilize-result.t Sun Jul 15 14:51:52 2012 +0200 @@ -37,11 +37,11 @@ $ glog --hidden @ 4:1447e1c4828d@default(draft) bk:[changea] changea | - | o 3:41ad4fe8c795@default(secret) bk:[] amends 102a90ea7b4a3361e4082ed620918c261189a36a + | x 3:41ad4fe8c795@default(secret) bk:[] amends 102a90ea7b4a3361e4082ed620918c261189a36a | | - | | o 2:cce2c55b8965@default(secret) bk:[] changea + | | x 2:cce2c55b8965@default(secret) bk:[] changea | |/ - | o 1:102a90ea7b4a@default(secret) bk:[] addb + | x 1:102a90ea7b4a@default(secret) bk:[] addb |/ o 0:07f494440405@default(draft) bk:[] adda diff -r c67af39d1ae9 -r 5bc3e5dc2637 tests/test-uncommit.t --- a/tests/test-uncommit.t Sun Jul 15 14:42:21 2012 +0200 +++ b/tests/test-uncommit.t Sun Jul 15 14:51:52 2012 +0200 @@ -220,7 +220,7 @@ $ glog --hidden @ 4:e8db4aa611f6@bar(stable/draft) touncommit | - | o 3:5eb72dbe0cb4@bar(extinct/secret) touncommit + | x 3:5eb72dbe0cb4@bar(extinct/secret) touncommit |/ o 2:f63b90038565@default(stable/draft) merge |\ @@ -267,7 +267,7 @@ | | o 4:e8db4aa611f6@bar(stable/draft) touncommit |/ - | o 3:5eb72dbe0cb4@bar(extinct/secret) touncommit + | x 3:5eb72dbe0cb4@bar(extinct/secret) touncommit |/ o 2:f63b90038565@default(stable/draft) merge |\