# HG changeset patch # User Mark Thomas # Date 1506978330 25200 # Node ID 6f11a74d489fb83b0c0882851e7100621c7b4b6e # Parent 0217d66846f7226b320d7b8ba4edf2bf903037b2 util: add safename function for generating safe names to rename to This function finds a name which does not clash with any other name in the manifest, and so can be used to safely rename a file. Differential Revision: https://phab.mercurial-scm.org/D783 diff -r 0217d66846f7 -r 6f11a74d489f mercurial/util.py --- a/mercurial/util.py Mon Oct 02 14:05:30 2017 -0700 +++ b/mercurial/util.py Mon Oct 02 14:05:30 2017 -0700 @@ -26,6 +26,7 @@ import gc import hashlib import imp +import itertools import mmap import os import platform as pyplatform @@ -3835,3 +3836,26 @@ # convenient shortcut dst = debugstacktrace + +def safename(f, tag, ctx, others=None): + """ + Generate a name that it is safe to rename f to in the given context. + + f: filename to rename + tag: a string tag that will be included in the new name + ctx: a context, in which the new name must not exist + others: a set of other filenames that the new name must not be in + + Returns a file name of the form oldname~tag[~number] which does not exist + in the provided context and is not in the set of other names. + """ + if others is None: + others = set() + + fn = '%s~%s' % (f, tag) + if fn not in ctx and fn not in others: + return fn + for n in itertools.count(1): + fn = '%s~%s~%s' % (f, tag, n) + if fn not in ctx and fn not in others: + return fn