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