vss2svn.pl: Improve error reporting and statistics
[vss2svn.git] / script / Vss2Svn / SvnRevHandler.pm
blob0416acb4112cd53a5b4f953ff4503a11b257d912
1 package Vss2Svn::SvnRevHandler;
3 use warnings;
4 use strict;
6 our(%gCfg);
8 $gCfg{revtimerange} = 3600;
10 ###############################################################################
11 # new
12 ###############################################################################
13 sub new {
14 my($class) = @_;
16 my $svncache = Vss2Svn::DataCache->new('SvnRevision', 1);
18 if (!defined($svncache)) {
19 print "\nERROR: Could not create cache 'SvnRevision'\n";
20 return undef;
23 my $self =
25 svncache => $svncache,
26 revnum => undef,
29 $self = bless($self, $class);
31 $self->_init();
32 return $self;
34 } # End new
36 ###############################################################################
37 # _init
38 ###############################################################################
39 sub _init {
40 my($self) = @_;
42 $self->{timestamp} = undef;
43 $self->{author} = undef;
44 $self->{comment} = undef;
45 $self->{seen} = {};
47 } # End _init
49 ###############################################################################
50 # check
51 ###############################################################################
52 sub check {
53 my($self, $data) = @_;
55 my($physname, $itemtype, $actiontype, $timestamp, $author, $comment) =
56 @{ $data }{qw( physname itemtype actiontype timestamp author comment )};
57 my($prevtimestamp, $prevauthor, $prevcomment) =
58 @{ $self }{qw( timestamp author comment )};
60 # Any of the following cause a new SVN revision:
61 # * same file touched more than once
62 # * different author or comment
63 # * time range exceeds threshold num. of seconds (default 3600)
64 # * any action on a directory other than add
66 my $wasseen = $self->{seen}->{$physname};
69 no warnings 'uninitialized';
70 if(($author ne $prevauthor) || ($comment ne $prevcomment) || $wasseen ||
71 ($timestamp - $prevtimestamp > $gCfg{revtimerange}) ||
72 ($itemtype == 1 && $actiontype ne 'ADD') ||
73 $self->{commitPending} ) {
75 $self->new_revision($data);
77 if ($self->{verbose}) {
78 print "\n**** NEW SVN REVISION ($self->{revnum}): ",
79 join(',', $physname, $timestamp, $author, $comment), "\n";
84 # Any of the following actions needs to be commited the next time:
85 # * any action on a directory other than add
86 # * the first initial creation of the $/ project
87 $self->{commitPending} = ($itemtype == 1 && $actiontype ne 'ADD') || ($self->{revnum} == 0);
89 $self->{seen}->{$physname}++;
91 @{ $self }{qw( timestamp author comment)} =
92 ($timestamp, $author, $comment);
94 } # End check
96 ###############################################################################
97 # new_revision
98 ###############################################################################
99 sub new_revision {
100 my($self, $data) = @_;
102 $self->{svncache}->add( @{ $data }{qw(timestamp author comment)} );
103 $self->{revnum} = $self->{svncache}->{pkey};
104 $self->{seen} = {};
105 $self->{commitPending} = undef;
107 } # End new_revision
109 ###############################################################################
110 # commit
111 ###############################################################################
112 sub commit {
113 my($self) = @_;
115 $self->{svncache}->commit();
116 } # End commit
118 ###############################################################################
119 # SetRevTimeRange
120 ###############################################################################
121 sub SetRevTimeRange {
122 my($class, $range) = @_;
124 $gCfg{revtimerange} = $range;
125 } # End SetRevTimeRange