A repository lock isn’t sacred—in Subversion’s default configuration state, locks can be released not only by the person who created them, but by anyone. 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 An Administrator’s Toolkit.)
$ svnadmin lslocks /var/svn/repos Path: /project2/images/banana.jpg UUID Token: opaquelocktoken:c32b4d88-e8fb-2310-abb3-153ff1236923 Owner: frank Created: 2006-06-15 13:29:18 -0500 (Thu, 15 Jun 2006) Expires: Comment (1 line): Still improving the yellow color. Path: /project/raisin.jpg UUID Token: opaquelocktoken:fc2b4dee-98f9-0310-abf3-653ff3226e6b Owner: harry Created: 2006-02-16 13:29:18 -0500 (Thu, 16 Feb 2006) Expires: Comment (1 line): Need to make a quick tweak to this image. $ svnadmin rmlocks /var/svn/repos /project/raisin.jpg Removed lock on '/project/raisin.jpg'. $
The more interesting option is to allow users to break each
other’s locks over the network. To do this, Sally simply needs to pass
the --force
to the svn unlock command:
$ svn status -u 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: http://svn.example.com/repos/project/raisin.jpg $ svn unlock http://svn.example.com/repos/project/raisin.jpg svn: Unlock request failed: 403 Forbidden (http://svn.example.com) $ svn unlock --force http://svn.example.com/repos/project/raisin.jpg 'raisin.jpg' unlocked. $
Now, 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.
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 relock
the file for her own use. She can accomplish this by using svn unlock with --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 do is to
steal the lock, which involves breaking and
relocking the file all in one atomic step. To do this, Sally passes the
--force
option to svn
lock:
$ svn lock raisin.jpg svn: Lock request failed: 423 Locked (http://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:
$ svn status K raisin.jpg $ svn status -u 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.