putitoutthere 0.3.18 → 0.3.20

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.
Files changed (110) hide show
  1. package/dist/action.d.ts.map +1 -1
  2. package/dist/action.js +4 -0
  3. package/dist/action.js.map +1 -1
  4. package/dist/check/check-cargo-shape-findings.d.ts +4 -0
  5. package/dist/check/check-cargo-shape-findings.d.ts.map +1 -0
  6. package/dist/check/check-cargo-shape-findings.js +10 -0
  7. package/dist/check/check-cargo-shape-findings.js.map +1 -0
  8. package/dist/check/check-crates-package-metadata.d.ts +4 -0
  9. package/dist/check/check-crates-package-metadata.d.ts.map +1 -0
  10. package/dist/check/check-crates-package-metadata.js +11 -0
  11. package/dist/check/check-crates-package-metadata.js.map +1 -0
  12. package/dist/check/check-depends-on.d.ts +4 -0
  13. package/dist/check/check-depends-on.d.ts.map +1 -0
  14. package/dist/check/check-depends-on.js +13 -0
  15. package/dist/check/check-depends-on.js.map +1 -0
  16. package/dist/check/check-globs-match-tracked-files.d.ts +4 -0
  17. package/dist/check/check-globs-match-tracked-files.d.ts.map +1 -0
  18. package/dist/check/check-globs-match-tracked-files.js +18 -0
  19. package/dist/check/check-globs-match-tracked-files.js.map +1 -0
  20. package/dist/check/check-npm-repository.d.ts +4 -0
  21. package/dist/check/check-npm-repository.d.ts.map +1 -0
  22. package/dist/check/check-npm-repository.js +14 -0
  23. package/dist/check/check-npm-repository.js.map +1 -0
  24. package/dist/check/check-npm-target-triples.d.ts +4 -0
  25. package/dist/check/check-npm-target-triples.d.ts.map +1 -0
  26. package/dist/check/check-npm-target-triples.js +27 -0
  27. package/dist/check/check-npm-target-triples.js.map +1 -0
  28. package/dist/check/check-package-json-shape-findings.d.ts +4 -0
  29. package/dist/check/check-package-json-shape-findings.d.ts.map +1 -0
  30. package/dist/check/check-package-json-shape-findings.js +10 -0
  31. package/dist/check/check-package-json-shape-findings.js.map +1 -0
  32. package/dist/check/check-paths.d.ts +4 -0
  33. package/dist/check/check-paths.d.ts.map +1 -0
  34. package/dist/check/check-paths.js +13 -0
  35. package/dist/check/check-paths.js.map +1 -0
  36. package/dist/check/check-pypi-version.d.ts +4 -0
  37. package/dist/check/check-pypi-version.d.ts.map +1 -0
  38. package/dist/check/check-pypi-version.js +11 -0
  39. package/dist/check/check-pypi-version.js.map +1 -0
  40. package/dist/check/check-pyproject-and-bundle-cli.d.ts +4 -0
  41. package/dist/check/check-pyproject-and-bundle-cli.d.ts.map +1 -0
  42. package/dist/check/check-pyproject-and-bundle-cli.js +52 -0
  43. package/dist/check/check-pyproject-and-bundle-cli.js.map +1 -0
  44. package/dist/check/check-pyproject-shape-findings.d.ts +4 -0
  45. package/dist/check/check-pyproject-shape-findings.d.ts.map +1 -0
  46. package/dist/check/check-pyproject-shape-findings.js +10 -0
  47. package/dist/check/check-pyproject-shape-findings.js.map +1 -0
  48. package/dist/check/check-repo-url-match-findings.d.ts +4 -0
  49. package/dist/check/check-repo-url-match-findings.d.ts.map +1 -0
  50. package/dist/check/check-repo-url-match-findings.js +17 -0
  51. package/dist/check/check-repo-url-match-findings.js.map +1 -0
  52. package/dist/check/check-tag-template-collisions.d.ts +4 -0
  53. package/dist/check/check-tag-template-collisions.d.ts.map +1 -0
  54. package/dist/check/check-tag-template-collisions.js +22 -0
  55. package/dist/check/check-tag-template-collisions.js.map +1 -0
  56. package/dist/check/collect-bins-from-manifest.d.ts +2 -0
  57. package/dist/check/collect-bins-from-manifest.d.ts.map +1 -0
  58. package/dist/check/collect-bins-from-manifest.js +27 -0
  59. package/dist/check/collect-bins-from-manifest.js.map +1 -0
  60. package/dist/check/list-tracked-files.d.ts +2 -0
  61. package/dist/check/list-tracked-files.d.ts.map +1 -0
  62. package/dist/check/list-tracked-files.js +11 -0
  63. package/dist/check/list-tracked-files.js.map +1 -0
  64. package/dist/check/parse-cargo-toml.d.ts +2 -0
  65. package/dist/check/parse-cargo-toml.d.ts.map +1 -0
  66. package/dist/check/parse-cargo-toml.js +11 -0
  67. package/dist/check/parse-cargo-toml.js.map +1 -0
  68. package/dist/check/read-declared-bins.d.ts +2 -0
  69. package/dist/check/read-declared-bins.d.ts.map +1 -0
  70. package/dist/check/read-declared-bins.js +33 -0
  71. package/dist/check/read-declared-bins.js.map +1 -0
  72. package/dist/check/workspace-member-manifests.d.ts +2 -0
  73. package/dist/check/workspace-member-manifests.d.ts.map +1 -0
  74. package/dist/check/workspace-member-manifests.js +23 -0
  75. package/dist/check/workspace-member-manifests.js.map +1 -0
  76. package/dist/check.d.ts +6 -5
  77. package/dist/check.d.ts.map +1 -1
  78. package/dist/check.js +21 -307
  79. package/dist/check.js.map +1 -1
  80. package/dist/cli-bin.js +5 -2
  81. package/dist/cli-bin.js.map +1 -1
  82. package/dist/handlers/crates.d.ts +3 -16
  83. package/dist/handlers/crates.d.ts.map +1 -1
  84. package/dist/handlers/crates.js +16 -108
  85. package/dist/handlers/crates.js.map +1 -1
  86. package/dist/handlers/scan-dirty-outside-manifest.d.ts +21 -0
  87. package/dist/handlers/scan-dirty-outside-manifest.d.ts.map +1 -0
  88. package/dist/handlers/scan-dirty-outside-manifest.js +104 -0
  89. package/dist/handlers/scan-dirty-outside-manifest.js.map +1 -0
  90. package/dist/is-within-dir.d.ts +11 -0
  91. package/dist/is-within-dir.d.ts.map +1 -0
  92. package/dist/is-within-dir.js +13 -0
  93. package/dist/is-within-dir.js.map +1 -0
  94. package/dist/utils/bound-capture.d.ts +12 -0
  95. package/dist/utils/bound-capture.d.ts.map +1 -0
  96. package/dist/utils/bound-capture.js +22 -0
  97. package/dist/utils/bound-capture.js.map +1 -0
  98. package/dist/utils/exec-capture.d.ts +1 -0
  99. package/dist/utils/exec-capture.d.ts.map +1 -1
  100. package/dist/utils/exec-capture.js +18 -3
  101. package/dist/utils/exec-capture.js.map +1 -1
  102. package/dist/utils/flush-stdio.d.ts +16 -0
  103. package/dist/utils/flush-stdio.d.ts.map +1 -0
  104. package/dist/utils/flush-stdio.js +24 -0
  105. package/dist/utils/flush-stdio.js.map +1 -0
  106. package/dist/write-dependent-version-reqs.d.ts +50 -0
  107. package/dist/write-dependent-version-reqs.d.ts.map +1 -0
  108. package/dist/write-dependent-version-reqs.js +158 -0
  109. package/dist/write-dependent-version-reqs.js.map +1 -0
  110. package/package.json +1 -1
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Move the in-repo version requirements that point at a crate whose version
3
+ * just changed. #640.
4
+ *
5
+ * #621 taught the *build*-time writers this, for the crates an artifact
6
+ * embeds. The *publish* path never learned it: the crates handler bumps
7
+ * exactly one manifest, the crate's own. For two crates.io packages in one
8
+ * repo where A path-deps B, releasing B moves it past A's requirement and
9
+ * nothing updates A:
10
+ *
11
+ * error: failed to select a version for the requirement `expcore = "^0.2"`
12
+ * candidate versions found which didn't match: 0.4.2
13
+ * location searched: …/packages/core
14
+ *
15
+ * A hard failure (exit 101) before anything compiles or packages, and an
16
+ * intermittent one — a repo on a patch cadence stays green until the first
17
+ * bump that leaves the declared range. `location searched` naming the local
18
+ * path is also why registry state cannot rescue it: for a `path` + `version`
19
+ * dependency cargo checks the requirement against the path crate's on-disk
20
+ * manifest.
21
+ *
22
+ * A `version` key alongside `path` is *mandatory* for any crate that also
23
+ * publishes to crates.io, so the shape that breaks is the shape such a repo
24
+ * is required to have.
25
+ *
26
+ * This is the inverse walk of `write-embedded-crate-versions.ts`: that one
27
+ * walks *out* from a crate to what it embeds, this one looks *in* at what
28
+ * points back. It rewrites requirements only; no crate's version is bumped
29
+ * here, because at publish time each package owns its own planned version
30
+ * and stamping a neighbour's would publish a version nobody planned.
31
+ *
32
+ * Like #621's rewrites these are ephemeral — the publish job runs off a
33
+ * fresh checkout and nothing is committed — but unlike #621's they happen in
34
+ * the same job as `cargo publish`, so the pre-publish dirty-tree check has
35
+ * to be told which manifests they touched.
36
+ */
37
+ import { readFile, writeFile } from 'node:fs/promises';
38
+ import { join, resolve } from 'node:path';
39
+ import { parse as parseToml } from 'smol-toml';
40
+ import { expandDirGlob } from './glob.js';
41
+ import { findWorkspaceRoot } from './find-workspace-root.js';
42
+ import { replaceDepVersionReq } from './replace-dep-version-req.js';
43
+ import { resolveDepDirs } from './resolve-dep-dirs.js';
44
+ /**
45
+ * Rewrite every in-repo `version = "…"` requirement that points at the crate
46
+ * at `crateDir` to `version`. Returns the absolute paths modified.
47
+ *
48
+ * `siblingDirs` are the other declared packages' directories — they may sit
49
+ * outside any shared cargo workspace, so they are scanned in addition to the
50
+ * workspace's own members rather than instead of them.
51
+ *
52
+ * Only entries that resolve to `crateDir` move. A registry dependency, or a
53
+ * path dependency pointing anywhere else, keeps its requirement: pinning
54
+ * pyo3 to this release's version would name a pyo3 that does not exist.
55
+ */
56
+ export async function writeDependentVersionReqs(crateDir, version, siblingDirs) {
57
+ // Canonicalize first: every candidate directory below arrives via
58
+ // `resolve`, and the check that decides whether a dependency points at
59
+ // this crate is string equality on those paths.
60
+ const target = resolve(crateDir);
61
+ const workspaceRoot = await findWorkspaceRoot(target);
62
+ const workspaceParsed = workspaceRoot === null ? null : (await readManifest(workspaceRoot))?.parsed;
63
+ const written = [];
64
+ // The released crate's own manifest is scanned like any other and simply
65
+ // never matches: cargo has no way to express a dependency on yourself, so
66
+ // no entry in it can resolve back to `target`.
67
+ //
68
+ // A member that inherits its requirement (`core.workspace = true`) is
69
+ // likewise a no-op here rather than a special case — the entry carries no
70
+ // `path` of its own, and `replaceDepVersionReq` only rewrites entries that
71
+ // do. The requirement it inherits lives in the workspace root, which is a
72
+ // candidate in its own right, so rewriting it there covers every member.
73
+ for (const dir of await candidateDirs(workspaceRoot, workspaceParsed, siblingDirs)) {
74
+ const manifest = await readManifest(dir);
75
+ if (manifest === null) {
76
+ continue;
77
+ }
78
+ let updated = manifest.source;
79
+ for (const dep of resolveDepDirs(manifest.parsed, dir, workspaceParsed, workspaceRoot)) {
80
+ if (!dep.hasVersionReq || dep.dir !== target) {
81
+ continue;
82
+ }
83
+ updated = replaceDepVersionReq(updated, dep.key, version);
84
+ }
85
+ if (updated !== manifest.source) {
86
+ const cargoPath = join(dir, 'Cargo.toml');
87
+ await writeFile(cargoPath, updated, 'utf8');
88
+ written.push(cargoPath);
89
+ }
90
+ }
91
+ return written;
92
+ }
93
+ /**
94
+ * Every manifest that could declare a requirement on the released crate: the
95
+ * workspace root (where an inheriting member's requirement actually lives),
96
+ * each of its members, and the other declared packages.
97
+ *
98
+ * Members are expanded with `expandDirGlob`, which mirrors how cargo resolves
99
+ * `[workspace].members` — a literal entry resolves as written, a glob entry
100
+ * matches against the real tree. Scanning members rather than only the
101
+ * declared packages matters because a crate the repo does not publish can
102
+ * still sit between two that it does, and cargo resolves the whole graph.
103
+ */
104
+ async function candidateDirs(workspaceRoot, workspaceParsed, siblingDirs) {
105
+ const dirs = new Set();
106
+ // An explicit guard rather than a `?? []` default: the caller holds an
107
+ // optional field, and "no sibling packages" and "an empty list of them"
108
+ // are the same thing to this walk.
109
+ if (siblingDirs !== undefined) {
110
+ for (const d of siblingDirs) {
111
+ dirs.add(resolve(d));
112
+ }
113
+ }
114
+ if (workspaceRoot === null) {
115
+ return dirs;
116
+ }
117
+ dirs.add(resolve(workspaceRoot));
118
+ const members = workspaceParsed?.workspace
119
+ ?.members;
120
+ if (!Array.isArray(members)) {
121
+ return dirs;
122
+ }
123
+ for (const member of members) {
124
+ if (typeof member !== 'string') {
125
+ continue;
126
+ }
127
+ for (const d of await expandDirGlob(workspaceRoot, member)) {
128
+ dirs.add(resolve(d));
129
+ }
130
+ }
131
+ return dirs;
132
+ }
133
+ /**
134
+ * Read and parse `<dir>/Cargo.toml`. Null when absent or unparseable — a
135
+ * declared package directory need not be a crate at all, and an
136
+ * odd-but-writable manifest should not abort a release. ENOENT is caught
137
+ * rather than pre-checked to avoid the TOCTOU shape CodeQL flags, matching
138
+ * the rest of the version-write path.
139
+ */
140
+ async function readManifest(dir) {
141
+ let source;
142
+ try {
143
+ source = await readFile(join(dir, 'Cargo.toml'), 'utf8');
144
+ }
145
+ catch (err) {
146
+ if (err.code === 'ENOENT') {
147
+ return null;
148
+ }
149
+ throw err;
150
+ }
151
+ try {
152
+ return { source, parsed: parseToml(source) };
153
+ }
154
+ catch {
155
+ return null;
156
+ }
157
+ }
158
+ //# sourceMappingURL=write-dependent-version-reqs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-dependent-version-reqs.js","sourceRoot":"","sources":["../src/write-dependent-version-reqs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "putitoutthere",
3
- "version": "0.3.18",
3
+ "version": "0.3.20",
4
4
  "description": "Polyglot release orchestrator for crates.io, PyPI, and npm",
5
5
  "license": "MIT",
6
6
  "repository": {