commit e9a4386e8fe18457c0d154d655ff6159ecae1ab9
parent f60d1fa300a9def9bed31e38e9c0025676705efd
Author: lumidify <nobody@lumidify.org>
Date:   Mon, 23 Mar 2020 11:53:09 +0100
Fix several errors
Diffstat:
26 files changed, 184 insertions(+), 103 deletions(-)
diff --git a/lumia.pl b/lumia.pl
@@ -78,13 +78,13 @@ sub make_lumia_iter {
 	make_file_iter sub {1}, sub {
 		my $path = "$_[0]/.lumidify_archive_dirs";
 		return [] if !-f $path;
-		my $dirs = read_file($path);
+		my $dirs = read_file($path, {});
 		return if !defined $dirs;
 		my @new_dirs;
 		foreach my $dir (keys %$dirs) {
 			my $dir_path = "$_[0]/$dir";
 			if (!-d $dir_path) {
-				warn "ERROR: Directory \"$dir_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";
 			} else {
 				push @new_dirs, $dir_path;
 			}
@@ -117,12 +117,11 @@ sub clean_files {
 }
 
 sub read_file {
-	my ($file, $is_cksums_file) = @_;
-	my %cksums;
+	my ($file, $cksums, $handle_cksum_func) = @_;
 	my $fh;
-	if (!open($fh, "<", $file)) {
+	if (!open $fh, "<", $file) {
 		warn "ERROR: unable to open file \"$file\": $!\n";
-		return undef;
+		return;
 	}
 	my $in_fn = 0;
 	my $cur_cksum;
@@ -130,14 +129,9 @@ sub read_file {
 	my $cur_fn = "";
 	foreach (<$fh>) {
 		next if (!$in_fn && /^$/);
-		if ($is_cksums_file && !$in_fn) {
-			my @fields = split(/ /, $_, 3);
-			if ($#fields != 2) {
-				warn "ERROR: Malformed line \"$_\" in file \"$file\"\n");
-				next;
-			}
-			$cur_cksum = join(" ", @fields[0,1]);
-			$cur_str = $fields[2];
+		if ($handle_cksum_func && !$in_fn) {
+			($cur_cksum, $cur_str) = $handle_cksum_func->($_);
+			return undef if !defined $cur_cksum;
 		} else {
 			$cur_str = $_;
 		}
@@ -152,7 +146,7 @@ sub read_file {
 			} elsif ($ch eq "\"") {
 				if ($in_fn) {
 					$in_fn = 0;
-					$cksums{$cur_fn} = $cur_cksum;
+					$cksums->{$cur_fn} = $cur_cksum;
 					$cur_fn = "";
 					last;
 				}
@@ -162,26 +156,42 @@ sub read_file {
 			}
 		}
 	}
+	close $fh;
 	if ($in_fn) {
-		warn "ERROR: Unterminated filename in file \"$path\"\n";
+		warn "ERROR: Unterminated filename in file \"$file\"\n";
 		return undef;
 	}
-	return \%cksums;
+	return $cksums;
+}
+
+sub read_cksum_file {
+	my ($file, $cksums) = @_;
+	return read_file $file, $cksums, sub {
+		my $line = shift;
+		my @fields = split(/ /, $line, 3);
+		if ($#fields != 2) {
+			warn "WARNING: Malformed line \"$line\" in file \"$file\"\n";
+			return;
+		}
+		my $cur_cksum = join(" ", @fields[0,1]);
+		my $cur_str = $fields[2];
+		return ($cur_cksum, $cur_str);
+	};
 }
 
 sub read_cksums {
 	my $dir = shift;
-	my $file_cksums = read_file "$dir/.lumidify_archive_cksums", 1;
-	my $dir_list = read_file "$dir/.lumidify_archive_dirs";
-	return undef if !defined $file_cksums || !defined $dir_list;
-	my %cksums = (%$file_cksums, %$dir_list);
-	return \%cksums;
+	my $cksums = read_cksum_file("$dir/.lumidify_archive_cksums", {});
+	return undef if !defined $cksums;
+	$cksums = read_file("$dir/.lumidify_archive_dirs", $cksums);
+	return undef if !defined $cksums;
+	return $cksums;
 }
 
 sub get_cksum {
 	my $path = shift;
 	my $path_esc = shell_quote $path;
-	$cksum_output = `$CKSUM_CMD -- $path_esc 2>&1`;
+	my $cksum_output = `$CKSUM_CMD -- $path_esc 2>&1`;
 	if ($?) {
 		warn "ERROR getting cksum for file \"$path\":\n$cksum_output\n";
 		return undef;
@@ -190,23 +200,28 @@ sub get_cksum {
 	return $cksum_output;
 }
 
-# This would be much cleaner with cksums's -c option, but that
-# doesn't seem to work with files beginning with whitespace
 sub check_cksums {
-	my ($dir, $cksum_file) = @_;
-	my $cksums = read_file "$dir/$cksum_file", 1;
-	return if !defined $cksums;
+	my ($dir, $cksum_file, $quiet) = @_;
+	my $cksums = read_cksum_file("$dir/$cksum_file", {});
+	return 0 if !defined $cksums;
+	my $failed = 1;
 	foreach my $file (keys %$cksums) {
-		my $path = catfile($dir, $file);
+		my $path = "$dir/$file";
 		my $output = get_cksum $path;
 		next if !defined $output;
-		print(($output eq $cksums->{$file} ? "OK" : "FAILED") . "  $path\n");
+		if ($output eq $cksums->{$file}) {
+			print "OK $path\n" if !$quiet;
+		} else {
+			print "FAILED $path\n";
+			$failed = 0;
+		}
 	}
+	return $failed;
 }
 
 sub check_files {
 	my $top_dir = shift;
-	my $iter = make_lumia_iter $dir;
+	my $iter = make_lumia_iter $top_dir;
 	while (my $dir = $iter->()) {
 		check_cksums $dir, ".lumidify_archive_cksums.cksum";
 		check_cksums $dir, ".lumidify_archive_cksums";
@@ -216,9 +231,13 @@ sub check_files {
 sub write_special_cksums {
 	my ($dir, @files) = @_;
 	my $cksum_file = "$dir/.lumidify_archive_cksums.cksum";
-	my $cksums = read_file $cksum_file, 1;
+	my $cksums = {};
+	if (-f $cksum_file) {
+		$cksums = read_cksum_file $cksum_file, {};
+	}
+	return if !defined $cksums;
 	foreach my $file (@files) {
-		my $cksum_output = get_cksum "$dir/$file";
+		my $cksum_output = get_cksum("$dir/$file");
 		next if (!defined $cksum_output);
 		$cksums->{$file} = $cksum_output;
 	}
@@ -228,35 +247,46 @@ sub write_special_cksums {
 sub check_new_files {
 	my ($dir, $file_func, $before_dir_func, $after_dir_func) = @_;
 	my $iter = make_file_iter sub {-d $_[0]}, sub {
+		my $dir = shift;
 		my $dh;
-		if (!opendir $dh, $_[0]) {
-			warn "ERROR: Unable to open directory \"$_[0]\"!";
+		if (!opendir $dh, $dir) {
+			warn "ERROR: Unable to open directory \"$dir\"!";
 			return undef;
 		}
-		my $ignore = read_file "$_[0]/.lumidify_archive_ignore" // {};
-		my $lumia_dirs = read_file "$_[0]/.lumidify_archive_dirs" // {};
-		my $lumia_files = read_file "$_[0]/.lumidify_archive_cksums", 1 // {};
+		my $read_file_noerror = sub {
+			if (-f $_[0]) {
+				return $_[1]->($_[0], {}) // {};
+			}
+			return {};
+		};
+		my $ignore = $read_file_noerror->("$dir/.lumidify_archive_ignore", \&read_file);
+		my $lumia_dirs = $read_file_noerror->("$dir/.lumidify_archive_dirs", \&read_file);
+		my $lumia_files = $read_file_noerror->("$dir/.lumidify_archive_cksums", \&read_cksum_file);
 		my @dirs;
 		my $found = 0;
 		while (my $file = readdir $dh) {
 			next if $file eq "." || $file eq "..";
 			next if exists $ignore->{$file} || exists $SPECIAL_FILES{$file};
 			if (!exists $lumia_dirs->{$file} && !exists $lumia_files->{$file}) {
-				if (!found && defined $before_dir_func) {
-					$before_dir_func->($_[0]);
+				if (!$found && defined $before_dir_func) {
+					last if !$before_dir_func->($dir);
 				}
 				if (defined $file_func) {
-					$file_func->($_[0], $file);
+					$file_func->($dir, $file);
 				} else {
-					print "$_[0]/$file";
+					print "$dir/$file\n";
 				}
 				$found = 1;
 			}
-			push @dirs, "$_[0]/$file" if -d "$_[0]/$file";
+			push @dirs, "$dir/$file" if -d "$dir/$file";
+		}
+		closedir $dh;
+		# also call $before_dir_func if the directory has not been initialized yet
+		if (!$found && !-f "$dir/.lumidify_archive_cksums.cksum" && defined $before_dir_func) {
+			$before_dir_func->($dir);
 		}
-		closedir $fh;
-		if (found && defined $after_dir_func) {
-			$after_dir_func->($_[0]);
+		if ($found && defined $after_dir_func) {
+			$after_dir_func->($dir);
 		}
 		return \@dirs;
 	}, $dir;
@@ -278,7 +308,7 @@ sub check_add_new_files {
 				warn "ERROR: Unable to append to file \"$dir_file\"!";
 				return;
 			}
-			print $fh, "\"" . escape_filename $file . "\"\n";
+			print $fh '"' . escape_filename($file) . '"' . "\n";
 			close $fh;
 			$changed_dirs = 1;
 		} else {
@@ -290,16 +320,29 @@ sub check_add_new_files {
 				warn "ERROR: Unable to append to file \"$cksum_file\"!";
 				return;
 			}
-			print $fh, $cksum_output . " \"" . escape_filename $file . "\"\n";
+			print $fh $cksum_output . ' "' . escape_filename($file) . '"' . "\n";
 			close $fh;
 			$changed_files = 1;
 		}
-	}, sub {check_cksums $_[0], ".lumidify_archive_cksums.cksum";}, sub {
+		print "Added \"$fullpath\"\n";
+	}, sub {
+		if (-f "$_[0]/.lumidify_archive_cksums.cksum") {
+			if (!check_cksums $_[0], ".lumidify_archive_cksums.cksum", 1) {
+				warn "Checksum files corrupt in \"$_[0]\", not adding new checksums!\n";
+				return 0;
+			}
+		} else {
+			write_cksums($_[0], {}, 1, 1);
+		}
+		return 1;
+	}, sub {
 		if ($changed_dirs) {
 			write_special_cksums $_[0], ".lumidify_archive_dirs";
+			$changed_dirs = 0;
 		}
 		if ($changed_files) {
-			write_special_cksums $_[0], ".lumidify_archive_files";
+			write_special_cksums $_[0], ".lumidify_archive_cksums";
+			$changed_files = 0;
 		}
 	};
 }
@@ -325,22 +368,27 @@ sub write_file {
 		if ($is_cksum_file) {
 			print $fh "$contents->{$filename} ";
 		}
-		print $fh "\"" . escape_filename $filename . "\"\n";
+		print $fh '"' . escape_filename($filename) . '"' . "\n";
 	}
 	close $fh;
 }
 
+sub write_cksum_file {
+	my ($path, $contents) = @_;
+	write_file $path, $contents, 1;
+}
+
 sub write_cksums {
 	my ($dir, $contents, $files_modified, $dirs_modified) = @_;
 	# No, this isn't efficient...
 	if ($files_modified) {
-		my %file_cksums = map {$_ => $contents->{$_}}, grep {defined $contents->{$_}}, keys %$contents;
-		write_file "$dir/.lumidify_archive_cksums", \%file_cksums, 1;
-		write_special_cksums $dir, ".lumidify_archive_files";
+		my %file_cksums = map {$_ => $contents->{$_}} grep({defined $contents->{$_}} keys %$contents);
+		write_cksum_file("$dir/.lumidify_archive_cksums", \%file_cksums);
+		write_special_cksums $dir, ".lumidify_archive_cksums";
 	}
 	if ($dirs_modified) {
-		my %dir_cksums = map {$_ => undef}, grep {!defined $contents->{$_}}, keys %$contents;
-		write_file "$dir/.lumidify_archive_dirs", \%file_cksums;
+		my %dir_cksums = map {$_ => undef} grep({!defined $contents->{$_}} keys %$contents);
+		write_file "$dir/.lumidify_archive_dirs", \%dir_cksums;
 		write_special_cksums $dir, ".lumidify_archive_dirs";
 	}
 }
@@ -352,18 +400,18 @@ sub remove_old_files {
 		if (!-e $file) {
 			my $dir = dirname $file;
 			my $filename = basename $file;
-			my $lumia_dirs = read_file "$dir/.lumidify_archive_dirs";
+			my $lumia_dirs = read_file "$dir/.lumidify_archive_dirs", {};
 			if (defined $lumia_dirs && exists $lumia_dirs->{$filename}) {
 				delete $lumia_dirs->{$filename};
 				write_file $dir, $lumia_dirs;
 				print "Removed \"$file\" from \"$dir/.lumidify_archive_dirs\"\n";
 				write_special_cksums $dir, ".lumidify_archive_dirs";
 			} else {
-				my $lumia_files = read_file "$dir/.lumidify_archive_cksums", 1;
+				my $lumia_files = read_cksum_file "$dir/.lumidify_archive_cksums", {};
 				next if !defined $lumia_files;
 				delete $lumia_files->{$filename};
-				write_file $dir, $lumia_files, 1;
-				print "Removed \"$file\" from \"$dir/.lumidify_archive_files\"\n";
+				write_cksum_file $dir, $lumia_files;
+				print "Removed \"$file\" from \"$dir/.lumidify_archive_cksums\"\n";
 				write_special_cksums $dir, ".lumidify_archive_cksums";
 			}
 		}
@@ -401,12 +449,12 @@ sub copy_files {
 	if (!-e $dst && -d $src->[0]) {
 		$diff_name = 1;
 	}
+	my $dst_cksums = read_cksums $dst_dir;
+	return if !defined $dst_cksums;
 	if (system("cp", "-aiv", @$src, $dst)) {
 		die "ERROR while copying files\n";
 	}
-	my $src_sorted = sort_by_dir @$src;
-	my $dst_cksums = read_cksums $dst_dir;
-	return if !defined $dst_cksums;
+	my $src_sorted = sort_by_dir(@$src);
 	my $files_touched = 0;
 	my $dirs_touched = 0;
 	foreach my $src_dir (keys %$src_sorted) {
@@ -415,9 +463,9 @@ sub copy_files {
 		foreach my $src_file (@{$src_sorted->{$src_dir}}) {
 			my $src_path = "$src_dir/$src_file";
 			if (-d $src_path) {
-				my $dirs_touched = 1;
+				$dirs_touched = 1;
 			} else {
-				my $files_touched = 1;
+				$files_touched = 1;
 			}
 			if (exists $src_cksums->{$src_file}) {
 				if ($diff_name) {
@@ -433,6 +481,14 @@ sub copy_files {
 	write_cksums $dst_dir, $dst_cksums, $files_touched, $dirs_touched;
 }
 
+sub cmp_path {
+	my ($src, $dst) = @_;
+	# remove trailing slash so compare works
+	$src =~ s/\/$//;
+	$dst =~ s/\/$//;
+	return $src eq $dst;
+}
+
 sub move_file {
 	my ($src, $dst) = @_;
 	if (-d $dst) {
@@ -472,7 +528,7 @@ sub move_from_same_dir {
 			$files_touched = 1;
 		}
 		if (exists $src_cksums->{$src_file}) {
-			$dst_cksums->{$src_file} = $src_cksums{$src_file};
+			$dst_cksums->{$src_file} = $src_cksums->{$src_file};
 			delete $src_cksums->{$src_file};
 		} else {
 			warn "WARNING: \"$src_dir/$src_file\" not in cksum or directory list.\n";
@@ -525,14 +581,6 @@ sub move_rename {
 	}
 }
 
-sub cmp_path {
-	my ($src, $dst) = @_;
-	# remove trailing slash so compare works
-	$src =~ s/\/$//;
-	$dst =~ s/\/$//;
-	return $src eq $dst;
-}
-
 # $src: list of source paths
 # $dst: destination directory or file (in latter case only one src is allowed)
 sub move_files {
@@ -557,13 +605,13 @@ sub move_files {
 		die "move: can't move directory to file\n";
 	}
 	# Separate files by current dir so the cksum and dir files only need to be opened once
-	my $src_files = sort_by_dir @$src;
+	my $src_files = sort_by_dir(@$src);
 	my $dst_cksums = read_cksums $dst;
 	return if !defined $dst_cksums;
 	my $files_touched = 0;
 	my $dirs_touched = 0;
 	foreach my $src_dir (keys %$src_files) {
-		my ($tmp_files_touched, $tmp_dirs_touched) = move_from_same_dir $src_dir, $src_files{$src_dir}, $dst_cksums, $dst;
+		my ($tmp_files_touched, $tmp_dirs_touched) = move_from_same_dir $src_dir, $src_files->{$src_dir}, $dst_cksums, $dst;
 		$files_touched ||= $tmp_files_touched;
 		$dirs_touched ||= $tmp_dirs_touched;
 	}
@@ -610,9 +658,9 @@ sub remove_from_same_dir {
 }
 
 sub remove_files {
-	my $sorted_files = sort_by_dir @_;
+	my $sorted_files = sort_by_dir(@_);
 	foreach my $dir (keys %$sorted_files) {
-		remove_from_same_dir($dir, @{$sorted_files{$dir}});
+		remove_from_same_dir($dir, @{$sorted_files->{$dir}});
 	}
 }
 
@@ -628,9 +676,7 @@ sub make_dirs {
 	# Separate files by current dir so the cksum and dir files only need to be opened once
 	my %dirs;
 	foreach my $dir (@created_dirs) {
-		system("touch", "$dir/.lumidify_archive_cksums");
-		system("touch", "$dir/.lumidify_archive_dirs");
-		write_special_cksums $dir, ".lumidify_archive_cksums", ".lumidify_archive_dirs";
+		write_cksums $dir, {}, 1, 1;
 		my $parent = dirname($dir);
 		if (!exists($dirs{$parent})) {
 			$dirs{$parent} = [];
@@ -638,17 +684,38 @@ sub make_dirs {
 		push(@{$dirs{$parent}}, basename($dir));
 	}
 	foreach my $parent (keys %dirs) {
-		my $parent_dirs = read_file "$parent/.lumidify_archive_dirs";
+		my $parent_dirs = read_file "$parent/.lumidify_archive_dirs", {};
 		next if !defined $parent_dirs;
 		foreach my $dir (@{$dirs{$parent}}) {
 			$parent_dirs->{$dir} = "";
 		}
 		write_file "$parent/.lumidify_archive_dirs", $parent_dirs;
+		write_special_cksums $parent, ".lumidify_archive_dirs";
+	}
+}
+
+sub extract {
+	my ($src_dir, $dst_dir) = @_;
+	# clean trailing slashes so removing the prefix later works
+	$src_dir =~ s/\/*$//;
+	# after cleaning the slashes, $src_dir is at the beginning of all
+	# dirs returned by the iterator, but we also need to remove the
+	# slash that comes right after the prefix
+	my $prefix_length = length $src_dir;
+	my $iter = make_lumia_iter $src_dir;
+	while (my $dir = $iter->()) {
+		# just returns "" for the original dir itself
+		my $final_dir = substr($dir, $prefix_length);
+		foreach my $file (keys %SPECIAL_FILES) {
+			my $fulldir = "$dst_dir/$final_dir";
+			system("mkdir", "-p", $fulldir);
+			system("cp", "-aiv", "$dir/$file", "$fulldir/$file");
+		}
 	}
 }
 
 if ($#ARGV < 0) {
-	die("USAGE: test.pl {init|check|clean|cknew|addnew|cp|mv|rm|mkdir}\n");
+	die("USAGE: test.pl {init|check|clean|checknew|addnew|cp|mv|rm|mkdir}\n");
 }
 if ($ARGV[0] eq "mv") {
 	if ($#ARGV < 2) {
@@ -660,39 +727,31 @@ if ($ARGV[0] eq "mv") {
 	if ($#ARGV < 1) {
 		die "rm requires at least one argument\n";
 	}
-	my @files = @ARGV[1..$#ARGV];
-	remove_files(\@files);
+	remove_files(@ARGV[1..$#ARGV]);
 } elsif ($ARGV[0] eq "addnew") {
 	my $dir = ".";
 	if ($#ARGV > 0) {
 		$dir = $ARGV[1];
 	}
-	check_add_new_files($dir);
-} elsif ($ARGV[0] eq "cknew") {
+	check_add_new_files $dir;
+} elsif ($ARGV[0] eq "checknew") {
 	my $dir = ".";
 	if ($#ARGV > 0) {
 		$dir = $ARGV[1];
 	}
-	check_new_files($dir);
+	check_new_files $dir;
 } elsif ($ARGV[0] eq "check") {
 	my $dir = ".";
 	if ($#ARGV > 0) {
 		$dir = $ARGV[1];
-		if (!-d $dir) {
-			die "ERROR: Directory \"$dir\" does not exist.\n";
-		}
-		chdir($dir);
 	}
-	check_files($dir);
+	check_files $dir;
 } elsif ($ARGV[0] eq "clean") {
 	my $dir = ".";
 	if ($#ARGV > 0) {
 		$dir = $ARGV[1];
-		if (!-d $dir) {
-			die "ERROR: Directory \"$dir\" does not exist.\n";
-		}
 	}
-	clean_files($dir);
+	clean_files $dir;
 } elsif ($ARGV[0] eq "extract") {
 	my $src_dir = ".";
 	my $dst_dir;
@@ -702,17 +761,15 @@ if ($ARGV[0] eq "mv") {
 	} elsif ($#ARGV == 1) {
 		$dst_dir = $ARGV[1];	
 	} else {
-		die("ERROR: `extract` requires at least a destination directory.\n");
+		die "ERROR: `extract` requires at least a destination directory.\n";
 	}
 	if (!-d $src_dir) {
-		die("ERROR: Directory \"$src_dir\" does not exist.\n");
+		die "ERROR: Directory \"$src_dir\" does not exist.\n";
 	}
 	if (!-d $dst_dir) {
-		die("ERROR: Directory \"$dst_dir\" does not exist.\n");
+		die "ERROR: Directory \"$dst_dir\" does not exist.\n";
 	}
-	# FIXME: check .lumidify_archive_cksums.cksum when initializing
-	my $cksums = init_cksums($src_dir);
-	write_cksums($dst_dir, $cksums, 1, 1);
+	extract $src_dir, $dst_dir;
 } elsif ($ARGV[0] eq "cp") {
 	if ($#ARGV < 2) {
 		die "cp requires at least two arguments\n";
diff --git a/test/.lumidify_archive_cksums b/test/.lumidify_archive_cksums
@@ -0,0 +1,3 @@
+4294967295 0 "bob"
+4294967295 0 "fred2"
+4294967295 0 "fred"
diff --git a/test/.lumidify_archive_cksums.cksum b/test/.lumidify_archive_cksums.cksum
@@ -0,0 +1,2 @@
+2175384240 27 ".lumidify_archive_dirs"
+2227479197 60 ".lumidify_archive_cksums"
diff --git a/test/.lumidify_archive_dirs b/test/.lumidify_archive_dirs
@@ -0,0 +1,4 @@
+"dir3"
+"dir2"
+"dir1"
+"dir"
diff --git a/test/bob b/test/bob
diff --git a/test/dir/.lumidify_archive_cksums b/test/dir/.lumidify_archive_cksums
@@ -0,0 +1 @@
+4294967295 0 "meh"
diff --git a/test/dir/.lumidify_archive_cksums.cksum b/test/dir/.lumidify_archive_cksums.cksum
@@ -0,0 +1,2 @@
+43109071 19 ".lumidify_archive_cksums"
+4294967295 0 ".lumidify_archive_dirs"
diff --git a/test/dir/.lumidify_archive_dirs b/test/dir/.lumidify_archive_dirs
diff --git a/test/dir/meh b/test/dir/meh
diff --git a/test/dir1/.lumidify_archive_cksums b/test/dir1/.lumidify_archive_cksums
@@ -0,0 +1 @@
+4294967295 0 "bob"
diff --git a/test/dir1/.lumidify_archive_cksums.cksum b/test/dir1/.lumidify_archive_cksums.cksum
@@ -0,0 +1,2 @@
+202046376 19 ".lumidify_archive_cksums"
+137730780 6 ".lumidify_archive_dirs"
diff --git a/test/dir1/.lumidify_archive_dirs b/test/dir1/.lumidify_archive_dirs
@@ -0,0 +1 @@
+"dir"
diff --git a/test/dir1/bob b/test/dir1/bob
diff --git a/test/dir1/dir/.lumidify_archive_cksums b/test/dir1/dir/.lumidify_archive_cksums
@@ -0,0 +1 @@
+4294967295 0 "bob"
diff --git a/test/dir1/dir/.lumidify_archive_cksums.cksum b/test/dir1/dir/.lumidify_archive_cksums.cksum
@@ -0,0 +1,2 @@
+202046376 19 ".lumidify_archive_cksums"
+4294967295 0 ".lumidify_archive_dirs"
diff --git a/test/dir1/dir/.lumidify_archive_dirs b/test/dir1/dir/.lumidify_archive_dirs
diff --git a/test/dir1/dir/bob b/test/dir1/dir/bob
diff --git a/test/dir2/.lumidify_archive_cksums b/test/dir2/.lumidify_archive_cksums
diff --git a/test/dir2/.lumidify_archive_cksums.cksum b/test/dir2/.lumidify_archive_cksums.cksum
@@ -0,0 +1,2 @@
+4294967295 0 ".lumidify_archive_cksums"
+4294967295 0 ".lumidify_archive_dirs"
diff --git a/test/dir2/.lumidify_archive_dirs b/test/dir2/.lumidify_archive_dirs
diff --git a/test/dir3/.lumidify_archive_cksums b/test/dir3/.lumidify_archive_cksums
@@ -0,0 +1 @@
+4294967295 0 "meh"
diff --git a/test/dir3/.lumidify_archive_cksums.cksum b/test/dir3/.lumidify_archive_cksums.cksum
@@ -0,0 +1,2 @@
+4294967295 0 ".lumidify_archive_dirs"
+43109071 19 ".lumidify_archive_cksums"
diff --git a/test/dir3/.lumidify_archive_dirs b/test/dir3/.lumidify_archive_dirs
diff --git a/test/dir3/meh b/test/dir3/meh
diff --git a/test/fred b/test/fred
diff --git a/test/fred2 b/test/fred2