1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
#!/usr/bin/perl
use strict;
use warnings;
my $reg_old = undef;
my $reg_new = undef;
my $require_both_hits = 0;
my $args = scalar(@ARGV);
if ($args>0) {
while (scalar(@ARGV)) {
my $arg = shift @ARGV;
if ($arg eq '--help' or $arg eq '-h') {
print "Usage: diff2grep.pl [switches]\n";
print "Converts a patch into grep-alike output\n";
print "switches:\n";
print " --old regexp only list old lines matching regexp\n";
print " --new regexp only list new lines matching regexp\n";
print " --both regexp only list if old and new lines match regexp\n";
print " (specifying --old and --new has same effect as --both)\n";
exit(0);
}
elsif ($arg eq '--old') {
my $reg = shift @ARGV;
die "--old expects argument 'regexp'" if not defined $reg;
$reg_old = qr/$reg/;
}
elsif ($arg eq '--new') {
my $reg = shift @ARGV;
die "--new expects argument 'regexp'" if not defined $reg;
$reg_new = qr/$reg/;
}
elsif ($arg eq '--both') {
my $reg = shift @ARGV;
die "--both expects argument 'regexp'" if not defined $reg;
$reg_old = qr/$reg/;
$reg_new = $reg_old;
$require_both_hits = 1;
}
else {
die "Unknown argument '$arg'";
}
}
}
my $reg_all = qr/./;
my $reg_none = qr/jkasfgadgsfaf/;
if (defined $reg_old) {
if (defined $reg_new) { $require_both_hits = 1; }
else { $reg_new = $reg_none; }
}
elsif (defined $reg_new) { $reg_old = $reg_none; }
else {
$reg_old = $reg_all;
$reg_new = $reg_all;
}
my $oldfile = undef;
my $newfile = undef;
my $newpad = '';
my $oldpad = '';
my $correct = 0; # perform correction?
my $corr = 0; # correct by number of lines (calc for next hunk)
my $this_corr = 0; # correct by number of lines (value for current hunk)
sub set_padding_and_correction() {
$correct = 1;
$corr = 0;
if (defined $oldfile and defined $newfile) {
my $oldlen = length($oldfile);
my $newlen = length($newfile);
$newpad = '';
$oldpad = '';
while ($oldlen<$newlen) { $oldpad .= ' '; $oldlen++; }
while ($newlen<$oldlen) { $newpad .= ' '; $newlen++; }
if ($oldfile ne $newfile) { $correct = 0; }
print "diff2grep.pl: oldfile='$oldfile'\n";
print "diff2grep.pl: newfile='$newfile'\n";
}
}
sub print_tagged($$) {
my ($tag,$line) = @_;
if ($line =~ /^\s+/o) {
my ($pad,$rest) = ($&,$');
my $tag_len = length($tag);
my $pad_len = length($pad);
if ($pad_len>($tag_len+1)) {
my $extra_pad = substr($pad,$pad_len-$tag_len-1);
$line = $extra_pad.$rest;
}
else {
$line = $rest;
}
}
print $tag.' '.$line."\n";
}
my $pwd = `pwd`; chomp($pwd);
print "diff2grep.pl: Entering directory `$pwd'\n";
my ($o1,$o2,$n1,$n2);
my $old_hitten = undef;
while (defined ($_ = <STDIN>)) {
chomp;
if (/^--- ([^\t]+)\t/) {
$oldfile = $1;
set_padding_and_correction();
}
elsif (/^\+\+\+ ([^\t]+)\t/) {
$newfile = $1;
set_padding_and_correction();
$this_corr = $corr;
}
elsif (/^-/) {
my $rest = $';
if ($rest =~ $reg_old) {
my $hitmsg = "$oldfile:".($o1+$this_corr*$correct).":$oldpad OLD: $rest\n";
if ($require_both_hits) { $old_hitten = $hitmsg; }
else { print $hitmsg; }
}
else {
print_tagged('[OLD]', $rest);
}
$corr--;
$o1++;
}
elsif (/^\+/) {
my $rest = $';
if ($rest =~ $reg_new) {
my $showNew = 1;
if ($require_both_hits==1) {
if (defined $old_hitten) {
print $old_hitten;
}
else {
$showNew = 0;
}
}
if ($showNew==1) {
print "$newfile:".($n1).":$newpad NEW: $rest\n";
}
}
else {
print_tagged('[NEW]', $rest);
}
$corr++;
$n1++;
}
elsif (/^\@\@ -(.*),(.*) \+(.*),(.*) \@\@$/) {
($o1,$o2,$n1,$n2) = ($1,$2,$3,$4);
print $_."\n";
$this_corr = $corr;
$old_hitten = undef;
}
else {
print $_."\n";
$o1++;
$n1++;
}
}
print "diff2grep.pl: Leaving directory `$pwd'\n";
|