Version Control with Subversion - Locking - Breaking and stealing locks
Breaking and stealing locks
A repository lock isn't sacred; it can be released not
only by the person who created it, but by anyone at all. When
somebody other than the original lock creator destroys a lock,
we refer to this as breaking the
lock.
From the administrator's chair, it's simple to break
locks. The
svnlook
and
svnadmin
programs have the ability to
display and remove locks directly from the repository. (For
more information about these tools, see
the section called “An Administrator's Toolkit”.)
$ svnadmin lslocks /usr/local/svn/repos
Path: /project2/images/banana.jpg
UUID Token: opaquelocktoken:c32b4d88-e8fb-2310-abb3-153ff1236923
Owner: frank
Created: 2005-06-15 13:29:18 -0500 (Wed, 15 Jun 2005)
Expires:
Comment (1 line):
Still improving the yellow color.
Path: /project/raisin.jpg
UUID Token: opaquelocktoken:fc2b4dee-98f9-0310-abf3-653ff3226e6b
Owner: harry
Created: 2005-02-16 13:29:18 -0500 (Wed, 16 Feb 2005)
Expires:
Comment (1 line):
Need to make a quick tweak to this image.
$ svnadmin rmlocks /usr/local/svn/repos /project/raisin.jpg
Removed lock on '/project/raisin.jpg'.
The more interesting option is allowing users to break
each other's locks over the network. To do this, one simply
needs to pass the --force to the unlock
command:
$ whoami
sally
$ svn status --show-updates
M 23 bar.c
M O 32 raisin.jpg
* 72 foo.h
Status against revision: 105
$ svn unlock raisin.jpg
svn: 'raisin.jpg' is not locked in this working copy
$ svn info raisin.jpg | grep URL
URL: https://svn.example.com/repos/project/raisin.jpg
$ svn unlock https://svn.example.com/repos/project/raisin.jpg
svn: Unlock request failed: 403 Forbidden (https://svn.example.com)
$ svn unlock --force https://svn.example.com/repos/project/raisin.jpg
'raisin.jpg' unlocked.
Sally's initial attempt to unlock failed because she
ran
svn unlock
directly on her working copy
of the file, and no lock token was present. To remove the
lock directly from the repository, she needs to pass a URL
to
svn unlock
. Her first attempt to unlock
the URL fails, because she can't authenticate as the lock
owner (nor does she have the lock token). But when she
passes --force , the authentication and
authorization requirements are ignored, and the remote lock is
broken.
Of course, simply breaking a lock may not be enough. In
the running example, Sally may not only want to break Harry's
long-forgotten lock, but re-lock the file for her own use.
She can accomplish this by running
svn unlock
--force
and then
svn lock
back-to-back, but there's a small chance that somebody else
might lock the file between the two commands. The simpler thing
to is steal the lock, which involves
breaking and re-locking the file all in one atomic step. To
do this, pass the --force option
to
svn lock
:
$ svn lock raisin.jpg
svn: Lock request failed: 423 Locked (https://svn.example.com)
$ svn lock --force raisin.jpg
'raisin.jpg' locked by user 'sally'.
In any case, whether the lock is broken or stolen, Harry
may be in for a surprise. Harry's working copy still
contains the original lock token, but that lock no longer
exists. The lock token is said to
be defunct. The lock represented by
the lock-token has either been broken (no longer in the
repository), or stolen (replaced with a different lock).
Either way, Harry can see this by asking
svn
status
to contact the repository:
$ whoami
harry
$ svn status
K raisin.jpg
$ svn status --show-updates
B 32 raisin.jpg
$ svn update
B raisin.jpg
$ svn status
$
If the repository lock was broken, then
svn
status --show-updates
displays
a B (Broken) symbol next to the file.
If a new lock exists in place of the old one, then
a T (sTolen) symbol is shown.
Finally,
svn update
notices any defunct
lock tokens and removes them from the working copy.
[an error occurred while processing this directive]
|