1#!/usr/bin/perl
2
3use strict;
4use Archive::Tar;
5use Getopt::Std;
6
7my $opts = {};
8getopts('h:', $opts) or die usage();
9
10die usages() if $opts->{h};
11
12### need Text::Diff -- give a polite error (not a standard prereq)
13unless ( eval { require Text::Diff; Text::Diff->import; 1 } ) {
14    die "\n\t This tool requires the 'Text::Diff' module to be installed\n";
15}
16
17my $arch = shift                        or die usage();
18my $tar  = Archive::Tar->new( $arch )   or die "Couldn't read '$arch': $!";
19
20
21foreach my $file ( $tar->get_files ) {
22    next unless $file->is_file;
23    my $name = $file->name;
24
25    diff(   \($file->get_content), $name,
26            {   FILENAME_A  => $name,
27                MTIME_A     => $file->mtime,
28                OUTPUT      => \*STDOUT
29            }
30    );
31}
32
33
34
35
36sub usage {
37    return q[
38
39Usage:  ptardiff ARCHIVE_FILE
40        ptardiff -h
41
42    ptardiff is a small program that diffs an extracted archive
43    against an unextracted one, using the perl module Archive::Tar.
44
45    This effectively lets you view changes made to an archives contents.
46
47    Provide the progam with an ARCHIVE_FILE and it will look up all
48    the files with in the archive, scan the current working directory
49    for a file with the name and diff it against the contents of the
50    archive.
51
52
53Options:
54    h   Prints this help message
55
56
57Sample Usage:
58
59    $ tar -xzf Acme-Buffy-1.3.tar.gz
60    $ vi Acme-Buffy-1.3/README
61
62    [...]
63
64    $ ptardiff Acme-Buffy-1.3.tar.gz > README.patch
65
66
67See Also:
68    tar(1)
69    ptar
70    Archive::Tar
71
72    ] . $/;
73}
74
75
76
77=head1 NAME
78
79ptardiff - program that diffs an extracted archive against an unextracted one
80
81=head1 DESCRIPTION
82
83    ptardiff is a small program that diffs an extracted archive
84    against an unextracted one, using the perl module Archive::Tar.
85
86    This effectively lets you view changes made to an archives contents.
87
88    Provide the progam with an ARCHIVE_FILE and it will look up all
89    the files with in the archive, scan the current working directory
90    for a file with the name and diff it against the contents of the
91    archive.
92
93=head1 SYNOPSIS
94
95    ptardiff ARCHIVE_FILE
96    ptardiff -h
97
98    $ tar -xzf Acme-Buffy-1.3.tar.gz
99    $ vi Acme-Buffy-1.3/README
100    [...]
101    $ ptardiff Acme-Buffy-1.3.tar.gz > README.patch
102
103
104=head1 OPTIONS
105
106    h   Prints this help message
107
108=head1 SEE ALSO
109
110tar(1), L<Archive::Tar>.
111
112=cut
113