comparison hgext3rd/topic/stack.py @ 2914:9897babc1fb5

stack: introduce a rich stack object The logic around stack object become more and more complex. We great and object to gather and abstract it.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 04 Sep 2017 12:19:49 +0200
parents f9c8c754a528
children b3abdb3d819e
comparison
equal deleted inserted replaced
2913:6b2ae9f2b9c4 2914:9897babc1fb5
20 context.basectx.orphan = context.basectx.unstable 20 context.basectx.orphan = context.basectx.unstable
21 21
22 if not util.safehasattr(context.basectx, 'isunstable'): 22 if not util.safehasattr(context.basectx, 'isunstable'):
23 context.basectx.isunstable = context.basectx.troubled 23 context.basectx.isunstable = context.basectx.troubled
24 24
25 class stack(object):
26 """object represent a stack and common logic associated to it."""
27
28 def __init__(self, repo, branch=None, topic=None):
29 self._repo = repo
30 self.branch = branch
31 self.topic = topic
32 if topic is not None and branch is not None:
33 raise error.ProgrammingError('both branch and topic specified (not defined yet)')
34 elif topic is not None:
35 trevs = repo.revs("topic(%s) - obsolete()", topic)
36 elif branch is not None:
37 trevs = repo.revs("branch(%s) - public() - obsolete() - topic()", branch)
38 else:
39 raise error.ProgrammingError('neither branch and topic specified (not defined yet)')
40 self._revs = trevs
41
42 def __iter__(self):
43 return iter(self.revs)
44
45 def __getitem__(self, index):
46 return self.revs[index]
47
48 def index(self, item):
49 return self.revs.index(item)
50
51 @util.propertycache
52 def revs(self):
53 revs = _orderrevs(self._repo, self._revs)
54 if revs:
55 pt1 = self._repo[revs[0]].p1()
56 if pt1.obsolete():
57 pt1 = self._repo[_singlesuccessor(self._repo, pt1)]
58 revs.insert(0, pt1.rev())
59 return revs
60
25 def getstack(repo, branch=None, topic=None): 61 def getstack(repo, branch=None, topic=None):
26 # XXX need sorting 62 # XXX need sorting
27 if topic is not None and branch is not None: 63 return stack(repo, branch=branch, topic = topic)
28 raise error.ProgrammingError('both branch and topic specified (not defined yet)')
29 elif topic is not None:
30 trevs = repo.revs("topic(%s) - obsolete()", topic)
31 elif branch is not None:
32 trevs = repo.revs("branch(%s) - public() - obsolete() - topic()", branch)
33 else:
34 raise error.ProgrammingError('neither branch and topic specified (not defined yet)')
35 revs = _orderrevs(repo, trevs)
36 if revs:
37 pt1 = repo[revs[0]].p1()
38 if pt1.obsolete():
39 pt1 = repo[_singlesuccessor(repo, pt1)]
40 revs.insert(0, pt1.rev())
41 return revs
42 64
43 def labelsgen(prefix, labelssuffix): 65 def labelsgen(prefix, labelssuffix):
44 """ Takes a label prefix and a list of suffixes. Returns a string of the prefix 66 """ Takes a label prefix and a list of suffixes. Returns a string of the prefix
45 formatted with each suffix separated with a space. 67 formatted with each suffix separated with a space.
46 """ 68 """