##// END OF EJS Templates
largefiles: fix path handling for cp/mv (issue3516)...
largefiles: fix path handling for cp/mv (issue3516) Previously, a copy or a move of a largefile only worked if the cwd was the root of the repository. The first issue was that the destination path passed to os.mkdirs() chopped the absolute path to the standin after '.hglf/', which essentially created a path relative to the repository root. Similarly, the second issue was that the source and dest paths for copyfile() were relative to the repo root. This converts these three paths to absolute paths. Some notable issues, regardless of the directory in which the cp/mv is executed: 1) The copy is not being recorded in lfdirstate, but it is in dirstate for the standins. I'm not sure if this is by design (i.e. minimal info in lfdirstate). 2) status -C doesn't behave as expected. Using the testcase as an example: # after mv + ci $ hg status -C -v --rev '.^' # expected to see 'A' and ' ' lines too R dira\dirb\largefile $ hg status -C -v --rev '.^' foo/largefile # no output # expected to see 'A' and ' ' lines only $ hg status -C -v --rev '.^' foo/ # no output # expected to see 'A', ' ' and 'R' lines $ hg status -C -v --rev '.^' ./ # expected to see 'A' and ' ' lines too R dirb\largefile $ hg status -C -v --rev '.^' ../.hglf/dira/foo/largefile A ..\.hglf\dira\foo\largefile ..\.hglf\dira\dirb\largefile # no 'R' expected when new file is specified $ hg status -C -v --rev '.^' ../.hglf # OK A ..\.hglf\dira\foo\largefile ..\.hglf\dira\dirb\largefile R ..\.hglf\dira\dirb\largefile

File last commit:

r11878:8bb1481c default
r17245:6e84171a stable
Show More
py3kcompat.py
72 lines | 2.3 KiB | text/x-python | PythonLexer
# py3kcompat.py - compatibility definitions for running hg in py3k
#
# Copyright 2010 Renato Cunha <renatoc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
import os, builtins
from numbers import Number
def bytesformatter(format, args):
'''Custom implementation of a formatter for bytestrings.
This function currently relias on the string formatter to do the
formatting and always returns bytes objects.
>>> bytesformatter(20, 10)
0
>>> bytesformatter('unicode %s, %s!', ('string', 'foo'))
b'unicode string, foo!'
>>> bytesformatter(b'test %s', 'me')
b'test me'
>>> bytesformatter('test %s', 'me')
b'test me'
>>> bytesformatter(b'test %s', b'me')
b'test me'
>>> bytesformatter('test %s', b'me')
b'test me'
>>> bytesformatter('test %d: %s', (1, b'result'))
b'test 1: result'
'''
# The current implementation just converts from bytes to unicode, do
# what's needed and then convert the results back to bytes.
# Another alternative is to use the Python C API implementation.
if isinstance(format, Number):
# If the fixer erroneously passes a number remainder operation to
# bytesformatter, we just return the correct operation
return format % args
if isinstance(format, bytes):
format = format.decode('utf-8', 'surrogateescape')
if isinstance(args, bytes):
args = args.decode('utf-8', 'surrogateescape')
if isinstance(args, tuple):
newargs = []
for arg in args:
if isinstance(arg, bytes):
arg = arg.decode('utf-8', 'surrogateescape')
newargs.append(arg)
args = tuple(newargs)
ret = format % args
return ret.encode('utf-8', 'surrogateescape')
builtins.bytesformatter = bytesformatter
# Create bytes equivalents for os.environ values
for key in list(os.environ.keys()):
# UTF-8 is fine for us
bkey = key.encode('utf-8', 'surrogateescape')
bvalue = os.environ[key].encode('utf-8', 'surrogateescape')
os.environ[bkey] = bvalue
origord = builtins.ord
def fakeord(char):
if isinstance(char, int):
return char
return origord(char)
builtins.ord = fakeord
if __name__ == '__main__':
import doctest
doctest.testmod()