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!
LL :-)
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.
>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
description.
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:
ERRR: ("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,
Grisha
To unsubscribe, e-mail: dev-unsubscribe (AT) subversion (DOT) tigris.org
For additional commands, e-mail: dev-help (AT) subversion (DOT) tigris.org