1 |
#!/usr/bin/perl |
2 |
|
3 |
# very simple program that mimics librsync's rdiff, using the |
4 |
# simple file utility functions. see rdiff2 for the same program, |
5 |
# written using the nonblocking API |
6 |
|
7 |
use File::Rdiff qw(:trace :file); |
8 |
|
9 |
trace_level(LOG_INFO); |
10 |
|
11 |
if ($ARGV[0] eq "signature") { |
12 |
open $base, "<$ARGV[1]" or die "$ARGV[1]: $!"; |
13 |
open $sig, ">$ARGV[2]" or die "$ARGV[2]: $!"; |
14 |
|
15 |
File::Rdiff::sig_file $base, $sig; |
16 |
} elsif ($ARGV[0] eq "delta") { |
17 |
open $sig, "<$ARGV[1]" or die "$ARGV[1]: $!"; |
18 |
open $new, "<$ARGV[2]" or die "$ARGV[2]: $!"; |
19 |
open $delta, ">$ARGV[3]" or die "$ARGV[3]: $!"; |
20 |
|
21 |
$sig = loadsig_file $sig; |
22 |
|
23 |
ref $sig or exit 1; |
24 |
|
25 |
$sig->build_hash_table; |
26 |
|
27 |
File::Rdiff::delta_file $sig, $new, $delta; |
28 |
} elsif ($ARGV[0] eq "patch") { |
29 |
open $base, "<$ARGV[1]" or die "$ARGV[1]: $!"; |
30 |
open $delta, "<$ARGV[2]" or die "$ARGV[2]: $!"; |
31 |
open $new, ">$ARGV[3]" or die "$ARGV[3]: $!"; |
32 |
|
33 |
File::Rdiff::patch_file $base, $delta, $new; |
34 |
} else { |
35 |
print <<EOF; |
36 |
$0 signature BASE SIGNATURE |
37 |
$0 delta SIGNATURE NEW DELTA |
38 |
$0 patch BASE DELTA NEW |
39 |
EOF |
40 |
exit (1); |
41 |
} |
42 |
|