diff --git a/README.md b/README.md index 73c1470..66f4c7b 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ jobs: path-to-flake-dir: 'nix/' # in this example our flake doesn't sit at the root of the repository, it sits under 'nix/flake.nix' ``` -You can also run the update operation in multiple directories, provide that each directory is a valid flake: +You can also run the update operation in multiple directories, provided that each directory is a valid flake: ```yaml - name: Update flake.lock @@ -150,6 +150,11 @@ You can also run the update operation in multiple directories, provide that each flake3 ``` +> **Warning**: If you choose multiple directories, `update-flake-lock` can only update all flake inputs, +> meaning that you can't set the `inputs` parameter. This is due to limitations in input handling in +> GitHub Actions, which only allows for strings, numbers, Booleans, and arrays but not objects, which +> would be the much preferred data type for expressing per-directory inputs. + ## Example using a different Git user If you want to change the author and / or committer of the flake.lock update commit, you can tweak the `git-{author,committer}-{name,email}` options: diff --git a/dist/index.js b/dist/index.js index f72d4e5..ae03eff 100644 --- a/dist/index.js +++ b/dist/index.js @@ -94848,7 +94848,7 @@ var UpdateFlakeLockAction = class extends DetSysAction { validateInputs() { if (this.flakeDirs !== null && this.flakeDirs.length > 0 && this.pathToFlakeDir !== null && this.pathToFlakeDir !== "") { throw new Error( - "Both `path-to-flake-dir` and `flake-dirs` are set, whereas only one can be set" + "Both `path-to-flake-dir` and `flake-dirs` are set, whereas only one can be" ); } if (this.flakeDirs !== null && this.flakeDirs.length === 0) { @@ -94856,6 +94856,11 @@ var UpdateFlakeLockAction = class extends DetSysAction { "The `flake-dirs` input is set to an empty array; it must contain at least one directory" ); } + if (this.flakeDirs !== null && this.flakeDirs.length > 0 && this.flakeInputs.length > 0) { + throw new Error( + `You've set both \`flake-dirs\` and \`inputs\` but you can only set one` + ); + } } ensureDirectoryExists(flakeDir) { core.debug(`Checking that flake directory \`${flakeDir}\` exists`); diff --git a/dist/index.js.map b/dist/index.js.map index 46dbd6c..ae8d4d9 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/nix.ts","../src/index.ts"],"sourcesContent":["// Build the Nix args out of inputs from the Actions environment\nexport function makeNixCommandArgs(\n nixOptions: string[],\n flakeInputs: string[],\n commitMessage: string,\n): string[] {\n const flakeInputFlags = flakeInputs.flatMap((input) => [\n \"--update-input\",\n input,\n ]);\n\n const updateLockMechanism = flakeInputFlags.length === 0 ? \"update\" : \"lock\";\n\n return nixOptions\n .concat([\"flake\", updateLockMechanism])\n .concat(flakeInputFlags)\n .concat([\"--commit-lock-file\", \"--commit-lockfile-summary\", commitMessage]);\n}\n","import { makeNixCommandArgs } from \"./nix.js\";\nimport * as actionsCore from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\nimport { DetSysAction, inputs } from \"detsys-ts\";\nimport * as fs from \"fs\";\n\nconst EVENT_EXECUTION_FAILURE = \"execution_failure\";\n\nclass UpdateFlakeLockAction extends DetSysAction {\n private commitMessage: string;\n private nixOptions: string[];\n private flakeInputs: string[];\n private pathToFlakeDir: string | null;\n\n constructor() {\n super({\n name: \"update-flake-lock\",\n fetchStyle: \"universal\",\n requireNix: \"fail\",\n });\n\n this.commitMessage = inputs.getString(\"commit-msg\");\n this.flakeInputs = inputs.getArrayOfStrings(\"inputs\", \"space\");\n this.nixOptions = inputs.getArrayOfStrings(\"nix-options\", \"space\");\n this.pathToFlakeDir = inputs.getStringOrNull(\"path-to-flake-dir\");\n\n this.validateInputs();\n }\n\n async main(): Promise {\n await this.updateFlakeLock();\n }\n\n // No post phase\n async post(): Promise {}\n\n private get flakeDirs(): string[] | null {\n const flakeDirs = inputs.getStringOrNull(\"flake-dirs\");\n if (flakeDirs !== null) {\n return flakeDirs.trim().split(\" \");\n } else {\n return null;\n }\n }\n\n async updateFlakeLock(): Promise {\n if (this.flakeDirs !== null && this.flakeDirs.length > 0) {\n actionsCore.debug(\n `Running flake lock update in multiple directories: ${this.flakeDirs.map((dir) => `\\`${dir}\\``).join(\" \")}`,\n );\n\n for (const directory of this.flakeDirs) {\n await this.updateFlakeInDirectory(directory);\n }\n } else {\n // Set directory to root if not specified\n const flakeDir = this.pathToFlakeDir ?? \".\";\n await this.updateFlakeInDirectory(flakeDir);\n }\n }\n\n private async updateFlakeInDirectory(flakeDir: string): Promise {\n this.ensureDirectoryExists(flakeDir);\n this.ensureDirectoryIsFlake(flakeDir);\n\n actionsCore.debug(`Running flake lock update in directory \\`${flakeDir}\\``);\n\n // Nix command of this form:\n // nix ${maybe nix options} flake ${\"update\" or \"lock\"} ${maybe --update-input flags} --commit-lock-file --commit-lockfile-summary ${commit message}\n // Example commands:\n // nix --extra-substituters https://example.com flake lock --update-input nixpkgs --commit-lock-file --commit-lockfile-summary \"updated flake.lock\"\n // nix flake update --commit-lock-file --commit-lockfile-summary \"updated flake.lock\"\n const nixCommandArgs: string[] = makeNixCommandArgs(\n this.nixOptions,\n this.flakeInputs,\n this.commitMessage,\n );\n\n actionsCore.debug(\n JSON.stringify({\n directory: flakeDir,\n options: this.nixOptions,\n inputs: this.flakeInputs,\n message: this.commitMessage,\n args: nixCommandArgs,\n }),\n );\n\n const execOptions: actionsExec.ExecOptions = {\n cwd: flakeDir,\n };\n\n const exitCode = await actionsExec.exec(\"nix\", nixCommandArgs, execOptions);\n\n if (exitCode !== 0) {\n this.recordEvent(EVENT_EXECUTION_FAILURE, {\n exitCode,\n });\n actionsCore.setFailed(\n `non-zero exit code of ${exitCode} detected while updating directory \\`${flakeDir}\\``,\n );\n } else {\n actionsCore.info(\n `flake.lock file in \\`${flakeDir}\\` was successfully updated`,\n );\n }\n }\n\n private validateInputs(): void {\n // Ensure that either path-to-flake-dir or flake-dirs is set to a meaningful value but not both\n if (\n this.flakeDirs !== null &&\n this.flakeDirs.length > 0 &&\n this.pathToFlakeDir !== null &&\n this.pathToFlakeDir !== \"\"\n ) {\n // TODO: improve this error message\n throw new Error(\n \"Both `path-to-flake-dir` and `flake-dirs` are set, whereas only one can be set\",\n );\n }\n\n // Ensure that flake-dirs isn't an empty array if set\n if (this.flakeDirs !== null && this.flakeDirs.length === 0) {\n throw new Error(\n \"The `flake-dirs` input is set to an empty array; it must contain at least one directory\",\n );\n }\n }\n\n private ensureDirectoryExists(flakeDir: string): void {\n actionsCore.debug(`Checking that flake directory \\`${flakeDir}\\` exists`);\n\n // Ensure the directory exists\n fs.access(flakeDir, fs.constants.F_OK, (err) => {\n if (err !== null) {\n throw new Error(`Directory \\`${flakeDir}\\` doesn't exist`);\n } else {\n actionsCore.debug(`Flake directory \\`${flakeDir}\\` exists`);\n }\n });\n }\n\n private ensureDirectoryIsFlake(flakeDir: string): void {\n const flakeDotNix = `${flakeDir}/flake.nix`;\n if (!fs.existsSync(flakeDotNix)) {\n throw new Error(\n `Directory \\`${flakeDir}\\` is not a valid flake as it doesn't contain a \\`flake.nix\\``,\n );\n } else {\n actionsCore.debug(`Directory \\`${flakeDir}\\` is a valid flake`);\n }\n }\n}\n\nfunction main(): void {\n new UpdateFlakeLockAction().execute();\n}\n\nmain();\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../src/nix.ts","../src/index.ts"],"sourcesContent":["// Build the Nix args out of inputs from the Actions environment\nexport function makeNixCommandArgs(\n nixOptions: string[],\n flakeInputs: string[],\n commitMessage: string,\n): string[] {\n const flakeInputFlags = flakeInputs.flatMap((input) => [\n \"--update-input\",\n input,\n ]);\n\n const updateLockMechanism = flakeInputFlags.length === 0 ? \"update\" : \"lock\";\n\n return nixOptions\n .concat([\"flake\", updateLockMechanism])\n .concat(flakeInputFlags)\n .concat([\"--commit-lock-file\", \"--commit-lockfile-summary\", commitMessage]);\n}\n","import { makeNixCommandArgs } from \"./nix.js\";\nimport * as actionsCore from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\nimport { DetSysAction, inputs } from \"detsys-ts\";\nimport * as fs from \"fs\";\n\nconst EVENT_EXECUTION_FAILURE = \"execution_failure\";\n\nclass UpdateFlakeLockAction extends DetSysAction {\n private commitMessage: string;\n private nixOptions: string[];\n private flakeInputs: string[];\n private pathToFlakeDir: string | null;\n\n constructor() {\n super({\n name: \"update-flake-lock\",\n fetchStyle: \"universal\",\n requireNix: \"fail\",\n });\n\n this.commitMessage = inputs.getString(\"commit-msg\");\n this.flakeInputs = inputs.getArrayOfStrings(\"inputs\", \"space\");\n this.nixOptions = inputs.getArrayOfStrings(\"nix-options\", \"space\");\n this.pathToFlakeDir = inputs.getStringOrNull(\"path-to-flake-dir\");\n\n this.validateInputs();\n }\n\n async main(): Promise {\n await this.updateFlakeLock();\n }\n\n // No post phase\n async post(): Promise {}\n\n private get flakeDirs(): string[] | null {\n const flakeDirs = inputs.getStringOrNull(\"flake-dirs\");\n if (flakeDirs !== null) {\n return flakeDirs.trim().split(\" \");\n } else {\n return null;\n }\n }\n\n async updateFlakeLock(): Promise {\n if (this.flakeDirs !== null && this.flakeDirs.length > 0) {\n actionsCore.debug(\n `Running flake lock update in multiple directories: ${this.flakeDirs.map((dir) => `\\`${dir}\\``).join(\" \")}`,\n );\n\n for (const directory of this.flakeDirs) {\n await this.updateFlakeInDirectory(directory);\n }\n } else {\n // Set directory to root if not specified\n const flakeDir = this.pathToFlakeDir ?? \".\";\n await this.updateFlakeInDirectory(flakeDir);\n }\n }\n\n private async updateFlakeInDirectory(flakeDir: string): Promise {\n this.ensureDirectoryExists(flakeDir);\n this.ensureDirectoryIsFlake(flakeDir);\n\n actionsCore.debug(`Running flake lock update in directory \\`${flakeDir}\\``);\n\n // Nix command of this form:\n // nix ${maybe nix options} flake ${\"update\" or \"lock\"} ${maybe --update-input flags} --commit-lock-file --commit-lockfile-summary ${commit message}\n // Example commands:\n // nix --extra-substituters https://example.com flake lock --update-input nixpkgs --commit-lock-file --commit-lockfile-summary \"updated flake.lock\"\n // nix flake update --commit-lock-file --commit-lockfile-summary \"updated flake.lock\"\n const nixCommandArgs: string[] = makeNixCommandArgs(\n this.nixOptions,\n this.flakeInputs,\n this.commitMessage,\n );\n\n actionsCore.debug(\n JSON.stringify({\n directory: flakeDir,\n options: this.nixOptions,\n inputs: this.flakeInputs,\n message: this.commitMessage,\n args: nixCommandArgs,\n }),\n );\n\n const execOptions: actionsExec.ExecOptions = {\n cwd: flakeDir,\n };\n\n const exitCode = await actionsExec.exec(\"nix\", nixCommandArgs, execOptions);\n\n if (exitCode !== 0) {\n this.recordEvent(EVENT_EXECUTION_FAILURE, {\n exitCode,\n });\n actionsCore.setFailed(\n `non-zero exit code of ${exitCode} detected while updating directory \\`${flakeDir}\\``,\n );\n } else {\n actionsCore.info(\n `flake.lock file in \\`${flakeDir}\\` was successfully updated`,\n );\n }\n }\n\n private validateInputs(): void {\n // Ensure that either `path-to-flake-dir` or `flake-dirs` is set to a meaningful value but not both\n if (\n this.flakeDirs !== null &&\n this.flakeDirs.length > 0 &&\n this.pathToFlakeDir !== null &&\n this.pathToFlakeDir !== \"\"\n ) {\n throw new Error(\n \"Both `path-to-flake-dir` and `flake-dirs` are set, whereas only one can be\",\n );\n }\n\n // Ensure that `flake-dirs` isn't an empty array if set\n if (this.flakeDirs !== null && this.flakeDirs.length === 0) {\n throw new Error(\n \"The `flake-dirs` input is set to an empty array; it must contain at least one directory\",\n );\n }\n\n // Ensure that both `flake-dirs` and `inputs` aren't set at the same time\n if (\n this.flakeDirs !== null &&\n this.flakeDirs.length > 0 &&\n this.flakeInputs.length > 0\n ) {\n throw new Error(\n `You've set both \\`flake-dirs\\` and \\`inputs\\` but you can only set one`,\n );\n }\n }\n\n private ensureDirectoryExists(flakeDir: string): void {\n actionsCore.debug(`Checking that flake directory \\`${flakeDir}\\` exists`);\n\n // Ensure the directory exists\n fs.access(flakeDir, fs.constants.F_OK, (err) => {\n if (err !== null) {\n throw new Error(`Directory \\`${flakeDir}\\` doesn't exist`);\n } else {\n actionsCore.debug(`Flake directory \\`${flakeDir}\\` exists`);\n }\n });\n }\n\n private ensureDirectoryIsFlake(flakeDir: string): void {\n const flakeDotNix = `${flakeDir}/flake.nix`;\n if (!fs.existsSync(flakeDotNix)) {\n throw new Error(\n `Directory \\`${flakeDir}\\` is not a valid flake as it doesn't contain a \\`flake.nix\\``,\n );\n } else {\n actionsCore.debug(`Directory \\`${flakeDir}\\` is a valid flake`);\n }\n }\n}\n\nfunction main(): void {\n new UpdateFlakeLockAction().execute();\n}\n\nmain();\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index da1674e..deef502 100644 --- a/src/index.ts +++ b/src/index.ts @@ -107,25 +107,35 @@ class UpdateFlakeLockAction extends DetSysAction { } private validateInputs(): void { - // Ensure that either path-to-flake-dir or flake-dirs is set to a meaningful value but not both + // Ensure that either `path-to-flake-dir` or `flake-dirs` is set to a meaningful value but not both if ( this.flakeDirs !== null && this.flakeDirs.length > 0 && this.pathToFlakeDir !== null && this.pathToFlakeDir !== "" ) { - // TODO: improve this error message throw new Error( - "Both `path-to-flake-dir` and `flake-dirs` are set, whereas only one can be set", + "Both `path-to-flake-dir` and `flake-dirs` are set, whereas only one can be", ); } - // Ensure that flake-dirs isn't an empty array if set + // Ensure that `flake-dirs` isn't an empty array if set if (this.flakeDirs !== null && this.flakeDirs.length === 0) { throw new Error( "The `flake-dirs` input is set to an empty array; it must contain at least one directory", ); } + + // Ensure that both `flake-dirs` and `inputs` aren't set at the same time + if ( + this.flakeDirs !== null && + this.flakeDirs.length > 0 && + this.flakeInputs.length > 0 + ) { + throw new Error( + `You've set both \`flake-dirs\` and \`inputs\` but you can only set one`, + ); + } } private ensureDirectoryExists(flakeDir: string): void {