+sub readCommits
+{
+ my $pipeHandle = shift;
+ my @commits;
+
+ my %commit = ();
+
+ while ( <$pipeHandle> )
+ {
+ chomp;
+ if (m/^commit\s+(.*)$/) {
+ # on ^commit lines put the just seen commit in the stack
+ # and prime things for the next one
+ if (keys %commit) {
+ my %copy = %commit;
+ unshift @commits, \%copy;
+ %commit = ();
+ }
+ my @parents = split(m/\s+/, $1);
+ $commit{hash} = shift @parents;
+ $commit{parents} = \@parents;
+ } elsif (m/^(\w+?):\s+(.*)$/ && !exists($commit{message})) {
+ # on rfc822-like lines seen before we see any message,
+ # lowercase the entry and put it in the hash as key-value
+ $commit{lc($1)} = $2;
+ } else {
+ # message lines - skip initial empty line
+ # and trim whitespace
+ if (!exists($commit{message}) && m/^\s*$/) {
+ # define it to mark the end of headers
+ $commit{message} = '';
+ next;
+ }
+ s/^\s+//; s/\s+$//; # trim ws
+ $commit{message} .= $_ . "\n";
+ }
+ }
+
+ unshift @commits, \%commit if ( keys %commit );
+
+ return @commits;
+}
+
+sub convertToCvsDate
+{
+ my $date = shift;
+ # Convert from: "git rev-list --pretty" formatted date
+ # Convert to: "the format specified by RFC822 as modified by RFC1123."
+ # Example: 26 May 1997 13:01:40 -0400
+ if( $date =~ /^\w+\s+(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+(\d+)\s+([+-]\d+)$/ )
+ {
+ $date = "$2 $1 $4 $3 $5";
+ }
+
+ return $date;
+}
+
+sub convertToDbMode
+{
+ my $mode = shift;
+
+ # NOTE: The CVS protocol uses a string similar "u=rw,g=rw,o=rw",
+ # but the database "mode" column historically (and currently)
+ # only stores the "rw" (for user) part of the string.
+ # FUTURE: It might make more sense to persist the raw
+ # octal mode (or perhaps the final full CVS form) instead of
+ # this half-converted form, but it isn't currently worth the
+ # backwards compatibility headaches.
+
+ $mode=~/^\d\d(\d)\d{3}$/;
+ my $userBits=$1;
+
+ my $dbMode = "";
+ $dbMode .= "r" if ( $userBits & 4 );
+ $dbMode .= "w" if ( $userBits & 2 );
+ $dbMode .= "x" if ( $userBits & 1 );
+ $dbMode = "rw" if ( $dbMode eq "" );
+
+ return $dbMode;
+}
+