# HG changeset patch # User Pierre-Yves.David@ens-lyon.org # Date 1342281488 -7200 # Node ID ce5ea6f6a70072e1fbc8d22ee7755fb76f86e99a # Parent b398e9c2dbd12b91417e49fd5df45a7c7eae7280# Parent 56d4c6207ef9dc80963979fc47038fb2c007dbf8 merge with doc fix diff -r b398e9c2dbd1 -r ce5ea6f6a700 .hgtags --- a/.hgtags Wed Jul 11 13:59:06 2012 -0400 +++ b/.hgtags Sat Jul 14 17:58:08 2012 +0200 @@ -2,3 +2,4 @@ d3f20770b86a31dba56ae7b252089e12b34702da 0.2.0 c046b083a5e0b21af69027f31cee141800cf894b 0.3.0 9bbcd274689829d9239978236e16610688978233 0.4.0 +4ecbaec1d664b1e6f8ebc78292e1ced77a8e69c0 0.4.1 diff -r b398e9c2dbd1 -r ce5ea6f6a700 hgext/evolve.py --- a/hgext/evolve.py Wed Jul 11 13:59:06 2012 -0400 +++ b/hgext/evolve.py Sat Jul 14 17:58:08 2012 +0200 @@ -33,24 +33,6 @@ return map(repo.changelog.node, scmutil.revrange(repo, revsets)) -def warnobserrors(orig, ui, repo, *args, **kwargs): - """display warning is the command resulted in more instable changeset""" - priorunstables = len(repo.revs('unstable()')) - priorlatecomers = len(repo.revs('latecomer()')) - #print orig, priorunstables - #print len(repo.revs('secret() - obsolete()')) - try: - return orig(ui, repo, *args, **kwargs) - finally: - newunstables = len(repo.revs('unstable()')) - priorunstables - newlatecomers = len(repo.revs('latecomer()')) - priorlatecomers - #print orig, newunstables - #print len(repo.revs('secret() - obsolete()')) - if newunstables > 0: - ui.warn(_('%i new unstables changesets\n') % newunstables) - if newlatecomers > 0: - ui.warn(_('%i new latecomers changesets\n') % newlatecomers) - ### changeset rewriting logic ############################# @@ -677,6 +659,10 @@ rebase = None raise error.Abort(_('evolution extension require rebase extension.')) + for cmd in ['amend', 'kill', 'uncommit']: + entry = extensions.wrapcommand(cmdtable, cmd, + obsolete.warnobserrors) + entry = extensions.wrapcommand(commands.table, 'commit', commitwrapper) entry[1].append(('o', 'obsolete', [], _("make commit obsolete this revision"))) @@ -686,11 +672,3 @@ entry[1].append(('O', 'old-obsolete', False, _("make graft obsoletes its source"))) - # warning about more obsolete - for cmd in ['commit', 'push', 'pull', 'graft', 'phase', 'unbundle']: - entry = extensions.wrapcommand(commands.table, cmd, warnobserrors) - for cmd in ['amend', 'kill', 'uncommit']: - entry = extensions.wrapcommand(cmdtable, cmd, warnobserrors) - - if rebase is not None: - entry = extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors) diff -r b398e9c2dbd1 -r ce5ea6f6a700 hgext/obsolete.py --- a/hgext/obsolete.py Wed Jul 11 13:59:06 2012 -0400 +++ b/hgext/obsolete.py Sat Jul 14 17:58:08 2012 +0200 @@ -152,6 +152,14 @@ context.changectx.latecomer = latecomer +def conflicting(ctx): + """is the changeset conflicting (Try to succeed to public change)""" + if ctx.node() is None: + return False + return ctx.rev() in ctx._repo._conflictingset + +context.changectx.conflicting = conflicting + ### revset ############################# @@ -193,6 +201,11 @@ args = revset.getargs(x, 0, 0, 'latecomer takes no arguments') return [r for r in subset if r in repo._latecomerset] +def revsetconflicting(repo, subset, x): + """conflicting, Try to succeed to public change""" + args = revset.getargs(x, 0, 0, 'conflicting takes no arguments') + return [r for r in subset if r in repo._conflictingset] + def _precursors(repo, s): """Precursor of a changeset""" cs = set() @@ -391,6 +404,7 @@ revset.symbols["suspended"] = revsetsuspended revset.symbols["extinct"] = revsetextinct revset.symbols["latecomer"] = revsetlatecomer + revset.symbols["conflicting"] = revsetconflicting revset.symbols["obsparents"] = revsetprecursors # DEPR revset.symbols["precursors"] = revsetprecursors revset.symbols["obsancestors"] = revsetallprecursors # DEPR @@ -400,9 +414,13 @@ templatekw.keywords['obsolete'] = obsoletekw + # warning about more obsolete + for cmd in ['commit', 'push', 'pull', 'graft', 'phase', 'unbundle']: + entry = extensions.wrapcommand(commands.table, cmd, warnobserrors) try: rebase = extensions.find('rebase') if rebase: + entry = extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors) extensions.wrapfunction(rebase, 'buildstate', buildstate) extensions.wrapfunction(rebase, 'defineparents', defineparents) extensions.wrapfunction(rebase, 'concludenode', concludenode) @@ -483,6 +501,9 @@ if ctx.latecomer(): raise util.Abort(_("Trying to push latecomer changeset: %s!") % ctx, hint=hint) + if ctx.conflicting(): + raise util.Abort(_("Trying to push conflicting changeset: %s!") % ctx, + hint=hint) ### patch remote branch map # do not read it this burn eyes try: @@ -609,7 +630,7 @@ 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')] + oldsubjects = [str(s) for s in oldmark.pop('subjects', [])] LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError) if len(oldobject) != 40: try: @@ -626,7 +647,9 @@ meta = dict((k.encode('utf-8'), v.encode('utf-8')) for k, v in oldmark.iteritems()) try: - store.create(bin(oldobject), [bin(n) for n in oldsubjects], + 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: @@ -672,6 +695,28 @@ ui.warn(_('Working directory parent is obsolete\n')) return res +def warnobserrors(orig, ui, repo, *args, **kwargs): + """display warning is the command resulted in more instable changeset""" + priorunstables = len(repo.revs('unstable()')) + priorlatecomers = len(repo.revs('latecomer()')) + priorconflictings = len(repo.revs('conflicting()')) + #print orig, priorunstables + #print len(repo.revs('secret() - obsolete()')) + try: + return orig(ui, repo, *args, **kwargs) + finally: + newunstables = len(repo.revs('unstable()')) - priorunstables + newlatecomers = len(repo.revs('latecomer()')) - priorlatecomers + newconflictings = len(repo.revs('conflicting()')) - priorconflictings + #print orig, newunstables + #print len(repo.revs('secret() - obsolete()')) + if newunstables > 0: + ui.warn(_('%i new unstables changesets\n') % newunstables) + if newlatecomers > 0: + ui.warn(_('%i new latecomers changesets\n') % newlatecomers) + if newconflictings > 0: + ui.warn(_('%i new conflictings changesets\n') % newconflictings) + def noextinctsvisibleheads(orig, repo): repo._turn_extinct_secret() return orig(repo) @@ -754,6 +799,7 @@ while toproceed: current = toproceed.pop() assert len(current) <= 1, 'splitting not handled yet. %r' % current + current = [n for n in current if n != nullid] if current: n, = current if n in objectrels: @@ -1028,6 +1074,26 @@ query = 'allsuccessors(public()) - obsolete() - public()' return set(self.revs(query)) + @util.propertycache + def _conflictingset(self): + """the set of rev trying to obsolete public revision""" + conflicting = set() + obsstore = self.obsstore + newermap = {} + for ctx in self.set('(not public()) - obsolete()'): + prec = obsstore.successors.get(ctx.node(), ()) + toprocess = set(prec) + while toprocess: + prec = toprocess.pop()[0] + if prec not in newermap: + newermap[prec] = newerversion(self, prec) + newer = [n for n in newermap[prec] if n] # filter kill + if len(newer) > 1: + conflicting.add(ctx.rev()) + break + toprocess.update(obsstore.successors.get(prec, ())) + return conflicting + def _clearobsoletecache(self): if '_obsoleteset' in vars(self): del self._obsoleteset @@ -1046,6 +1112,8 @@ del self._extinctset if '_latecomerset' in vars(self): del self._latecomerset + if '_conflictingset' in vars(self): + del self._conflictingset def addobsolete(self, sub, obj): """Add a relation marking that node is a new version of """ diff -r b398e9c2dbd1 -r ce5ea6f6a700 tests/test-obsolete.t --- a/tests/test-obsolete.t Wed Jul 11 13:59:06 2012 -0400 +++ b/tests/test-obsolete.t Sat Jul 14 17:58:08 2012 +0200 @@ -108,6 +108,7 @@ $ hg up 3 -q Working directory parent is obsolete $ mkcommit d # 5 (on 3) + 1 new unstables changesets $ qlog -r 'obsolete()' 3 - 0d3f46688ccc @@ -180,6 +181,7 @@ Working directory parent is obsolete $ mkcommit obsol_d # 6 created new head + 1 new unstables changesets $ hg debugobsolete 6 5 $ qlog 6 @@ -235,6 +237,7 @@ Working directory parent is obsolete $ mkcommit "obsol_d'" # 7 created new head + 1 new unstables changesets $ hg debugobsolete 7 6 $ hg pull -R ../other-new . pulling from . @@ -318,6 +321,7 @@ Working directory parent is obsolete $ mkcommit "obsol_d''" created new head + 1 new unstables changesets $ hg debugobsolete 8 7 $ cd ../other-new $ hg up -q 3 @@ -488,6 +492,7 @@ $ cd local $ hg phase --public 11 + 1 new latecomers changesets $ hg --config extensions.graphlog=glog glog --template='{rev} - ({phase}) {node|short} {desc}\n' @ 12 - (draft) 6db5e282cb91 add obsol_d''' | @@ -578,3 +583,24 @@ 9468a5f5d8b2 6db5e282cb91 95de7fc6918d 909a0fb57e5d a7a6f2b5d8a5 95de7fc6918d + +Check conflict detection + + $ hg up 9468a5f5d8b2 # add obsol_d'' + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit "obsolet_conflicting_d" + $ hg summary + parent: 14:50f11e5e3a63 tip + add obsolet_conflicting_d + branch: default + commit: (clean) + update: 9 new changesets, 9 branch heads (merge) + $ hg debugobsolete 50f11e5e3a63 a7a6f2b5d8a5 + $ hg log -r 'conflicting()' + changeset: 14:50f11e5e3a63 + tag: tip + parent: 11:9468a5f5d8b2 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add obsolet_conflicting_d + diff -r b398e9c2dbd1 -r ce5ea6f6a700 tests/test-oldconvert.t --- a/tests/test-oldconvert.t Wed Jul 11 13:59:06 2012 -0400 +++ b/tests/test-oldconvert.t Sat Jul 14 17:58:08 2012 +0200 @@ -78,9 +78,6 @@ > }, > { > "reason": "import from older format.", - > "subjects": [ - > "a37154106de358121a32a3dd6ba0281931550515" - > ], > "user": "Pierre-Yves David ", > "date": [ > 1336557472.7875929, @@ -92,7 +89,7 @@ > { > "reason": "import from older format.", > "subjects": [ - > "dc8d8aa6e8ac490fcafd074d570df0787ee0ee69" + > "0000000000000000000000000000000000000000" > ], > "user": "Pierre-Yves David ", > "date": [ @@ -111,7 +108,7 @@ $ hg debugconvertobsolete --traceback 3 obsolete marker converted $ hg debugsuccessors - 2c3784e102bb dc8d8aa6e8ac + 2c3784e102bb 3e03d82708d4 3218406b50ed - 5c722672795c a37154106de3 + 5c722672795c 7c3bad9141dc d67cd0334eee diff -r b398e9c2dbd1 -r ce5ea6f6a700 tests/test-uncommit.t --- a/tests/test-uncommit.t Wed Jul 11 13:59:06 2012 -0400 +++ b/tests/test-uncommit.t Sat Jul 14 17:58:08 2012 +0200 @@ -242,6 +242,7 @@ Working directory parent is obsolete $ hg --config extensions.purge= purge $ hg uncommit -I 'set:added() and e' + 2 new conflictings changesets $ hg st --copies A e $ hg st --copies --change . @@ -285,6 +286,7 @@ Working directory parent is obsolete $ hg --config extensions.purge= purge $ hg uncommit --all -X e + 1 new conflictings changesets $ hg st --copies M b M d