def revset_automationrelevant(repo, subset, x): """``automationrelevant(set)`` Changesets relevant to scheduling in automation. Given a revset that evaluates to a single revision, will return that revision and any ancestors that are part of the same push unioned with non-public ancestors. """ s = revset.getset(repo, revset.fullreposet(repo), x) if len(s) > 1: raise util.Abort('can only evaluate single changeset') ctx = repo[s.first()] revs = set([ctx.rev()]) # The pushlog is used to get revisions part of the same push as # the requested revision. pushlog = getattr(repo, 'pushlog', None) if pushlog: pushinfo = repo.pushlog.pushfromchangeset(ctx) for n in pushinfo[3]: pctx = repo[n] if pctx.rev() <= ctx.rev(): revs.add(pctx.rev()) # Union with non-public ancestors. for rev in repo.revs('::%d & not public()', ctx.rev()): revs.add(rev) return subset & revset.baseset(revs)
def revset_automationrelevant(repo, subset, x): """``automationrelevant(set)`` Changesets relevant to scheduling in automation. Given a revset that evaluates to a single revision, will return that revision and any ancestors that are part of the same push unioned with non-public ancestors. """ s = revset.getset(repo, revset.fullreposet(repo), x) if len(s) > 1: raise error.Abort(b'can only evaluate single changeset') ctx = repo[s.first()] revs = {ctx.rev()} # The pushlog is used to get revisions part of the same push as # the requested revision. pushlog = getattr(repo, 'pushlog', None) if pushlog: push = repo.pushlog.pushfromchangeset(ctx) for n in push.nodes: pctx = repo[n] if pctx.rev() <= ctx.rev(): revs.add(pctx.rev()) # Union with non-public ancestors if configured. By default, we only # consider changesets from the push. However, on special repositories # (namely Try), we want changesets from previous pushes to come into # play too. if repo.ui.configbool(b'hgmo', b'automationrelevantdraftancestors', False): for rev in repo.revs(b'::%d & not public()', ctx.rev()): revs.add(rev) return subset & revset.baseset(revs)
def _calculateset(repo, subset, x, f): """f is a function that converts input nodes to output nodes repo, subset, x are typical revsetpredicate parameters. This function takes care of converting between revs/nodes, and filtering. """ revs = revset.getset(repo, revset.fullreposet(repo), x) cl = repo.unfiltered().changelog torev = cl.rev tonode = cl.node nodemap = cl.nodemap resultrevs = set(torev(n) for n in f(tonode(r) for r in revs) if n in nodemap) s = smartset.baseset(resultrevs - set(revs) - repo.changelog.filteredrevs) s.sort() return subset & s