--- a/mercurial/utils/storageutil.py Fri Sep 28 11:29:05 2018 -0700
+++ b/mercurial/utils/storageutil.py Fri Sep 28 11:37:49 2018 -0700
@@ -89,6 +89,25 @@
offset = text.index(b'\x01\n', 2)
return text[offset + 2:]
+def filerevisioncopied(store, node):
+ """Resolve file revision copy metadata.
+
+ Returns ``False`` if the file has no copy metadata. Otherwise a
+ 2-tuple of the source filename and node.
+ """
+ if store.parents(node)[0] != nullid:
+ return False
+
+ meta = parsemeta(store.revision(node))[0]
+
+ # copy and copyrev occur in pairs. In rare cases due to old bugs,
+ # one can occur without the other. So ensure both are present to flag
+ # as a copy.
+ if meta and b'copy' in meta and b'copyrev' in meta:
+ return meta[b'copy'], bin(meta[b'copyrev'])
+
+ return False
+
def iterrevs(storelen, start=0, stop=None):
"""Iterate over revision numbers in a store."""
step = 1