You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
5.3 KiB
128 lines
5.3 KiB
#!@l_prefix@/bin/perl |
|
## |
|
## monotone-colorize -- colorize output of mtn(1) |
|
## Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> |
|
## |
|
## This program is free software; you can redistribute it and/or modify |
|
## it under the terms of the GNU General Public License as published by |
|
## the Free Software Foundation; either version 2 of the License, or |
|
## (at your option) any later version. |
|
## |
|
## This program is distributed in the hope that it will be useful, |
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
## General Public License for more details. |
|
## |
|
## You should have received a copy of the GNU General Public License |
|
## along with this program; if not, write to the Free Software |
|
## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
|
## USA, or contact Ralf S. Engelschall <rse@engelschall.com>. |
|
## |
|
## monotone-colorize.pl: filter implementation (language: Perl) |
|
## |
|
|
|
require 5.008; |
|
use Term::ANSIColor qw(color); |
|
|
|
# color definitions |
|
my $color = { |
|
-standout => color("bold"), |
|
-inverse => color("bold white on_black"), |
|
-positive => color("blue"), |
|
-negative => color("red"), |
|
-none => color("reset"), |
|
}; |
|
|
|
# if connected to the TTY, colorize and connect to less(1) |
|
my $ontty = 0; |
|
if (-t STDOUT) { |
|
$ontty = 1; |
|
open(FP, "|@l_prefix@/bin/less -E -r"); |
|
*STDOUT = *FP; |
|
} |
|
|
|
# determine mtn(1) command |
|
my $cmd = shift(@ARGV); |
|
|
|
# process mtn(1) output |
|
my $in = { -changelog => 0 }; |
|
while (<STDIN>) { |
|
if ($ontty) { |
|
# dispatch according to mtn(1) command |
|
if ($cmd eq "update") { |
|
# colorize branch/revision information |
|
s/(expanded\s+selector\s+')([^']*)('\s+->\s+')([^']*)/$1$color->{-positive}$2$color->{-none}$3$color->{-positive}$4$color->{-none}/o; |
|
|
|
s/((?:updating\s+along\s+branch|expanding\s+selection)\s+')([^']*)(')/$1$color->{-positive}$2$color->{-none}$3/o; |
|
s/(expanded\s+to\s+')([^']*)(')/$1$color->{-standout}$2$color->{-none}$3/o; |
|
s/((?:already\s+up\s+to\s+date\s+at|selected\s+update\s+target|updated\s+to\s+base\s+revision)\s+)(\S+)/$1$color->{-standout}$2$color->{-none}/o; |
|
s/((?:switching\s+to\s+branch|next\s+commit\s+will\s+use\s+branch)\s+)(\S+)/$1$color->{-positive}$2$color->{-none}$3/o; |
|
|
|
# colorize status list |
|
s/(\s+dropping\s+)(\S+)/$1$color->{-negative}$2$color->{-none}/o; |
|
s/(\s+modifying\s+)(\S+)/$1$color->{-positive}$2$color->{-none}/o; |
|
s/(\s+adding\s+)(\S+)/$1$color->{-standout}$color->{-positive}$2$color->{-none}/o; |
|
|
|
# colorize errors |
|
s/(misuse:)(.+)$/$1$color->{-negative}$2$color->{-none}/o; |
|
} |
|
elsif ($cmd eq "status") { |
|
# colorize headers |
|
s/^(Current branch:\s+)(\S+)/$1$color->{-standout}$2$color->{-none}/o; |
|
s/^(Changes against parent\s+)(\S+)/$1$color->{-standout}$2$color->{-none}/o; |
|
|
|
# colorize status list |
|
s/^(\s+patched\s+)(\S+)/$1$color->{-positive}$2$color->{-none}/o; |
|
s/^(\s+dropped\s+)(\S+)/$1$color->{-negative}$2$color->{-none}/o; |
|
s/^(\s+added\s+)(\S+)/$1$color->{-standout}$color->{-positive}$2$color->{-none}/o; |
|
} |
|
elsif ($cmd eq "log") { |
|
# colorize certs |
|
s/(Revision:\s+)(.+)/$color->{-inverse}$1$2$color->{-none}/o; |
|
s/((?:Ancestor|Author|Date|Branch|Tag):\s+)(.+)/$1$color->{-standout}$2$color->{-none}/o; |
|
|
|
# colorize changelog text |
|
if (m/---------------+/s) { |
|
$in->{-changelog} = 0; |
|
s/^([\s|\\\/o]\s*)?(---+)\r?\n$/$1.("_" x 78)."\n"/oes; |
|
} |
|
s/^([\s|\\\/o]\s*)(.+)$/$1$color->{-positive}$2$color->{-none}/o if ($in->{-changelog}); |
|
$in->{-changelog} = 1 if (m/ChangeLog:\s*$/s); |
|
} |
|
elsif ($cmd eq "diff") { |
|
# expand tabs |
|
1 while (s/\t/" " x (8 - ((length($`)-1) % 8))/e); |
|
|
|
# colorize diff header |
|
s/^Index:\s+(\S+).*$/("_" x 78)."\n"."$color->{-inverse} ".$1." $color->{-none}\n"/oes; |
|
s/^========+\s*$//os; |
|
|
|
# colorize unified diff |
|
s/^(@@.*$)/$color->{-standout}$1$color->{-none}/o; |
|
s/^(\+.*)$/$color->{-positive}$1$color->{-none}/o; |
|
s/^(---\s+\S+\s+.+)$/$color->{-negative}$1$color->{-none}/o; |
|
s/^(-([^-].*|))$/$color->{-negative}$1$color->{-none}/o; |
|
|
|
# colorize context diff |
|
s/^(--- \d+,\d+ ----.*)$/$color->{-standout}$1$color->{-none}/o; |
|
s/^(\*\*\* \d+,\d+ *\*\*\*.*)$/$color->{-standout}$1$color->{-none}/o; |
|
s/^(\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*)$/$color->{-standout}$1$color->{-none}/o; |
|
s/^(!.*)$/$color->{-positive}$1$color->{-none}/o; |
|
} |
|
elsif ($cmd eq "list-tags") { |
|
# colorize tag names and revisions |
|
s/^(\S+)(\s+)(\S+)(\s+)(.+)$/$color->{-positive}$1$color->{-none}$2$color->{-standout}$3$color->{-none}$4$5/o; |
|
} |
|
elsif ($cmd eq "list-branches") { |
|
# colorize branch names |
|
s/^(\S+)$/$color->{-positive}$1$color->{-none}/o; |
|
} |
|
} |
|
print STDOUT $_; |
|
} |
|
|
|
# close connection to less(1) |
|
if ($ontty) { |
|
close(FP); |
|
} |
|
|
|
|