lumia

Archive checksum manager
git clone git://lumidify.org/git/lumia.git
Log | Files | Refs | README

commit ae5ceb4ffcbb4205584e4a1e7dc8b055a8c152d6
parent d170d94e968a44a9330ed8d5eb8b2fd4996afa90
Author: lumidify <nobody@lumidify.org>
Date:   Tue, 24 Mar 2020 18:27:06 +0100

Add more tests

Diffstat:
Mlumia.pl | 27+++++++++++++++------------
Mtests/README | 3+++
Atests/addcknew.sh | 26++++++++++++++++++++++++++
Atests/addcknew.txt | 23+++++++++++++++++++++++
Mtests/alltests.sh | 6++++++
Atests/checkupdate.sh | 21+++++++++++++++++++++
Atests/checkupdate.txt | 19+++++++++++++++++++
Atests/extract.sh | 21+++++++++++++++++++++
Atests/extract.txt | 19+++++++++++++++++++
Atests/mkdir.sh | 11+++++++++++
Atests/mkdir.txt | 8++++++++
Atests/rm.sh | 27+++++++++++++++++++++++++++
Atests/rm.txt | 11+++++++++++
Atests/rmckold.sh | 27+++++++++++++++++++++++++++
Atests/rmckold.txt | 50++++++++++++++++++++++++++++++++++++++++++++++++++
15 files changed, 287 insertions(+), 12 deletions(-)

diff --git a/lumia.pl b/lumia.pl @@ -10,7 +10,6 @@ use strict; use warnings; use File::Spec::Functions qw(catfile abs2rel); use File::Basename qw(basename dirname); -use File::Path qw(remove_tree); use String::ShellQuote; use Pod::Usage; use Getopt::Long; @@ -88,6 +87,7 @@ sub make_file_iter_basic { # note: this returns nonexistent directories if those are still # specified in the lumia files sub make_lumia_iter { + my ($quiet, @dirs) = @_; make_file_iter sub {1}, sub { my $path = "$_[0]/$DIR_FILE"; return [] if !-f $path; @@ -97,13 +97,14 @@ sub make_lumia_iter { foreach my $dir (keys %$dirs) { my $dir_path = "$_[0]/$dir"; if (!-d $dir_path) { - warn "ERROR: Directory \"$dir_path\" mentioned in \"$path\" does not exist or is not directory.\n"; + warn "ERROR: Directory \"$dir_path\" mentioned in " . + "\"$path\" does not exist or is not directory.\n" if !$quiet; } # still push it even when it doesn't exist so rmold can work properly push @new_dirs, $dir_path; } return \@new_dirs; - }, @_; + }, @dirs; } # remove all special lumia files from the given directory @@ -128,7 +129,7 @@ sub read_file { my ($file, $cksums, $handle_cksum_func) = @_; my $fh; if (!open $fh, "<", $file) { - warn "ERROR: unable to open file \"$file\": $!\n"; + warn "ERROR: Unable to open file \"$file\": $!\n"; return; } my $in_fn = 0; @@ -205,7 +206,7 @@ sub get_cksum { my $path_esc = shell_quote $path; my $cksum_output = `$CKSUM_CMD -- $path_esc 2>&1`; if ($?) { - warn "ERROR getting cksum for file \"$path\":\n$cksum_output\n"; + warn "ERROR getting cksum for file \"$path\":\n$cksum_output"; return undef; } chomp $cksum_output; @@ -262,7 +263,7 @@ sub check_files { print "FAILED $file\n"; } } - my $iter = make_lumia_iter @dirs; + my $iter = make_lumia_iter 0, @dirs; while (my $file = $iter->()) { check_cksums $file, $DOUBLE_CKSUM_FILE, $args->{"q"}; check_cksums $file, $CKSUM_FILE, $args->{"q"}; @@ -468,9 +469,8 @@ sub write_cksums { # show all files that are present in the checksum files but don't exist on the filesystem anymore sub check_old_files { my $top_dir = shift; - my $iter = make_lumia_iter $top_dir; + my $iter = make_lumia_iter 1, $top_dir; while (my $dir = $iter->()) { - # if $dir doesn't exist, the iterator already issued a warning if (-e $dir) { my $cksums = read_cksum_file("$dir/$CKSUM_FILE", {}) // {}; foreach my $file (keys %$cksums) { @@ -478,6 +478,8 @@ sub check_old_files { warn "Nonexistent file: \"$dir/$file\"!\n"; } } + } else { + warn "Nonexistent directory: \"$dir\"!\n"; } } } @@ -486,7 +488,7 @@ sub check_old_files { # on the filesystem anymore sub remove_old_files { my ($top_dir, $args) = @_; - my $iter = make_lumia_iter $top_dir; + my $iter = make_lumia_iter 1, $top_dir; while (my $dir = $iter->()) { if (!-e $dir) { my $parent = dirname $dir; @@ -770,7 +772,7 @@ sub remove_file_dir { return 1; } if (-e $path) { - warn "ERROR: unable to remove \"$path\" from filesystem but " . + warn "ERROR: Unable to remove \"$path\" from filesystem but " . "will still be removed from checksum database\n"; } return 0; @@ -856,7 +858,7 @@ sub make_dirs { # entire directory structure in the process sub extract { my ($src_dir, $dst_dir, $args) = @_; - my $iter = make_lumia_iter $src_dir; + my $iter = make_lumia_iter 0, $src_dir; my $options = $args->{"v"} ? "-av" : "-a"; while (my $dir = $iter->()) { my $final_dir = abs2rel $dir, $src_dir; @@ -1059,7 +1061,8 @@ B<directory> defaults to the current directory. =item B<rmold> [-q] [directory] -Deletes all files found by B<checkold>. B<directory> defaults to the current directory. +Removes all files found by B<checkold> from the database. B<directory> defaults to +the current directory. C<-q> suppresses the printing of each file as it is removed. diff --git a/tests/README b/tests/README @@ -2,3 +2,6 @@ All tests must sort the output from lumia.pl since the order in the checksum files is random. To run all tests, simply run alltests.sh + +There aren't that many tests yet. Maybe I'll get around +to adding more tests for all the edge cases someday. diff --git a/tests/addcknew.sh b/tests/addcknew.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +mkdir tmp +cd tmp + +mkdir a +mkdir b +mkdir c + +touch f1 +touch f2 +touch f3 + +../../lumia.pl addnew | sort +../../lumia.pl clean -q +../../lumia.pl addnew -q +touch -- -bob +../../lumia.pl checknew +../../lumia.pl addnew +touch a/fred +../../lumia.pl checknew a +../../lumia.pl addnew a +../../lumia.pl check | sort + +cd .. +rm -r tmp diff --git a/tests/addcknew.txt b/tests/addcknew.txt @@ -0,0 +1,23 @@ +Added "./a" +Added "./b" +Added "./c" +Added "./f1" +Added "./f2" +Added "./f3" +./-bob +Added "./-bob" +a/fred +Added "a/fred" +OK ./-bob +OK ./.lumidify_archive_cksums +OK ./.lumidify_archive_dirs +OK ./a/.lumidify_archive_cksums +OK ./a/.lumidify_archive_dirs +OK ./a/fred +OK ./b/.lumidify_archive_cksums +OK ./b/.lumidify_archive_dirs +OK ./c/.lumidify_archive_cksums +OK ./c/.lumidify_archive_dirs +OK ./f1 +OK ./f2 +OK ./f3 diff --git a/tests/alltests.sh b/tests/alltests.sh @@ -3,3 +3,9 @@ ./runtest.sh filenames ./runtest.sh mv ./runtest.sh cp +./runtest.sh addcknew +./runtest.sh checkupdate +./runtest.sh rmckold +./runtest.sh mkdir +./runtest.sh extract +./runtest.sh rm diff --git a/tests/checkupdate.sh b/tests/checkupdate.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +mkdir tmp +cd tmp + +mkdir a +mkdir b +mkdir c + +touch f1 +touch f2 +touch f3 + +../../lumia.pl addnew | sort +echo "a" > f1 +../../lumia.pl check -q +../../lumia.pl update f1 a +../../lumia.pl check | sort + +cd .. +rm -r tmp diff --git a/tests/checkupdate.txt b/tests/checkupdate.txt @@ -0,0 +1,19 @@ +Added "./a" +Added "./b" +Added "./c" +Added "./f1" +Added "./f2" +Added "./f3" +FAILED ./f1 +Ignoring directory "a" +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 +OK ./f2 +OK ./f3 diff --git a/tests/extract.sh b/tests/extract.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +mkdir tmp +cd tmp + +mkdir a +mkdir b +mkdir c + +touch f1 +touch f2 +touch f3 + +../../lumia.pl addnew -q +mkdir bob +../../lumia.pl extract bob +find bob | sort +cat bob/.lumidify_archive_cksums | sort + +cd .. +rm -r tmp diff --git a/tests/extract.txt b/tests/extract.txt @@ -0,0 +1,19 @@ +bob +bob/.lumidify_archive_cksums +bob/.lumidify_archive_cksums.cksum +bob/.lumidify_archive_dirs +bob/a +bob/a/.lumidify_archive_cksums +bob/a/.lumidify_archive_cksums.cksum +bob/a/.lumidify_archive_dirs +bob/b +bob/b/.lumidify_archive_cksums +bob/b/.lumidify_archive_cksums.cksum +bob/b/.lumidify_archive_dirs +bob/c +bob/c/.lumidify_archive_cksums +bob/c/.lumidify_archive_cksums.cksum +bob/c/.lumidify_archive_dirs +4294967295 0 "f1" +4294967295 0 "f2" +4294967295 0 "f3" diff --git a/tests/mkdir.sh b/tests/mkdir.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +mkdir tmp +cd tmp + +../../lumia.pl addnew +../../lumia.pl mkdir -- a b -c +../../lumia.pl check | sort + +cd .. +rm -r tmp diff --git a/tests/mkdir.txt b/tests/mkdir.txt @@ -0,0 +1,8 @@ +OK ./-c/.lumidify_archive_cksums +OK ./-c/.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 diff --git a/tests/rm.sh b/tests/rm.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +mkdir tmp +cd tmp + +mkdir a +mkdir b +mkdir c + +touch f1 +touch f2 +touch f3 + +../../lumia.pl addnew | sort +../../lumia.pl rm f1 +# Note: this doesn't check what happens when you try to remove this +# file without '-f', since it seems to be a paint to try to make +# rm believe that we're in a tty +chmod 444 f2 +../../lumia.pl rm -f f2 +echo "a" > a/meh +../../lumia.pl addnew a +../../lumia.pl rm a f3 c +../../lumia.pl check | sort + +cd .. +rm -rf tmp diff --git a/tests/rm.txt b/tests/rm.txt @@ -0,0 +1,11 @@ +Added "./a" +Added "./b" +Added "./c" +Added "./f1" +Added "./f2" +Added "./f3" +Added "a/meh" +OK ./.lumidify_archive_cksums +OK ./.lumidify_archive_dirs +OK ./b/.lumidify_archive_cksums +OK ./b/.lumidify_archive_dirs diff --git a/tests/rmckold.sh b/tests/rmckold.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +mkdir tmp +cd tmp + +mkdir a +mkdir b +mkdir c + +touch f1 +touch f2 +touch f3 + +../../lumia.pl addnew | sort +rm f1 +../../lumia.pl check | sort +../../lumia.pl checkold +../../lumia.pl rmold +../../lumia.pl check | sort +rm -r a +../../lumia.pl check | sort +../../lumia.pl checkold +../../lumia.pl rmold -q +../../lumia.pl check | sort + +cd .. +rm -r tmp diff --git a/tests/rmckold.txt b/tests/rmckold.txt @@ -0,0 +1,50 @@ +Added "./a" +Added "./b" +Added "./c" +Added "./f1" +Added "./f2" +Added "./f3" +ERROR getting cksum for file "./f1": +cksum: cannot open ./f1: No such file or directory +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 ./f2 +OK ./f3 +Nonexistent file: "./f1"! +Removed "./f1" from "./.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 ./f2 +OK ./f3 +ERROR: Directory "./a" mentioned in "./.lumidify_archive_dirs" does not exist or is not directory. +ERROR: Unable to open file "./a/.lumidify_archive_cksums.cksum": No such file or directory +ERROR: Unable to open file "./a/.lumidify_archive_cksums": No such file or directory +OK ./.lumidify_archive_cksums +OK ./.lumidify_archive_dirs +OK ./b/.lumidify_archive_cksums +OK ./b/.lumidify_archive_dirs +OK ./c/.lumidify_archive_cksums +OK ./c/.lumidify_archive_dirs +OK ./f2 +OK ./f3 +Nonexistent directory: "./a"! +OK ./.lumidify_archive_cksums +OK ./.lumidify_archive_dirs +OK ./b/.lumidify_archive_cksums +OK ./b/.lumidify_archive_dirs +OK ./c/.lumidify_archive_cksums +OK ./c/.lumidify_archive_dirs +OK ./f2 +OK ./f3