#require unix-permissions no-root no-windows Prepare $ hg init a $ echo a > a/a $ hg -R a ci -A -m a adding a $ hg clone a b updating to branch default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved Test that raising an exception in the release function doesn't cause the lock to choke $ cat > testlock.py << EOF > from mercurial import error, registrar > > cmdtable = {} > command = registrar.command(cmdtable) > > def acquiretestlock(repo, releaseexc): > def unlock(): > if releaseexc: > raise error.Abort(b'expected release exception') > l = repo._lock(repo.vfs, b'testlock', False, unlock, None, b'test lock') > return l > > @command(b'testlockexc') > def testlockexc(ui, repo): > testlock = acquiretestlock(repo, True) > try: > testlock.release() > finally: > try: > testlock = acquiretestlock(repo, False) > except error.LockHeld: > raise error.Abort(b'lockfile on disk even after releasing!') > testlock.release() > EOF $ cat >> $HGRCPATH << EOF > [extensions] > testlock=$TESTTMP/testlock.py > EOF $ hg -R b testlockexc abort: expected release exception [255] One process waiting for another $ SYNC_FILE_LOCKED="$TESTTMP/sync-file-locked" $ export SYNC_FILE_LOCKED $ SYNC_FILE_TRYING_LOCK="$TESTTMP/sync-file-trying-lock" $ export SYNC_FILE_TRYING_LOCK $ cat << EOF > locker.sh > $RUNTESTDIR/testlib/wait-on-file 10 $SYNC_FILE_TRYING_LOCK $SYNC_FILE_LOCKED; > EOF $ cat << EOF > waiter.sh > $RUNTESTDIR/testlib/wait-on-file 10 $SYNC_FILE_LOCKED; > EOF $ clean_sync() { > rm -f "$SYNC_FILE_LOCKED" > rm -f "$SYNC_FILE_TRYING_LOCK" > } $ clean_sync $ echo b > b/b $ hg -R b ci -A -m b \ > --config hooks.precommit="sh $TESTTMP/locker.sh" \ > > stdout & $ hg -R b up -q \ > --config ui.timeout.warn=0 \ > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \ > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \ > > preup-stdout 2> preup-stderr $ wait $ cat preup-stdout $ cat preup-stderr waiting for lock on working directory of b held by process '*' on host '*' (glob) got lock after * seconds (glob) $ cat stdout adding b On processs waiting on another, warning after a long time. $ clean_sync $ echo b > b/c $ hg -R b ci -A -m b \ > --config hooks.precommit="sh $TESTTMP/locker.sh" \ > > stdout & $ hg -R b up -q \ > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \ > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \ > --config ui.timeout.warn=250 \ > > preup-stdout 2> preup-stderr $ wait $ cat preup-stdout $ cat preup-stderr $ cat stdout adding c On processs waiting on another, warning disabled. $ clean_sync $ echo b > b/d $ hg -R b ci -A -m b \ > --config hooks.precommit="sh $TESTTMP/locker.sh" \ > > stdout & $ hg -R b up -q \ > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \ > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \ > --config ui.timeout.warn=-1 \ > > preup-stdout 2>preup-stderr $ wait $ cat preup-stdout $ cat preup-stderr $ cat stdout adding d check we still print debug output On processs waiting on another, warning after a long time (debug output on) $ clean_sync $ echo b > b/e $ hg -R b ci -A -m b \ > --config hooks.precommit="sh $TESTTMP/locker.sh" \ > > stdout & $ hg -R b up \ > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \ > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \ > --config ui.timeout.warn=250 --debug \ > > preup-stdout 2>preup-stderr $ wait $ cat preup-stdout running hook pre-update: sh $TESTTMP/waiter.sh waiting for lock on working directory of b held by process '*' on host '*' (glob) got lock after * seconds (glob) 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cat preup-stderr $ cat stdout adding e On processs waiting on another, warning disabled, (debug output on) $ clean_sync $ echo b > b/f $ hg -R b ci -A -m b \ > --config hooks.precommit="sh $TESTTMP/locker.sh" \ > > stdout & $ hg -R b up \ > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \ > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \ > --config ui.timeout.warn=-1 --debug\ > > preup-stdout 2>preup-stderr $ wait $ cat preup-stdout running hook pre-update: sh $TESTTMP/waiter.sh waiting for lock on working directory of b held by process '*' on host '*' (glob) got lock after * seconds (glob) 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cat preup-stderr $ cat stdout adding f Pushing to a local read-only repo that can't be locked $ chmod 100 a/.hg/store $ hg -R b push a pushing to a searching for changes abort: could not lock repository a: $EACCES$ [20] $ chmod 700 a/.hg/store