summaryrefslogtreecommitdiff
path: root/bin/hashl
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2011-05-20 15:50:14 +0200
committerDaniel Friesel <derf@finalrewind.org>2011-05-20 15:50:14 +0200
commitc0c056c9e09ecd2f95a561d277dabef8ebb67b9d (patch)
treed7d1344ff96b2d24eb54e5cd8b37652c70361c4a /bin/hashl
parent1d78433ff8f8490ec942d6601ef800406355f6ca (diff)
Code cleanup
Diffstat (limited to 'bin/hashl')
-rwxr-xr-xbin/hashl226
1 files changed, 137 insertions, 89 deletions
diff --git a/bin/hashl b/bin/hashl
index aaf17b9..ec93f24 100755
--- a/bin/hashl
+++ b/bin/hashl
@@ -14,20 +14,20 @@ use Getopt::Long;
use IO::Handle;
use Time::Progress;
-my $base = getcwd();
-my $rel_paths = 1;
-my $db_file = '.hashl.db';
-my $total = 0;
-my $cur = 0;
+my $base = getcwd();
+my $rel_paths = 1;
+my $db_file = '.hashl.db';
+my $total = 0;
+my $cur = 0;
my $show_progress = 1;
my $timer;
my $incoming_dir;
my $read_size;
-my ($find_ref, $find_db_write);
+my ( $find_ref, $find_db_write );
my $hashl;
-my $VERSION = '0.1';
+our $VERSION = '0.1';
STDERR->autoflush(1);
@@ -38,7 +38,7 @@ GetOptions(
'V|version' => sub { say "hashl version ${VERSION}"; exit 0 },
) or usage();
-if (substr($db_file, 0, 1) ne '/') {
+if ( substr( $db_file, 0, 1 ) ne q{/} ) {
$db_file = "${base}/${db_file}";
}
@@ -49,24 +49,21 @@ sub usage {
Usage: $0 [options] <update|list|info|...> [args]
See 'perldoc -F $0' (or 'man hashl' if it is properly installed)
EOF
-
}
-if (not defined $action) {
+if ( not defined $action ) {
usage();
}
-if (-r $db_file) {
+if ( -r $db_file ) {
$hashl = App::Hashl->new_from_file($db_file);
}
else {
- $hashl = App::Hashl->new(
- read_size => $read_size,
- );
+ $hashl = App::Hashl->new( read_size => $read_size );
}
-$SIG{INT} = \&quit_save_db;
-$SIG{TERM} = \&quit_save_db;
+local $SIG{INT} = \&quit_save_db;
+local $SIG{TERM} = \&quit_save_db;
sub quit_save_db {
$hashl->save($db_file);
@@ -75,83 +72,97 @@ sub quit_save_db {
sub get_total {
my $file = $File::Find::name;
- if (-f $file and not -l $file and $file ne $db_file) {
+
+ if ( -f $file and not -l $file and $file ne $db_file ) {
$total++;
}
+
+ return;
}
sub drop_deleted {
- for my $file ($hashl->files()) {
- if (! -e $file) {
+ for my $file ( $hashl->files() ) {
+ if ( not -e $file ) {
$hashl->delete_file($file);
}
}
+
+ return;
}
sub copy_file {
- my ($file, $to) = @_;
+ my ( $file, $to ) = @_;
- my $base = substr($file, length($base) + 1);
- if ($base =~ s{ / [^/]+ $}{}x) {
- mkdirs($incoming_dir, $base);
+ my $cp_base = substr( $file, length($base) + 1 );
+ if ( $base =~ s{ / [^/]+ $}{}x ) {
+ mkdirs( $incoming_dir, $cp_base );
}
- copy($file, "${to}/${base}")
- or die("Cannot copy ${file} to ${to}/${base}: $!\n");
+ copy( $file, "${to}/${cp_base}" )
+ or die("Cannot copy ${file} to ${to}/${cp_base}: $!\n");
+
+ return;
}
sub db_find_new {
- my ($file, $path) = @_;
+ my ( $file, $path ) = @_;
- if (not $hashl->file_in_db($path)) {
+ if ( not $hashl->file_in_db($path) ) {
say "\r\e[2K${file}";
}
+
+ return;
}
sub db_find_known {
- my ($file, $path) = @_;
+ my ( $file, $path ) = @_;
- if ($hashl->file_in_db($path)) {
+ if ( $hashl->file_in_db($path) ) {
say "\r\e[2K${file}";
}
+
+ return;
}
sub db_info {
printf(
"Read size: %d bytes (%s)\n",
- $hashl->read_size(),
- $hashl->si_size($hashl->read_size),
+ $hashl->read_size(), $hashl->si_size( $hashl->read_size ),
);
+
+ return;
}
sub file_info {
my ($file) = @_;
+
my $entry = $hashl->file($file);
- if (not $entry) {
+ if ( not $entry ) {
die("No such file in database\n");
}
printf(
"File: %s\nSize: %d bytes (%s)\nHash: %s\n",
- $file,
- $entry->{size},
- $hashl->si_size($entry->{size}),
+ $file, $entry->{size}, $hashl->si_size( $entry->{size} ),
$entry->{hash},
);
+
+ return;
}
sub process_file {
- my ($code, $write) = ($find_ref, $find_db_write);
+ my ( $code, $write ) = ( $find_ref, $find_db_write );
+
my $file = $File::Find::name;
my $path = $file;
- if (not -f $file or -l $file or $file eq $db_file) {
+ if ( not -f $file or -l $file or $file eq $db_file ) {
return;
}
if ($rel_paths) {
- $file = substr($file, length($base) + 1);
+ $file = substr( $file, length($base) + 1 );
}
$cur++;
@@ -159,86 +170,100 @@ sub process_file {
if ($show_progress) {
print STDERR $timer->report(
"\r\e[2KScanning directory: %p done, %L elapsed, %E remaining",
- $cur,
- );
+ $cur, );
}
- &{$code}($file, $path);
+ &{$code}( $file, $path );
- if ($write and (($cur % 5000) == 0)) {
+ if ( $write and ( ( $cur % 5000 ) == 0 ) ) {
$hashl->save($db_file);
}
+
+ return;
}
sub db_update {
- my ($file, $path) = @_;
+ my ( $file, $path ) = @_;
$hashl->add_file(
file => $file,
path => $path,
);
+
+ return;
}
sub db_ignore {
- my ($file, $path) = @_;
+ my ( $file, $path ) = @_;
+
+ $hashl->ignore( $file, $path );
- $hashl->ignore($file, $path);
+ return;
}
sub db_copy {
- my ($file, $path) = @_;
+ my ( $file, $path ) = @_;
- if (not $hashl->file_in_db($path)) {
- copy_file($path, $incoming_dir);
+ if ( not $hashl->file_in_db($path) ) {
+ copy_file( $path, $incoming_dir );
}
+
+ return;
}
sub mkdirs {
- my ($base, $new) = @_;
+ my ( $dir_base, $new ) = @_;
- for my $dir (split(qr{/}, $new)) {
- $base .= "/$dir";
- if (! -d $base) {
- mkdir($base)
- or die("Cannot create ${base}: $!\n");
+ for my $dir ( split( qr{/}, $new ) ) {
+ $dir_base .= "/$dir";
+ if ( !-d $dir_base ) {
+ mkdir($dir_base)
+ or die("Cannot create ${dir_base}: $!\n");
}
}
+
+ return;
}
sub prepare_db_run {
my ($dir) = @_;
+
$dir //= $base;
- if (not $show_progress) {
+ if ( not $show_progress ) {
return;
}
- find(\&get_total, $dir);
+ find( \&get_total, $dir );
$timer = Time::Progress->new();
$timer->attr(
min => 1,
max => $total,
);
+
return;
}
sub cmd_copy {
- prepare_db_run();
($incoming_dir) = @_;
- if (not $incoming_dir) {
+ prepare_db_run();
+
+ if ( not $incoming_dir ) {
usage();
}
- if (substr($incoming_dir, 0, 1) ne '/') {
- $incoming_dir = $base . '/' . $incoming_dir;
+ if ( substr( $incoming_dir, 0, 1 ) ne q{/} ) {
+ $incoming_dir = $base . q{/} . $incoming_dir;
}
- $find_ref = \&db_copy;
+ $find_ref = \&db_copy;
$find_db_write = 0;
- find(\&process_file, $base);
+ find( \&process_file, $base );
print "\n";
+
+ return;
}
sub cmd_find_known {
@@ -246,16 +271,18 @@ sub cmd_find_known {
$dir //= $base;
- if (substr($dir, 0, 1) ne '/') {
- $dir = $base . '/' . $dir;
+ if ( substr( $dir, 0, 1 ) ne q{/} ) {
+ $dir = $base . q{/} . $dir;
}
prepare_db_run($dir);
- $find_ref = \&db_find_known;
+ $find_ref = \&db_find_known;
$find_db_write = 0;
- find(\&process_file, $dir);
+ find( \&process_file, $dir );
print "\n";
+
+ return;
}
sub cmd_find_new {
@@ -263,16 +290,18 @@ sub cmd_find_new {
$new_dir //= $base;
- if (substr($new_dir, 0, 1) ne '/') {
- $new_dir = $base . '/' . $new_dir;
+ if ( substr( $new_dir, 0, 1 ) ne q{/} ) {
+ $new_dir = $base . q{/} . $new_dir;
}
prepare_db_run($new_dir);
- $find_ref = \&db_find_new;
+ $find_ref = \&db_find_new;
$find_db_write = 0;
- find(\&process_file, $new_dir);
+ find( \&process_file, $new_dir );
print "\n";
+
+ return;
}
sub cmd_ignore {
@@ -282,15 +311,17 @@ sub cmd_ignore {
prepare_db_run();
- if (substr($ign_dir, 0, 1) ne '/') {
- $ign_dir = $base . '/' . $ign_dir;
+ if ( substr( $ign_dir, 0, 1 ) ne q{/} ) {
+ $ign_dir = $base . q{/} . $ign_dir;
}
- $find_ref = \&db_ignore;
+ $find_ref = \&db_ignore;
$find_db_write = 1;
- find(\&process_file, $ign_dir);
+ find( \&process_file, $ign_dir );
$hashl->save($db_file);
print "\n";
+
+ return;
}
sub cmd_info {
@@ -302,44 +333,53 @@ sub cmd_info {
else {
db_info();
}
+
+ return;
}
sub cmd_list {
printf(
"# hashl v%s Read Size %d bytes (%s)\n",
- $VERSION,
- $hashl->read_size(),
- $hashl->si_size($hashl->read_size()),
+ $VERSION, $hashl->read_size(), $hashl->si_size( $hashl->read_size() ),
);
- for my $name (sort $hashl->files()) {
+
+ for my $name ( sort $hashl->files() ) {
my $file = $hashl->file($name);
- printf(
- "%s %-7s %s\n",
- $file->{hash},
- $hashl->si_size($file->{size}),
- $name
- );
+ printf( "%s %-7s %s\n",
+ $file->{hash}, $hashl->si_size( $file->{size} ), $name );
}
+
+ return;
}
sub cmd_list_files {
- say join("\n", sort $hashl->files());
+ say join( "\n", sort $hashl->files() );
+
+ return;
}
sub cmd_list_ignored {
- for my $hash ($hashl->ignored()) {
+ for my $hash ( $hashl->ignored() ) {
say $hash;
}
+
+ return;
}
sub cmd_update {
drop_deleted();
prepare_db_run();
- $find_ref = \&db_update;
+
+ $find_ref = \&db_update;
$find_db_write = 1;
- find(\&process_file, $base);
+
+ find( \&process_file, $base );
+
print "\n";
+
$hashl->save($db_file);
+
+ return;
}
given ($action) {
@@ -352,7 +392,7 @@ given ($action) {
when ('list-files') { cmd_list_files(@ARGV) }
when ('list-ignored') { cmd_list_ignored(@ARGV) }
when ('update') { cmd_update(@ARGV) }
- default { usage() }
+ default { usage() }
}
__END__
@@ -365,6 +405,10 @@ B<hashl> - Create database with partial file hashes, check if other files are in
B<hashl> [B<-d> I<dbfile>] [B<-s> I<read-size>] I<action> [I<args>]
+=head1 VERSION
+
+This manual documents hashl version 0.1
+
=head1 DESCRIPTION
Actions:
@@ -439,6 +483,10 @@ Print version information.
=back
+=head1 EXIT STATUS
+
+Unless an error occured, B<hashl> will always return zero.
+
=head1 CONFIGURATION
None, so far