diff options
Diffstat (limited to 'bin/lo-commit-stat')
-rwxr-xr-x | bin/lo-commit-stat | 403 |
1 files changed, 0 insertions, 403 deletions
diff --git a/bin/lo-commit-stat b/bin/lo-commit-stat deleted file mode 100755 index 24bcb891b..000000000 --- a/bin/lo-commit-stat +++ /dev/null @@ -1,403 +0,0 @@ -#!/usr/bin/perl - eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' - if $running_under_some_shell; -#!/usr/bin/perl - -use strict; - -my $main_repo="bootstrap"; -my @pieces=("artwork", "base", "calc", "components", - "extensions", "extras", "filters", "help", "impress", - "libs-core", "libs-extern", "libs-extern-sys", "libs-gui", - "translations", "postprocess", "sdk", "testing", "ure", "writer"); - -sub search_bugs($$$$) -{ - my ($pdata, $piece, $commit_id, $line) = @_; - - my $bug = ""; - my $bug_orig; - while (defined $bug) { - - # match fdo#123, rhz#123, i#123 - if ( $line =~ m/(\w*\#+\d+)/ ) { - $bug_orig = $1; - $bug = $1; - # match #i123# - } elsif ( $line =~ m/(\#i)(\d+)(\#)/ ) { - $bug_orig = $1 . $2 . $3; - $bug = "i#$2"; - } else { - $bug = undef; - next; - } - -# print " found $bug\n"; - # remove bug number from the comment; it will be added later a standardized way - $bug_orig =~ s/\#/\\#/; - $line =~ s/[Rr]esolves:\s*$bug_orig\s*//; - $line =~ s/\s*-\s*$bug_orig\s*//; - $line =~ s/\(?$bug_orig\)?[:,]?\s*//; - - # bnc# is preferred over n# for novell bugs - $bug =~ s/^n\#/bnc#/; - # save the bug number - %{$pdata->{$piece}{$commit_id}{'bugs'}} = () if (! defined %{$pdata->{$piece}{$commit_id}{'bugs'}}); - $pdata->{$piece}{$commit_id}{'bugs'}{$bug} = 1; - $pdata->{$piece}{$commit_id}{'flags'}{'bug'} = 1; - } - - return $line; -} - -sub standardize_summary($) -{ - my $line = shift; - - $line =~ s/^\s*//; - $line =~ s/\s*$//; - - # lower first letter - $line =~ m/(^.)/; - my $first_char = lc($1); - $line =~ s/^./$first_char/; - - # FIXME: remove do at the end of line - # remove bug numbers - return $line; -} - -sub load_git_log($$$$$) -{ - my ($pdata, $repo_dir, $piece, $branch_name, $git_command) = @_; - - my $cmd = "cd $repo_dir; $git_command"; - my $commit_id; - my $summary; - - print STDERR "Analyzing log from the git repo: $piece...\n"; - - my $repo_branch_name = get_branch_name($repo_dir); - if ( $branch_name ne $repo_branch_name ) { - die "Error: mismatch of branches:\n" . - " main repo is on the branch: $branch_name\n" . - " $piece repo is on the branch: $repo_branch_name\n"; - } - - open (GIT, "$cmd 2>&1|") || die "Can't run $cmd: $!"; - %{$pdata->{$piece}} = (); - - while (my $line = <GIT>) { - chomp $line; - - if ( $line =~ m/^commit ([0-9a-z]{20})/ ) { - $commit_id = "$1"; - $summary=undef; - %{$pdata->{$piece}{"$commit_id"}} = (); - %{$pdata->{$piece}{"$commit_id"}{'flags'}} = (); - next; - } - - if ( $line =~ /^Author:\s*([^\<]*)\<([^\>]*)>/ ) { - # get rid of extra empty spaces; - my $name = "$1"; - $name =~ s/\s+$//; - die "Error: Author already defined for the commit {$commit_id}\n" if defined ($pdata->{$piece}{$commit_id}{'author'}); - %{$pdata->{$piece}{$commit_id}{'author'}} = (); - $pdata->{$piece}{$commit_id}{'author'}{'name'} = "$name"; - $pdata->{$piece}{$commit_id}{'author'}{'email'} = "$2"; - next; - } - - if ( $line =~ /^Date:\s+/ ) { - # ignore date line - next; - } - - if ( $line =~ /^\s*$/ ) { - # ignore empty line - next; - } - - $line = search_bugs($pdata, $piece, $commit_id, $line); - # FIXME: need to be implemented -# search_keywords($pdata, $line); - - unless (defined $pdata->{$piece}{$commit_id}{'summary'}) { - $summary = standardize_summary($line); - $pdata->{$piece}{$commit_id}{'summary'} = $summary; - } - } - - close GIT; -} - -sub get_repo_name($) -{ - my $repo_dir = shift; - - open (GIT_CONFIG, "$repo_dir/.git/config") || - die "can't open \"$$repo_dir/.git/config\" for reading: $!\n"; - - while (my $line = <GIT_CONFIG>) { - chomp $line; - - if ( $line =~ /^\s*url\s*=\s*(\S+)$/ ) { - my $repo_name = "$1"; - $repo_name = s/.*\///g; - return "$repo_name"; - } - } - die "Error: can't find repo name in \"$$repo_dir/.git/config\"\n"; -} - -sub load_data($$$$$) -{ - my ($pdata, $top_dir, $piece, $branch_name, $git_command) = @_; - - if (defined $piece) { - my $piece_dir; - if ("$piece" eq "$main_repo") { - $piece_dir = "$top_dir"; - } else { - $piece_dir = "$top_dir/clone/$piece"; - } - load_git_log($pdata, $piece_dir, $piece, $branch_name, $git_command); - } else { - load_git_log($pdata, $top_dir, $main_repo, $branch_name, $git_command); - foreach my $piece (@pieces) { - load_git_log($pdata, "$top_dir/clone/$piece", $piece, $branch_name, $git_command); - } - } -} - -sub get_branch_name($) -{ - my ($top_dir) = @_; - - my $branch; - my $cmd = "cd $top_dir && git branch"; - - open (GIT, "$cmd 2>&1|") || die "Can't run $cmd: $!"; - - while (my $line = <GIT>) { - chomp $line; - - if ( $line =~ m/^\*\s*(\S+)/ ) { - $branch = "$1"; - } - } - - close GIT; - - die "Error: did not detect git branch name in $top_dir\n" unless defined ($branch); - - return $branch; -} - -sub open_log_file($$$$$) -{ - my ($log_dir, $log_prefix, $log_suffix, $top_dir, $branch_name) = @_; - - my $logfilename = "$log_prefix-$branch_name-$log_suffix.log"; - $logfilename = "$log_dir/$logfilename" if (defined $log_dir); - - if (-f $logfilename) { - print "WARNING: The log file already exists: $logfilename\n"; - print "Do you want to overwrite it? (Y/n)?\n"; - my $answer = <STDIN>; - chomp $answer; - $answer = "y" unless ($answer); - die "Please, rename the file or choose another log suffix\n" if ( lc($answer) ne "y" ); - } - - my $log; - open($log, '>', $logfilename) || die "Can't open \"$logfilename\" for writing: $!\n"; - - return $log; -} - -sub print_summary_in_stat($$$$$$$$$) -{ - my ($summary, $pprint_filters, $print_mode, $ppiece_title, $pflags, $pbugs, $pauthors, $prefix, $log) = @_; - - return if ( $summary eq "" ); - - # do we want to print this summary at all? - my $print; - if (%{$pprint_filters}) { - foreach my $flag (keys %{$pprint_filters}) { - $print = 1 if (defined $pflags->{$flag}); - } - } else { - $print = 1; - } - return unless (defined $print); - - # print piece title if not done yet - if ( defined ${$ppiece_title} && $print_mode ne "bugnumbers" ) { - printf $log "${$ppiece_title}\n"; - ${$ppiece_title} = undef; - } - - # finally print the summary line - my $bugs = ""; - if ( %{$pbugs} ) { - if ( $print_mode eq "bugnumbers" ) { - $bugs = join ("\n", keys %{$pbugs}) . "\n"; - } else { - $bugs = " (" . join (", ", keys %{$pbugs}) . ")"; - } - } - - my $authors = ""; - if ( %{$pauthors} ) { - $authors = " [" . join (", ", keys %{$pauthors}) . "]"; - } - - if ( $print_mode eq "bugnumbers" ) { - printf $log $bugs; - } else { - printf $log $prefix . $summary . $bugs . $authors . "\n"; - } -} - -sub print_stat($$$$) -{ - my ($pdata, $pprint_filters, $print_mode, $log) = @_; - - foreach my $piece ( sort { $a cmp $b } keys %{$pdata}) { - # check if this piece has any entries at all - my $piece_title = "+ $piece"; - if ( %{$pdata->{$piece}} ) { - my $old_summary=""; - my %authors = (); - my %bugs = (); - my %flags = (); - foreach my $id ( sort { $pdata->{$piece}{$a}{'summary'} cmp $pdata->{$piece}{$b}{'summary'} } keys %{$pdata->{$piece}}) { - my $summary = $pdata->{$piece}{$id}{'summary'}; - if ($summary ne $old_summary) { - print_summary_in_stat($old_summary, $pprint_filters, $print_mode, \$piece_title, \%flags, \%bugs, \%authors, " + ", $log); - $old_summary = $summary; - %authors = (); - %bugs = (); - %flags = (); - } - # collect bug numbers - if (defined $pdata->{$piece}{$id}{'bugs'}) { - foreach my $bug (keys %{$pdata->{$piece}{$id}{'bugs'}}) { - $bugs{$bug} = 1; - } - } - # collect author names - my $author = $pdata->{$piece}{$id}{'author'}{'name'}; - $authors{$author} = 1; - # collect flags - foreach my $flag ( keys %{$pdata->{$piece}{$id}{'flags'}} ) { - $flags{$flag} = 1; - } - } - print_summary_in_stat($old_summary, $pprint_filters, $print_mode, \$piece_title, \%flags, \%bugs, \%authors, " + ", $log); - } - } -} - -######################################################################## -# help - -sub usage() -{ - print "This script generates LO git commit summary\n\n" . - - "Usage: lo-commit-stat [--help] [--no-pieces] [--piece=<piece>] --log-dir=<dir> --log-suffix=<string> topdir [git_arg...]\n\n" . - - "Options:\n" . - " --help print this help\n" . - " --no-pieces read changes just from the main repository, ignore other cloned repos\n" . - " --piece=<piece> summarize just changes from the given piece\n" . - " --log-dir=<dir> directory where to put the generated log\n" . - " --log-suffix=<string> suffix of the log file name; the result will be\n" . - " commit-log-<branch>-<log-name-suffix>.log; the branch name\n" . - " is detected automatically\n" . - " --bugs print just bug fixes\n" . - " --bug-numbers print just fixed bug numbers\n" . - " --rev-list use \"git rev-list\" instead of \"git log\"; useful to check\n" . - " differences between branches\n" . - " topdir directory with the libreoffice/bootstrap clone; the piece repos\n" . - " must be cloned in the main-repo-root/clone/<piece> subdirectories\n" . - " git_arg extra parameters passed to the git command to define\n" . - " the area of interest; The default command is \"git log\" and\n" . - " parameters might be, for example, --after=\"2010-09-27\" or\n" . - " TAG..HEAD; with the option --rev-list, useful might be, for\n" . - " example origin/master ^origin/libreoffice-3-3\n"; -} - - -####################################################################### -####################################################################### -# MAIN -####################################################################### -####################################################################### - - -my $piece; -my $top_dir; -my $log_prefix = "commit-log"; -my $log_dir; -my $log_suffix; -my $log; -my $branch_name; -my $git_command = "git log"; -my $branch_name; -my @git_args; -my %data; -my %print_filters = (); -my $print_mode = "normal"; - -foreach my $arg (@ARGV) { - if ($arg eq '--help') { - usage(); - exit; - } elsif ($arg eq '--no-pieces') { - $piece = "bootstrap"; - } elsif ($arg =~ m/--piece=(.*)/) { - $piece = $1; - } elsif ($arg =~ m/--log-suffix=(.*)/) { - $log_suffix = "$1"; - } elsif ($arg =~ m/--log-dir=(.*)/) { - $log_dir = "$1"; - } elsif ($arg eq '--bugs') { - $print_filters{'bug'} = 1; - $log_prefix = "bugfixes" - } elsif ($arg eq '--bug-numbers') { - $print_filters{'bug'} = 1; - $log_prefix = "bugnumbers"; - $print_mode = "bugnumbers"; - } elsif ($arg eq '--rev-list') { - $git_command = "git rev-list --pretty=medium" - } else { - if (! defined $top_dir) { - $top_dir=$arg; - } else { - push @git_args, $arg; - } - } -} - -$git_command .= " " . join ' ', @git_args if (@git_args); - -(defined $top_dir) || die "Error: top directory is not defined\n"; -(-d "$top_dir") || die "Error: not a directory: $top_dir\n"; -(-f "$top_dir/.git/config") || die "Error: can't find $top_dir/.git/config\n"; - -(!defined $log_dir) || (-d $log_dir) || die "Error: directory does no exist: $log_dir\n"; - -(defined $log_suffix) || die "Error: define log suffix using --log-suffix=<string>\n"; - -$branch_name = get_branch_name($top_dir); - -load_data(\%data, $top_dir, $piece, $branch_name, $git_command); - -$log = open_log_file($log_dir, $log_prefix, $log_suffix, $top_dir, $branch_name); -print_stat(\%data, \%print_filters, $print_mode, $log); -close $log; |