feat(user/bkots):Use subshells to speed up jobs
[BK-2020-03.git] / user / bkots
index cca1fd803ec7a11bc0169351e951be0caaa02b2c..ec371f67aff52105211ca69452b03a8a4d741b23 100755 (executable)
@@ -1,6 +1,8 @@
 #!/usr/bin/env bash
 
 # Define variables
+declare -g max_job_count="2"; # default max job count
+declare -g age_threshold="60"; # min age to add file; seconds;
 declare -Ag appRollCall # Associative array for storing app status
 declare -Ag fileRollCall # Associative array for storing file status
 declare -Ag dirRollCall # Associative array for storing dir status
@@ -10,8 +12,6 @@ calendars+=("https://finney.calendar.eternitywall.com");
 calendars+=("https://btc.calendar.catallaxy.com");
 calendars+=("https://alice.btc.calendar.opentimestamps.org");
 calendars+=("https://bob.btc.calendar.opentimestamps.org");
-age_threshold="60"; # min age to add file; seconds;
-max_job_count="2"; # default max job count
 
 # Declare functions
 yell() { echo "$0: $*" >&2; } # print script path and all args to stderr
@@ -200,7 +200,7 @@ showVersion() {
     vbm "DEBUG:showVersion function called."
 
     cat <<'EOF'
-bkots 2.0.0
+bkots 2.1.0
 Copyright (C) 2022 Steven Baltakatei Sandoval
 License GPLv3: GNU GPL version 3
 This is free software; you are free to change and redistribute it.
@@ -406,7 +406,6 @@ main() {
     # Ref/Attrib: [1] How to create an array of unique elements from a string/array in bash https://unix.stackexchange.com/a/167194
     #             [2] How to find files containing newlines in their names https://stackoverflow.com/a/21727028
     #             [3] Get mtime of specific file using Bash? https://stackoverflow.com/a/4774377
-    #             [4] Search/Replace with string substitution instead of sed. https://www.shellcheck.net/wiki/SC2001
     local -a file_list file_list_pruned;
     local -a files_to_verify files_to_upgrade files_to_stamp
     local -a files_to_verify_pruned files_to_upgrade_pruned files_to_stamp_pruned
@@ -667,103 +666,108 @@ main() {
         vbm "DEBUG:files_to_stamp_pruned:";
         printf "%s\n" "${files_to_stamp_pruned[@]}";
     fi;
-    
+
     # Act on files
     ## Assemble and execute upgrade file commands
     for item in "${files_to_upgrade_pruned[@]}"; do
-        path_prf="$(cut -d $'\n' -f1 < <(echo "$item"))";
-        path_prf_sesc="${path_prf//\"/\\\"}"; # escape path double quotes. See [4].
-        if [[ -z "$path_prf" ]]; then
-            yell "ERROR:blank upgrade item encountered. Skipping:item:$item";
-            continue;
-        fi;
-        vbm "DEBUG:Attempting to upgrade proof file:path_prf:$path_prf";
-        if [[ ! $option_dry_run == "true" ]]; then
-            ### Try upgrade with known calendars in random order
-            while read -r url; do
-                vbm "DEBUG:Upgrading with calendar:url:$url";
-
-                #### assemble command
-                local -a cmd_temp;
-                cmd_temp+=("ots");
-                if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
-                cmd_temp+=("-l" "$url" "--no-default-whitelist");
-                cmd_temp+=("upgrade" "$path_prf_sesc");
-                if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
-
-                #### execute command
-                wait_for_jobslot && must "${cmd_temp[@]}" &
-                unset cmd_temp;
-                break;
-                #ots -l "$url" --no-default-whitelist upgrade "$path_prf" && break;
-            done < <(printf "%s\n" "${calendars[@]}" | shuf);
-        else
-            yell "DEBUG:DRY RUN:Not running:\"ots upgrade $path_prf\"";
-        fi;
+        wait_for_jobslot && {
+            path_prf="$(cut -d $'\n' -f1 < <(echo "$item"))";
+            if [[ -z "$path_prf" ]]; then
+                yell "ERROR:blank upgrade item encountered. Skipping:item:$item";
+                continue;
+            fi;
+            vbm "DEBUG:Attempting to upgrade proof file:path_prf:$path_prf";
+            if [[ ! $option_dry_run == "true" ]]; then
+                ### Try upgrade with known calendars in random order
+                while read -r url; do
+                    vbm "DEBUG:Upgrading with calendar:url:$url";
+
+                    #### assemble command
+                    local -a cmd_temp;
+                    cmd_temp+=("ots");
+                    if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
+                    cmd_temp+=("-l" "$url" "--no-default-whitelist");
+                    cmd_temp+=("upgrade" "$path_prf");
+                    if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
+
+                    #### execute command
+                    "${cmd_temp[@]}";
+                    unset cmd_temp;
+                    break;
+                    #ots -l "$url" --no-default-whitelist upgrade "$path_prf" && break;
+                done < <(printf "%s\n" "${calendars[@]}" | shuf);
+            else
+                yell "DEBUG:DRY RUN:Not running:\"ots upgrade $path_prf\"";
+            fi;
+        } &
     done;
 
     ## Assemble and execute verify file commands
     for item in "${files_to_verify_pruned[@]}"; do
-        path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
-        path_prf="$(cut -d $'\n' -f2 < <(echo "$item"))";
-        path_src_sesc="${path_src//\"/\\\"}"; # escape path double quotes. See [4].
-        path_prf_sesc="${path_prf//\"/\\\"}"; # escape path double quotes. See [4].
-        if [[ -z "$path_src" ]] || [[ -z "$path_prf" ]]; then
-            yell "ERROR:blank verify item encountered. Skipping:item:$item";
-            continue;
-        fi;
-        vbm "DEBUG:Attempting to verify source file:path_src:$path_src";
-        vbm "DEBUG:    against proof file:          path_prf:$path_prf";
-        if [[ ! $option_dry_run == "true" ]]; then
-            ### Try verify with known calendars in random order
-            while read -r url; do
-                vbm "DEBUG:Verifying with calendar:url:$url";
+        wait_for_jobslot && {
+            path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
+            path_prf="$(cut -d $'\n' -f2 < <(echo "$item"))";
+            if [[ -z "$path_src" ]] || [[ -z "$path_prf" ]]; then
+                yell "ERROR:blank verify item encountered. Skipping:item:$item";
+                continue;
+            fi;
+            vbm "DEBUG:Attempting to verify source file:path_src:$path_src";
+            vbm "DEBUG:    against proof file:          path_prf:$path_prf";
+            if [[ ! $option_dry_run == "true" ]]; then
+                ### Try verify with known calendars in random order
+                while read -r url; do
+                    vbm "DEBUG:Verifying with calendar:url:$url";
+
+                    #### assemble command
+                    local -a cmd_temp;
+                    cmd_temp+=("ots");
+                    if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
+                    cmd_temp+=("-l" "$url" "--no-default-whitelist");
+                    cmd_temp+=("verify" "-f" "$path_src" "$path_prf");
+                    if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
+
+                    #### execute command
+                    "${cmd_temp[@]}";
+                    unset cmd_temp;
+                    break;
+                    #ots -l "$url" --no-default-whitelist verify -f "$path_src" "$path_prf" && break;
+                done < <(printf "%s\n" "${calendars[@]}" | shuf);
+            else
+                yell "DEBUG:DRY RUN:Not running:\"ots verify -f $path_src $path_prf\"";
+            fi;
+        } &
+    done;
+
+    ## Assemble and execute stamp file commands
+    for item in "${files_to_stamp_pruned[@]}"; do
+        wait_for_jobslot && {
+            path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
+            if [[ -z "$path_src" ]]; then
+                yell "ERROR:blank stamp item encountered. Skipping:item:$item";
+                continue;
+            fi;
+            vbm "DEBUG:Attempting to stamp source file:path_src:$path_src";
+            if [[ ! $option_dry_run == "true" ]]; then
 
                 #### assemble command
                 local -a cmd_temp;
                 cmd_temp+=("ots");
                 if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
-                cmd_temp+=("-l" "$url" "--no-default-whitelist");
-                cmd_temp+=("verify" "-f" "$path_src_sesc" "$path_prf_sesc");
+                cmd_temp+=("stamp" "$path_src");
                 if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
 
                 #### execute command
-                wait_for_jobslot && must "${cmd_temp[@]}" &
+                "${cmd_temp[@]}";
                 unset cmd_temp;
-                break;
-                #ots -l "$url" --no-default-whitelist verify -f "$path_src" "$path_prf" && break;
-            done < <(printf "%s\n" "${calendars[@]}" | shuf);
-        else
-            yell "DEBUG:DRY RUN:Not running:\"ots verify -f $path_src $path_prf\"";
-        fi;
-    done;
-    
-    ## Assemble and execute stamp file commands
-    for item in "${files_to_stamp_pruned[@]}"; do
-        path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
-        path_src_sesc="${path_src//\"/\\\"}"; # escape path double quotes. See [4].
-        if [[ -z "$path_src" ]]; then
-            yell "ERROR:blank stamp item encountered. Skipping:item:$item";
-            continue;
-        fi;
-        vbm "DEBUG:Attempting to stamp source file:path_src:$path_src";
-        if [[ ! $option_dry_run == "true" ]]; then
-
-            #### assemble command
-            local -a cmd_temp;
-            cmd_temp+=("ots");
-            if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
-            cmd_temp+=("stamp" "$path_src_sesc");
-            if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
-
-            #### execute command
-            wait_for_jobslot && must "${cmd_temp[@]}" &
-            unset cmd_temp;
-            #ots stamp "$path_src";
-        else
-            yell "DEBUG:DRY RUN:Not running:\"ots stamp $path_src\"";
-        fi;
+                #ots stamp "$path_src";
+            else
+                yell "DEBUG:DRY RUN:Not running:\"ots stamp $path_src\"";
+            fi;
+        } &
     done;
+
+    ## Wait for jobs to finish.
+    wait;
 }; # main program
 
 # Run program