diff --git a/action.yml b/action.yml index 4cc3c3c..ab905fa 100644 --- a/action.yml +++ b/action.yml @@ -21,11 +21,14 @@ inputs: required: false default: "update_flake_lock_action" path-to-flake-dir: - description: "The path of the directory containing `flake.nix` file within your repository. Useful when `flake.nix` cannot reside at the root of your repository." + description: | + The path of the directory containing `flake.nix` file within your repository. + Useful when `flake.nix` cannot reside at the root of your repository. required: false flake-dirs: description: | - A space-separated list of directories containing `flake.nix` files within your repository. Useful when you have multiple flakes in your repository. + A space-separated list of directories containing `flake.nix` files within your repository. + Useful when you have multiple flakes in your repository. required: false default: "" pr-title: diff --git a/dist/index.js b/dist/index.js index 621bc2c..e31754f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -94798,11 +94798,12 @@ var UpdateFlakeLockAction = class extends DetSysAction { await this.updateFlake(directory); } } else { - await this.updateFlake(this.pathToFlakeDir); + const flakeDir = this.pathToFlakeDir ?? "."; + await this.updateFlake(flakeDir); } } - async updateFlake(directory) { - core.debug(`Running flake lock update in directory ${directory}`); + async updateFlake(flakeDir) { + core.debug(`Running flake lock update in directory ${flakeDir}`); const nixCommandArgs = makeNixCommandArgs( this.nixOptions, this.flakeInputs, @@ -94810,7 +94811,7 @@ var UpdateFlakeLockAction = class extends DetSysAction { ); core.debug( JSON.stringify({ - directory, + directory: flakeDir, options: this.nixOptions, inputs: this.flakeInputs, message: this.commitMessage, @@ -94818,7 +94819,7 @@ var UpdateFlakeLockAction = class extends DetSysAction { }) ); const execOptions = { - cwd: directory + cwd: flakeDir }; const exitCode = await exec.exec("nix", nixCommandArgs, execOptions); if (exitCode !== 0) { @@ -94826,11 +94827,11 @@ var UpdateFlakeLockAction = class extends DetSysAction { exitCode }); core.setFailed( - `non-zero exit code of ${exitCode} detected while updating directory ${directory}` + `non-zero exit code of ${exitCode} detected while updating directory ${flakeDir}` ); } else { core.info( - `flake.lock file in ${directory} was successfully updated` + `flake.lock file in ${flakeDir} was successfully updated` ); } } diff --git a/dist/index.js.map b/dist/index.js.map index 10d75b7..a200775 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\";\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 private flakeDirs: 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 this.flakeDirs = inputs.getArrayOfStrings(\"flake-dirs\", \"space\");\n\n if (\n this.flakeDirs !== null &&\n this.flakeDirs.length > 0 &&\n this.pathToFlakeDir !== \"\"\n ) {\n // TODO: improve this error message\n throw new Error(\"Both path-to-flake-dir and flake-dirs is defined\");\n }\n }\n\n async main(): Promise {\n await this.update();\n }\n\n // No post phase\n async post(): Promise {}\n\n async update(): Promise {\n if (this.flakeDirs !== null && this.flakeDirs.length > 0) {\n actionsCore.debug(\n `Running flake lock update in multiple directories: ${this.flakeDirs}`,\n );\n\n for (const directory of this.flakeDirs) {\n await this.updateFlake(directory);\n }\n } else {\n await this.updateFlake(this.pathToFlakeDir!);\n }\n }\n\n private async updateFlake(directory: string): Promise {\n actionsCore.debug(`Running flake lock update in directory ${directory}`);\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,\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: directory,\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 ${directory}`,\n );\n } else {\n actionsCore.info(\n `flake.lock file in ${directory} was successfully updated`,\n );\n }\n }\n}\n\nfunction main(): void {\n new UpdateFlakeLockAction().execute();\n}\n\nmain();\n"],"mappings":";AACO,SAAS,mBACd,YACA,aACA,eACU;AACV,QAAM,kBAAkB,YAAY,QAAQ,CAAC,UAAU;AAAA,IACrD;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,sBAAsB,gBAAgB,WAAW,IAAI,WAAW;AAEtE,SAAO,WACJ,OAAO,CAAC,SAAS,mBAAmB,CAAC,EACrC,OAAO,eAAe,EACtB,OAAO,CAAC,sBAAsB,6BAA6B,aAAa,CAAC;AAC9E;;;AChBA,YAAY,iBAAiB;AAC7B,YAAY,iBAAiB;AAC7B,SAAS,cAAc,cAAc;AAErC,IAAM,0BAA0B;AAEhC,IAAM,wBAAN,cAAoC,aAAa;AAAA,EAO/C,cAAc;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAED,SAAK,gBAAgB,OAAO,UAAU,YAAY;AAClD,SAAK,cAAc,OAAO,kBAAkB,UAAU,OAAO;AAC7D,SAAK,aAAa,OAAO,kBAAkB,eAAe,OAAO;AACjE,SAAK,iBAAiB,OAAO,gBAAgB,mBAAmB;AAChE,SAAK,YAAY,OAAO,kBAAkB,cAAc,OAAO;AAE/D,QACE,KAAK,cAAc,QACnB,KAAK,UAAU,SAAS,KACxB,KAAK,mBAAmB,IACxB;AAEA,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,OAAO;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM,OAAsB;AAAA,EAAC;AAAA,EAE7B,MAAM,SAAwB;AAC5B,QAAI,KAAK,cAAc,QAAQ,KAAK,UAAU,SAAS,GAAG;AACxD,MAAY;AAAA,QACV,sDAAsD,KAAK,SAAS;AAAA,MACtE;AAEA,iBAAW,aAAa,KAAK,WAAW;AACtC,cAAM,KAAK,YAAY,SAAS;AAAA,MAClC;AAAA,IACF,OAAO;AACL,YAAM,KAAK,YAAY,KAAK,cAAe;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,WAAkC;AAC1D,IAAY,kBAAM,0CAA0C,SAAS,EAAE;AAOvE,UAAM,iBAA2B;AAAA,MAC/B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,IAAY;AAAA,MACV,KAAK,UAAU;AAAA,QACb;AAAA,QACA,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,cAAuC;AAAA,MAC3C,KAAK;AAAA,IACP;AAEA,UAAM,WAAW,MAAkB,iBAAK,OAAO,gBAAgB,WAAW;AAE1E,QAAI,aAAa,GAAG;AAClB,WAAK,YAAY,yBAAyB;AAAA,QACxC;AAAA,MACF,CAAC;AACD,MAAY;AAAA,QACV,yBAAyB,QAAQ,sCAAsC,SAAS;AAAA,MAClF;AAAA,IACF,OAAO;AACL,MAAY;AAAA,QACV,sBAAsB,SAAS;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,OAAa;AACpB,MAAI,sBAAsB,EAAE,QAAQ;AACtC;AAEA,KAAK;","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\";\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 private flakeDirs: 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 this.flakeDirs = inputs.getArrayOfStrings(\"flake-dirs\", \"space\");\n\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 !== \"\"\n ) {\n // TODO: improve this error message\n throw new Error(\"Both path-to-flake-dir and flake-dirs is defined\");\n }\n }\n\n async main(): Promise {\n await this.update();\n }\n\n // No post phase\n async post(): Promise {}\n\n async update(): Promise {\n if (this.flakeDirs !== null && this.flakeDirs.length > 0) {\n actionsCore.debug(\n `Running flake lock update in multiple directories: ${this.flakeDirs}`,\n );\n\n for (const directory of this.flakeDirs) {\n await this.updateFlake(directory);\n }\n } else {\n // Set directory to root if not specified\n const flakeDir = this.pathToFlakeDir ?? \".\";\n await this.updateFlake(flakeDir);\n }\n }\n\n private async updateFlake(flakeDir: string): Promise {\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\nfunction main(): void {\n new UpdateFlakeLockAction().execute();\n}\n\nmain();\n"],"mappings":";AACO,SAAS,mBACd,YACA,aACA,eACU;AACV,QAAM,kBAAkB,YAAY,QAAQ,CAAC,UAAU;AAAA,IACrD;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,sBAAsB,gBAAgB,WAAW,IAAI,WAAW;AAEtE,SAAO,WACJ,OAAO,CAAC,SAAS,mBAAmB,CAAC,EACrC,OAAO,eAAe,EACtB,OAAO,CAAC,sBAAsB,6BAA6B,aAAa,CAAC;AAC9E;;;AChBA,YAAY,iBAAiB;AAC7B,YAAY,iBAAiB;AAC7B,SAAS,cAAc,cAAc;AAErC,IAAM,0BAA0B;AAEhC,IAAM,wBAAN,cAAoC,aAAa;AAAA,EAO/C,cAAc;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAED,SAAK,gBAAgB,OAAO,UAAU,YAAY;AAClD,SAAK,cAAc,OAAO,kBAAkB,UAAU,OAAO;AAC7D,SAAK,aAAa,OAAO,kBAAkB,eAAe,OAAO;AACjE,SAAK,iBAAiB,OAAO,gBAAgB,mBAAmB;AAChE,SAAK,YAAY,OAAO,kBAAkB,cAAc,OAAO;AAG/D,QACE,KAAK,cAAc,QACnB,KAAK,UAAU,SAAS,KACxB,KAAK,mBAAmB,IACxB;AAEA,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,OAAO;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM,OAAsB;AAAA,EAAC;AAAA,EAE7B,MAAM,SAAwB;AAC5B,QAAI,KAAK,cAAc,QAAQ,KAAK,UAAU,SAAS,GAAG;AACxD,MAAY;AAAA,QACV,sDAAsD,KAAK,SAAS;AAAA,MACtE;AAEA,iBAAW,aAAa,KAAK,WAAW;AACtC,cAAM,KAAK,YAAY,SAAS;AAAA,MAClC;AAAA,IACF,OAAO;AAEL,YAAM,WAAW,KAAK,kBAAkB;AACxC,YAAM,KAAK,YAAY,QAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,UAAiC;AACzD,IAAY,kBAAM,0CAA0C,QAAQ,EAAE;AAOtE,UAAM,iBAA2B;AAAA,MAC/B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,IAAY;AAAA,MACV,KAAK,UAAU;AAAA,QACb,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,cAAuC;AAAA,MAC3C,KAAK;AAAA,IACP;AAEA,UAAM,WAAW,MAAkB,iBAAK,OAAO,gBAAgB,WAAW;AAE1E,QAAI,aAAa,GAAG;AAClB,WAAK,YAAY,yBAAyB;AAAA,QACxC;AAAA,MACF,CAAC;AACD,MAAY;AAAA,QACV,yBAAyB,QAAQ,sCAAsC,QAAQ;AAAA,MACjF;AAAA,IACF,OAAO;AACL,MAAY;AAAA,QACV,sBAAsB,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,OAAa;AACpB,MAAI,sBAAsB,EAAE,QAAQ;AACtC;AAEA,KAAK;","names":[]} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 665eca9..e1b2b44 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,6 +25,7 @@ class UpdateFlakeLockAction extends DetSysAction { this.pathToFlakeDir = inputs.getStringOrNull("path-to-flake-dir"); this.flakeDirs = inputs.getArrayOfStrings("flake-dirs", "space"); + // 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 && @@ -52,12 +53,14 @@ class UpdateFlakeLockAction extends DetSysAction { await this.updateFlake(directory); } } else { - await this.updateFlake(this.pathToFlakeDir!); + // Set directory to root if not specified + const flakeDir = this.pathToFlakeDir ?? "."; + await this.updateFlake(flakeDir); } } - private async updateFlake(directory: string): Promise { - actionsCore.debug(`Running flake lock update in directory ${directory}`); + private async updateFlake(flakeDir: string): Promise { + actionsCore.debug(`Running flake lock update in directory ${flakeDir}`); // Nix command of this form: // nix ${maybe nix options} flake ${"update" or "lock"} ${maybe --update-input flags} --commit-lock-file --commit-lockfile-summary ${commit message} @@ -72,7 +75,7 @@ class UpdateFlakeLockAction extends DetSysAction { actionsCore.debug( JSON.stringify({ - directory, + directory: flakeDir, options: this.nixOptions, inputs: this.flakeInputs, message: this.commitMessage, @@ -81,7 +84,7 @@ class UpdateFlakeLockAction extends DetSysAction { ); const execOptions: actionsExec.ExecOptions = { - cwd: directory, + cwd: flakeDir, }; const exitCode = await actionsExec.exec("nix", nixCommandArgs, execOptions); @@ -91,11 +94,11 @@ class UpdateFlakeLockAction extends DetSysAction { exitCode, }); actionsCore.setFailed( - `non-zero exit code of ${exitCode} detected while updating directory ${directory}`, + `non-zero exit code of ${exitCode} detected while updating directory ${flakeDir}`, ); } else { actionsCore.info( - `flake.lock file in ${directory} was successfully updated`, + `flake.lock file in ${flakeDir} was successfully updated`, ); } }