| Index: debian.chrome/scripts/misc/git-ubuntu-log
|
| diff --git a/debian.chrome/scripts/misc/git-ubuntu-log b/debian.chrome/scripts/misc/git-ubuntu-log
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..666e831ecfe8fe9e8d03439541dc0fd197548681
|
| --- /dev/null
|
| +++ b/debian.chrome/scripts/misc/git-ubuntu-log
|
| @@ -0,0 +1,243 @@
|
| +#!/usr/bin/perl -w
|
| +
|
| +use strict;
|
| +use Text::Wrap;
|
| +
|
| +my $kernel_auth = "Upstream Kernel Changes";
|
| +
|
| +my (%map, @reverts);
|
| +my $pstate = 1;
|
| +my $no_kern_log = 0;
|
| +my $print_shas = 0;
|
| +my $first_print = 1;
|
| +
|
| +while (@ARGV) {
|
| + my $opt = $ARGV[0];
|
| + shift;
|
| + if ($opt eq "--no-kern-log") {
|
| + $no_kern_log = 1;
|
| + } elsif ($opt eq "--print-shas") {
|
| + $print_shas = 1;
|
| + } else {
|
| + print STDERR "Unknown options: $opt\n";
|
| + exit(1);
|
| + }
|
| +}
|
| +
|
| +sub check_reverts($) {
|
| + my ($entry) = @_;
|
| + my ($check);
|
| +
|
| + foreach $check (reverse @reverts) {
|
| + my $desc = "Revert \"" . $entry->{'desc'} . "\"";
|
| + if ($check->{'desc'} eq $desc) {
|
| + @reverts = grep($_->{'desc'} ne $desc, @reverts);
|
| + return 1;
|
| + }
|
| + }
|
| +
|
| + return 0;
|
| +}
|
| +
|
| +sub add_entry($) {
|
| + my ($entry) = @_;
|
| + my $key = $entry->{'author'};
|
| +
|
| + # store description in array, in email->{desc list} map
|
| + if (exists $map{$key}) {
|
| + # grab ref
|
| + my $obj = $map{$key};
|
| +
|
| + # add desc to array
|
| + push(@$obj, $entry);
|
| + } else {
|
| + # create new array, containing 1 item
|
| + my @arr = ($entry);
|
| +
|
| + # store ref to array
|
| + $map{$key} = \@arr;
|
| + }
|
| +}
|
| +
|
| +sub shortlog_entry($$$$$) {
|
| + my ($name, $desc, $bug, $cve, $commit) = @_;
|
| + my $entry;
|
| +
|
| + $desc =~ s#/pub/scm/linux/kernel/git/#/.../#g;
|
| + $desc =~ s#\[PATCH\] ##g;
|
| +
|
| + $desc =~ s#^\s*##g;
|
| + $desc =~ s# *UBUNTU: ##g;
|
| +
|
| + $entry->{'desc'} = $desc;
|
| + if ($bug ne '') {
|
| + $entry->{'bugno'} = $bug;
|
| + }
|
| + $entry->{'cve'} = $cve;
|
| + $entry->{'commit'} = $commit;
|
| + $entry->{'author'} = $name;
|
| +
|
| + if ($desc =~ /^Revert "/) {
|
| + push(@reverts, $entry);
|
| + return;
|
| + }
|
| +
|
| + return if check_reverts($entry);
|
| +
|
| + add_entry($entry);
|
| +}
|
| +
|
| +# sort comparison function
|
| +sub by_name($$) {
|
| + my ($a, $b) = @_;
|
| +
|
| + uc($a) cmp uc($b);
|
| +}
|
| +
|
| +sub shortlog_output {
|
| + my ($obj, $key, $entry);
|
| +
|
| + foreach $key (sort by_name keys %map) {
|
| + next if $key eq $kernel_auth and $no_kern_log;
|
| +
|
| + print "\n" unless $first_print;
|
| + $first_print = 0;
|
| +
|
| + # output author
|
| + printf " [ %s ]\n\n", $key;
|
| +
|
| + # output author's 1-line summaries
|
| + $obj = $map{$key};
|
| + foreach $entry (reverse @$obj) {
|
| + print wrap(" * ", " ", $entry->{'desc'}) . "\n";
|
| + # For non upstream changes, add other info.
|
| + if ($key ne $kernel_auth) {
|
| + if ($print_shas) {
|
| + print " - GIT-SHA " . $entry->{'commit'} .
|
| + "\n";
|
| + }
|
| + }
|
| + if (defined($entry->{'bugno'})) {
|
| + print " - LP: #" . $entry->{'bugno'} . "\n";
|
| + }
|
| + if (defined($entry->{'cve'})) {
|
| + print " - " . $entry->{'cve'} . "\n";
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +sub changelog_input {
|
| + my ($author, $desc, $commit, $entry, $cve);
|
| +
|
| + while (<STDIN>) {
|
| + # get commit
|
| + if ($pstate == 1) {
|
| + next unless /^commit (.*)/;
|
| +
|
| + $commit = $1;
|
| +
|
| + $pstate++;
|
| + }
|
| +
|
| + # get author and email
|
| + elsif ($pstate == 2) {
|
| + my ($email);
|
| +
|
| + next unless /^[Aa]uthor:?\s*(.*?)\s*<(.*)>/;
|
| +
|
| + $author = $1;
|
| + $email = $2;
|
| + $desc = undef;
|
| + $cve = undef;
|
| +
|
| + # cset author fixups
|
| + if (!$author) {
|
| + $author = $email;
|
| + }
|
| + $pstate++;
|
| + }
|
| +
|
| + # skip to blank line
|
| + elsif ($pstate == 3) {
|
| + next unless /^\s*$/;
|
| + $pstate++;
|
| + }
|
| +
|
| + # skip to non-blank line
|
| + elsif ($pstate == 4) {
|
| + next unless /^\s*?(.*)/;
|
| + my $ignore = 0;
|
| + my $bug = undef;
|
| + my %bugz = ();
|
| + my $k;
|
| +
|
| + # skip lines that are obviously not
|
| + # a 1-line cset description
|
| + next if /^\s*From: /;
|
| +
|
| + chomp;
|
| + $desc = $1;
|
| +
|
| + if ($desc =~ /^ *(Revert "|)UBUNTU:/) {
|
| + while (<STDIN>) {
|
| + $ignore = 1 if /^ *Ignore: yes/i;
|
| + if (/^ *Bug: *(#|)(.*)/i) {
|
| + foreach $k (split('(,|)*\s*#', $2)) {
|
| + $bugz{$k} = 1 if (($k ne '') and ($k =~ /[0-9]+/));
|
| + }
|
| + }
|
| + elsif (/^ *BugLink: *http.*:\/\/.*\/([0-9]+)/i) {
|
| + $bugz{$1} = 1;
|
| + }
|
| + elsif (/^ *(CVE-.*)/) {
|
| + $cve = $1
|
| + }
|
| + last if /^commit /;
|
| + }
|
| + } else {
|
| + $author = $kernel_auth;
|
| + $ignore = 1 if $desc =~ /Merge /;
|
| + while (<STDIN>) {
|
| + if (/^ *Bug: *(#|)(.*)/i) {
|
| + foreach $k (split('(,|)*\s*#', $2)) {
|
| + $bugz{$k} = 1 if (($k ne '') and ($k =~ /[0-9]+/));
|
| + }
|
| + }
|
| + elsif (/^ *BugLink: *http.*:\/\/.*\/([0-9]+)/i) {
|
| + $bugz{$1} = 1;
|
| + }
|
| + elsif (/^ *(CVE-.*)/) {
|
| + $cve = $1
|
| + }
|
| + last if /^commit /;
|
| + }
|
| + }
|
| +
|
| + $bug = join(", #", keys(%bugz));
|
| + if (!$ignore) {
|
| + &shortlog_entry($author, $desc, $bug,
|
| + $cve, $commit, 0);
|
| + }
|
| +
|
| + $pstate = 1;
|
| + if ($_ && /^commit (.*)/) {
|
| + $commit = $1;
|
| + $pstate++;
|
| + }
|
| + }
|
| +
|
| + else {
|
| + die "invalid parse state $pstate";
|
| + }
|
| + }
|
| +
|
| + foreach $entry (@reverts) {
|
| + add_entry($entry);
|
| + }
|
| +}
|
| +
|
| +&changelog_input;
|
| +&shortlog_output;
|
| +
|
| +exit(0);
|
|
|