@altano/repository-tools 2.0.4 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,14 +25,43 @@ const environment = {
25
25
  svnadmin: {},
26
26
  svnrdump: {}
27
27
  };
28
+ /**
29
+ * Inherited environment variables to drop, per command. The other version
30
+ * control systems have no equivalent of GIT_DIR: they're told which repository
31
+ * to use with a flag, never with the environment.
32
+ */
33
+ const removedEnvironment = {
34
+ git: [
35
+ "GIT_DIR",
36
+ "GIT_WORK_TREE",
37
+ "GIT_COMMON_DIR",
38
+ "GIT_INDEX_FILE",
39
+ "GIT_INDEX_VERSION",
40
+ "GIT_OBJECT_DIRECTORY",
41
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
42
+ "GIT_NAMESPACE",
43
+ "GIT_PREFIX",
44
+ "GIT_QUARANTINE_PATH"
45
+ ],
46
+ hg: [],
47
+ sl: [],
48
+ svn: [],
49
+ svnadmin: [],
50
+ svnrdump: []
51
+ };
52
+ function getEnvironment(command) {
53
+ const result = {
54
+ ...process.env,
55
+ ...environment[command]
56
+ };
57
+ for (const variable of removedEnvironment[command]) delete result[variable];
58
+ return result;
59
+ }
28
60
  async function repositoryExec(cwd, command, args) {
29
61
  return execFileAsync(command, args, {
30
62
  cwd,
31
63
  encoding: "utf8",
32
- env: {
33
- ...process.env,
34
- ...environment[command]
35
- }
64
+ env: getEnvironment(command)
36
65
  }).then(({ stdout, stderr }) => {
37
66
  return stderr ? Promise.reject(new Error(stderr.trim())) : stdout.trim();
38
67
  });
@@ -41,10 +70,7 @@ function repositoryExecSync(cwd, command, args) {
41
70
  return execFileSync(command, args, {
42
71
  cwd,
43
72
  encoding: "utf8",
44
- env: {
45
- ...process.env,
46
- ...environment[command]
47
- }
73
+ env: getEnvironment(command)
48
74
  }).trim();
49
75
  }
50
76
  const createExecForDirectory = (cwd) => repositoryExec.bind(null, cwd);
@@ -1 +1 @@
1
- {"version":3,"file":"repositoryCommand.js","names":[],"sources":["../src/repositoryCommand.ts"],"sourcesContent":["import { execFileAsync, execFileSync } from \"./exec.js\";\nimport {} from \"child_process\";\n\ntype RepositoryCommand = \"git\" | \"hg\" | \"sl\" | \"svn\" | \"svnadmin\" | \"svnrdump\";\n\nconst environment = {\n git: {\n // non-interactive\n GIT_TERMINAL_PROMPT: \"0\",\n // don't use global config\n GIT_CONFIG_GLOBAL: \"/dev/null\",\n GIT_CONFIG_SYSTEM: \"/dev/null\",\n // user config\n GIT_COMMITTER_NAME: \"alan\",\n GIT_COMMITTER_EMAIL: \"alan@example.com\",\n GIT_AUTHOR_NAME: \"alan\",\n GIT_AUTHOR_EMAIL: \"alan@example.com\",\n },\n hg: {\n // don't use global config\n HGRCPATH: \"/dev/null\",\n // don't use global config\n HGUSER: \"alan\",\n EMAIL: \"alan@example.com\",\n },\n sl: {\n // don't use global config\n HGRCPATH: \"/dev/null\",\n // don't use global config\n HGUSER: \"alan\",\n EMAIL: \"alan@example.com\",\n },\n svn: {},\n svnadmin: {},\n svnrdump: {},\n} as const satisfies Record<RepositoryCommand, NodeJS.ProcessEnv>;\n\nexport async function repositoryExec(\n cwd: string,\n command: RepositoryCommand,\n args: readonly string[],\n): Promise<string> {\n // const msg = `Executing command: ${command} ${args.join(\" \")}`;\n // console.time(msg);\n return execFileAsync(command, args, {\n cwd: cwd,\n encoding: \"utf8\",\n env: {\n ...process.env,\n ...environment[command],\n },\n }).then(({ stdout, stderr }) => {\n // console.timeEnd(msg);\n return stderr ? Promise.reject(new Error(stderr.trim())) : stdout.trim();\n });\n}\n\nexport function repositoryExecSync(\n cwd: string,\n command: RepositoryCommand,\n args: readonly string[],\n): string {\n // const msg = `Executing command: ${command} ${args.join(\" \")}`;\n // console.time(msg);\n const result = execFileSync(command, args, {\n cwd: cwd,\n encoding: \"utf8\",\n env: {\n ...process.env,\n ...environment[command],\n },\n }).trim();\n // console.timeEnd(msg);\n return result;\n}\n\nexport const createExecForDirectory = (\n cwd: string,\n): ((command: RepositoryCommand, args: readonly string[]) => Promise<string>) =>\n repositoryExec.bind(null, cwd);\n\n// Not being used.\n// export const createExecSyncForDirectory = (\n// cwd: string,\n// ): ((command: RepositoryCommand, args: readonly string[]) => string) =>\n// repositoryExecSync.bind(null, cwd);\n"],"mappings":";;;AAKA,MAAM,cAAc;CAClB,KAAK;EAEH,qBAAqB;EAErB,mBAAmB;EACnB,mBAAmB;EAEnB,oBAAoB;EACpB,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;CACpB;CACA,IAAI;EAEF,UAAU;EAEV,QAAQ;EACR,OAAO;CACT;CACA,IAAI;EAEF,UAAU;EAEV,QAAQ;EACR,OAAO;CACT;CACA,KAAK,CAAC;CACN,UAAU,CAAC;CACX,UAAU,CAAC;AACb;AAEA,eAAsB,eACpB,KACA,SACA,MACiB;CAGjB,OAAO,cAAc,SAAS,MAAM;EAC7B;EACL,UAAU;EACV,KAAK;GACH,GAAG,QAAQ;GACX,GAAG,YAAY;EACjB;CACF,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,aAAa;EAE9B,OAAO,SAAS,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK;CACzE,CAAC;AACH;AAEA,SAAgB,mBACd,KACA,SACA,MACQ;CAYR,OATe,aAAa,SAAS,MAAM;EACpC;EACL,UAAU;EACV,KAAK;GACH,GAAG,QAAQ;GACX,GAAG,YAAY;EACjB;CACF,CAAC,CAAC,CAAC,KAES;AACd;AAEA,MAAa,0BACX,QAEA,eAAe,KAAK,MAAM,GAAG"}
1
+ {"version":3,"file":"repositoryCommand.js","names":[],"sources":["../src/repositoryCommand.ts"],"sourcesContent":["import { execFileAsync, execFileSync } from \"./exec.js\";\nimport {} from \"child_process\";\n\ntype RepositoryCommand = \"git\" | \"hg\" | \"sl\" | \"svn\" | \"svnadmin\" | \"svnrdump\";\n\nconst environment = {\n git: {\n // non-interactive\n GIT_TERMINAL_PROMPT: \"0\",\n // don't use global config\n GIT_CONFIG_GLOBAL: \"/dev/null\",\n GIT_CONFIG_SYSTEM: \"/dev/null\",\n // user config\n GIT_COMMITTER_NAME: \"alan\",\n GIT_COMMITTER_EMAIL: \"alan@example.com\",\n GIT_AUTHOR_NAME: \"alan\",\n GIT_AUTHOR_EMAIL: \"alan@example.com\",\n },\n hg: {\n // don't use global config\n HGRCPATH: \"/dev/null\",\n // don't use global config\n HGUSER: \"alan\",\n EMAIL: \"alan@example.com\",\n },\n sl: {\n // don't use global config\n HGRCPATH: \"/dev/null\",\n // don't use global config\n HGUSER: \"alan\",\n EMAIL: \"alan@example.com\",\n },\n svn: {},\n svnadmin: {},\n svnrdump: {},\n} as const satisfies Record<RepositoryCommand, NodeJS.ProcessEnv>;\n\n/**\n * Environment variables that pin git to one particular repository, work tree,\n * index, or object store.\n *\n * Git exports several of these before running a hook, so every process a hook\n * spawns inherits them. We always point git at a directory of our choosing\n * (via cwd) and want an answer about *that* directory, so they have to go.\n *\n * GIT_DIR is the worst offender: when it is set and GIT_WORK_TREE isn't, git\n * skips repository discovery entirely and \"tells Git that you are at the top\n * level of the working tree\", so `git rev-parse --show-toplevel` echoes back\n * the directory we asked about instead of the root containing it.\n *\n * https://github.com/altano/npm-packages/issues/299\n *\n * Variables that only tune discovery, and that a user has to opt into\n * deliberately (GIT_CEILING_DIRECTORIES, GIT_DISCOVERY_ACROSS_FILESYSTEM), are\n * intentionally left alone.\n */\nconst gitRepositoryVariables = [\n \"GIT_DIR\",\n \"GIT_WORK_TREE\",\n \"GIT_COMMON_DIR\",\n \"GIT_INDEX_FILE\",\n \"GIT_INDEX_VERSION\",\n \"GIT_OBJECT_DIRECTORY\",\n \"GIT_ALTERNATE_OBJECT_DIRECTORIES\",\n \"GIT_NAMESPACE\",\n \"GIT_PREFIX\",\n \"GIT_QUARANTINE_PATH\",\n] as const;\n\n/**\n * Inherited environment variables to drop, per command. The other version\n * control systems have no equivalent of GIT_DIR: they're told which repository\n * to use with a flag, never with the environment.\n */\nconst removedEnvironment = {\n git: gitRepositoryVariables,\n hg: [],\n sl: [],\n svn: [],\n svnadmin: [],\n svnrdump: [],\n} as const satisfies Record<RepositoryCommand, readonly string[]>;\n\nfunction getEnvironment(command: RepositoryCommand): NodeJS.ProcessEnv {\n const result: NodeJS.ProcessEnv = {\n ...process.env,\n ...environment[command],\n };\n for (const variable of removedEnvironment[command]) {\n delete result[variable];\n }\n return result;\n}\n\nexport async function repositoryExec(\n cwd: string,\n command: RepositoryCommand,\n args: readonly string[],\n): Promise<string> {\n // const msg = `Executing command: ${command} ${args.join(\" \")}`;\n // console.time(msg);\n return execFileAsync(command, args, {\n cwd: cwd,\n encoding: \"utf8\",\n env: getEnvironment(command),\n }).then(({ stdout, stderr }) => {\n // console.timeEnd(msg);\n return stderr ? Promise.reject(new Error(stderr.trim())) : stdout.trim();\n });\n}\n\nexport function repositoryExecSync(\n cwd: string,\n command: RepositoryCommand,\n args: readonly string[],\n): string {\n // const msg = `Executing command: ${command} ${args.join(\" \")}`;\n // console.time(msg);\n const result = execFileSync(command, args, {\n cwd: cwd,\n encoding: \"utf8\",\n env: getEnvironment(command),\n }).trim();\n // console.timeEnd(msg);\n return result;\n}\n\nexport const createExecForDirectory = (\n cwd: string,\n): ((command: RepositoryCommand, args: readonly string[]) => Promise<string>) =>\n repositoryExec.bind(null, cwd);\n\n// Not being used.\n// export const createExecSyncForDirectory = (\n// cwd: string,\n// ): ((command: RepositoryCommand, args: readonly string[]) => string) =>\n// repositoryExecSync.bind(null, cwd);\n"],"mappings":";;;AAKA,MAAM,cAAc;CAClB,KAAK;EAEH,qBAAqB;EAErB,mBAAmB;EACnB,mBAAmB;EAEnB,oBAAoB;EACpB,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;CACpB;CACA,IAAI;EAEF,UAAU;EAEV,QAAQ;EACR,OAAO;CACT;CACA,IAAI;EAEF,UAAU;EAEV,QAAQ;EACR,OAAO;CACT;CACA,KAAK,CAAC;CACN,UAAU,CAAC;CACX,UAAU,CAAC;AACb;;;;;;AAuCA,MAAM,qBAAqB;CACzB,KAAK;EAlBL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAS0B;CAC1B,IAAI,CAAC;CACL,IAAI,CAAC;CACL,KAAK,CAAC;CACN,UAAU,CAAC;CACX,UAAU,CAAC;AACb;AAEA,SAAS,eAAe,SAA+C;CACrE,MAAM,SAA4B;EAChC,GAAG,QAAQ;EACX,GAAG,YAAY;CACjB;CACA,KAAK,MAAM,YAAY,mBAAmB,UACxC,OAAO,OAAO;CAEhB,OAAO;AACT;AAEA,eAAsB,eACpB,KACA,SACA,MACiB;CAGjB,OAAO,cAAc,SAAS,MAAM;EAC7B;EACL,UAAU;EACV,KAAK,eAAe,OAAO;CAC7B,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,aAAa;EAE9B,OAAO,SAAS,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK;CACzE,CAAC;AACH;AAEA,SAAgB,mBACd,KACA,SACA,MACQ;CASR,OANe,aAAa,SAAS,MAAM;EACpC;EACL,UAAU;EACV,KAAK,eAAe,OAAO;CAC7B,CAAC,CAAC,CAAC,KAES;AACd;AAEA,MAAa,0BACX,QAEA,eAAe,KAAK,MAAM,GAAG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@altano/repository-tools",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "Misc tools for dealing with repositories of multiple version control systems (git, svn, etc)",
5
5
  "keywords": [
6
6
  "repository",
@@ -46,7 +46,7 @@
46
46
  "memize": "^2.1.1",
47
47
  "prettier": "3.9.6",
48
48
  "ts-assert-unreachable": "^0.0.9",
49
- "tsdown": "^0.22.13",
49
+ "tsdown": "^0.22.14",
50
50
  "typescript": "^6.0.3",
51
51
  "vite": "^8.1.5",
52
52
  "vitest": "^4.1.10",