largefiles: in putlfile, ensure tempfile's directory exists prior to creation
Let R be a repo served by an hg daemon on a machine with an empty largefiles
cache. Pushing a largefiles repo to R will result in a no-such-file-or-directory
OSError because putlfile will attempt to create a temporary file in
R/.hg/largefiles, which does not yet exist.
This patch also adds a regression test for this scenario.
--- a/hgext/largefiles/proto.py Wed May 02 17:15:11 2012 -0700
+++ b/hgext/largefiles/proto.py Fri May 04 14:36:40 2012 -0400
@@ -20,8 +20,10 @@
user cache.'''
proto.redirect()
- tmpfp = util.atomictempfile(lfutil.storepath(repo, sha),
- createmode=repo.store.createmode)
+ path = lfutil.storepath(repo, sha)
+ util.makedirs(os.path.dirname(path))
+ tmpfp = util.atomictempfile(path, createmode=repo.store.createmode)
+
try:
try:
proto.getfile(tmpfp)
--- a/tests/test-largefiles.t Wed May 02 17:15:11 2012 -0700
+++ b/tests/test-largefiles.t Fri May 04 14:36:40 2012 -0400
@@ -952,6 +952,31 @@
[255]
$ rm -rf empty
+Push a largefiles repository to a served empty repository
+ $ hg init r8
+ $ echo c3 > r8/f1
+ $ hg add --large r8/f1 -R r8
+ $ hg commit -m "m1" -R r8
+ Invoking status precommit hook
+ A f1
+ $ hg init empty
+ $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
+ > --config 'web.allow_push=*' --config web.push_ssl=False
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ rm ${USERCACHE}/*
+ $ hg push -R r8 http://localhost:$HGPORT2
+ pushing to http://localhost:$HGPORT2/
+ searching for changes
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ $ rm -rf empty
+
+used all HGPORTs, kill all daemons
+ $ "$TESTDIR/killdaemons.py"
+
Clone a local repository owned by another user
We have to simulate that here by setting $HOME and removing write permissions
$ ORIGHOME="$HOME"