commit a4d16b3c7af854ea44887d829731d1405cbb66f2
parent ae5ceb4ffcbb4205584e4a1e7dc8b055a8c152d6
Author: lumidify <nobody@lumidify.org>
Date: Wed, 25 Mar 2020 18:35:32 +0100
Add updatespecial command
Diffstat:
4 files changed, 84 insertions(+), 36 deletions(-)
diff --git a/lumia.pl b/lumia.pl
@@ -902,6 +902,11 @@ sub update {
}
}
+sub update_special {
+ my $dir = shift;
+ write_special_cksums $dir, $CKSUM_FILE, $DIR_FILE;
+}
+
my %args;
Getopt::Long::Configure("bundling");
GetOptions(\%args, "f|force", "q|quiet", "v|verbose", "h|help");
@@ -914,35 +919,21 @@ my $cmd = shift;
if ($cmd eq "mv") {
die "mv requires at least two arguments\n" if @ARGV < 2;
my @src = @ARGV[0..$#ARGV-1];
- move_files(\@src, $ARGV[-1], \%args);
+ move_files \@src, $ARGV[-1], \%args;
} elsif ($cmd eq "rm") {
- if (@ARGV < 1) {
- die "rm requires at least one argument\n";
- }
+ die "rm requires at least one argument\n" if @ARGV < 1;
remove_files \%args, @ARGV;
} elsif ($cmd eq "addnew") {
- my $dir = ".";
- if (@ARGV >= 1) {
- $dir = $ARGV[0];
- }
+ my $dir = @ARGV ? $ARGV[0] : ".";
check_add_new_files $dir, \%args;
} elsif ($cmd eq "checknew") {
- my $dir = ".";
- if (@ARGV >= 1) {
- $dir = $ARGV[0];
- }
+ my $dir = @ARGV ? $ARGV[0] : ".";
check_new_files $dir;
} elsif ($cmd eq "checkold") {
- my $dir = ".";
- if (@ARGV >= 1) {
- $dir = $ARGV[0];
- }
+ my $dir = @ARGV ? $ARGV[0] : ".";
check_old_files $dir;
} elsif ($cmd eq "rmold") {
- my $dir = ".";
- if (@ARGV >= 1) {
- $dir = $ARGV[0];
- }
+ my $dir = @ARGV ? $ARGV[0] : ".";
remove_old_files $dir, \%args;
} elsif ($cmd eq "check") {
if (@ARGV < 1) {
@@ -951,21 +942,18 @@ if ($cmd eq "mv") {
check_files \%args, @ARGV;
}
} elsif ($cmd eq "clean") {
- my $dir = ".";
- if (@ARGV >= 1) {
- $dir = $ARGV[0];
- }
+ my $dir = @ARGV ? $ARGV[0] : ".";
clean_files $dir, \%args;
} elsif ($cmd eq "extract") {
my $src_dir = ".";
my $dst_dir;
- if (@ARGV >= 2) {
+ if (@ARGV == 2) {
$src_dir = $ARGV[0];
$dst_dir = $ARGV[1];
} elsif (@ARGV == 1) {
$dst_dir = $ARGV[0];
} else {
- die "ERROR: `extract` requires at least a destination directory.\n";
+ die "Invalid number of arguments\n";
}
if (!-d $src_dir) {
die "ERROR: Directory \"$src_dir\" does not exist.\n";
@@ -975,21 +963,19 @@ if ($cmd eq "mv") {
}
extract $src_dir, $dst_dir;
} elsif ($cmd eq "cp") {
- if (@ARGV < 2) {
- die "cp requires at least two arguments\n";
- }
+ die "cp requires at least two arguments\n" if @ARGV < 2;
my @src = @ARGV[0..$#ARGV-1];
copy_files \@src, $ARGV[-1], \%args;
} elsif ($cmd eq "mkdir") {
- if (@ARGV < 1) {
- die "mkdir requires at least one argument\n";
- }
+ die "mkdir requires at least one argument\n" if @ARGV < 1;
make_dirs @ARGV;
} elsif ($cmd eq "update") {
- if (@ARGV < 1) {
- die "update requires at least one argument\n";
- }
+ die "update requires at least one argument\n" if @ARGV < 1;
update @ARGV;
+} elsif ($cmd eq "updatespecial") {
+ die "Invalid number of arguments\n" if @ARGV > 1;
+ my $dir = @ARGV ? $ARGV[0] : ".";
+ update_special $dir;
}
__END__
@@ -1040,6 +1026,9 @@ the author has made too many bad decisions to rectify that problem at the moment
=head1 COMMANDS
+Note that some commands support multiple files/directories as arguments and others,
+for which it would make just as much sense, don't. That's just the way it is.
+
=over 8
=item B<addnew> [-q] [directory]
@@ -1120,6 +1109,16 @@ Note: Directories given as arguments are ignored.
This is mainly meant to quickly "touch" a file after it was modified (e.g. a
notes file that is occasionally updated).
+=item B<updatespecial> [directory]
+
+Recalculates the checksums for the special files C<.lumidify_archive_dirs> and
+C<.lumidify_archive_cksums> and writes them to C<.lumidify_archive_cksums.cksum>.
+B<directory> defaults to the current directory.
+
+This is only meant to be used if, for some reason, the checksum files had to
+be edited manually and thus don't match the checksums in C<.lumidify_archive_cksums.cksum>
+anymore.
+
=item B<rm> [-f] file ...
Removes the given files and directories recursively from the filesystem and
@@ -1322,7 +1321,8 @@ B<addnew> command in any subdirectory when you've added new files there.
Due to the extensive use of iterators and the author's bad life decisions,
some functions, such as B<addnew> and B<check>, run more slowly than they
-would if they were programmed more efficiently. Too bad.
+would if they were programmed more efficiently, especially on many small
+files and folders. Too bad.
=head1 PORTABILITY
diff --git a/tests/alltests.sh b/tests/alltests.sh
@@ -9,3 +9,4 @@
./runtest.sh mkdir
./runtest.sh extract
./runtest.sh rm
+./runtest.sh updatespecial
diff --git a/tests/updatespecial.sh b/tests/updatespecial.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+mkdir tmp
+cd tmp
+
+mkdir a
+mkdir b
+mkdir c
+
+touch f1
+touch f2
+
+../../lumia.pl addnew -q
+rm f2
+echo '4294967295 0 "f1"' > .lumidify_archive_cksums
+../../lumia.pl check -q
+../../lumia.pl updatespecial
+../../lumia.pl check | sort
+rm -r c
+echo '"a"
+"b"' > .lumidify_archive_dirs
+../../lumia.pl check -q
+cd a
+../../../lumia.pl updatespecial ..
+cd ..
+../../lumia.pl check | sort
+
+cd ..
+rm -r tmp
diff --git a/tests/updatespecial.txt b/tests/updatespecial.txt
@@ -0,0 +1,18 @@
+FAILED ./.lumidify_archive_cksums
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./a/.lumidify_archive_cksums
+OK ./a/.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./c/.lumidify_archive_cksums
+OK ./c/.lumidify_archive_dirs
+OK ./f1
+FAILED ./.lumidify_archive_dirs
+OK ./.lumidify_archive_cksums
+OK ./.lumidify_archive_dirs
+OK ./a/.lumidify_archive_cksums
+OK ./a/.lumidify_archive_dirs
+OK ./b/.lumidify_archive_cksums
+OK ./b/.lumidify_archive_dirs
+OK ./f1