comparison hgext/obsolete.py @ 354:bd26eb9714fb stable

obsolete: Detect conflicting changeset!
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Wed, 11 Jul 2012 12:38:05 +0200
parents 4ecbaec1d664
children 56d4c6207ef9
comparison
equal deleted inserted replaced
352:de3edd3856c3 354:bd26eb9714fb
150 return False 150 return False
151 return ctx.rev() in ctx._repo._latecomerset 151 return ctx.rev() in ctx._repo._latecomerset
152 152
153 context.changectx.latecomer = latecomer 153 context.changectx.latecomer = latecomer
154 154
155 def conflicting(ctx):
156 """is the changeset conflicting (Try to succeed to public change)"""
157 if ctx.node() is None:
158 return False
159 return ctx.rev() in ctx._repo._conflictingset
160
161 context.changectx.conflicting = conflicting
162
155 163
156 ### revset 164 ### revset
157 ############################# 165 #############################
158 166
159 def revsethidden(repo, subset, x): 167 def revsethidden(repo, subset, x):
190 198
191 def revsetlatecomer(repo, subset, x): 199 def revsetlatecomer(repo, subset, x):
192 """latecomer, Try to succeed to public change""" 200 """latecomer, Try to succeed to public change"""
193 args = revset.getargs(x, 0, 0, 'latecomer takes no arguments') 201 args = revset.getargs(x, 0, 0, 'latecomer takes no arguments')
194 return [r for r in subset if r in repo._latecomerset] 202 return [r for r in subset if r in repo._latecomerset]
203
204 def revsetconflicting(repo, subset, x):
205 """conflicting, Try to succeed to public change"""
206 args = revset.getargs(x, 0, 0, 'conflicting takes no arguments')
207 return [r for r in subset if r in repo._conflictingset]
195 208
196 def _precursors(repo, s): 209 def _precursors(repo, s):
197 """Precursor of a changeset""" 210 """Precursor of a changeset"""
198 cs = set() 211 cs = set()
199 nm = repo.changelog.nodemap 212 nm = repo.changelog.nodemap
389 revset.symbols["obsolete"] = revsetobsolete 402 revset.symbols["obsolete"] = revsetobsolete
390 revset.symbols["unstable"] = revsetunstable 403 revset.symbols["unstable"] = revsetunstable
391 revset.symbols["suspended"] = revsetsuspended 404 revset.symbols["suspended"] = revsetsuspended
392 revset.symbols["extinct"] = revsetextinct 405 revset.symbols["extinct"] = revsetextinct
393 revset.symbols["latecomer"] = revsetlatecomer 406 revset.symbols["latecomer"] = revsetlatecomer
407 revset.symbols["conflicting"] = revsetconflicting
394 revset.symbols["obsparents"] = revsetprecursors # DEPR 408 revset.symbols["obsparents"] = revsetprecursors # DEPR
395 revset.symbols["precursors"] = revsetprecursors 409 revset.symbols["precursors"] = revsetprecursors
396 revset.symbols["obsancestors"] = revsetallprecursors # DEPR 410 revset.symbols["obsancestors"] = revsetallprecursors # DEPR
397 revset.symbols["allprecursors"] = revsetallprecursors # bad name 411 revset.symbols["allprecursors"] = revsetallprecursors # bad name
398 revset.symbols["successors"] = revsetsuccessors 412 revset.symbols["successors"] = revsetsuccessors
480 if ctx.obsolete(): 494 if ctx.obsolete():
481 raise util.Abort(_("Trying to push obsolete changeset: %s!") % ctx, 495 raise util.Abort(_("Trying to push obsolete changeset: %s!") % ctx,
482 hint=hint) 496 hint=hint)
483 if ctx.latecomer(): 497 if ctx.latecomer():
484 raise util.Abort(_("Trying to push latecomer changeset: %s!") % ctx, 498 raise util.Abort(_("Trying to push latecomer changeset: %s!") % ctx,
499 hint=hint)
500 if ctx.conflicting():
501 raise util.Abort(_("Trying to push conflicting changeset: %s!") % ctx,
485 hint=hint) 502 hint=hint)
486 ### patch remote branch map 503 ### patch remote branch map
487 # do not read it this burn eyes 504 # do not read it this burn eyes
488 try: 505 try:
489 if 'oldbranchmap' not in vars(remote): 506 if 'oldbranchmap' not in vars(remote):
1029 def _latecomerset(self): 1046 def _latecomerset(self):
1030 """the set of rev trying to obsolete public revision""" 1047 """the set of rev trying to obsolete public revision"""
1031 query = 'allsuccessors(public()) - obsolete() - public()' 1048 query = 'allsuccessors(public()) - obsolete() - public()'
1032 return set(self.revs(query)) 1049 return set(self.revs(query))
1033 1050
1051 @util.propertycache
1052 def _conflictingset(self):
1053 """the set of rev trying to obsolete public revision"""
1054 conflicting = set()
1055 obsstore = self.obsstore
1056 newermap = {}
1057 for ctx in self.set('(not public()) - obsolete()'):
1058 prec = obsstore.successors.get(ctx.node(), ())
1059 toprocess = set(prec)
1060 while toprocess:
1061 prec = toprocess.pop()[0]
1062 if prec not in newermap:
1063 newermap[prec] = newerversion(self, prec)
1064 newer = [n for n in newermap[prec] if n] # filter kill
1065 if len(newer) > 1:
1066 conflicting.add(ctx.rev())
1067 break
1068 toprocess.update(obsstore.successors.get(prec, ()))
1069 return conflicting
1070
1034 def _clearobsoletecache(self): 1071 def _clearobsoletecache(self):
1035 if '_obsoleteset' in vars(self): 1072 if '_obsoleteset' in vars(self):
1036 del self._obsoleteset 1073 del self._obsoleteset
1037 self._clearunstablecache() 1074 self._clearunstablecache()
1038 1075
1047 del self._suspendedset 1084 del self._suspendedset
1048 if '_extinctset' in vars(self): 1085 if '_extinctset' in vars(self):
1049 del self._extinctset 1086 del self._extinctset
1050 if '_latecomerset' in vars(self): 1087 if '_latecomerset' in vars(self):
1051 del self._latecomerset 1088 del self._latecomerset
1089 if '_conflictingset' in vars(self):
1090 del self._conflictingset
1052 1091
1053 def addobsolete(self, sub, obj): 1092 def addobsolete(self, sub, obj):
1054 """Add a relation marking that node <sub> is a new version of <obj>""" 1093 """Add a relation marking that node <sub> is a new version of <obj>"""
1055 assert sub != obj 1094 assert sub != obj
1056 if not repo[obj].phase(): 1095 if not repo[obj].phase():