annotate admin/find_changes @ 12669:1c92b4b26ced octave-forge

releasePKG.m: exclude .hg* files of export as of bug #45669
author jpicarbajal
date Fri, 31 Jul 2015 19:49:28 +0000
parents f82660cf7dee
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
1 #!/usr/bin/perl -w
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
2
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
3 =head1 NAME find_changes.pl - Find patterns in text files and propose changes.
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
4
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
5 This script passes lines of text through a perl function with the aim of
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
6 reporting the occurence of patterns and proposing changes to be
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
7 done. L<patch> should be used to actually modify the original files.
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
8
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
9 =head1 SYNOPSIS
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
10
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
11 find_changes.pl [options] changes_def file(s).txt ... E<gt> changes_patch
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
12
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
13 Reads and executes the perl F<changes_def> file, which must contain the
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
14 definition of a function called C<change_line()>, and then reads the
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
15 F<file(s).txt> line by line.
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
16
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
17 For each line of each file, the function F<change_line()> is called with the
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
18 line as single argument, which can be modified inplace.
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
19
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
20 If any change is done to the line, it is reported by printing to stdout a
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
21 universal diff patch.
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
22
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
23 =head2 Modifying files
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
24
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
25 It is then recommended to inspect and edit the file F<changes_patch>,
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
26 removing lines that should not be changed. Once this is done, the changes
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
27 can be done in the original files by using C<patch -p0 < changes_patch>.
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
28
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
29 =head2 Commenting on lines
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
30
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
31 If a function C<comment_line()> is present, each line will be passed to it
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
32 and its output will be shown on standard error.
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
33
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
34 =head1 OPTIONS
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
35
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
36 =over 4
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
37
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
38 =item -p, --patch
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
39
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
40 Output a patch (default).
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
41
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
42 =item -d
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
43
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
44 Use another output format, adapted to some F<do_changes.pl> script.
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
45
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
46 =item -v, --verbose
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
47
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
48 Print some info on stderr during execution.
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
49
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
50 =item -h, --help
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
51
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
52 Print a help message and exit.
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
53
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
54 =head1 COPYRIGHT
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
55
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
56 This file is distributed under the terms of the GNU General Public Licence.
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
57
10050
f82660cf7dee maint: update e-mail address of Etienne Grossmann to <etienne@egdn.net> as requested by himself
carandraug
parents: 596
diff changeset
58 =head1 AUTHOR Etienne Grossmann E<lt>etienne@egdn.netE<gt>
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
59
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
60 =cut
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
61
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
62 ###
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
63 sub help {system ("perldoc $0|cat")}
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
64
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
65 $patch = 1;
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
66 $verbose = 0;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
67 # Read options
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
68
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
69 while (@ARGV && ($ARGV[0] =~ /^\-/)) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
70 if ($ARGV[0] =~ /^\-(h|\-help)$/){ help(); exit 0;}
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
71 elsif ($ARGV[0] =~ /^\-(v|\-verbose)$/){ $verbose = 1;}
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
72 elsif ($ARGV[0] =~ /^\-(p|\-patch)$/) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
73 $patch = 1;
596
7ac67c0e2383 small fix
etienne
parents: 595
diff changeset
74 } elsif ($ARGV[0] =~ /^\-(d)$/) {
595
5f5ef94f5bac use patch by default
etienne
parents: 594
diff changeset
75 $patch = 0;
594
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
76 } else {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
77 die "Unknown option '$ARGV[0]'. Try '$0 --help'";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
78 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
79
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
80 shift @ARGV;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
81 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
82
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
83 die "No definition file specified" unless @ARGV;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
84
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
85 $dfile = shift @ARGV;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
86
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
87 # Read and compile definition file
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
88 print STDERR "Definition file is $dfile\n" if $verbose;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
89
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
90 if (!defined (do ($dfile))) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
91 if ($!) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
92 print STDERR "Can't find $dfile : '$!'\n";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
93 exit 1;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
94 } elsif ($@) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
95 print STDERR "Can't compile $dfile : '$@'\n";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
96 exit 1;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
97 } else {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
98 print STDERR "Problem with $dfile : do returns undefined\n";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
99 exit 1;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
100 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
101 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
102
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
103 if (!defined (&change_line)) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
104 print STDERR "File '$dfile' does not define a function 'change_line()'\n";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
105 exit 1;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
106 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
107
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
108 $has_comment = defined (&comment_line);
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
109
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
110 foreach my $f (@ARGV) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
111
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
112 if (!$patch) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
113 unless (open FF, "<$f") {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
114 print "## Whoa!!! Can't open file '$f'. Skipping";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
115 next;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
116 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
117 print STDERR "Scanning file $f\n" if $verbose;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
118
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
119
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
120 local $lnum = 0;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
121 while (! eof (FF)) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
122
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
123 my $line = <FF>; # Read a line
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
124 my $olin = $line;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
125 $lnum++;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
126
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
127 if ($has_comment) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
128 if ($comment = &comment_line ($line)) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
129 $comment = "## $comment" if $comment !~ /^\s*\#/;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
130 $comment .= "\n" if $comment !~ /\n$/;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
131 print "$f:$.:$comment";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
132 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
133 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
134
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
135 &change_line ($line);
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
136 if ($olin ne $line) {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
137 print "$f:$.:$olin";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
138 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
139 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
140 close FF;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
141 } else { # Do a patch. Using diff, what else?
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
142 my $nf = "$f.new";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
143 my $i = 1;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
144 while (-e $nf) { # Find a name for the temp file.
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
145 $nf = $f . ".new." . $i ;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
146 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
147 unless (open FF, "<$f") {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
148 print STDERR "## Whoa!!! Can't open file '$f'. Skipping\n";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
149 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
150 unless (open GG, ">$nf") {
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
151 print STDERR "## Whoa!!! Can't open temp file '$nf'. Skipping\n";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
152 next;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
153 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
154 print STDERR "## Scanning file $f\n" if $verbose;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
155
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
156 while (! eof (FF)) { # Create (temp) transformed file
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
157
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
158 my $line = <FF>; # Read a line
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
159
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
160 &change_line ($line);
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
161 print GG $line;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
162 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
163 close FF; close GG;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
164 # Call diff and modify slightly the output
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
165 my $tmp = `diff -u $f $nf`;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
166 $tmp =~ s{^\+\+\+ $nf}{+++ $f}m;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
167 print $tmp;
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
168
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
169 unlink($nf) or print STDERR "## Whoa!!! Can't remove temp file '$nf'\n";
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
170 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
171 }
d856e0d1e410 code transformation tools
etienne
parents:
diff changeset
172