line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package PatchReader;
|
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
1618
|
use strict;
|
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
61
|
|
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 NAME
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
PatchReader - Utilities to read and manipulate patches and CVS
|
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
# Script that reads in a patch (in any known format), and prints
|
12
|
|
|
|
|
|
|
# out some information about it. Other common operations are
|
13
|
|
|
|
|
|
|
# outputting the patch in a raw unified diff format, outputting
|
14
|
|
|
|
|
|
|
# the patch information to Template::Toolkit templates, adding
|
15
|
|
|
|
|
|
|
# context to a patch from CVS, and narrowing the patch down to
|
16
|
|
|
|
|
|
|
# apply only to a single file or set of files.
|
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
use PatchReader::Raw;
|
19
|
|
|
|
|
|
|
use PatchReader::PatchInfoGrabber;
|
20
|
|
|
|
|
|
|
my $filename = 'filename.patch';
|
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
# Create the reader that parses the patch and the object that
|
23
|
|
|
|
|
|
|
# extracts info from the reader's datastream
|
24
|
|
|
|
|
|
|
my $reader = new PatchReader::Raw();
|
25
|
|
|
|
|
|
|
my $patch_info_grabber = new PatchReader::PatchInfoGrabber();
|
26
|
|
|
|
|
|
|
$reader->sends_data_to($patch_info_grabber);
|
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
# Iterate over the file
|
29
|
|
|
|
|
|
|
$reader->iterate_file($filename);
|
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
# Print the output
|
32
|
|
|
|
|
|
|
my $patch_info = $patch_info_grabber->patch_info();
|
33
|
|
|
|
|
|
|
print "Summary of Changed Files:\n";
|
34
|
|
|
|
|
|
|
while (my ($file, $info) = each %{$patch_info->{files}}) {
|
35
|
|
|
|
|
|
|
print "$file: +$info->{plus_lines} -$info->{minus_lines}\n";
|
36
|
|
|
|
|
|
|
}
|
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
=head1 ABSTRACT
|
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
This perl library allows you to manipulate patches programmatically by
|
41
|
|
|
|
|
|
|
chaining together a variety of objects that read, manipulate, and output
|
42
|
|
|
|
|
|
|
patch information:
|
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
=over
|
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
=item PatchReader::Raw
|
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
Parse a patch in any format known to this author (unified, normal, cvs diff,
|
49
|
|
|
|
|
|
|
among others)
|
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
=item PatchReader::PatchInfoGrabber
|
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
Grab summary info for sections of a patch in a nice hash
|
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=item PatchReader::AddCVSContext
|
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
Add context to the patch by grabbing the original files from CVS
|
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
=item PatchReader::NarrowPatch
|
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
Narrow a patch down to only apply to a specific set of files
|
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
=item PatchReader::DiffPrinter::raw
|
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
Output the parsed patch in raw unified diff format
|
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=item PatchReader::DiffPrinter::template
|
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
Output the parsed patch to L templates (can be used to make
|
70
|
|
|
|
|
|
|
HTML output or anything else you please)
|
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
=back
|
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
Additionally, it is designed so that you can plug in your own objects that
|
75
|
|
|
|
|
|
|
read the parsed data while it is being parsed (no need for the performance or
|
76
|
|
|
|
|
|
|
memory problems that can come from reading in the entire patch all at once).
|
77
|
|
|
|
|
|
|
You can do this by mimicking one of the existing readers (such as
|
78
|
|
|
|
|
|
|
PatchInfoGrabber) and overriding the methods start_patch, start_file, section,
|
79
|
|
|
|
|
|
|
end_file and end_patch.
|
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=cut
|
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
$PatchReader::VERSION = '0.9.6';
|
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
1
|