diff --git a/mercurial/changelog.py b/mercurial/changelog.py --- a/mercurial/changelog.py +++ b/mercurial/changelog.py @@ -16,6 +16,7 @@ from .thirdparty import attr from . import ( + copies, encoding, error, pycompat, @@ -89,61 +90,6 @@ return b"\0".join(items) -def encodecopies(files, copies): - items = [] - for i, dst in enumerate(files): - if dst in copies: - items.append(b'%d\0%s' % (i, copies[dst])) - if len(items) != len(copies): - raise error.ProgrammingError( - b'some copy targets missing from file list' - ) - return b"\n".join(items) - - -def decodecopies(files, data): - try: - copies = {} - if not data: - return copies - for l in data.split(b'\n'): - strindex, src = l.split(b'\0') - i = int(strindex) - dst = files[i] - copies[dst] = src - return copies - except (ValueError, IndexError): - # Perhaps someone had chosen the same key name (e.g. "p1copies") and - # used different syntax for the value. - return None - - -def encodefileindices(files, subset): - subset = set(subset) - indices = [] - for i, f in enumerate(files): - if f in subset: - indices.append(b'%d' % i) - return b'\n'.join(indices) - - -def decodefileindices(files, data): - try: - subset = [] - if not data: - return subset - for strindex in data.split(b'\n'): - i = int(strindex) - if i < 0 or i >= len(files): - return None - subset.append(files[i]) - return subset - except (ValueError, IndexError): - # Perhaps someone had chosen the same key name (e.g. "added") and - # used different syntax for the value. - return None - - def stripdesc(desc): """strip trailing whitespace and leading and trailing empty lines""" return b'\n'.join([l.rstrip() for l in desc.splitlines()]).strip(b'\n') @@ -368,7 +314,7 @@ rawindices = self.extra.get(b'filesadded') if rawindices is None: return None - return decodefileindices(self.files, rawindices) + return copies.decodefileindices(self.files, rawindices) @property def filesremoved(self): @@ -378,7 +324,7 @@ rawindices = self.extra.get(b'filesremoved') if rawindices is None: return None - return decodefileindices(self.files, rawindices) + return copies.decodefileindices(self.files, rawindices) @property def p1copies(self): @@ -387,7 +333,7 @@ else: rawcopies = self.extra.get(b'p1copies') if rawcopies is not None: - rawcopies = decodecopies(self.files, rawcopies) + rawcopies = copies.decodecopies(self.files, rawcopies) return rawcopies @property @@ -398,7 +344,7 @@ rawcopies = self.extra.get(b'p2copies') if rawcopies is None: return None - return decodecopies(self.files, rawcopies) + return copies.decodecopies(self.files, rawcopies) @property def description(self): @@ -711,13 +657,13 @@ ): extra.pop(name, None) if p1copies is not None: - p1copies = encodecopies(sortedfiles, p1copies) + p1copies = copies.encodecopies(sortedfiles, p1copies) if p2copies is not None: - p2copies = encodecopies(sortedfiles, p2copies) + p2copies = copies.encodecopies(sortedfiles, p2copies) if filesadded is not None: - filesadded = encodefileindices(sortedfiles, filesadded) + filesadded = copies.encodefileindices(sortedfiles, filesadded) if filesremoved is not None: - filesremoved = encodefileindices(sortedfiles, filesremoved) + filesremoved = copies.encodefileindices(sortedfiles, filesremoved) if self._copiesstorage == b'extra': extrasentries = p1copies, p2copies, filesadded, filesremoved if extra is None and any(x is not None for x in extrasentries): diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -546,7 +546,7 @@ filesadded = None if filesadded is None: if compute_on_none: - filesadded = scmutil.computechangesetfilesadded(self) + filesadded = copies.computechangesetfilesadded(self) else: filesadded = [] return filesadded @@ -565,7 +565,7 @@ filesremoved = None if filesremoved is None: if compute_on_none: - filesremoved = scmutil.computechangesetfilesremoved(self) + filesremoved = copies.computechangesetfilesremoved(self) else: filesremoved = [] return filesremoved diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -14,6 +14,7 @@ from .i18n import _ from . import ( + error, match as matchmod, node, pathutil, @@ -855,6 +856,26 @@ wctx[dst].markcopied(src) +def computechangesetfilesadded(ctx): + """return the list of files added in a changeset + """ + added = [] + for f in ctx.files(): + if not any(f in p for p in ctx.parents()): + added.append(f) + return added + + +def computechangesetfilesremoved(ctx): + """return the list of files removed in a changeset + """ + removed = [] + for f in ctx.files(): + if f not in ctx: + removed.append(f) + return removed + + def computechangesetcopies(ctx): """return the copies data for a changeset @@ -879,3 +900,58 @@ elif src in p2 and p2[src].filenode() == srcnode: p2copies[dst] = src return p1copies, p2copies + + +def encodecopies(files, copies): + items = [] + for i, dst in enumerate(files): + if dst in copies: + items.append(b'%d\0%s' % (i, copies[dst])) + if len(items) != len(copies): + raise error.ProgrammingError( + b'some copy targets missing from file list' + ) + return b"\n".join(items) + + +def decodecopies(files, data): + try: + copies = {} + if not data: + return copies + for l in data.split(b'\n'): + strindex, src = l.split(b'\0') + i = int(strindex) + dst = files[i] + copies[dst] = src + return copies + except (ValueError, IndexError): + # Perhaps someone had chosen the same key name (e.g. "p1copies") and + # used different syntax for the value. + return None + + +def encodefileindices(files, subset): + subset = set(subset) + indices = [] + for i, f in enumerate(files): + if f in subset: + indices.append(b'%d' % i) + return b'\n'.join(indices) + + +def decodefileindices(files, data): + try: + subset = [] + if not data: + return subset + for strindex in data.split(b'\n'): + i = int(strindex) + if i < 0 or i >= len(files): + return None + subset.append(files[i]) + return subset + except (ValueError, IndexError): + # Perhaps someone had chosen the same key name (e.g. "added") and + # used different syntax for the value. + return None diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -2219,23 +2219,3 @@ mark, mark, ) - - -def computechangesetfilesadded(ctx): - """return the list of files added in a changeset - """ - added = [] - for f in ctx.files(): - if not any(f in p for p in ctx.parents()): - added.append(f) - return added - - -def computechangesetfilesremoved(ctx): - """return the list of files removed in a changeset - """ - removed = [] - for f in ctx.files(): - if f not in ctx: - removed.append(f) - return removed