# HG changeset patch # User FUJIWARA Katsunori # Date 1429713535 -32400 # Node ID 6e31e12740807e016c2c3ea764932965bfca0153 # Parent cb981009d697fc84e32cb5ac29f06d7c77f6aaf5 bundlerepo: use pathutil.normasprefix to ensure os.sep at the end of cwd Since Python 2.7.9, "os.path.join(path, '')" doesn't add "os.sep" at the end of UNC path (see issue4557 for detail). This makes bundlerepo incorrectly work, if: 1. cwd is the root of UNC share (e.g. "\host\share"), and 2. mainreporoot is near cwd (e.g. "\host\sharefoo\repo") - host of UNC path is same as one of cwd - share of UNC path starts with one of cwd 3. "repopath" isn't specified in bundle URI (e.g. "bundle:bundlefile" or just "bundlefile") For example: $ hg --cwd \host\share -R \host\sharefoo\repo incoming bundle In this case: - os.path.join(r"\host\share", "") returns r"\host\share", - r"\host\sharefoo\repo".startswith(r"\host\share") returns True, then - r"foo\repo" is treated as repopath of bundlerepo instead of r"\host\sharefoo\repo" This causes failure of combining "\host\sharefoo\repo" and bundle file: in addition to it, "\host\share\foo\repo" may be combined with bundle file, if it accidentally exists. This patch uses "pathutil.normasprefix()" to ensure "os.sep" at the end of cwd safely, even with some problematic encodings, which use 0x5c (= "os.sep" on Windows) as the tail byte of some multi-byte characters. BTW, normalization before "pathutil.normasprefix()" isn't needed in this case, because "os.getcwd()" always returns normalized one. diff -r cb981009d697 -r 6e31e1274080 mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py Wed Apr 22 23:38:52 2015 +0900 +++ b/mercurial/bundlerepo.py Wed Apr 22 23:38:55 2015 +0900 @@ -16,6 +16,7 @@ import os, tempfile, shutil import changegroup, util, mdiff, discovery, cmdutil, scmutil, exchange import localrepo, changelog, manifest, filelog, revlog, error, phases, bundle2 +import pathutil class bundlerevlog(revlog.revlog): def __init__(self, opener, indexfile, bundle, linkmapper): @@ -352,7 +353,7 @@ if parentpath == cwd: parentpath = '' else: - cwd = os.path.join(cwd,'') + cwd = pathutil.normasprefix(cwd) if parentpath.startswith(cwd): parentpath = parentpath[len(cwd):] u = util.url(path)