Dirk & All,
I came up with, and coded a solution for this problem. The patch is
supplied below, if anyone is interested.
To summarise, this is to fix the "svnadmin load" problem where it emits
the following error:
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
svnadmin: File not found: transaction '20678-1', path
'orphaned/_YEDAAAAA/S01/InstallShield/WebGate/Setup Files/Uncompressed
Files/Language Independent/OS Independent/setup.bmp'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The main problem stemmed from the following query in the BUILDACTIONHIST
phase:
my $sql = 'SELECT * FROM PhysicalAction ORDER BY timestamp ASC, '
. 'itemtype ASC, priority ASC, sortkey ASC, action_id ASC';
If 2 or more projects were added at the exact same time, then depending on
their physical VSS name, they may be returned by this query in the wrong
order (i.e. ADDing a subproject before its parent project has been ADDed).
To fix this, I decided to extend the use of "parentdata" in the
PhysicalAction table, and instead treat it like a project "depth"
attribute. During the MERGEPARENTDATA phase, all of the parent records are
updated with their project path depth as an integer, such that the depth
increases the further a project/file gets from the root project.
The query is then changed to:
my $sql = 'SELECT * FROM PhysicalAction ORDER BY timestamp ASC, '
. 'itemtype ASC, priority ASC, parentdata ASC, sortkey ASC,
action_id ASC';
The solution ensures that subprojects will have a parentdata value greater
than that of their parent project, and therefore be returned by this query
after their parent project.
This fixed the problem for me. If anyone can think of a better solution,
go for it. Delving into this problem has made me truly realise how badly
designed VSS is !
A disclaimer - PERL is not my forte, so if there is a cleverer way of
doing it, I'd be happy for people to edit my efforts :-)
Dave
Index: script/vss2svn.pl
===================================================================
--- script/vss2svn.pl (revision 311)
+++ script/vss2svn.pl (working copy)
@@ -526,13 +526,13 @@
my($sth, $rows, $row);
$sth = $gCfg{dbh}->prepare('SELECT * FROM PhysicalAction '
- . 'WHERE parentdata = 1');
+ . 'WHERE parentdata > 0');
$sth->execute();
# need to pull in all recs at once, since we'll be updating/deleting
data
$rows = $sth->fetchall_arrayref( {} );
- my($childrecs, $child, $id);
+ my($childrecs, $child, $id, $depth);
my @delchild = ();
foreach $row (@$rows) {
@@ -543,6 +543,8 @@
. "'$row->{action_id}'");
}
+ $depth = &GetPathDepth($row);
+
foreach $child (@$childrecs) {
&UpdateParentRec($row, $child);
push(@delchild, $child->{action_id});
@@ -558,6 +560,72 @@
} # End MergeParentData
###############################################################################
+# GetPathDepth
+###############################################################################
+sub GetPathDepth {
+ my($row) = @_;
+
+ # If we've already worked out the depth of this row, return it
immediately
+ if ($row->{parentdata} > 1) {
+ return $row->{parentdata};
+ }
+
+ my($maxParentDepth, $depth, $parents, $parent);
+
+ # Get the row(s) corresponding to the parent(s) of this row, and work
out
+ # the maximum depth
+
+ my $sql = <<"EOSQL";
+SELECT
+ *
+FROM
+ PhysicalAction
+WHERE
+ parentdata > 0
+ AND physname = ?
+ AND actiontype = ?
+EOSQL
+
+ my $sth = $gCfg{dbh}->prepare($sql);
+ $sth->execute( @{ $row }{qw(parentphys actiontype)} );
+
+ $parents = $sth->fetchall_arrayref( {} );
+ $maxParentDepth = 0;
+ foreach $parent (@$parents) {
+ $depth = &GetPathDepth($parent);
+ $maxParentDepth = ($depth > $maxParentDepth) ? $depth :
$maxParentDepth;
+ }
+
+ # Depth of this path becomes one more than the maximum parent depth
+ $depth = $maxParentDepth + 1;
+
+ # Update the row for this record
+ &UpdateDepth($row, $depth);
+
+ return $depth;
+} # End GetPathDepth
+
+###############################################################################
+# UpdateDepth
+###############################################################################
+sub UpdateDepth {
+ my($row, $depth) = @_;
+
+ my $sql = <<"EOSQL";
+UPDATE
+ PhysicalAction
+SET
+ parentdata = ?
+WHERE
+ action_id = ?
+EOSQL
+
+ my $sth = $gCfg{dbh}->prepare($sql);
+ $sth->execute( $depth, $row->{action_id} );
+
+} # End UpdateParentRec
+
+###############################################################################
# GetChildRecs
###############################################################################
sub GetChildRecs {
@@ -739,7 +807,7 @@
my($sth, $row, $action, $handler, $physinfo, $itempaths,
$allitempaths);
my $sql = 'SELECT * FROM PhysicalAction ORDER BY timestamp ASC, '
- . 'itemtype ASC, priority ASC, sortkey ASC, action_id ASC';
+ . 'itemtype ASC, priority ASC, parentdata ASC, sortkey ASC,
action_id ASC';
$sth = $gCfg{dbh}->prepare($sql);
$sth->execute();
This e-mail message and any attachments may contain confidential,
proprietary or non-public information. This information is intended solely
for the designated recipient(s). If an addressing or transmission error
has misdirected this e-mail, please notify the sender immediately and
destroy this e-mail. Any review, dissemination, use or reliance upon this
information by unintended recipients is prohibited. Any opinions expressed
in this e-mail are those of the author personally.
Dirk <[EMAIL PROTECTED]>
Sent by: [EMAIL PROTECTED]
27-Mar-2007 06:51 PM
Please respond to
Vss2Svn Users <[email protected]>
To
Vss2Svn Users <[email protected]>
cc
Subject
Re: Fw: ssphys error: failed to read necessary amount of data from input
file
Dirk schrieb:
>
>> 86197 TUADAAAA EDADAAAA 1 ADD
>> 1 0 \N
>> 86198 LUADAAAA TUADAAAA 1 ADD
>> /orphaned/_YEDAAAAA/S01/InstallShield/WebGate/Setup
>> Files/Uncompressed Files/Language Independent/ 1
>> 0 \N
Ok, the problem is, that you managed to add a subproject to a project at
exactly the same timestamp as you added the project to its parent
project. vss2svn is confused about this fact, and as a result it first
adds the subproject, then the project itself. The above two actions must
actually be reversed.
Here are the corresponding lines from your physical history without any
confidential information
> 58593 TUADAAAA \N LUADAAAA ADD Language
Independent/ 1 1139237015 xxxx 0 \N 1 AAAADAUT
1 \N \N
> 98983 EDADAAAA \N TUADAAAA ADD OS Independent/ 1
1139237015 xxxx 0 \N 1 AAAADADE 1 \N \N
TUADAAAA is added to LUADAAAA at timestamp 1139237015 .
EDADAAAA is added to TUADAAAA also at timestamp 1139237015 .
Gimme some time to think about a solution.
Dirk
_______________________________________________
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
_______________________________________________
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