SVN::W...Parser(3pm)
π SVN::W...Parser β bestie edition π
okay so real talk, the manual name up top is SVN::W...Parser(3pm), and it lives in the User Contributed Perl Documentation corner of the internet. The actual module you're here for is SVN::Web::DiffParser β it parses patch files that have unified and standard diffs in them. Slay. Let's go π¦
β¨ NAME β¨
SVN::Web::DiffParser β bestie, it parses patch files containing unified and standard diffs π
π NOTE π
Heads up: this is Text::Diff::Parser, plus some local bug fixes that got exposed when it was used with SVN::Web. For more deets about Text::Diff::Parser, go look at CPAN. π
πΈ SYNOPSIS πΈ
use SVN::Web::DiffParser;
# create the object
my $parser = SVN::Web::DiffParser->new();
# With options
$parser = SVN::Web::DiffParser->new( Simplify=>1, # simplify the diff
Strip=>2 ); # strip 2 directories
# Create object. Parse $file
$parser = SVN::Web::DiffParser->new( $file );
$parser = SVN::Web::DiffParser->new( File=>$file );
# Create object. Parse text
my $parser = SVN::Web::DiffParser->new( $text );
$parser = SVN::Web::DiffParser->new( Diff=>$text );
# parse a file
$parser->parse_file( $filename );
# parse a string
$parser->parse( $text );
# Remove no-change lines. Combine line substitutions
$parser->simplify;
# Find results
foreach my $change ( $parser->changes ) {
print "File1: ", $change->filename1;
print "Line1: ", $change->line1;
print "File2: ", $change->filename2;
print "Line2: ", $change->line2;
print "Type: ", $change->type;
my $size = $change->size;
foreach my $line ( 0..($size-1) ) {
print "Line: ", $change->line( $size );
}
}
# In scalar context, returns the number of changes
my $n = $parser->changes;
print "There are $n changes",
# Get the changes to a given file
my @changes = $parser->changes( 'Makefile.PL' );
# Get list of files changed by the diff
my @files = $parser->files;
π DESCRIPTION π
SVN::Web::DiffParser parses diff files and patches. It lets you access the changes to a file in a standardized way, even when multiple patch formats are getting used at once. iconic behavior honestly π
A diff can be thought of as a series of operations on a file β either adding, removing or modifying lines of one file (the "from-file") to produce another file (the "to-file"). Diffs are generally produced either by hand with diff, or by your version control system (cvs diff, svn diff, ...). Some diff formats, notably unified diffs, also contain null operations, that is lines that
(yeah bestie, the sentence just ends there in the original, I'm not the one who cut it off π)
SVN::Web::DiffParser currently parses unified diff format and standard diff format. no cap.
Unified diffs look like the following.
--- Filename1 2006-04-12 18:47:22.000000000 -0400
+++ Filename2 2006-04-12 19:21:16.000000000 -0400
@@ -1,4 +1,6 @@
ONE
TWO
-THREE
+honk
FOUR
+honk
+honk
Standard diffs look like the following.
diff something something.4
3c3
< THREE
---
> honk
4a5,6
> honk
> honk
The diff line isn't in fact part of the format, but it is necessary to find which files the chunks deal with. It's output by cvs diff and svn diff, so honestly? not a problem π«Ά
π¦ METHODS π¦
new
$parser = SVN::Web::DiffParser->new;
$parser = SVN::Web::DiffParser->new( $file );
$parser = SVN::Web::DiffParser->new( $handle );
$parser = SVN::Web::DiffParser->new( %params );
$parser = SVN::Web::DiffParser->new( \%params );
Object constructor. the origin story β¨
Diffβ a string that contains a diff. This diff gets parsed beforenewreturns.Fileβ a file name or file handle that gets parsed beforenewreturns.Simplifyβ simplifying a patch means dropping all null-operations, and converting a remove operation followed by an add operation (or an add followed by a remove) of the same size on the same lines into a modify operation. combining vibes fr fr.Stripβ strip N leading directories from all filenames. Lowkey less than useful for standard diffs produced bycvs diff, because those don't contain directory information.Verboseβ if true, print copious details of what is going on. the group chat gets everything π
parse_file
$parser->parse_file( $file );
$parser->parse_file( $handle );
Read and parse the file or file handle specified. It will die if it fails π, and returns true on success. After that, the contents of the file may be accessed with changes and files.
parse
$parser->parse( $string );
Parses the diff present in $string. Will die if it fails, returns true on success. Contents of the file may then be accessed with changes and files. periodt.
files
%files = $parser->files;
Fetch a list of all the files that were referenced in the patch. The keys are original files ("from-file") and the values are the modified files ("to-file"). it's giving receipts π§Ύ
changes
@changes = $parser->changes;
$n = $parser->changes;
@changes = $parser->changes( $file );
$n = $parser->changes( $file );
Return all the operations (array context) or the number of operations in the patch file (scalar context). If $file is specified, it only returns changes to that file (either "from-file" or "to-file").
Elements of the returned array are change objects, as described in CHANGE METHODS below π«
π CHANGE METHODS π
The changes method returns an array of objects that describe each operation. You may use the following methods to find out details of the operation. main character energy only.
type
Returns the type of operation, either 'ADD', 'REMOVE', 'MODIFY' or '' (null operation). the vibe check result π
filename1
Filename of the "from-file".
filename2
Filename of the "to-file".
line1
Line in the "from-file" the operation starts at.
line2
Line in the "to-file" the operation starts at.
size
Number of lines affected by this operation.
text
@lines = $ch->text;
$line = $ch->text( $N );
Fetch the text of the line $N if present, or all lines affected by this operation. For '' (null) and 'REMOVE' operations, these are the lines present before the operation was done ('from-file'. For 'ADD' and 'MODIFY' operations, these are the lines present after the operation was done ('to-file'. π
π BUGS π
I'm not 100% sure of standard diff handling.
Missing support for context diffs.
no shade, they're just being honest about it. respect π
β SEE ALSO β
Text::Diff, Arch, diff.
π AUTHOR π
Philip Gwyn, <gwyn-at-cpan.org>
πΈ COPYRIGHT AND LICENSE πΈ
Copyright (C) 2006 by Philip Gwyn
Copyright (C) 2012 by Dean Hamstead
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.
okay that's the whole thing bestie, and per the fine print at the bottom: this was perl v5.40.1, dated 2025-04-09, and the page title was SVN::W...Parser(3pm). go parse something gorgeous πβ¨π¦
π¦ where this page comes from
- debian trixie: libsvn-web-perl 0.63-4 Β· Artistic-1.0-Perl
- ubuntu resolute: libsvn-web-perl 0.63-4 Β· Artistic-1.0-Perl
- ubuntu stonking: libsvn-web-perl 0.63-4 Β· Artistic-1.0-Perl
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms