It seems to be possible to do a copy (or 'restore') and commit as a single action. That is what I was proposing...

Arrgh, I love it. what should happen if you destroy the parent project in between?

e.g the following situation:

ss create $project1
ss add $project1/file.txt
ss commit $project1/file.txt
ss create $project2
ss share $project1/file.txt $project2
ss delete $project1     <----- please note I have deleted the project ---->
ss commit $project2/file.txt
ss purge $project2
ss undelete $project1

I can safely detect that the third commit will be a copy to orphan before, but recovering the project will recover the project to the prior state, without the new additions on the file.txt.

So actually we should not move the actual file to the oprhaned cache, but the deleted "project" in the undeleted state, so that we can perform further checkins on the subitems. Later in the recover step, we need to copy the project from orphan again. :-((( This will be difficult.

Dirk




Further test example: after the command sequence:

echo this is my file > testfile1.txt
svn add testfile1.txt
svn ci -mrevision1
svn del testfile1.txt
svn copy testfile1.txt -rHEAD testfile2.txt
echo now it's at revision 2 and in a different place >> testfile2.txt
svn ci -mrevision2

the following revision is in the dumpfile (for the second "svn ci"), including a single copy-and-modify node for testfile2.txt. When viewing the log for testfile2.txt, it imports the history from testfile1.txt as expected.


Revision-number: 6
Prop-content-length: 107
Content-length: 107

K 7
svn:log
V 9
revision2
K 10
svn:author
V 4
SLee
K 8
svn:date
V 27
2007-02-12T11:06:44.998538Z
PROPS-END

Node-path: testfile2.txt
Node-kind: file
Node-action: add
Node-copyfrom-rev: 5
Node-copyfrom-path: testfile1.txt
Text-content-length: 68
Text-content-md5: b9c43f1081bcaba20cd4d1b03e0e1d06
Content-length: 68

this is my file
now it's at revision 2 and in a different place


Node-path: testfile1.txt
Node-action: delete


* Dumped revision 6.


vss2svn could do the same - when a commit is needed for a file with no currently active path, find the last place it WAS active, and commit to the orphaned folder, together with Node-copyfrom-rev and Node-copyfrom-path lines for any path where the previous version had been.

> c) file MOVE from an unknown location can become a SHARE (which if the
> item is orphaned will turn back into a MOVE again)
Ähm, how do we know where to move/share from, if the "source path" is
unknown?

SHARE from any known instance of that physical file at that revision.

> e) dir MOVE to/from an unknown location can become a MOVE to/from
> orphaned
The same problem here: what is the move source if it is unknown?

The orphaned folder, which is where vss2svn puts things with no parent. A dir should exist in precisely one place at all times... so the where to move to/from is easier to determine in that case (unless you can delete/restore a dir? or is that only files? if you can, it could exist in zero places)


Essentially, the ideal would be that any given revision of a file exists in the orphaned folder only if there is no valid parent for the current revision of the file. Remaining orphans at the end of conversion would be anything where there was no valid itempath for the item with that physical name after the last ADD, COMMIT, MOVE (with no need to optimistically move DELETEd items to the orphaned folder as these can be recovered from the original path as described above when the next commit occurs).


I'm also wondering if the gPhysInfo is laid out the right way round... as far as I can see from the layout of the PhysicalAction file, all operations (MOVE, SHARE, BRANCH, PIN, etc.) "know" a priori what revision of the file they are supposed to be working on, yet the gPhysInfo structure in ActionHandler.pm seems to be laid out in a manner that is primarily determining what versions are available for a specific parent, rather than what parents are available for a specific version.

Rather than looking up each parent first...
$gPhysInfo{$physname}->{parents}->{$parentphys}->{versions}->[$version]

... might it be restructured so that:
$gPhysInfo{$physname}->{parents}->{$parentphys}
gives only live parents to which the file is shared and to which a subsequent commit would occur... (if empty, the next commit would be to orphaned). This would make the {deleted} and {pinned} fields obsolete.

A new layout addressed something like:
$gPhysInfo{$physname}->{versions}->[$version]->{parents}->{$parentphys}
could be used to lookup what locations any given revision of the file exists at (with the original path or enough info to reconstruct it as needed)

On a commit, the entirety of the {parents} field could be copied to the new item in the {versions} array, and then augmented with path / version information. If there is no valid path, then the orphaned folder would be used, and if the file was not orphaned in the previous revision a copy+modify+commit from first listed path for previous version (or an add if there was no previous revision). When adding a parent to {versions}->[$version]->{parents}, an existing one with an undef $parentphys can be removed as a "real" path would always be preferred to orphaned...

I think that would simplify some of the operations I am referring to... are there others that it would complicate?


_______________________________________________
vss2svn-users mailing list
Project homepage:
http://www.pumacode.org/projects/vss2svn/
Subscribe/Unsubscribe/Admin:
http://lists.pumacode.org/mailman/listinfo/vss2svn-users-lists.pumacode.org
Mailing list web interface (with searchable archives):
http://dir.gmane.org/gmane.comp.version-control.subversion.vss2svn.user

Reply via email to