|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: change barsMy original script had bugs in it. Here is a newer version with better revision tracking and hopefully fewer bugs. :-) -Costa On Wed, 5 Jul 2000, Matt Wakeley wrote: > Hi Costa, > > Thanks for the perl script. It really helps. > > But I noticed that it did not catch the "difference" between 0628 and 0706 of the > changing of the "ping" and the new "map" commands in section 3.1.1 (these are "new" > lines that it did not flag). > > -Matt > > Costa Sapuntzakis wrote: > > > I have included the Perl script I used to generate the change bars. > > The draft was generated as follows: > > > > perl create-change-bar.pl iSCSI000628.txt iscsi00615.txt > iSCSI000628.2.txt > > > > Hope it helps! > > > > -Costa > > > #! # # The script operates in the following fashion. First, it # strips all blank lines, headers, and footers from both # document. # # It then runs diff on the stripped files to find the # differences. # # Finally, it takes the output of diff and generates the # change bars at the destination. # # Note: the change bars only mark additions and changes # # -Costa (csapuntz@alum.mit.edu) 06/28/00 use strict; use Getopt::Long; my $lines_flag = 0; sub usage { print STDERR "Usage:\nperl create-change-bar.pl [--lines] <file1> <file2>\n"; print STDERR "file1 will be printed with change bars\n\n"; print STDERR "--lines is a less exact match that may work better for\n"; print STDERR " large diffs\n"; exit 1; } &GetOptions(lines => \$lines_flag); &usage if ($#ARGV != 1); my $src = $ARGV[0]; my $dst = $ARGV[1]; &usage if (!defined $src || !defined $dst); open(SRC, $src) or die "Unabled to open $src: $!"; $src .= ".tmp"; if (-r $src) { print STDERR "Error: temporary file $src already exists\n"; exit 1; } open(SRC2, ">$src") or die "Unabled to open $src: $!";; open(DST, $dst) or die "Unabled to open $dst: $!";; $dst .= ".tmp"; if (-r $dst) { print STDERR "Error: temporary file $dst already exists\n"; exit 1; } open(DST2, ">$dst") or die "Unabled to open $dst: $!";; sub process_file { my ($linemap, $fh1, $fh2) = @_; # Strip leading change bars s/^|//; my $oldlineno = -1; my $newlineno = 0; my $state = 0; my $saveword ; my $savewordlineno = 0; while(<$fh1>) { chomp; $oldlineno++; if ($state == 1) { $state = 0; next; } if (/^\014/) { $state = 1; next; } next if (/\[Page/); next if (/^\s*$/); if ( $lines_flag ) { $$linemap[$newlineno] = $oldlineno; $newlineno++; print $fh2 $_ . "\n"; } else { s/[\t\n\r]//g; my @words = split; if ($saveword) { print $fh2 $saveword; undef $saveword; } if ($#words >= 0 && $words[$#words] =~ /-$/) { $saveword = substr(pop @words, 0, -1); $savewordlineno = $oldlineno; } foreach my $word (@words) { # print $word . "\n"; print $fh2 $word . "\n"; $$linemap[$newlineno] = $oldlineno; $newlineno++; } } } } # # Store mapping between stripped line numbers and original # line numbers # my @linemap = (); my @changes = (); &process_file(\@linemap, \*SRC, \*SRC2); &process_file([], \*DST, \*DST2); close DST2; close DST; close SRC2; # # diff the two documents # open (DIFFS, "diff -w $dst $src |") or die "Unabled to run diff: $!"; while(<DIFFS>) { # print ; next if (!/^\d/); /[acd](\d+)(,(\d+))?/; next if (!defined $1); my $start = $1; my $end = $3; if (!defined $end) { $end = $start; } for (my $idx = $start - 1; $idx <= $end - 1; $idx++) { $changes[$linemap[$idx]] = 1; } } # # Print out document, marking changed lines # seek SRC, 0, 0; my $oldlineno = 0; while (<SRC>) { # Strip leading change bars s/^|//; if ($changes[$oldlineno]) { print "|"; } else { print " "; } print; $oldlineno++; } # # Cleanup # unlink $src; unlink $dst;
Home Last updated: Tue Sep 04 01:08:10 2001 6315 messages in chronological order |