tests/test-symlink-os-yes-fs-no.py
author Patrick Mezard <pmezard@gmail.com>
Thu, 19 May 2011 22:44:01 +0200
changeset 14389 909ac6b9636b
parent 14168 135e244776f0
child 14553 d976542986d2
permissions -rw-r--r--
patch: stop modifying gitpatch objects gitpatch objects emitted by iterhunks() were referencing file paths unmodified from the input patch. _applydif() made them usable by modifying the gitpatch objects in-place with specified path strip level. The same modified objects were then reused by iterhunks() generator. _applydiff() now copies and update the paths which completely decouples both routines. As a side effect, the "git" event now receives only metadata about copies/renames to perform the necessary copies ahead of time. Other actions are handled in the "file" event.

import os, sys, time
from mercurial import hg, ui, commands, util

TESTDIR = os.environ["TESTDIR"]
BUNDLEPATH = os.path.join(TESTDIR, 'bundles', 'test-no-symlinks.hg')

# only makes sense to test on os which supports symlinks
if not hasattr(os, "symlink"):
    sys.exit(80) # SKIPPED_STATUS defined in run-tests.py

# clone with symlink support
u = ui.ui()
hg.clone(u, BUNDLEPATH, 'test0')

repo = hg.repository(u, 'test0')

# wait a bit, or the status call wont update the dirstate
time.sleep(1)
commands.status(u, repo)

# now disable symlink support -- this is what os.symlink would do on a
# non-symlink file system
def symlink_failure(src, dst):
    raise OSError, (1, "Operation not permitted")
os.symlink = symlink_failure

# dereference links as if a Samba server has exported this to a
# Windows client
for f in 'test0/a.lnk', 'test0/d/b.lnk':
    os.unlink(f)
    fp = open(f, 'wb')
    fp.write(util.readfile(f[:-4]))
    fp.close()

# reload repository
u = ui.ui()
repo = hg.repository(u, 'test0')
commands.status(u, repo)

# try cloning a repo which contains symlinks
u = ui.ui()
hg.clone(u, BUNDLEPATH, 'test1')