On Monday 29 January 2007 18:36, Scott Nowell wrote:
>
> ------- Committed revision 2737 >>>
>
> <<< Started new transaction, based on original revision 2738
> * editing path : MS04/Documents/PSAC-MS04.doc ... done.
>
> ------- Committed revision 2738 >>>
>
> <<< Started new transaction, based on original revision 2739
> * adding path : MS01/Source/UnitTests/Scripts/ManualTests.c ...
> done.
>
> ------- Committed revision 2739 >>>
>
> <<< Started new transaction, based on original revision 2740
> * adding path : labels/Ready for MS01 Validation Run ... done.
> * adding path : labels/Ready for MS01 Validation Run/UC00 ... done.
> * adding path : labels/Ready for MS01 Validation Run/UC00/Source
> ... done.
> * adding path : labels/Ready for MS01 Validation
> Run/UC00/Source/MicroCOS ... done.
> <SNIP about 80 similar lines>
> * adding path : labels/Ready for MS01 Validation
> Run/MS01/Source/UnitTests/
> Test/setenv.bat ...COPIED... done.
> svnadmin: Invalid change ordering: new node revision ID without delete
>
Hi Scott,
I've seen this error because child and parent creation order were reversed due
to bogus timestamps. If that is the case in your dataset the attached patch
may help you.
Index: script/vss2svn.pl
===================================================================
--- script/vss2svn.pl (revision 289)
+++ script/vss2svn.pl (working copy)
@@ -513,6 +513,7 @@
foreach $child (@$childrecs) {
&UpdateParentRec($row, $child);
push(@delchild, $child->{action_id});
+ last;
}
}
@@ -618,7 +619,7 @@
$childrecs = &GetChildRecs($row, 1);
if (scalar @$childrecs > 1) {
- &ThrowWarning("Multiple chidl recs for parent MOVE rec "
+ &ThrowWarning("Multiple child recs for parent MOVE rec "
. "'$row->{action_id}'");
}
@@ -628,6 +629,7 @@
. 'WHERE action_id = ?');
$update->execute( $row->{parentphys}, $child->{action_id} );
+ last;
}
if (scalar @$childrecs == 0) {
@@ -654,6 +656,8 @@
&DeleteChildRec($id);
}
+ FixAddParentTimestamp();
+
1;
} # End MergeMoveData
@@ -671,6 +675,61 @@
} # End DeleteChildRec
###############################################################################
+# FixAddParentTimestamp
+###############################################################################
+sub FixAddParentTimestamp {
+
+# This fixes the timestamps of ADD records for parents that have child records that are
+# dated before the parents creation. This would cause the svn import to fail.
+# Because adjusting the timestamp of the parent could push their creation date before
+# the grandparent this has to be repeated in a loop until no more records could be found.
+
+ my $sth;
+
+ $sth = $gCfg{dbh}->prepare('CREATE INDEX PhysicalActionIdx_parentphys on PhysicalAction(parentphys)');
+ $sth->execute;
+
+ $sth = $gCfg{dbh}->prepare('CREATE INDEX PhysicalActionIdx_physname on PhysicalAction(physname)');
+ $sth->execute;
+
+ $sth = $gCfg{dbh}->prepare('CREATE INDEX PhysicalActionIdx_actiontype on PhysicalAction(actiontype)');
+ $sth->execute;
+
+
+ my $sql = 'SELECT parent.*, min(child.timestamp) mintime FROM PhysicalAction parent, PhysicalAction child '
+ . 'where parent.actiontype="ADD" '
+ . 'and child.parentphys = parent.physname and parent.timestamp > child.timestamp '
+ . 'group by parent.action_id';
+
+ my $prio = 1;
+
+ while (1)
+ {
+ $sth = $gCfg{dbh}->prepare($sql);
+ $sth->execute();
+
+ my $rows = $sth->fetchall_arrayref( {} );
+ last if (scalar @$rows == 0);
+
+ my $row;
+
+ foreach $row (@$rows) {
+ my $sql = "UPDATE PhysicalAction SET timestamp = ?,priority = ? "
+ . "WHERE action_id = ?";
+
+ my $update;
+ $update = $gCfg{dbh}->prepare($sql);
+ $update->execute( $row->{mintime}, $prio, $row->{action_id});
+ }
+
+ # To ensure that grandparents are created before parents their priority is decreased for every
+ # generation. The timestamp cannot provide this because the adjustment process would assign
+ # the same timestamp for all.
+ $prio = $prio - 1;
+ }
+}
+
+###############################################################################
# BuildVssActionHistory
###############################################################################
sub BuildVssActionHistory {
Index: script/Vss2Svn/Dumpfile.pm
===================================================================
--- script/Vss2Svn/Dumpfile.pm (revision 289)
+++ script/Vss2Svn/Dumpfile.pm (working copy)
@@ -720,8 +720,6 @@
my $fh = $self->{fh};
- $text = '' unless defined $text;
-
my $proplen = 0;
my $textlen = 0;
my($propout, $textout) = ('') x 2;
@@ -744,20 +742,23 @@
$proplen = length($propout);
}
- $textlen = length($text);
- return if ($textlen + $proplen == 0);
+ return if (!defined ($text) && $proplen == 0);
if ($proplen > 0) {
print $fh "Prop-content-length: $proplen\n";
}
- if ($textlen > 0) {
+ if (defined ($text)) {
+ $textlen = length($text);
print $fh "Text-content-length: $textlen\n";
+ print $fh "Content-length: " . ($proplen + $textlen)
+ . "\n\n$propout$text\n";
}
+ else {
+ print $fh "Content-length: " . ($proplen)
+ . "\n\n$propout\n";
+ }
- print $fh "Content-length: " . ($proplen + $textlen)
- . "\n\n$propout$text\n";
-
} # End output_content
###############################################################################
_______________________________________________
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