3 # tig-like git log output. Used when tig is not available or broken.
5 # Copyright (C) 2013 Simon Ruderich
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 use Term::ANSIColor qw(colored);
28 my $color_graph = 'yellow';
29 my $color_hash = 'cyan';
30 my $color_ref_sep = 'cyan';
31 my $color_ref_head = 'cyan bold';
32 my $color_ref_branch = 'green bold';
33 my $color_ref_reference = 'red bold';
34 my $color_author = 'magenta';
37 my $format = '%x00' # separator from --graph
38 . '%h' . '%x00' # abbreviated commit hash
39 . '%at' . '%x00' # author date
40 . '%an' . '%x00' # author name
41 . '%s' . '%x00' # subject
43 my @cmd = ('git', 'log', '--all', '--graph', "--format=$format");
44 open my $fh, '-|', @cmd or die $!;
46 my $pager = $ENV{PAGER};
47 # Try to find an usable pager without searching $PATH.
48 if (not defined $pager) {
49 foreach my $path (qw(/usr/bin/less /bin/less /usr/bin/more /bin/more)) {
56 # Use a pager if STDOUT is a terminal.
57 if (-t STDOUT and defined $pager) {
58 open STDOUT, '|-', $pager or die $!;
61 while (my $line = <$fh>) {
63 if ($line =~ m{^([|/\\_ ]+)$}) {
64 print colored($line, $color_graph);
69 $line =~ /^([ *|.-]+)\x00(.+)\x00(.+)\x00(.+)\x00(.+)\x00(.*)$/
72 my $hash = colored($2, $color_hash);
73 my $date = POSIX::strftime('%Y-%m-%d', localtime($3));
74 my $author = colored($4, $color_author);
78 # Strip trailing whitespace.
81 $prefix =~ s/\|/colored($&, $color_graph)/ge;
83 # Strip leading whitespace and braces.
88 $refs = join colored(', ', $color_ref_sep), map {
91 $color = $color_ref_head;
93 $color = $color_ref_reference;
95 $color = $color_ref_branch;
102 . colored('(', $color_ref_sep)
104 . colored(')', $color_ref_sep);
107 printf "%s %s %s %s%s %s\n",
108 $prefix, $hash, $date, $author, $refs, $message;
113 # Necessary for the redirection to a pager or the pager terminates after our
114 # script finishes without displaying all data.
115 if (defined $pager) {
116 close STDOUT or die $!;