states.py
changeset 30 a2189159e92f
parent 29 52c227772dad
child 31 1fef89f56588
equal deleted inserted replaced
29:52c227772dad 30:a2189159e92f
   226     o_writejournal = repo._writejournal
   226     o_writejournal = repo._writejournal
   227     class statefulrepo(repo.__class__):
   227     class statefulrepo(repo.__class__):
   228 
   228 
   229         def nodestate(self, node):
   229         def nodestate(self, node):
   230             rev = self.changelog.rev(node)
   230             rev = self.changelog.rev(node)
       
   231 
   231             for state in STATES:
   232             for state in STATES:
   232                 # XXX avoid for untracked heads
   233                 # XXX avoid for untracked heads
   233                 if state.next is not None:
   234                 if state.next is not None:
   234                     revs = scmutil.revrange(self, ["::%s()" % state.headssymbol])
   235                     ancestors = map(self.changelog.rev, self.stateheads(state))
   235                     if rev in revs:
   236                     ancestors.extend(self.changelog.ancestors(*ancestors))
       
   237                     if rev in ancestors:
   236                         break
   238                         break
   237             return state
   239             return state
   238 
   240 
   239 
   241 
   240 
   242 
   308                 self.setstate(state.next, nodes) # cascading
   310                 self.setstate(state.next, nodes) # cascading
   309 
   311 
   310         def _reducehead(self, candidates):
   312         def _reducehead(self, candidates):
   311             selected = set()
   313             selected = set()
   312             st = laststatewithout(_NOSHARE)
   314             st = laststatewithout(_NOSHARE)
   313             for candidate in candidates:
   315             candidates = set(map(self.changelog.rev, candidates))
   314                 rev = self.changelog.rev(candidate)
   316             heads = set(map(self.changelog.rev, self.stateheads(st)))
   315                 ok = True
   317             shareable = set(self.changelog.ancestors(*heads))
   316                 for h in self.stateheads(st):
   318             shareable.update(heads)
   317                     revh = self.changelog.rev(h)
   319             selected = candidates & shareable
       
   320             unselected = candidates - shareable
       
   321             for rev in unselected:
       
   322                 for revh in heads:
   318                     if self.changelog.descendant(revh, rev):
   323                     if self.changelog.descendant(revh, rev):
   319                         ok = False
   324                         selected.add(revh)
   320                         selected.add(h)
   325             return sorted(map(self.changelog.node, selected))
   321                 if ok:
       
   322                     selected.add(candidate)
       
   323             return sorted(selected)
       
   324 
   326 
   325         ### enable // disable logic
   327         ### enable // disable logic
   326 
   328 
   327         @util.propertycache
   329         @util.propertycache
   328         def _enabledstates(self):
   330         def _enabledstates(self):