Merge from vendor branch GROFF:
[dragonfly.git] / tools / tools / commitsdb / make_commit_db
1 #!/usr/bin/perl -w
2
3 # $FreeBSD: src/tools/tools/commitsdb/make_commit_db,v 1.1.2.1 2002/08/12 13:37:46 joe Exp $
4 # $DragonFly: src/tools/tools/commitsdb/make_commit_db,v 1.2 2003/06/17 04:29:11 dillon Exp $
5
6 # This script walks the tree from the current directory
7 # and spits out a database generated by md5'ing the cvs log
8 # messages of each revision of every file in the tree.
9
10 use strict;
11 use Digest::MD5 qw(md5_hex);
12
13 my $dbname = "commitsdb";
14 open DB, "> $dbname" or die "$!\n";
15
16 # Extract all the logs for the current directory.
17 my @dirs = ".";
18 while (@dirs) {
19         my $dir = shift @dirs;
20         my %logs;
21
22         opendir DIR, $dir or die $!;
23         foreach (grep { /[^\.]/ } readdir DIR) {
24                 my $filename = "$dir/$_";
25                 if (-f $filename) {
26                         my %loghash = parse_log_message($filename);
27                         next unless %loghash;
28
29                         $logs{$filename} = {%loghash};
30                 } elsif (-d $_) {
31                         next if /^CVS$/;
32                         push @dirs, $_;
33                 }
34         }
35         close DIR;
36
37         # Product a database of the commits
38         foreach my $f (keys %logs) {
39                 my $file = $logs{$f};
40                 foreach my $rev (keys %$file) {
41                         my $hash = $$file{$rev};
42
43                         print DB "$f $rev $hash\n";
44                 }
45         }
46
47         print "\r" . " " x 30 . "\r$dir";
48 }
49 print "\n";
50
51 close DB;
52
53
54
55 ##################################################
56 # Run a cvs log on a file and return a parse entry.
57 ##################################################
58 sub parse_log_message {
59         my $file = shift;
60
61         # Get a log of the file.
62         open LOG, "cvs -R log $file |" or die $!;
63         my @log = <LOG>;
64         my $log = join "", @log;
65         close LOG;
66
67         # Split the log into revisions.
68         my @entries = split /----------------------------\n/, $log;
69
70         # Throw away the first entry.
71         shift @entries;
72
73         # Record the hash of the message against the revision.
74         my %loghash = ();
75         foreach my $e (@entries) {
76                 # Get the revision number
77                 $e =~ s/^revision\s*(\S*)\n//s;
78                 my $rev = $1;
79
80                 # Strip off any other headers.
81                 while ($e =~ s/^(date|branches):[^\n]*\n//sg) {
82                 };
83
84                 my $hash = string_to_hash($e);
85                 $loghash{$rev} = $hash;
86         }
87
88         return %loghash;
89 }
90
91
92 ##################################################
93 # Convert a log message into an md5 checksum.
94 ##################################################
95 sub string_to_hash {
96         my $logmsg = shift;
97
98         return md5_hex($logmsg);
99 }
100
101
102
103 #end