diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index cce541c..aabe8fa 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -39,4 +39,4 @@ jobs: run: "curl --fail --location --silent --show-error https://astral.sh/uv/install.sh | sh" - name: "Run unit tests" - run: "task test" + run: "task test --concurrency 1 --verbose" diff --git a/exports/taskfiles/utils/boost.yaml b/exports/taskfiles/utils/boost.yaml index 33fec0a..fc100cf 100644 --- a/exports/taskfiles/utils/boost.yaml +++ b/exports/taskfiles/utils/boost.yaml @@ -8,38 +8,39 @@ set: ["u", "pipefail"] shopt: ["globstar"] tasks: - # Generates `GENERATE_DIR` by copying `SOURCE_DIR` and then running boost's bootstrap step. + # Runs the Boost generate (bootstrap) step. # - # @param {string} SOURCE_DIR Project source directory. - # @param {string} GENERATE_DIR Directory in which to generate `b2` and the build configuration. - # @param {string} GENERATE_CHECKSUM_FILE Checksum file for `GENERATE_DIR`. # @param {string} INSTALL_PREFIX Path prefix of where the project should be installed. + # @param {string} SOURCE_DIR Project source directory. # @param {string[]} TARGETS Target libraries to build. + # @param {string} [CHECKSUM_FILE={{.SOURCE_DIR}}.md5] Checksum file path for `SOURCE_DIR`. # @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the generate command. generate: internal: true + label: "{{.TASK}}:{{.SOURCE_DIR}}" vars: + CHECKSUM_FILE: >- + {{default (printf "%s.md5" .SOURCE_DIR) .CHECKSUM_FILE}} EXTRA_ARGS: ref: "default (list) .EXTRA_ARGS" + SOURCE_SENTINEL_FILE: "{{.SOURCE_DIR}}/{{.TASK}}.sentinel" requires: - vars: ["SOURCE_DIR", "GENERATE_DIR", "GENERATE_CHECKSUM_FILE", "INSTALL_PREFIX", "TARGETS"] - sources: - - "{{.SOURCE_DIR}}/**/*" + vars: + - "INSTALL_PREFIX" + - "TARGETS" + - "SOURCE_DIR" + sources: ["{{.TASKFILE}}"] generates: - - "{{.GENERATE_CHECKSUM_FILE}}" + - "{{.CHECKSUM_FILE}}" + - "{{.SOURCE_SENTINEL_FILE}}" deps: - task: "checksum:validate" vars: - CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}" - INCLUDE_PATTERNS: - - "{{.GENERATE_DIR}}" + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] cmds: - >- - rm -rf "{{.GENERATE_DIR}}" - - >- - cp -R "{{.SOURCE_DIR}}" "{{.GENERATE_DIR}}" - - >- - pushd "{{.GENERATE_DIR}}"; + pushd "{{.SOURCE_DIR}}"; ./bootstrap.sh --prefix="{{.INSTALL_PREFIX}}" --exec-prefix="{{.INSTALL_PREFIX}}" @@ -48,37 +49,74 @@ tasks: "{{.}}" {{- end}}; popd + - "touch '{{.SOURCE_SENTINEL_FILE}}'" - task: "checksum:compute" vars: - CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}" - INCLUDE_PATTERNS: - - "{{.GENERATE_DIR}}" + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] - # Runs boost's b2 build and install step, and creates a CMake settings file. The caller must have - # previously called `generate` on `SOURCE_DIR` (to produce the `GENERATE_DIR`) for this task to - # succeed. + # Runs Boost's b2 build and install step. + # Fails if the caller has not successfully called `generate` on `SOURCE_DIR`. # - # @param {string} GENERATE_DIR Directory containing boost's source and build files. + # Required parameters # @param {string} BUILD_DIR Directory in which to build boost. # @param {string} INSTALL_PREFIX Path prefix of where the project should be installed. - # @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the build command. + # @param {string} SOURCE_DIR Directory containing boost's source and build files. + # + # Checksum parameters + # @param {string} [BUILD_CHECKSUM_FILE={{.BUILD_DIR}}.md5] Checksum file path for `BUILD_DIR`. + # @param {string} [INSTALL_CHECKSUM_FILE={{.INSTALL_PREFIX}}.md5] Checksum file path for + # `INSTALL_PREFIX` + # @param {string} [SOURCE_CHECKSUM_FILE={{.SOURCE_DIR}}.md5] Checksum file path for `SOURCE_DIR`. + # + # Build command parameters # @param {int} [JOBS] The maximum number of concurrent processes to use when building. If # omitted, the b2 default number is used. Before 1.76.0, the number was 1. Since 1.76.0, the # default is the number of cores. - # @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings - # file should be stored. + # @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the build command. build-and-install: internal: true + label: "{{.TASK}}:{{.BUILD_DIR}}-{{.INSTALL_PREFIX}}" vars: + # Checksum files + BUILD_CHECKSUM_FILE: >- + {{default (printf "%s.md5" .BUILD_DIR) .BUILD_CHECKSUM_FILE}} + INSTALL_CHECKSUM_FILE: >- + {{default (printf "%s.md5" .INSTALL_PREFIX) .INSTALL_CHECKSUM_FILE}} + SOURCE_CHECKSUM_FILE: >- + {{default (printf "%s.md5" .SOURCE_DIR) .SOURCE_CHECKSUM_FILE}} + EXTRA_ARGS: ref: "default (list) .EXTRA_ARGS" - JOBS: >- - {{default "" .JOBS}} + SOURCE_SENTINEL_FILE: "{{.SOURCE_DIR}}/{{.TASK}}.sentinel" requires: - vars: ["GENERATE_DIR", "BUILD_DIR", "INSTALL_PREFIX"] + vars: + - "BUILD_DIR" + - "INSTALL_PREFIX" + - "SOURCE_DIR" + sources: ["{{.TASKFILE}}"] + generates: + - "{{.BUILD_CHECKSUM_FILE}}" + - "{{.INSTALL_CHECKSUM_FILE}}" + - "{{.SOURCE_CHECKSUM_FILE}}" + - "{{.SOURCE_SENTINEL_FILE}}" + deps: + - task: "checksum:validate" + vars: + CHECKSUM_FILE: "{{.BUILD_CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.BUILD_DIR}}"] + - task: "checksum:validate" + vars: + CHECKSUM_FILE: "{{.INSTALL_CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.INSTALL_PREFIX}}"] + - task: "checksum:validate" + vars: + CHECKSUM_FILE: "{{.SOURCE_CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] + FAIL: "true" cmds: - >- - pushd "{{.GENERATE_DIR}}"; + pushd "{{.SOURCE_DIR}}"; ./b2 install --build-dir="{{.BUILD_DIR}}" @@ -89,102 +127,81 @@ tasks: "-j{{.JOBS}}" {{- end}}; popd; - - >- - {{- if .CMAKE_SETTINGS_DIR}} - echo "set(Boost_ROOT - \"{{.INSTALL_PREFIX}}\" - CACHE PATH - \"Package root for Boost.\" - )" >> "{{.CMAKE_SETTINGS_DIR}}/Boost.cmake" - {{- end}} + - "touch '{{.SOURCE_SENTINEL_FILE}}'" + - task: "checksum:compute" + vars: + CHECKSUM_FILE: "{{.BUILD_CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.BUILD_DIR}}"] + - task: "checksum:compute" + vars: + CHECKSUM_FILE: "{{.INSTALL_CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.INSTALL_PREFIX}}"] + - task: "checksum:compute" + vars: + CHECKSUM_FILE: "{{.SOURCE_CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] - # Downloads boost from `URL` and installs boost. + # Downloads Boost from `TAR_URL` and then generates, builds, and installs Boost inside `WORK_DIR`. + # If `CMAKE_SETTINGS_DIR` is set, a settings file will be created in that directory, containing a + # `Boost_ROOT` CMake variable that points to `INSTALL_PREFIX`. # # General parameters - # @param {string} [WORK_DIR={{.ROOT_DIR}}] Base directory in which to store the source, generate, - # build, and install directories. - # @param {string} [SOURCE_DIR={{.WORK_DIR}}/boost-src] Directory in which to extract the tar - # file. - # - # Download parameters - # @param {string} FILE_SHA256 Content hash to verify the downloaded tar file against. - # @param {string} URL + # @param {string} TAR_SHA256 Content hash to verify the downloaded tar file against. + # @param {string} TAR_URL URL of the tar file to download. + # @param {string} WORK_DIR Directory in which to store the source, build, and install directories. + # @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings + # file should be stored. # - # Boost generate parameters - # @param {string} [GENERATE_DIR={{.WORK_DIR}}/boost-generate] Directory in which to generate the - # project build files. - # @param {string} [GENERATE_CHECKSUM_FILE={{.WORK_DIR}}/boost-generate.md5] Checksum file for the - # generate directory. - # @param {string} [INSTALL_PREFIX={{.WORK_DIR}}/boost-install] Path prefix of where the project - # should be installed. - # @param {string[]} [TARGETS] Target libraries to build. + # Boost parameters + # @param {string[]} TARGETS Target libraries to build. + # @param {string[]} [BUILD_AND_INSTALL_ARGS] Any additional arguments to pass to boost's build and + # install command. # @param {string[]} [GENERATE_ARGS] Any additional arguments to pass to the generate command. - # - # Boost build-and-install parameters - # @param {string} [BUILD_DIR={{.WORK_DIR}}/boost-build] Directory in which to build the project. # @param {int} [JOBS] The maximum number of concurrent processes to use when building. If # omitted, the b2 default number is used. Before 1.76.0, the number was 1. Since 1.76.0, the # default is the number of cores. - # @param {string[]} [BUILD_AND_INSTALL_ARGS] Any additional arguments to pass to boost's build - # and install command. - # @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings - # file should be stored. download-and-install: internal: true - label: "{{.TASK}}:{{.URL}}-{{.INSTALL_PREFIX}}" + label: "{{.TASK}}:{{.TAR_URL}}-{{.WORK_DIR}}" vars: - # General parameters - WORK_DIR: >- - {{default .ROOT_DIR .WORK_DIR}} - SOURCE_DIR: >- - {{default (printf "%s/boost-src" .WORK_DIR) .SOURCE_DIR}} - - # Boost generate parameters - GENERATE_DIR: >- - {{default (printf "%s/boost-generate" .WORK_DIR) .GENERATE_DIR}} - GENERATE_CHECKSUM_FILE: >- - {{default (printf "%s/boost-generate.md5" .WORK_DIR) .GENERATE_CHECKSUM_FILE}} - INSTALL_PREFIX: >- - {{default (printf "%s/boost-install" .WORK_DIR) .INSTALL_PREFIX}} - TARGETS: - ref: "default (list) .TARGETS" - GENERATE_ARGS: - ref: "default (list) .GENERATE_ARGS" - - # Boost build-and-install parameters - BUILD_DIR: >- - {{default (printf "%s/boost-build" .WORK_DIR) .BUILD_DIR}} - BUILD_AND_INSTALL_ARGS: - ref: "default (list) .BUILD_AND_INSTALL_ARGS" - JOBS: >- - {{default "" .JOBS}} - CMAKE_SETTINGS_DIR: >- - {{default "" .CMAKE_SETTINGS_DIR}} + # Directory parameters + BUILD_DIR: "{{.WORK_DIR}}/boost-build" + INSTALL_PREFIX: "{{.WORK_DIR}}/boost-install" + SOURCE_DIR: "{{.WORK_DIR}}/boost-src" requires: - vars: ["FILE_SHA256", "URL"] + vars: + - "TAR_SHA256" + - "TAR_URL" + - "TARGETS" + - "WORK_DIR" deps: - task: "remote:download-and-extract-tar" vars: - FILE_SHA256: "{{.FILE_SHA256}}" + FILE_SHA256: "{{.TAR_SHA256}}" OUTPUT_DIR: "{{.SOURCE_DIR}}" - URL: "{{.URL}}" + URL: "{{.TAR_URL}}" cmds: - task: "generate" vars: - SOURCE_DIR: "{{.SOURCE_DIR}}" - GENERATE_DIR: "{{.GENERATE_DIR}}" - GENERATE_CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}" INSTALL_PREFIX: "{{.INSTALL_PREFIX}}" + SOURCE_DIR: "{{.SOURCE_DIR}}" TARGETS: ref: ".TARGETS" EXTRA_ARGS: ref: ".GENERATE_ARGS" - task: "build-and-install" vars: - GENERATE_DIR: "{{.GENERATE_DIR}}" BUILD_DIR: "{{.BUILD_DIR}}" INSTALL_PREFIX: "{{.INSTALL_PREFIX}}" + SOURCE_DIR: "{{.SOURCE_DIR}}" EXTRA_ARGS: ref: ".BUILD_AND_INSTALL_ARGS" JOBS: "{{.JOBS}}" - CMAKE_SETTINGS_DIR: "{{.CMAKE_SETTINGS_DIR}}" + - >- + {{- if .CMAKE_SETTINGS_DIR}} + echo "set(Boost_ROOT + \"{{.INSTALL_PREFIX}}\" + CACHE PATH + \"Package root for Boost.\" + )" > "{{.CMAKE_SETTINGS_DIR}}/Boost.cmake" + {{- end}} diff --git a/exports/taskfiles/utils/checksum.yaml b/exports/taskfiles/utils/checksum.yaml index e9b5ec7..892de6b 100644 --- a/exports/taskfiles/utils/checksum.yaml +++ b/exports/taskfiles/utils/checksum.yaml @@ -13,6 +13,9 @@ tasks: internal: true label: "{{.TASK}}-{{.CHECKSUM_FILE}}" silent: true + vars: + TAR: >- + {{if eq OS "darwin"}}gtar{{else}}tar{{end}} requires: vars: ["CHECKSUM_FILE", "INCLUDE_PATTERNS"] cmds: @@ -25,7 +28,24 @@ tasks: # passed to `tar` as arguments. If the input patterns are passed to `tar` with quotes, the # pattern won't be evaluated and will instead be treated literally. - >- - tar + {{.TAR}} + --create + --file - + --group 0 + --mtime "UTC 1970-01-01" + --numeric-owner + --owner 0 + --sort name + --no-anchored + --wildcards + {{- range .EXCLUDE_PATTERNS}} + --exclude="{{.}}" + {{- end}} + {{- range .INCLUDE_PATTERNS}} + {{.}} + {{- end}} + - >- + {{.TAR}} --create --file - --group 0 @@ -46,20 +66,29 @@ tasks: # Ignore errors so that dependent tasks don't fail ignore_error: true + # Validates the checksum of the given path include patterns matches the checksum in the given + # file. If `FAIL` is set to "true" the task will fail, otherwise the checksum file is deleted. + # # @param {string} CHECKSUM_FILE # @param {string[]} INCLUDE_PATTERNS Path wildcard patterns to validate the checksum for. # @param {string[]} [EXCLUDE_PATTERNS] Path wildcard patterns, relative to any `INCLUDE_PATTERNS`, # to exclude from the checksum. + # @param {string} [FAIL="false"] If set to "true" the task fails. validate: - desc: "Validates the checksum of the given directory matches the checksum in the given file, or - deletes the checksum file otherwise." internal: true label: "{{.TASK}}-{{.CHECKSUM_FILE}}" - silent: true vars: + FAIL: >- + {{- if (eq "true" .FAIL) -}} + true + {{- else}} + false + {{- end}} TMP_CHECKSUM_FILE: "{{.CHECKSUM_FILE}}.tmp" requires: - vars: ["CHECKSUM_FILE", "INCLUDE_PATTERNS"] + vars: + - "CHECKSUM_FILE" + - "INCLUDE_PATTERNS" cmds: - task: "compute" vars: @@ -69,13 +98,17 @@ tasks: ref: "default (list) .EXCLUDE_PATTERNS" CHECKSUM_FILE: "{{.TMP_CHECKSUM_FILE}}" - defer: "rm -f '{{.TMP_CHECKSUM_FILE}}'" - # Check that all paths exist and the checksum matches; otherwise delete the checksum file. - |- ( {{- range .INCLUDE_PATTERNS}} for path in {{.}}; do - test -e "$path" + test -e "$path" || exit 1 done {{- end}} - diff -q "{{.TMP_CHECKSUM_FILE}}" "{{.CHECKSUM_FILE}}" 2> /dev/null - ) || rm -f "{{.CHECKSUM_FILE}}" + cmp -s "{{.TMP_CHECKSUM_FILE}}" "{{.CHECKSUM_FILE}}" + ) \ + {{- if eq "true" .FAIL}} + || false + {{- else}} + || rm -f "{{.CHECKSUM_FILE}}" + {{- end}} diff --git a/taskfiles/boost/CMakeLists.txt b/taskfiles/boost/CMakeLists.txt index fd3e1aa..1480ba4 100644 --- a/taskfiles/boost/CMakeLists.txt +++ b/taskfiles/boost/CMakeLists.txt @@ -30,7 +30,6 @@ find_package( process program_options regex - system url ) if(Boost_FOUND) @@ -49,6 +48,5 @@ target_link_libraries( Boost::process Boost::program_options Boost::regex - Boost::system Boost::url ) diff --git a/taskfiles/boost/test_boost.cpp b/taskfiles/boost/test_boost.cpp index 61d9007..6f0137a 100644 --- a/taskfiles/boost/test_boost.cpp +++ b/taskfiles/boost/test_boost.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include @@ -103,7 +103,7 @@ auto test_process() -> bool { io_context, boost::dll::program_location(), {"--help"}, - boost::process::process_stdio{.in{}, .out{nullptr}, .err{nullptr}} + boost::process::v2::process_stdio{.in{}, .out{nullptr}, .err{nullptr}} }; std::future result = process.async_wait(boost::asio::use_future); io_context.run(); diff --git a/taskfiles/boost/tests.yaml b/taskfiles/boost/tests.yaml index f6544bc..85570c1 100644 --- a/taskfiles/boost/tests.yaml +++ b/taskfiles/boost/tests.yaml @@ -48,9 +48,9 @@ tasks: - task: "utils:boost:download-and-install" vars: WORK_DIR: "{{.G_BOOST_DEPS_DIR}}/boost" - FILE_SHA256: "2128a4c96862b5c0970c1e34d76b1d57e4a1016b80df85ad39667f30b1deba26" - URL: "https://github.com/boostorg/boost/releases/download/boost-1.86.0/\ - boost-1.86.0-b2-nodocs.tar.gz" + TAR_SHA256: "aa25e7b9c227c21abb8a681efd4fe6e54823815ffc12394c9339de998eb503fb" + TAR_URL: "https://github.com/boostorg/boost/releases/download/boost-1.89.0/\ + boost-1.89.0-b2-nodocs.tar.gz" CMAKE_SETTINGS_DIR: "{{.G_BOOST_DEPS_CMAKE_SETTINGS_DIR}}" TARGETS: - "filesystem" @@ -59,7 +59,6 @@ tasks: - "process" - "program_options" - "regex" - - "system" - "url" run-boost-test: diff --git a/taskfiles/checksum/tests.yaml b/taskfiles/checksum/tests.yaml new file mode 100644 index 0000000..f78ae70 --- /dev/null +++ b/taskfiles/checksum/tests.yaml @@ -0,0 +1,169 @@ +version: "3" + +includes: + checksum: + internal: true + taskfile: "../../exports/taskfiles/utils/checksum.yaml" + +tasks: + default: + cmds: + - task: "checksum-test-rerun" + - task: "checksum-test-skip" + - task: "checksum-test-update" + + checksum-test-rerun: + vars: + OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}" + SRC_DIR: "{{.OUTPUT_DIR}}/src" + + CHECKSUM_FILE: "{{.SRC_DIR}}.md5" + CHECKSUM_FILE_REF: "{{.CHECKSUM_FILE}}.ref" + FILE_0: "{{.SRC_DIR}}/0.txt" + FILE_1: "{{.SRC_DIR}}/1.txt" + cmds: + - task: "checksum-test-init" + vars: + OUTPUT_DIR: "{{.OUTPUT_DIR}}" + - task: "create-dir-with-checksum" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + FILE_PATH: "{{.FILE_0}}" + - "mv '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}'" + - task: "create-dir-with-checksum" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + FILE_PATH: "{{.FILE_1}}" + + # Test create-dir-with-checksum ran the second time and created a different checksum. + - "test ! -e '{{.FILE_0}}'" + - "test -e '{{.FILE_1}}'" + - |- + date -r '{{.CHECKSUM_FILE}}' + cat '{{.CHECKSUM_FILE}}' + - |- + date -r '{{.CHECKSUM_FILE_REF}}' + cat '{{.CHECKSUM_FILE_REF}}' + - "! cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}' && true" + - |- + if cmp '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}'; then + exit 1 + else + exit 0 + fi + - |- + if ! cmp '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}'; then + exit 0 + else + exit 1 + fi + + checksum-test-skip: + vars: + OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}" + SRC_DIR: "{{.OUTPUT_DIR}}/src" + + CHECKSUM_FILE: "{{.SRC_DIR}}.md5" + CHECKSUM_MOD_TS: "{{.CHECKSUM_FILE}}-mod-ts.txt" + FILE_0: "{{.SRC_DIR}}/0.txt" + FILE_1: "{{.SRC_DIR}}/1.txt" + cmds: + - task: "checksum-test-init" + vars: + OUTPUT_DIR: "{{.OUTPUT_DIR}}" + - task: "create-dir-with-checksum" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + FILE_PATH: "{{.FILE_0}}" + - "date -r '{{.CHECKSUM_FILE}}' > '{{.CHECKSUM_MOD_TS}}'" + - task: "create-dir-with-checksum" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + FILE_PATH: "{{.FILE_1}}" + + # Test create-dir-with-checksum didn't run the second time and the checksum is unmodified. + - "test -e '{{.FILE_0}}'" + - "test ! -e '{{.FILE_1}}'" + - "cmp -s '{{.CHECKSUM_MOD_TS}}' <(date -r '{{.CHECKSUM_FILE}}')" + + checksum-test-update: + vars: + OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}" + SRC_DIR: "{{.OUTPUT_DIR}}/src" + + CHECKSUM_FILE: "{{.SRC_DIR}}.md5" + CHECKSUM_FILE_REF0: "{{.CHECKSUM_FILE}}.ref0" + CHECKSUM_FILE_REF1: "{{.CHECKSUM_FILE}}.ref1" + FILE_0: "{{.SRC_DIR}}/0.txt" + FILE_1: "{{.SRC_DIR}}/1.txt" + cmds: + - task: "checksum-test-init" + vars: + OUTPUT_DIR: "{{.OUTPUT_DIR}}" + - task: "create-dir-with-checksum" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + FILE_PATH: "{{.FILE_0}}" + - "cp '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF0}}'" + + - "cat '{{.CHECKSUM_FILE}}' > '{{.FILE_0}}'" + - task: "checksum:compute" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.SRC_DIR}}"] + - "cp '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF1}}'" + + - task: "create-dir-with-checksum" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + FILE_PATH: "{{.FILE_1}}" + + # Test create-dir-with-checksum didn't run the second time and the updated checksum is + # different from the original. + - "test -e '{{.FILE_0}}'" + - "test ! -e '{{.FILE_1}}'" + - "cmp -s '{{.FILE_0}}' '{{.CHECKSUM_FILE_REF0}}'" + - "cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF1}}'" + - |- + if cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF0}}'; then + exit 1 + else + exit 0 + fi + - |- + if ! cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF0}}'; then + exit 0 + else + exit 1 + fi + + checksum-test-init: + internal: true + requires: + vars: ["OUTPUT_DIR"] + cmds: + - "rm -rf '{{.OUTPUT_DIR}}'" + - "mkdir -p '{{.OUTPUT_DIR}}'" + + create-dir-with-checksum: + internal: true + vars: + DIR: "{{dir .FILE_PATH}}" + requires: + vars: ["CHECKSUM_FILE", "FILE_PATH"] + sources: ["{{.TASKFILE}}"] + generates: ["{{.CHECKSUM_FILE}}"] + deps: + - task: "checksum:validate" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.DIR}}"] + cmds: + - |- + rm -rf "{{.DIR}}" + mkdir -p "{{.DIR}}" + touch "{{.FILE_PATH}}" + - task: "checksum:compute" + vars: + CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" + INCLUDE_PATTERNS: ["{{.DIR}}"] diff --git a/taskfiles/tests.yaml b/taskfiles/tests.yaml index 7c99a64..3d2efaf 100644 --- a/taskfiles/tests.yaml +++ b/taskfiles/tests.yaml @@ -2,6 +2,7 @@ version: "3" includes: boost: "boost/tests.yaml" + checksum: "checksum/tests.yaml" remote: "remote/tests.yaml" ystdlib-py: "ystdlib-py/tests.yaml" @@ -9,7 +10,8 @@ tasks: all: internal: true cmds: - - task: "boost" + # - task: "boost" + - task: "checksum" - task: "remote" - task: "ystdlib-py"