- adjust to package changes
[opensuse:installation-images.git] / git2log
1 #! /usr/bin/perl
2
3 use Getopt::Long;
4
5 sub usage;
6
7 usage 0 if !@ARGV;
8
9 GetOptions(
10   'help'    => sub { usage 0 },
11   'version' => \$opt_version,
12   'log'     => \$opt_log,
13 ) || usage 1;
14
15 usage 1 if @ARGV || !($opt_log || $opt_version);
16
17 die "no git repo\n" unless -d ".git";
18
19 for (`git branch`) {
20   if(/^\*\s+(\S+)/) {
21     $branch = $1;
22     last;
23   }
24 }
25
26 die "no branch?\n" unless $branch;
27
28 # print STDERR "writing log for branch $branch\n";
29
30 @tags = `git tag`;
31
32 chomp @tags;
33
34 for (@tags) {
35   if(/^\d/) {
36     s/(\d+)/sprintf "%04d", $1/eg;
37     push @ntags, $_;
38   }
39   elsif(s/^$branch\-//) {
40     s/(\d+)/sprintf "%04d", $1/eg;
41     push @ntags, "$branch-$_";
42   }
43 }
44
45 @tags = sort @ntags;
46
47 die "no tags?\n" unless @tags;
48
49 if($opt_version) {
50   $t = $tags[-1];
51   $t =~ s/(\d+)/$1 + 0/eg;
52
53   if(`git log --pretty=medium --date=iso '$t..HEAD'`) {
54     $t =~ s/(\d+)$/$1 + 1/e;
55   }
56
57   $t =~ s/^$branch\-//;
58
59   print "$t\n";
60
61   exit 0;
62 }
63
64 if($branch ne 'master') {
65   for ($i = 0; $i < @tags; $i++) {
66     if($tags[$i] =~ /^$branch\-(\S+)/) {
67       $i2 = $i;
68       $bi = $1;
69       last;
70     }
71   }
72
73   # print STDERR ">> $branch-$bi\n";
74
75   die "no tags in this branch?\n" unless $bi;
76
77   for ($i = 0; $i < $i2; $i++) {
78     if($tags[$i] eq $bi) {
79       $i1 = $i;
80       last;
81     }
82   }
83
84   splice @tags, $i1, $i2 - $i1;
85 }
86
87 map { s/(\d+)/$1 + 0/eg } @tags;
88
89 # for (@tags) { print "$_\n"; }
90
91 push @tags, "HEAD";
92
93 for ($i = @tags - 1; $i > 0; $i--) {
94   $date = undef;
95   @t = `git log --pretty=medium --date=iso '$tags[$i-1]..$tags[$i]'`;
96   chomp @t;
97   for (@t) {
98     if(/^Date:\s*(\S+)/) {
99       $date = $1;
100       last;
101     }
102   }
103   @t = grep { !/^(commit|Author:|Date:|Merge:|\s*$)|created.*tag/ } @t;
104   if(@t) {
105     # rewrite a bit to have it look more consistent
106     map { s/(fate|bnc)#/$1 #/g } @t;
107     map { s/\(#/(bnc #/g } @t;
108     map { s/bug\s*#/bnc #/g } @t;
109     map { s/feat(\.|ure)?\s*#?(\d+)/fate #$2/g } @t;
110     map { s/^ {4}// } @t;
111     map { s/^ {8}// } @t;
112     map { s/^([^-\s])/- $1/ } @t;
113     map { s/^- - /- / } @t;
114     map { s/^- \+\s+(- )?/- / } @t;
115     map { s/^/\t/ } @t;
116     $t = $tags[$i];
117     $t = "${branch}-$t" if $branch ne 'master' && $t eq "HEAD";
118     print "$date:\t$t\n";
119     print join("\n", @t), "\n\n";
120   }
121 }
122
123
124 sub usage
125 {
126   my $err = shift;
127
128   print <<"  usage";
129 Usage: git2log [OPTIONS]
130 Create changelog and project version from git repo.
131   --log         Print changelog file.
132   --version     Print version number.
133   --help        Write this help text.
134   usage
135
136   exit $err;
137 }
138
139