commit aa3fbdeec22eabf826a6bf730f61d8df3d6f383e
parent 041b675684a7f17f2fb7ae14af0be4d53ee3aba9
Author: lumidify <nobody@lumidify.org>
Date:   Mon, 23 Mar 2020 17:14:23 +0100
Add update command
Diffstat:
8 files changed, 54 insertions(+), 18 deletions(-)
diff --git a/lumia.pl b/lumia.pl
@@ -235,8 +235,8 @@ sub check_files {
 	my $iter = make_lumia_iter @_;
 	while (my $file = $iter->()) {
 		if (-d $file) {
-			check_cksums $file, "$DOUBLE_CKSUM_FILE";
-			check_cksums $file, "$CKSUM_FILE";
+			check_cksums $file, $DOUBLE_CKSUM_FILE;
+			check_cksums $file, $CKSUM_FILE;
 		} else {
 			my $dir = dirname $file;
 			my $base = basename $file;
@@ -262,7 +262,7 @@ sub check_files {
 }
 
 # write the checksums of the special lumia files given as arguments
-# to "$DOUBLE_CKSUM_FILE" in $dir
+# to $DOUBLE_CKSUM_FILE in $dir
 sub write_special_cksums {
 	my ($dir, @files) = @_;
 	my $cksum_file = "$dir/$DOUBLE_CKSUM_FILE";
@@ -283,7 +283,7 @@ sub write_special_cksums {
 # - if $file_func is set, it is called for each new file
 # - if $before_dir_func is set, it is called before processing the
 #   files in each directory that has new files OR if a directory
-#   is entirely new (well, it only checks if "$DOUBLE_CKSUM_FILE" exists)
+#   is entirely new (well, it only checks if $DOUBLE_CKSUM_FILE exists)
 # - if $after_dir_func is set, it is called after processing the
 #   files in each directory that has new files
 sub check_new_files {
@@ -370,7 +370,7 @@ sub check_add_new_files {
 		print "Added \"$fullpath\"\n";
 	}, sub {
 		if (-f "$_[0]/$DOUBLE_CKSUM_FILE") {
-			if (!check_cksums $_[0], "$DOUBLE_CKSUM_FILE", 1) {
+			if (!check_cksums $_[0], $DOUBLE_CKSUM_FILE, 1) {
 				warn "Checksum files corrupt in \"$_[0]\", not adding new checksums!\n";
 				return 0;
 			}
@@ -380,11 +380,11 @@ sub check_add_new_files {
 		return 1;
 	}, sub {
 		if ($changed_dirs) {
-			write_special_cksums $_[0], "$DIR_FILE";
+			write_special_cksums $_[0], $DIR_FILE;
 			$changed_dirs = 0;
 		}
 		if ($changed_files) {
-			write_special_cksums $_[0], "$CKSUM_FILE";
+			write_special_cksums $_[0], $CKSUM_FILE;
 			$changed_files = 0;
 		}
 	};
@@ -425,12 +425,12 @@ sub write_cksums {
 	if ($files_modified) {
 		my %file_cksums = map {$_ => $contents->{$_}} grep({defined $contents->{$_}} keys %$contents);
 		write_cksum_file("$dir/$CKSUM_FILE", \%file_cksums);
-		write_special_cksums $dir, "$CKSUM_FILE";
+		write_special_cksums $dir, $CKSUM_FILE;
 	}
 	if ($dirs_modified) {
 		my %dir_cksums = map {$_ => undef} grep({!defined $contents->{$_}} keys %$contents);
 		write_file "$dir/$DIR_FILE", \%dir_cksums;
-		write_special_cksums $dir, "$DIR_FILE";
+		write_special_cksums $dir, $DIR_FILE;
 	}
 }
 
@@ -465,7 +465,7 @@ sub remove_old_files {
 				delete $lumia_dirs->{$child};
 				write_file "$parent/$DIR_FILE", $lumia_dirs;
 				print "Removed \"$dir\" from \"$parent/$DIR_FILE\"\n";
-				write_special_cksums $parent, "$DIR_FILE";
+				write_special_cksums $parent, $DIR_FILE;
 			}
 		} else {
 			my $cksums = read_cksum_file("$dir/$CKSUM_FILE", {}) // {};
@@ -479,7 +479,7 @@ sub remove_old_files {
 			}
 			if ($found) {
 				write_cksum_file "$dir/$CKSUM_FILE", $cksums;
-				write_special_cksums $dir, "$CKSUM_FILE";
+				write_special_cksums $dir, $CKSUM_FILE;
 			}
 		}
 	}
@@ -793,7 +793,7 @@ sub make_dirs {
 			$parent_dirs->{$dir} = "";
 		}
 		write_file "$parent/$DIR_FILE", $parent_dirs;
-		write_special_cksums $parent, "$DIR_FILE";
+		write_special_cksums $parent, $DIR_FILE;
 	}
 }
 
@@ -815,8 +815,37 @@ sub extract {
 	}
 }
 
+# update the checksums of the given files
+# ignores any directories given as arguments
+sub update {
+	my @files;
+	foreach (@_) {
+		if (-d $_) {
+			warn "Ignoring directory \"$_\"\n";
+		} else {
+			push @files, $_;
+		}
+	}
+	my $sorted_files = sort_by_dir @files;
+	foreach my $dir (keys %$sorted_files) {
+		my $cksums = read_cksum_file "$dir/$CKSUM_FILE", {};
+		next if !defined $cksums;
+		my $changed = 0;
+		foreach my $file (@{$sorted_files->{$dir}}) {
+			my $cksum_output = get_cksum "$dir/$file";
+			next if !defined $cksum_output;
+			$cksums->{$file} = $cksum_output;
+			$changed = 1;
+		}
+		if ($changed) {
+			write_cksum_file "$dir/$CKSUM_FILE", $cksums;
+			write_special_cksums $dir, $CKSUM_FILE;
+		}
+	}
+}
+
 if ($#ARGV < 0) {
-	die("USAGE: test.pl {init|check|clean|checknew|addnew|checkold|rmold|extract|cp|mv|rm|mkdir}\n");
+	die("USAGE: test.pl {init|check|clean|checknew|addnew|checkold|rmold|extract|cp|mv|rm|mkdir|update}\n");
 }
 if ($ARGV[0] eq "mv") {
 	if ($#ARGV < 2) {
@@ -895,4 +924,9 @@ if ($ARGV[0] eq "mv") {
 	}
 	my @dirs = @ARGV[1..$#ARGV];
 	make_dirs(@dirs);
+} elsif ($ARGV[0] eq "update") {
+	if ($#ARGV < 1) {
+		die "update requires at least one argument\n";
+	}
+	update @ARGV[1..$#ARGV];
 }
diff --git a/test/.lumidify_archive_cksums b/test/.lumidify_archive_cksums
@@ -1,4 +1,4 @@
+2454254050 2 "fred2"
 2418082923 2 "bob1"
-2418082923 2 "bob3"
+2454254050 2 "bob3"
 4294967295 0 "bob2"
-4294967295 0 "fred2"
diff --git a/test/.lumidify_archive_cksums.cksum b/test/.lumidify_archive_cksums.cksum
@@ -1,2 +1,2 @@
+650526090 81 ".lumidify_archive_cksums"
 3971863640 21 ".lumidify_archive_dirs"
-1556400735 81 ".lumidify_archive_cksums"
diff --git a/test/bob3 b/test/bob3
@@ -1 +1 @@
-a
+b
diff --git a/test/dir2/.lumidify_archive_cksums b/test/dir2/.lumidify_archive_cksums
@@ -0,0 +1 @@
+2418082923 2 "meh"
diff --git a/test/dir2/.lumidify_archive_cksums.cksum b/test/dir2/.lumidify_archive_cksums.cksum
@@ -1,2 +1,2 @@
-4294967295 0 ".lumidify_archive_cksums"
 137730780 6 ".lumidify_archive_dirs"
+3978068116 19 ".lumidify_archive_cksums"
diff --git a/test/bob3 b/test/dir2/meh
diff --git a/test/fred2 b/test/fred2
@@ -0,0 +1 @@
+b