pressship 0.1.3 → 0.1.6

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 (39) hide show
  1. package/README.md +282 -356
  2. package/assets/logo-new.png +0 -0
  3. package/assets/pressship-dark.png +0 -0
  4. package/assets/pressship-square-dark.png +0 -0
  5. package/assets/pressship-square.png +0 -0
  6. package/assets/pressship-symbol-dark.png +0 -0
  7. package/assets/pressship-symbol.png +0 -0
  8. package/assets/pressship-wordmark-dark.png +0 -0
  9. package/assets/pressship-wordmark.png +0 -0
  10. package/assets/pressship.png +0 -0
  11. package/dist/cli.js +22 -2
  12. package/dist/cli.js.map +1 -1
  13. package/dist/package/ignore.js +4 -0
  14. package/dist/package/ignore.js.map +1 -1
  15. package/dist/plugin/discover.d.ts +8 -0
  16. package/dist/plugin/discover.js +27 -1
  17. package/dist/plugin/discover.js.map +1 -1
  18. package/dist/plugin/list.d.ts +24 -0
  19. package/dist/plugin/list.js +174 -0
  20. package/dist/plugin/list.js.map +1 -0
  21. package/dist/svn/credentials.d.ts +9 -0
  22. package/dist/svn/credentials.js +94 -0
  23. package/dist/svn/credentials.js.map +1 -0
  24. package/dist/svn/get.d.ts +45 -0
  25. package/dist/svn/get.js +139 -0
  26. package/dist/svn/get.js.map +1 -0
  27. package/dist/svn/release.d.ts +2 -0
  28. package/dist/svn/release.js +113 -18
  29. package/dist/svn/release.js.map +1 -1
  30. package/dist/svn/subversion.d.ts +18 -0
  31. package/dist/svn/subversion.js +171 -0
  32. package/dist/svn/subversion.js.map +1 -0
  33. package/dist/utils/paths.d.ts +1 -0
  34. package/dist/utils/paths.js +3 -0
  35. package/dist/utils/paths.js.map +1 -1
  36. package/dist/wordpress-org/publish.d.ts +2 -0
  37. package/dist/wordpress-org/publish.js +16 -8
  38. package/dist/wordpress-org/publish.js.map +1 -1
  39. package/package.json +2 -1
@@ -0,0 +1,139 @@
1
+ import { execa } from "execa";
2
+ import { mkdir, readdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ import { slugFromHostedTarget } from "../plugin/info.js";
6
+ import { ui } from "../ui.js";
7
+ import { pathExists } from "../utils/paths.js";
8
+ import { ensureSvnAvailable } from "./subversion.js";
9
+ const getOptionsSchema = z.object({
10
+ json: z.boolean().default(false),
11
+ installSvn: z.boolean().default(true)
12
+ });
13
+ export async function getPlugin(slugOrUrl, destination, rawOptions = {}) {
14
+ const options = getOptionsSchema.parse(rawOptions);
15
+ const slug = slugFromHostedTarget(slugOrUrl);
16
+ const checkoutPath = resolveCheckoutPath(slug, destination);
17
+ const runtimeOptions = {
18
+ installSvn: options.installSvn,
19
+ interactive: !options.json && process.stdin.isTTY,
20
+ quiet: options.json
21
+ };
22
+ await ensureSvnAvailable({ autoInstall: runtimeOptions.installSvn, interactive: runtimeOptions.interactive });
23
+ const result = options.json
24
+ ? await checkoutOrUpdatePlugin(slug, checkoutPath, runtimeOptions)
25
+ : await ui.task("Preparing SVN working copy", () => checkoutOrUpdatePlugin(slug, checkoutPath, runtimeOptions), (value) => value.action === "checkout" ? `Checked out ${value.slug}` : `Updated ${value.slug}`);
26
+ if (options.json) {
27
+ console.log(JSON.stringify(result, null, 2));
28
+ return;
29
+ }
30
+ printSvnGetResult(result);
31
+ }
32
+ export async function checkoutOrUpdatePlugin(slug, checkoutPath, options = {}) {
33
+ await ensureSvnAvailable({ autoInstall: options.installSvn, interactive: options.interactive });
34
+ const svnUrl = getPluginSvnUrl(slug);
35
+ const action = await resolveSvnGetAction(checkoutPath);
36
+ const commandOptions = { capture: options.quiet };
37
+ if (action === "checkout") {
38
+ await mkdir(path.dirname(checkoutPath), { recursive: true });
39
+ await runSvn(["checkout", svnUrl, checkoutPath], process.cwd(), commandOptions);
40
+ }
41
+ else {
42
+ await runSvn(["update"], checkoutPath, commandOptions);
43
+ }
44
+ const info = parseSvnInfo(await runSvn(["info"], checkoutPath, { capture: true }));
45
+ return {
46
+ slug,
47
+ action,
48
+ svnUrl,
49
+ path: checkoutPath,
50
+ info,
51
+ layout: await readSvnLayout(checkoutPath)
52
+ };
53
+ }
54
+ export function resolveCheckoutPath(slug, destination) {
55
+ return path.resolve(destination ?? slug);
56
+ }
57
+ export function getPluginSvnUrl(slug) {
58
+ return `https://plugins.svn.wordpress.org/${slug}`;
59
+ }
60
+ export async function resolveSvnGetAction(checkoutPath) {
61
+ if (!pathExists(checkoutPath)) {
62
+ return "checkout";
63
+ }
64
+ if (pathExists(path.join(checkoutPath, ".svn"))) {
65
+ return "update";
66
+ }
67
+ const entries = await readdir(checkoutPath);
68
+ if (entries.length === 0) {
69
+ return "checkout";
70
+ }
71
+ throw new Error(`Target directory already exists and is not an SVN working copy: ${checkoutPath}. Choose another path or remove the directory.`);
72
+ }
73
+ export function parseSvnInfo(output) {
74
+ const values = Object.fromEntries(output
75
+ .split(/\r?\n/)
76
+ .map((line) => line.match(/^([^:]+):\s*(.*)$/))
77
+ .filter((match) => Boolean(match))
78
+ .map((match) => [match[1].toLowerCase(), match[2]]));
79
+ return {
80
+ workingCopyRoot: values["working copy root path"],
81
+ url: values.url,
82
+ relativeUrl: values["relative url"],
83
+ repositoryRoot: values["repository root"],
84
+ repositoryUuid: values["repository uuid"],
85
+ revision: values.revision,
86
+ nodeKind: values["node kind"],
87
+ schedule: values.schedule,
88
+ lastChangedAuthor: values["last changed author"],
89
+ lastChangedRevision: values["last changed rev"],
90
+ lastChangedDate: values["last changed date"]
91
+ };
92
+ }
93
+ async function readSvnLayout(checkoutPath) {
94
+ const tagsPath = path.join(checkoutPath, "tags");
95
+ const tagEntries = pathExists(tagsPath) ? await readdir(tagsPath, { withFileTypes: true }) : [];
96
+ return {
97
+ trunk: pathExists(path.join(checkoutPath, "trunk")),
98
+ assets: pathExists(path.join(checkoutPath, "assets")),
99
+ tags: pathExists(tagsPath),
100
+ tagCount: tagEntries.filter((entry) => entry.isDirectory()).length
101
+ };
102
+ }
103
+ async function runSvn(args, cwd, options = {}) {
104
+ const result = await execa("svn", args, {
105
+ cwd,
106
+ reject: false,
107
+ stdout: options.capture ? "pipe" : "inherit",
108
+ stderr: options.capture ? "pipe" : "inherit"
109
+ }).catch((error) => {
110
+ if (isMissingSvnError(error)) {
111
+ throw new Error("`svn` is required for `pressship get`. Install Subversion and try again.");
112
+ }
113
+ throw error;
114
+ });
115
+ if (result.failed && result.exitCode === undefined && !result.stderr && !result.stdout) {
116
+ throw new Error("`svn` is required for `pressship get`. Install Subversion and try again.");
117
+ }
118
+ if (result.exitCode !== 0) {
119
+ throw new Error(result.stderr || result.stdout || `svn ${args.join(" ")} failed.`);
120
+ }
121
+ return `${result.stdout ?? ""}\n${result.stderr ?? ""}`.trim();
122
+ }
123
+ function isMissingSvnError(error) {
124
+ return (error instanceof Error &&
125
+ ("code" in error ? error.code === "ENOENT" : /ENOENT|not found/i.test(error.message)));
126
+ }
127
+ function printSvnGetResult(result) {
128
+ ui.section(result.slug);
129
+ ui.keyValue("Action", result.action === "checkout" ? "checked out" : "updated");
130
+ ui.keyValue("SVN", ui.path(result.svnUrl));
131
+ ui.keyValue("Path", ui.path(result.path));
132
+ ui.keyValue("Revision", result.info.revision ?? "unknown");
133
+ ui.keyValue("Last rev", result.info.lastChangedRevision ?? "unknown");
134
+ ui.keyValue("Last author", result.info.lastChangedAuthor ?? "unknown");
135
+ ui.keyValue("Trunk", result.layout.trunk ? ui.value("available") : "missing");
136
+ ui.keyValue("Assets", result.layout.assets ? ui.value("available") : "missing");
137
+ ui.keyValue("Tags", result.layout.tags ? `${result.layout.tagCount}` : "missing");
138
+ }
139
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/svn/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACtC,CAAC,CAAC;AAuCH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,WAA+B,EAAE,aAAyB,EAAE;IAC7G,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG;QACrB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QACjD,KAAK,EAAE,OAAO,CAAC,IAAI;KACpB,CAAC;IAEF,MAAM,kBAAkB,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAE9G,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI;QACzB,CAAC,CAAC,MAAM,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,cAAc,CAAC;QAClE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CACtH,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,IAAI,EAAE,CACpF,CAAC;IAEN,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,YAAoB,EACpB,UAAgC,EAAE;IAElC,MAAM,kBAAkB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhG,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAElD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,OAAO;QACL,IAAI;QACJ,MAAM;QACN,MAAM;QACN,IAAI,EAAE,YAAY;QAClB,IAAI;QACJ,MAAM,EAAE,MAAM,aAAa,CAAC,YAAY,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,WAA+B;IAC/E,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,qCAAqC,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,YAAoB;IAC5D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,mEAAmE,YAAY,gDAAgD,CAChI,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM;SACH,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC5D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CACtD,CAAC;IAEF,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,wBAAwB,CAAC;QACjD,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACnC,cAAc,EAAE,MAAM,CAAC,iBAAiB,CAAC;QACzC,cAAc,EAAE,MAAM,CAAC,iBAAiB,CAAC;QACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,iBAAiB,EAAE,MAAM,CAAC,qBAAqB,CAAC;QAChD,mBAAmB,EAAE,MAAM,CAAC,kBAAkB,CAAC;QAC/C,eAAe,EAAE,MAAM,CAAC,mBAAmB,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,YAAoB;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhG,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;QAC1B,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM;KACnE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,GAAW,EAAE,UAAiC,EAAE;IACpF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;QACtC,GAAG;QACH,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC5C,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC7C,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC1B,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAE,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CACjH,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChF,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;IAC3D,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,SAAS,CAAC,CAAC;IACtE,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC,CAAC;IACvE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9E,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChF,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACpF,CAAC"}
@@ -9,9 +9,11 @@ declare const releaseOptionsSchema: z.ZodObject<{
9
9
  dryRun: z.ZodDefault<z.ZodBoolean>;
10
10
  yes: z.ZodDefault<z.ZodBoolean>;
11
11
  ignore: z.ZodDefault<z.ZodArray<z.ZodString>>;
12
+ installSvn: z.ZodDefault<z.ZodBoolean>;
12
13
  }, z.core.$strip>;
13
14
  export type ReleaseOptions = z.input<typeof releaseOptionsSchema>;
14
15
  export declare function release(pluginPath: string | undefined, rawOptions: ReleaseOptions): Promise<void>;
15
16
  export declare function createReleaseCommandPlan(slug: string, svnDir: string, version: string, message: string, username?: string): CommandPlan[];
16
17
  export declare function svnRepositoryExists(slug: string): Promise<boolean>;
18
+ export declare function assertReleaseVersionIsNew(version: string, svnDir: string): Promise<void>;
17
19
  export {};
@@ -4,9 +4,11 @@ import { cp, mkdir, readdir, rm } from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { z } from "zod";
6
6
  import { listPackageFiles } from "../package/archive.js";
7
- import { discoverPluginProject } from "../plugin/discover.js";
7
+ import { discoverPluginProject, resolvePluginProjectPath } from "../plugin/discover.js";
8
8
  import { ui } from "../ui.js";
9
9
  import { pathExists } from "../utils/paths.js";
10
+ import { resolveSvnCredentials, resolveSvnUsername } from "./credentials.js";
11
+ import { ensureSvnAvailable, isSvnAvailable } from "./subversion.js";
10
12
  const releaseOptionsSchema = z.object({
11
13
  slug: z.string().optional(),
12
14
  version: z.string().optional(),
@@ -15,25 +17,32 @@ const releaseOptionsSchema = z.object({
15
17
  message: z.string().optional(),
16
18
  dryRun: z.boolean().default(false),
17
19
  yes: z.boolean().default(false),
18
- ignore: z.array(z.string()).default([])
20
+ ignore: z.array(z.string()).default([]),
21
+ installSvn: z.boolean().default(true)
19
22
  });
20
23
  export async function release(pluginPath, rawOptions) {
21
24
  const options = releaseOptionsSchema.parse(rawOptions);
22
25
  ui.intro(options.dryRun ? "Dry-run SVN release" : "Release plugin to WordPress.org SVN");
23
- const rootDir = path.resolve(pluginPath ?? (await input({ message: "Plugin directory", default: process.cwd() })));
26
+ const inputDir = path.resolve(pluginPath ?? (await input({ message: "Plugin directory", default: process.cwd() })));
27
+ const source = resolvePluginProjectPath(inputDir);
28
+ const rootDir = source.rootDir;
24
29
  const project = await ui.task("Discovering WordPress plugin", () => discoverPluginProject(rootDir), (value) => `Discovered ${value.headers.pluginName}`);
25
30
  const slug = options.slug ?? project.slug;
26
31
  const version = options.version ?? project.version;
27
32
  if (!version) {
28
33
  throw new Error("Could not infer a plugin version. Pass --version or add Version to the plugin header.");
29
34
  }
30
- const svnDir = path.resolve(options.svnDir ?? path.join(process.cwd(), ".pressship-svn", slug));
35
+ const svnDir = path.resolve(options.svnDir ?? source.svnRootDir ?? path.join(process.cwd(), ".pressship-svn", slug));
31
36
  const message = options.message ?? `Release ${slug} ${version}`;
32
- const plan = createReleaseCommandPlan(slug, svnDir, version, message, options.username);
37
+ const username = options.username ?? (options.dryRun ? undefined : await resolveSvnUsername());
38
+ const plan = createReleaseCommandPlan(slug, svnDir, version, message, username);
33
39
  ui.section("Release");
34
40
  ui.keyValue("SVN", ui.path(`https://plugins.svn.wordpress.org/${slug}`));
35
41
  ui.keyValue("Working copy", ui.path(svnDir));
36
42
  ui.keyValue("Version", ui.value(version));
43
+ if (username) {
44
+ ui.keyValue("SVN user", ui.value(username));
45
+ }
37
46
  if (options.dryRun) {
38
47
  ui.section("Dry-run command plan");
39
48
  for (const command of plan) {
@@ -41,11 +50,22 @@ export async function release(pluginPath, rawOptions) {
41
50
  }
42
51
  return;
43
52
  }
44
- await ui.task("Preparing SVN working copy", () => ensureWorkingCopy(slug, svnDir, options.username));
45
- await ui.task("Syncing plugin files to trunk", () => syncTrunk(rootDir, path.join(svnDir, "trunk"), options.ignore));
46
- await ui.task("Adding changed files to SVN", () => runSvn(["add", "--force", "trunk"], svnDir));
53
+ await ensureSvnAvailable({ autoInstall: options.installSvn, interactive: process.stdin.isTTY });
54
+ await ui.task("Preparing SVN working copy", () => ensureWorkingCopy(slug, svnDir));
55
+ await assertReleaseVersionIsNew(version, svnDir);
56
+ const trunkDir = path.join(svnDir, "trunk");
57
+ if (samePath(rootDir, trunkDir)) {
58
+ ui.info("Using the current SVN trunk working copy.");
59
+ }
60
+ else {
61
+ await ui.task("Syncing plugin files to trunk", () => syncTrunk(rootDir, trunkDir, options.ignore));
62
+ }
63
+ await syncAssets(rootDir, path.join(svnDir, "assets"));
64
+ await ui.task("Adding changed files to SVN", () => runSvn(["add", "--force", "."], svnDir));
47
65
  await ui.task("Removing deleted files from SVN", () => deleteMissingFiles(svnDir));
48
66
  await ui.task(`Creating tag ${version}`, () => createTag(version, svnDir));
67
+ await setAssetMimeTypes(svnDir);
68
+ await ui.task("Updating SVN working copy", () => runSvn(["update"], svnDir));
49
69
  const status = await runSvn(["status"], svnDir, { capture: true });
50
70
  ui.section("SVN status");
51
71
  console.log(status || ui.muted("No SVN changes detected."));
@@ -58,21 +78,26 @@ export async function release(pluginPath, rawOptions) {
58
78
  throw new Error("SVN release cancelled before commit.");
59
79
  }
60
80
  }
61
- await ui.task("Committing SVN release", () => runSvn(["commit", "-m", message, ...usernameArgs(options.username)], svnDir));
81
+ const credentials = await resolveSvnCredentials(username);
82
+ await ui.task("Committing SVN release", () => runSvn(["commit", "-m", message, ...svnCredentialArgs(credentials)], svnDir));
62
83
  }
63
84
  export function createReleaseCommandPlan(slug, svnDir, version, message, username) {
64
85
  return [
65
86
  {
66
87
  command: "svn",
67
- args: ["checkout", `https://plugins.svn.wordpress.org/${slug}`, svnDir, ...usernameArgs(username)]
88
+ args: ["checkout", `https://plugins.svn.wordpress.org/${slug}`, svnDir]
68
89
  },
69
- { command: "svn", args: ["add", "--force", "trunk"], cwd: svnDir },
90
+ { command: "svn", args: ["add", "--force", "."], cwd: svnDir },
70
91
  { command: "svn", args: ["copy", "trunk", `tags/${version}`], cwd: svnDir },
92
+ { command: "svn", args: ["update"], cwd: svnDir },
71
93
  { command: "svn", args: ["status"], cwd: svnDir },
72
- { command: "svn", args: ["commit", "-m", message, ...usernameArgs(username)], cwd: svnDir }
94
+ { command: "svn", args: ["commit", "-m", message, ...svnCredentialPreviewArgs(username)], cwd: svnDir }
73
95
  ];
74
96
  }
75
97
  export async function svnRepositoryExists(slug) {
98
+ if (!(await isSvnAvailable())) {
99
+ throw new Error("`svn` is not installed. Pressship can install it when you run a release or get command.");
100
+ }
76
101
  const result = await execa("svn", ["info", `https://plugins.svn.wordpress.org/${slug}`], {
77
102
  reject: false,
78
103
  stdout: "pipe",
@@ -80,14 +105,20 @@ export async function svnRepositoryExists(slug) {
80
105
  });
81
106
  return result.exitCode === 0;
82
107
  }
83
- async function ensureWorkingCopy(slug, svnDir, username) {
108
+ export async function assertReleaseVersionIsNew(version, svnDir) {
109
+ if (!pathExists(path.join(svnDir, "tags", version))) {
110
+ return;
111
+ }
112
+ throw new Error(`No version change detected. Version ${version} already exists in WordPress.org SVN, so it cannot be published again. Bump the plugin version with \`pressship version patch\` or pass --version before publishing.`);
113
+ }
114
+ async function ensureWorkingCopy(slug, svnDir) {
84
115
  await mkdir(path.dirname(svnDir), { recursive: true });
85
116
  try {
86
117
  await runSvn(["info"], svnDir, { capture: true });
87
118
  await runSvn(["update"], svnDir);
88
119
  }
89
120
  catch {
90
- await runSvn(["checkout", `https://plugins.svn.wordpress.org/${slug}`, svnDir, ...usernameArgs(username)], process.cwd());
121
+ await runSvn(["checkout", `https://plugins.svn.wordpress.org/${slug}`, svnDir], process.cwd());
91
122
  }
92
123
  }
93
124
  async function syncTrunk(pluginRoot, trunkDir, ignore) {
@@ -101,6 +132,17 @@ async function syncTrunk(pluginRoot, trunkDir, ignore) {
101
132
  await cp(source, destination);
102
133
  }
103
134
  }
135
+ async function syncAssets(pluginRoot, assetsDir) {
136
+ const sourceAssetsDir = path.join(pluginRoot, ".wordpress-org");
137
+ if (!pathExists(sourceAssetsDir)) {
138
+ return;
139
+ }
140
+ await ui.task("Syncing WordPress.org assets", async () => {
141
+ await mkdir(assetsDir, { recursive: true });
142
+ await emptyDirectory(assetsDir);
143
+ await cp(sourceAssetsDir, assetsDir, { recursive: true });
144
+ });
145
+ }
104
146
  async function emptyDirectory(directory) {
105
147
  const entries = await readdir(directory, { withFileTypes: true });
106
148
  for (const entry of entries) {
@@ -124,25 +166,75 @@ async function deleteMissingFiles(svnDir) {
124
166
  async function createTag(version, svnDir) {
125
167
  const tagPath = path.join(svnDir, "tags", version);
126
168
  if (pathExists(tagPath)) {
127
- throw new Error(`SVN tag tags/${version} already exists. Choose a new version; tags should not be overwritten.`);
169
+ throw new Error(`No version change detected. Version ${version} already exists in WordPress.org SVN, so it cannot be published again. Bump the plugin version with \`pressship version patch\` or pass --version before publishing.`);
128
170
  }
129
171
  await mkdir(path.dirname(tagPath), { recursive: true });
130
172
  await runSvn(["copy", "trunk", `tags/${version}`], svnDir);
131
173
  }
174
+ async function setAssetMimeTypes(svnDir) {
175
+ const assetsDir = path.join(svnDir, "assets");
176
+ if (!pathExists(assetsDir)) {
177
+ return;
178
+ }
179
+ const mimeTypes = new Map([
180
+ [".gif", "image/gif"],
181
+ [".jpg", "image/jpeg"],
182
+ [".jpeg", "image/jpeg"],
183
+ [".png", "image/png"],
184
+ [".svg", "image/svg+xml"]
185
+ ]);
186
+ const entries = await readdir(assetsDir, { withFileTypes: true });
187
+ for (const entry of entries) {
188
+ if (!entry.isFile()) {
189
+ continue;
190
+ }
191
+ const mimeType = mimeTypes.get(path.extname(entry.name).toLowerCase());
192
+ if (mimeType) {
193
+ await runSvn(["propset", "svn:mime-type", mimeType, path.posix.join("assets", entry.name)], svnDir);
194
+ }
195
+ }
196
+ }
132
197
  async function runSvn(args, cwd, options = {}) {
133
198
  const result = await execa("svn", args, {
134
199
  cwd,
135
200
  reject: false,
136
201
  stdout: options.capture ? "pipe" : "inherit",
137
202
  stderr: options.capture ? "pipe" : "inherit"
203
+ }).catch((error) => {
204
+ if (isMissingSvnError(error)) {
205
+ throw new Error("`svn` is required for WordPress.org SVN releases. Install Subversion and try again.");
206
+ }
207
+ throw error;
138
208
  });
209
+ if (result.failed && result.exitCode === undefined && !result.stderr && !result.stdout) {
210
+ throw new Error("`svn` is required for WordPress.org SVN releases. Install Subversion and try again.");
211
+ }
139
212
  if (result.exitCode !== 0) {
140
- throw new Error(result.stderr || result.stdout || `svn ${args.join(" ")} failed.`);
213
+ throw new Error(result.stderr || result.stdout || `svn ${redactSvnArgs(args).join(" ")} failed.`);
141
214
  }
142
215
  return `${result.stdout ?? ""}\n${result.stderr ?? ""}`.trim();
143
216
  }
144
- function usernameArgs(username) {
145
- return username ? ["--username", username] : [];
217
+ function svnCredentialArgs(credentials) {
218
+ return [
219
+ "--no-auth-cache",
220
+ "--non-interactive",
221
+ "--username",
222
+ credentials.username,
223
+ "--password",
224
+ credentials.password
225
+ ];
226
+ }
227
+ function svnCredentialPreviewArgs(username) {
228
+ return username
229
+ ? ["--no-auth-cache", "--non-interactive", "--username", username, "--password", "<saved-svn-password>"]
230
+ : [];
231
+ }
232
+ function redactSvnArgs(args) {
233
+ return args.map((arg, index) => (args[index - 1] === "--password" ? "<redacted>" : arg));
234
+ }
235
+ function isMissingSvnError(error) {
236
+ return (error instanceof Error &&
237
+ ("code" in error ? error.code === "ENOENT" : /ENOENT|not found/i.test(error.message)));
146
238
  }
147
239
  function formatCommand(command) {
148
240
  const prefix = command.cwd ? `(cd ${command.cwd} && ` : "";
@@ -152,4 +244,7 @@ function formatCommand(command) {
152
244
  function quoteArg(value) {
153
245
  return /\s/.test(value) ? JSON.stringify(value) : value;
154
246
  }
247
+ function samePath(left, right) {
248
+ return path.resolve(left) === path.resolve(right);
249
+ }
155
250
  //# sourceMappingURL=release.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/svn/release.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/svn/release.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type SubversionInstallCommand = {
2
+ command: string;
3
+ args: string[];
4
+ };
5
+ export type SubversionInstallPlan = {
6
+ platform: NodeJS.Platform;
7
+ manager?: string;
8
+ commands: SubversionInstallCommand[];
9
+ instructions: string[];
10
+ };
11
+ export type EnsureSvnOptions = {
12
+ autoInstall?: boolean;
13
+ interactive?: boolean;
14
+ };
15
+ export declare function ensureSvnAvailable(options?: EnsureSvnOptions): Promise<void>;
16
+ export declare function isSvnAvailable(): Promise<boolean>;
17
+ export declare function getSubversionInstallPlan(platform: NodeJS.Platform, availableCommands: Iterable<string>): SubversionInstallPlan;
18
+ export declare function formatSubversionInstallInstructions(plan: SubversionInstallPlan): string;
@@ -0,0 +1,171 @@
1
+ import { confirm } from "@inquirer/prompts";
2
+ import { execa } from "execa";
3
+ import { ui } from "../ui.js";
4
+ const INSTALL_COMMANDS = ["brew", "apt-get", "dnf", "yum", "pacman", "zypper", "apk", "sudo", "winget", "choco"];
5
+ export async function ensureSvnAvailable(options = {}) {
6
+ if (await isSvnAvailable()) {
7
+ return;
8
+ }
9
+ const plan = getSubversionInstallPlan(process.platform, await findAvailableInstallCommands());
10
+ const autoInstall = options.autoInstall ?? true;
11
+ const interactive = options.interactive ?? process.stdin.isTTY;
12
+ if (!autoInstall || plan.commands.length === 0) {
13
+ throw new Error(formatSubversionInstallInstructions(plan));
14
+ }
15
+ if (!interactive) {
16
+ throw new Error([
17
+ "Subversion (`svn`) is required, but it is not installed.",
18
+ "Automatic installation needs an interactive terminal.",
19
+ ...plan.instructions.map((instruction) => `- ${instruction}`)
20
+ ].join("\n"));
21
+ }
22
+ ui.warn("Subversion (`svn`) is required, but it is not installed.");
23
+ ui.info(`Detected ${plan.manager}. Pressship can run: ${formatInstallCommands(plan.commands)}`);
24
+ const shouldInstall = await confirm({ message: "Install Subversion now?", default: true });
25
+ if (!shouldInstall) {
26
+ throw new Error(formatSubversionInstallInstructions(plan));
27
+ }
28
+ for (const command of plan.commands) {
29
+ await execa(command.command, command.args, { stdio: "inherit" });
30
+ }
31
+ if (!(await isSvnAvailable())) {
32
+ throw new Error("Subversion install command finished, but `svn` is still not available on PATH. Open a new terminal or install it manually.");
33
+ }
34
+ }
35
+ export async function isSvnAvailable() {
36
+ return commandExists("svn");
37
+ }
38
+ export function getSubversionInstallPlan(platform, availableCommands) {
39
+ const available = new Set(availableCommands);
40
+ if (platform === "darwin") {
41
+ if (available.has("brew")) {
42
+ return {
43
+ platform,
44
+ manager: "Homebrew",
45
+ commands: [{ command: "brew", args: ["install", "subversion"] }],
46
+ instructions: ["Install Subversion with Homebrew: brew install subversion"]
47
+ };
48
+ }
49
+ return {
50
+ platform,
51
+ commands: [],
52
+ instructions: [
53
+ "Install Homebrew from https://brew.sh, then install Subversion: brew install subversion"
54
+ ]
55
+ };
56
+ }
57
+ if (platform === "linux") {
58
+ if (available.has("apt-get")) {
59
+ const updateCommand = privilegedCommand(available, "apt-get", ["update"]);
60
+ const installCommand = privilegedCommand(available, "apt-get", ["install", "-y", "subversion"]);
61
+ return {
62
+ platform,
63
+ manager: "apt",
64
+ commands: [updateCommand, installCommand],
65
+ instructions: ["Install Subversion with apt: sudo apt-get update && sudo apt-get install -y subversion"]
66
+ };
67
+ }
68
+ if (available.has("dnf")) {
69
+ return linuxSingleCommandPlan(platform, available, "dnf", ["install", "-y", "subversion"]);
70
+ }
71
+ if (available.has("yum")) {
72
+ return linuxSingleCommandPlan(platform, available, "yum", ["install", "-y", "subversion"]);
73
+ }
74
+ if (available.has("pacman")) {
75
+ return linuxSingleCommandPlan(platform, available, "pacman", ["-Sy", "--noconfirm", "subversion"]);
76
+ }
77
+ if (available.has("zypper")) {
78
+ return linuxSingleCommandPlan(platform, available, "zypper", ["install", "-y", "subversion"]);
79
+ }
80
+ if (available.has("apk")) {
81
+ const command = privilegedCommand(available, "apk", ["add", "subversion"]);
82
+ return {
83
+ platform,
84
+ manager: "apk",
85
+ commands: [command],
86
+ instructions: ["Install Subversion with apk: sudo apk add subversion"]
87
+ };
88
+ }
89
+ return {
90
+ platform,
91
+ commands: [],
92
+ instructions: [
93
+ "Install Subversion with your system package manager, then rerun Pressship."
94
+ ]
95
+ };
96
+ }
97
+ if (platform === "win32") {
98
+ if (available.has("winget")) {
99
+ return {
100
+ platform,
101
+ manager: "winget",
102
+ commands: [{ command: "winget", args: ["install", "--id", "Apache.Subversion", "-e"] }],
103
+ instructions: ["Install Subversion with winget: winget install --id Apache.Subversion -e"]
104
+ };
105
+ }
106
+ if (available.has("choco")) {
107
+ return {
108
+ platform,
109
+ manager: "Chocolatey",
110
+ commands: [{ command: "choco", args: ["install", "subversion", "-y"] }],
111
+ instructions: ["Install Subversion with Chocolatey: choco install subversion -y"]
112
+ };
113
+ }
114
+ return {
115
+ platform,
116
+ commands: [],
117
+ instructions: [
118
+ "Install Subversion for Windows, then make sure svn.exe is available on PATH."
119
+ ]
120
+ };
121
+ }
122
+ return {
123
+ platform,
124
+ commands: [],
125
+ instructions: ["Install Subversion for your operating system, then rerun Pressship."]
126
+ };
127
+ }
128
+ export function formatSubversionInstallInstructions(plan) {
129
+ return [
130
+ "Subversion (`svn`) is required, but it is not installed.",
131
+ ...plan.instructions.map((instruction) => `- ${instruction}`)
132
+ ].join("\n");
133
+ }
134
+ async function findAvailableInstallCommands() {
135
+ const found = new Set();
136
+ for (const command of INSTALL_COMMANDS) {
137
+ if (await commandExists(command)) {
138
+ found.add(command);
139
+ }
140
+ }
141
+ return found;
142
+ }
143
+ async function commandExists(command) {
144
+ const result = process.platform === "win32"
145
+ ? await execa("where", [command], { reject: false, stdout: "ignore", stderr: "ignore" })
146
+ : await execa("sh", ["-c", `command -v ${quoteShell(command)}`], {
147
+ reject: false,
148
+ stdout: "ignore",
149
+ stderr: "ignore"
150
+ });
151
+ return result.exitCode === 0;
152
+ }
153
+ function linuxSingleCommandPlan(platform, available, manager, args) {
154
+ const command = privilegedCommand(available, manager, args);
155
+ return {
156
+ platform,
157
+ manager,
158
+ commands: [command],
159
+ instructions: [`Install Subversion with ${manager}: sudo ${manager} ${args.join(" ")}`]
160
+ };
161
+ }
162
+ function privilegedCommand(available, command, args) {
163
+ return available.has("sudo") ? { command: "sudo", args: [command, ...args] } : { command, args };
164
+ }
165
+ function formatInstallCommands(commands) {
166
+ return commands.map((command) => `${command.command} ${command.args.join(" ")}`).join(" && ");
167
+ }
168
+ function quoteShell(value) {
169
+ return `'${value.replaceAll("'", "'\\''")}'`;
170
+ }
171
+ //# sourceMappingURL=subversion.js.map