diff --git a/mercurial/revsetlang.py b/mercurial/revsetlang.py --- a/mercurial/revsetlang.py +++ b/mercurial/revsetlang.py @@ -661,3 +661,26 @@ if tree[0] == 'func': funcs.add(tree[1][1]) return funcs + +hashre = util.re.compile('[0-9a-fA-F]{1,40}') + +def _ishashlikesymbol(symbol): + """returns true if the symbol looks like a hash""" + return hashre.match(symbol) + +def gethashlikesymbols(tree): + """returns the list of symbols of the tree that look like hashes + + for example for the revset 3::abe3ff it will return ('3', 'abe3ff')""" + if not tree: + return [] + + results = [] + if tree[0] == "symbol": + results.append(tree[1]) + elif len(tree) >= 3: + for subtree in tree[1:]: + results += gethashlikesymbols(subtree) + # return directly, we don't need to filter symbols again + return results + return [s for s in results if _ishashlikesymbol(s)]