Show More
@@ -19,7 +19,7 b' from . import (' | |||||
19 | encoding, |
|
19 | encoding, | |
20 | error, |
|
20 | error, | |
21 | lock as lockmod, |
|
21 | lock as lockmod, | |
22 |
obs |
|
22 | obsutil, | |
23 | pycompat, |
|
23 | pycompat, | |
24 | scmutil, |
|
24 | scmutil, | |
25 | txnutil, |
|
25 | txnutil, | |
@@ -682,7 +682,7 b' def validdest(repo, old, new):' | |||||
682 | # (new != nullrev has been excluded by the previous check) |
|
682 | # (new != nullrev has been excluded by the previous check) | |
683 | return True |
|
683 | return True | |
684 | elif repo.obsstore: |
|
684 | elif repo.obsstore: | |
685 |
return new.node() in obs |
|
685 | return new.node() in obsutil.foreground(repo, [old.node()]) | |
686 | else: |
|
686 | else: | |
687 | # still an independent clause as it is lazier (and therefore faster) |
|
687 | # still an independent clause as it is lazier (and therefore faster) | |
688 | return old.descendant(new) |
|
688 | return old.descendant(new) |
@@ -28,7 +28,7 b' from . import (' | |||||
28 | error, |
|
28 | error, | |
29 | filemerge, |
|
29 | filemerge, | |
30 | match as matchmod, |
|
30 | match as matchmod, | |
31 |
obs |
|
31 | obsutil, | |
32 | pycompat, |
|
32 | pycompat, | |
33 | scmutil, |
|
33 | scmutil, | |
34 | subrepo, |
|
34 | subrepo, | |
@@ -1588,8 +1588,8 b' def update(repo, node, branchmerge, forc' | |||||
1588 | dirty = wc.dirty(missing=True) |
|
1588 | dirty = wc.dirty(missing=True) | |
1589 | if dirty: |
|
1589 | if dirty: | |
1590 | # Branching is a bit strange to ensure we do the minimal |
|
1590 | # Branching is a bit strange to ensure we do the minimal | |
1591 |
# amount of call to obs |
|
1591 | # amount of call to obsutil.foreground. | |
1592 |
foreground = obs |
|
1592 | foreground = obsutil.foreground(repo, [p1.node()]) | |
1593 | # note: the <node> variable contains a random identifier |
|
1593 | # note: the <node> variable contains a random identifier | |
1594 | if repo[node].node() in foreground: |
|
1594 | if repo[node].node() in foreground: | |
1595 | pass # allow updating to successors |
|
1595 | pass # allow updating to successors |
@@ -869,32 +869,6 b' def successormarkers(ctx):' | |||||
869 | for data in ctx.repo().obsstore.successors.get(ctx.node(), ()): |
|
869 | for data in ctx.repo().obsstore.successors.get(ctx.node(), ()): | |
870 | yield marker(ctx.repo(), data) |
|
870 | yield marker(ctx.repo(), data) | |
871 |
|
871 | |||
872 | def foreground(repo, nodes): |
|
|||
873 | """return all nodes in the "foreground" of other node |
|
|||
874 |
|
||||
875 | The foreground of a revision is anything reachable using parent -> children |
|
|||
876 | or precursor -> successor relation. It is very similar to "descendant" but |
|
|||
877 | augmented with obsolescence information. |
|
|||
878 |
|
||||
879 | Beware that possible obsolescence cycle may result if complex situation. |
|
|||
880 | """ |
|
|||
881 | repo = repo.unfiltered() |
|
|||
882 | foreground = set(repo.set('%ln::', nodes)) |
|
|||
883 | if repo.obsstore: |
|
|||
884 | # We only need this complicated logic if there is obsolescence |
|
|||
885 | # XXX will probably deserve an optimised revset. |
|
|||
886 | nm = repo.changelog.nodemap |
|
|||
887 | plen = -1 |
|
|||
888 | # compute the whole set of successors or descendants |
|
|||
889 | while len(foreground) != plen: |
|
|||
890 | plen = len(foreground) |
|
|||
891 | succs = set(c.node() for c in foreground) |
|
|||
892 | mutable = [c.node() for c in foreground if c.mutable()] |
|
|||
893 | succs.update(obsutil.allsuccessors(repo.obsstore, mutable)) |
|
|||
894 | known = (n for n in succs if n in nm) |
|
|||
895 | foreground = set(repo.set('%ln::', known)) |
|
|||
896 | return set(c.node() for c in foreground) |
|
|||
897 |
|
||||
898 | # keep compatibility for the 4.3 cycle |
|
872 | # keep compatibility for the 4.3 cycle | |
899 | def allprecursors(obsstore, nodes, ignoreflags=0): |
|
873 | def allprecursors(obsstore, nodes, ignoreflags=0): | |
900 | movemsg = 'obsolete.allprecursors moved to obsutil.allprecursors' |
|
874 | movemsg = 'obsolete.allprecursors moved to obsutil.allprecursors' | |
@@ -911,6 +885,11 b' def exclusivemarkers(repo, nodes):' | |||||
911 | repo.ui.deprecwarn(movemsg, '4.3') |
|
885 | repo.ui.deprecwarn(movemsg, '4.3') | |
912 | return obsutil.exclusivemarkers(repo, nodes) |
|
886 | return obsutil.exclusivemarkers(repo, nodes) | |
913 |
|
887 | |||
|
888 | def foreground(repo, nodes): | |||
|
889 | movemsg = 'obsolete.foreground moved to obsutil.foreground' | |||
|
890 | repo.ui.deprecwarn(movemsg, '4.3') | |||
|
891 | return obsutil.foreground(repo, nodes) | |||
|
892 | ||||
914 | def successorssets(repo, initialnode, cache=None): |
|
893 | def successorssets(repo, initialnode, cache=None): | |
915 | movemsg = 'obsolete.successorssets moved to obsutil.successorssets' |
|
894 | movemsg = 'obsolete.successorssets moved to obsutil.successorssets' | |
916 | repo.ui.deprecwarn(movemsg, '4.3') |
|
895 | repo.ui.deprecwarn(movemsg, '4.3') |
@@ -203,6 +203,32 b' def exclusivemarkers(repo, nodes):' | |||||
203 |
|
203 | |||
204 | return exclmarkers |
|
204 | return exclmarkers | |
205 |
|
205 | |||
|
206 | def foreground(repo, nodes): | |||
|
207 | """return all nodes in the "foreground" of other node | |||
|
208 | ||||
|
209 | The foreground of a revision is anything reachable using parent -> children | |||
|
210 | or precursor -> successor relation. It is very similar to "descendant" but | |||
|
211 | augmented with obsolescence information. | |||
|
212 | ||||
|
213 | Beware that possible obsolescence cycle may result if complex situation. | |||
|
214 | """ | |||
|
215 | repo = repo.unfiltered() | |||
|
216 | foreground = set(repo.set('%ln::', nodes)) | |||
|
217 | if repo.obsstore: | |||
|
218 | # We only need this complicated logic if there is obsolescence | |||
|
219 | # XXX will probably deserve an optimised revset. | |||
|
220 | nm = repo.changelog.nodemap | |||
|
221 | plen = -1 | |||
|
222 | # compute the whole set of successors or descendants | |||
|
223 | while len(foreground) != plen: | |||
|
224 | plen = len(foreground) | |||
|
225 | succs = set(c.node() for c in foreground) | |||
|
226 | mutable = [c.node() for c in foreground if c.mutable()] | |||
|
227 | succs.update(allsuccessors(repo.obsstore, mutable)) | |||
|
228 | known = (n for n in succs if n in nm) | |||
|
229 | foreground = set(repo.set('%ln::', known)) | |||
|
230 | return set(c.node() for c in foreground) | |||
|
231 | ||||
206 | def successorssets(repo, initialnode, cache=None): |
|
232 | def successorssets(repo, initialnode, cache=None): | |
207 | """Return set of all latest successors of initial nodes |
|
233 | """Return set of all latest successors of initial nodes | |
208 |
|
234 |
General Comments 0
You need to be logged in to leave comments.
Login now