SVN::W...Parser(3pm)

πŸ“¦
version 0.63 Β· 3 versions
, in debian trixie, ubuntu resolute, ubuntu stonking

πŸ’– 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 before new returns.
  • File β€” a file name or file handle that gets parsed before new returns.
  • 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 by cvs 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 (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