Version Control with Subversion - Locking - Lock Communication
Lock Communication
We've seen how
svn lock
and
svn unlock
can be used to create,
release, break, and steal locks. This satisfies the goal of
serializing commit access to a file. But what about the
larger problem of preventing wasted time?
For example, suppose Harry locks an image file and then
begins editing it. Meanwhile, miles away, Sally wants to do
the same thing. She doesn't think to run
svn status
--show-updates
, so she has no idea that Harry has
already locked the file. She spends hours editing the file,
and when she tries to commit her change, she discovers that
either the file is locked or that she's out-of-date.
Regardless, her changes aren't mergeable with Harry's. One of
these two people has to throw away their work, and a lot of
time has been wasted.
Subversion's solution to this problem is provide a
mechanism to remind users that a file ought to be locked
before
the editing begins.
The mechanism is a special
property, svn:needs-lock . If the property
is attached to a file (the value is irrelevant), then the file
will have read-only permissions. When the user locks the file
and receives a lock token, the file becomes read-write. When
the lock is released—either explicitly unlocked, or
released via commit—the file returns to read-only
again.
The theory, then, is that if the image file has this
property attached, then Sally would immediately notice
something is strange when she opens the file for editing. Her
application would be unable to save changes, or (better yet)
tell her that the file is read-only. This reminds her to lock
the file before editing, whereby she discovers the
pre-existing lock:
$ /usr/local/bin/gimp raisin.jpg
gimp: error: file is read-only!
$ ls -l raisin.jpg
-r--r--r-- 1 sally sally 215589 Jun 8 19:23 raisin.jpg
$ svn lock raisin.jpg
svn: Lock request failed: 423 Locked (https://svn.example.com)
$ svn info https://svn.example.com/repos/project/raisin.jpg | grep Lock
Lock Token: opaquelocktoken:fc2b4dee-98f9-0310-abf3-653ff3226e6b
Lock Owner: harry
Lock Created: 2005-06-08 07:29:18 -0500 (Thu, 08 June 2005)
Lock Comment (1 line):
Making some tweaks. Locking for the next two hours.
As a matter of “best practice”, both users
and administrators are encouraged to attach
the svn:needs-lock property to any file
which cannot be contextually merged. It's the main
technique for encouraging good locking habits and preventing
wasted effort.
Note that this property is a communication tool which
works independently from the locking system. In other
words, any file can be locked, whether or not this property
is present. And conversely, the presence of this property
doesn't make the repository require a lock when
committing.
The system isn't flawless, either. It's possible that
even when a file has the property, the read-only reminder
won't always work. Sometimes applications misbehave and
“hijack” the read-only file, silently allowing
users to edit and save the file anyway. Unfortunately,
there's not much Subversion can do about this.
[an error occurred while processing this directive]
|