mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 07:17:55 +03:00
merge with stable
This commit is contained in:
commit
af430ebf31
@ -77,8 +77,11 @@ def link(src, dest):
|
||||
try:
|
||||
util.oslink(src, dest)
|
||||
except OSError:
|
||||
# if hardlinks fail, fallback on copy
|
||||
shutil.copyfile(src, dest)
|
||||
# if hardlinks fail, fallback on atomic copy
|
||||
dst = util.atomictempfile(dest)
|
||||
for chunk in util.filechunkiter(open(src)):
|
||||
dst.write(chunk)
|
||||
dst.close()
|
||||
os.chmod(dest, os.stat(src).st_mode)
|
||||
|
||||
def usercachepath(ui, hash):
|
||||
@ -212,6 +215,8 @@ def copyfromcache(repo, hash, filename):
|
||||
if path is None:
|
||||
return False
|
||||
util.makedirs(os.path.dirname(repo.wjoin(filename)))
|
||||
# The write may fail before the file is fully written, but we
|
||||
# don't use atomic writes in the working copy.
|
||||
shutil.copy(path, repo.wjoin(filename))
|
||||
return True
|
||||
|
||||
@ -226,8 +231,11 @@ def copytostoreabsolute(repo, file, hash):
|
||||
if inusercache(repo.ui, hash):
|
||||
link(usercachepath(repo.ui, hash), storepath(repo, hash))
|
||||
else:
|
||||
shutil.copyfile(file, storepath(repo, hash))
|
||||
os.chmod(storepath(repo, hash), os.stat(file).st_mode)
|
||||
dst = util.atomictempfile(storepath(repo, hash))
|
||||
for chunk in util.filechunkiter(open(file)):
|
||||
dst.write(chunk)
|
||||
dst.close()
|
||||
util.copymode(file, storepath(repo, hash))
|
||||
linktousercache(repo, hash)
|
||||
|
||||
def linktousercache(repo, hash):
|
||||
|
68
tests/test-largefiles-small-disk.t
Normal file
68
tests/test-largefiles-small-disk.t
Normal file
@ -0,0 +1,68 @@
|
||||
Test how largefiles abort in case the disk runs full
|
||||
|
||||
$ cat > criple.py <<EOF
|
||||
> import os, errno, shutil
|
||||
> from mercurial import util
|
||||
> #
|
||||
> # this makes the original largefiles code abort:
|
||||
> def copyfileobj(fsrc, fdst, length=16*1024):
|
||||
> fdst.write(fsrc.read(4))
|
||||
> raise IOError(errno.ENOSPC, os.strerror(errno.ENOSPC))
|
||||
> shutil.copyfileobj = copyfileobj
|
||||
> #
|
||||
> # this makes the rewritten code abort:
|
||||
> def filechunkiter(f, size=65536, limit=None):
|
||||
> yield f.read(4)
|
||||
> raise IOError(errno.ENOSPC, os.strerror(errno.ENOSPC))
|
||||
> util.filechunkiter = filechunkiter
|
||||
> #
|
||||
> def oslink(src, dest):
|
||||
> raise OSError("no hardlinks, try copying instead")
|
||||
> util.oslink = oslink
|
||||
> EOF
|
||||
|
||||
$ echo "[extensions]" >> $HGRCPATH
|
||||
$ echo "largefiles =" >> $HGRCPATH
|
||||
|
||||
$ hg init alice
|
||||
$ cd alice
|
||||
$ echo "this is a very big file" > big
|
||||
$ hg add --large big
|
||||
$ hg commit --config extensions.criple=$TESTTMP/criple.py -m big
|
||||
abort: No space left on device
|
||||
[255]
|
||||
|
||||
The largefile is not created in .hg/largefiles:
|
||||
|
||||
$ ls .hg/largefiles
|
||||
dirstate
|
||||
|
||||
The user cache is not even created:
|
||||
|
||||
>>> import os; os.path.exists("$HOME/.cache/largefiles/")
|
||||
False
|
||||
|
||||
Make the commit with space on the device:
|
||||
|
||||
$ hg commit -m big
|
||||
|
||||
Now make a clone with a full disk, and make sure lfutil.link function
|
||||
makes copies instead of hardlinks:
|
||||
|
||||
$ cd ..
|
||||
$ hg --config extensions.criple=$TESTTMP/criple.py clone --pull alice bob
|
||||
requesting all changes
|
||||
adding changesets
|
||||
adding manifests
|
||||
adding file changes
|
||||
added 1 changesets with 1 changes to 1 files
|
||||
updating to branch default
|
||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
||||
getting changed largefiles
|
||||
abort: No space left on device
|
||||
[255]
|
||||
|
||||
The largefile is not created in .hg/largefiles:
|
||||
|
||||
$ ls bob/.hg/largefiles
|
||||
dirstate
|
Loading…
Reference in New Issue
Block a user