On Wed, 14 Jun 2006, Ben Collins-Sussman wrote:
> Trying to understand subversion semantics by looking at DAV traffic is
> like trying to understand western philosophy by watching MTV!
> You don't need to guess at this stuff through observation: just read
> the repository (filesystem) API in svn_fs.h.
The problem is that I cannot use fs, because the requirement is that it
works remotely, most likely via dav_svn, so I must use ra.
> It has long documentation explaining transactions and how they work.
> The RA API is just a shallow layer on top of that. The real 'theory' of
> the repository is in svn_fs.h.
I'll take a look. More comments below.
>> Or am I underestimating SVN here? Can I actually rollback a transaction?
> A transaction starts life as a copy of the latest revision tree. You
> make changes to the transaction tree, then attempt to commit it. If
> newer changes have been committed in the meantime, the repository
> attempts to merge your changes with the new changes. This the dumbest
> sort of merge: if nobody else has changed the same files you're
> changing, then there's no conflict, and the commit succeeds. If
> someone else *has* changed the same file you're changing, a conflict
> is declared, and the commit fails. At that point, the transaction can
> be re-edited and resubmitted for commit again, or can just be aborted
> (deleted). It's your choice.
> The RA commit editor is just a thin layer over the svn_fs.h API. It
> happens to automatically abort a transaction which fails due to
> conflicts, but if you choose to use svn_fs.h directly, you'll have
> more control.
I don't know about "thin" - if you consider that it's a layer on top of
neon (in case of DAV)... "limited" is probably a more accurate
I've just done some tests, and it appears like you say - if [using ra]:
o transaction A creates a (new, previously non-existent) directory X
o transaction B creates X
o A is committed
o B is commited
...the B commit fails, the entire transaction is aborted, and there
seems to be no way to get an explanation from ra as to what the problem
was - all you get is:
ERROR: ("MERGE request failed on '/blah/blah/trunk'", 160024)
... this is rather unfortunate, it'd be nice if there was some way to
reatract, or at least get details of the problem.
> (So the issue of 'rollback' doesn't come into play here. If a
> transaction *does* get successfully committed, a new global revision
> tree is created, and that tree is permanent and immutable. The only way
> to 'undo' a committed change is to submit a transaction which changes
> files back to the way they used to be.)
Yep, that's the way I understood it.
Now if transaction A attempts to create an already existing directory X,
then that operation alone fails, but the editor "lives on", which at least
is some good news... :)
Thanks for the detailed response,
To unsubscribe, e-mail: email@example.com
For additional commands, e-mail: firstname.lastname@example.org
Received on Fri Jun 16 02:06:47 2006