From 9ad47d450e59d4bc6fefef49dbd04513157ccc1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Sat, 29 Jun 2024 01:55:18 -0300 Subject: [PATCH 1/6] Adding `tag` as a possible parameter to POST /packages --- src/controllers/postPackages.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/controllers/postPackages.js b/src/controllers/postPackages.js index 8349ee3f..9b7fd15c 100644 --- a/src/controllers/postPackages.js +++ b/src/controllers/postPackages.js @@ -29,6 +29,9 @@ module.exports = { repository: (context, req) => { return context.query.repository(req); }, + tag: (context, req) => { + return context.query.tag(req); + }, auth: (context, req) => { return context.query.auth(req); }, @@ -148,7 +151,8 @@ module.exports = { const newPack = await context.vcs.newPackageData( user.content, ownerRepo, - "git" + "git", + params.tag ); callStack.addCall("vcs.newPackageData", newPack); From 8f5f7aa230e05654ecc8ba2a6602211772edf0ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Sat, 29 Jun 2024 01:55:43 -0300 Subject: [PATCH 2/6] Considering the tag on newPackageData --- src/vcs.js | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/vcs.js b/src/vcs.js index 827f1da2..2b28a64b 100644 --- a/src/vcs.js +++ b/src/vcs.js @@ -99,7 +99,7 @@ async function ownership(userObj, packObj, dev_override = false) { * Contains the full package data. This includes the Readme, the package.json, and all version data. * @todo Stop hardcoding the service that is passed here. */ -async function newPackageData(userObj, ownerRepo, service) { +async function newPackageData(userObj, ownerRepo, service, possibleTag) { try { let provider = null; // Provider above, is the provider that should be assigned to allow interaction @@ -129,25 +129,30 @@ async function newPackageData(userObj, ownerRepo, service) { // information. // See: https://github.com/pulsar-edit/package-backend/issues/205 - const tags = await provider.tags(userObj, ownerRepo); + let tags; + if(possibleTag) { + tags = [{name: possibleTag}]; + } else { + tags = await provider.tags(userObj, ownerRepo); + + if (!tags.ok) { + return new ServerStatus() + .notOk() + .setContent(`Failed to get gh tags for ${ownerRepo} - ${tags.short}`) + .setShort("Server Error") + .build(); + } - if (!tags.ok) { - return new ServerStatus() - .notOk() - .setContent(`Failed to get gh tags for ${ownerRepo} - ${tags.short}`) - .setShort("Server Error") - .build(); + // Sort the tags into descending order + tags = tags.content.sort((a, b) => { + return semver.rcompare(a.name, b.name); + }); } - // Sort the tags into descending order - tags.content.sort((a, b) => { - return semver.rcompare(a.name, b.name); - }); - let pack = await provider.packageJSON( userObj, ownerRepo, - tags.content[0]?.name + tags[0]?.name ); if (!pack.ok) { @@ -162,7 +167,7 @@ async function newPackageData(userObj, ownerRepo, service) { const readme = await provider.readme( userObj, ownerRepo, - tags.content[0]?.name + tags[0]?.name ); if (!readme.ok) { @@ -203,7 +208,7 @@ async function newPackageData(userObj, ownerRepo, service) { ownerRepo: ownerRepo, provider: packRepoObj, packageJson: pack.content, - tags: tags.content, + tags: tags, readme: readme.content, }); } catch (err) { From e9ef304b0ff4885b6274c058951b424738d55592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Thu, 4 Jul 2024 02:36:35 -0300 Subject: [PATCH 3/6] Using a single tag to publish new package --- src/models/constructNewPackagePublishData.js | 39 ++++---------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/src/models/constructNewPackagePublishData.js b/src/models/constructNewPackagePublishData.js index 5c575d20..6b8d8ff4 100644 --- a/src/models/constructNewPackagePublishData.js +++ b/src/models/constructNewPackagePublishData.js @@ -13,7 +13,7 @@ module.exports = function constructNewPackagePublishData(opts = {}) { // ownerRepo = OWNER/REPO (string) // provider = Provider object from VCS // packageJson = The full `package.json` from the latest version - // tags = The GitHub API return of tag information + // tag = The GitHub API return of tag information // readme = The full text readme let out = {}; @@ -39,7 +39,7 @@ module.exports = function constructNewPackagePublishData(opts = {}) { // Now lets setup some constants that we will use over and over let PACK_NAME = findPackName(opts); - let LATEST_VER = findLatestVer(opts); + let PACKAGE_VER = findLatestVer(opts); out.name = PACK_NAME; out.owner = findOwner(opts); @@ -47,7 +47,7 @@ module.exports = function constructNewPackagePublishData(opts = {}) { out.repository = opts.provider; out.metadata = buildMeta(opts); out.releases = { - latest: LATEST_VER, + latest: PACKAGE_VER, }; // From here we want to build or version objects, except we don't have the @@ -59,15 +59,8 @@ module.exports = function constructNewPackagePublishData(opts = {}) { out.versions = {}; // So lets loop through all versions, we will use the same meta object for the // latest, while getting mandatory only fields for the rest - out.versions[LATEST_VER] = buildMeta(opts); - - for (let i = 0; i < opts.tags.length; i++) { - let curVer = semver.clean(opts.tags[i].name); - if (curVer && curVer !== LATEST_VER) { - out.versions[curVer] = buildAbsentVer(curVer, opts); - } - } - + out.versions[PACKAGE_VER] = buildMeta(opts); + buildAbsentVer(PACKAGE_VER, opts) // Now we should be good to go return out; @@ -155,7 +148,7 @@ function buildMeta(opts) { out.engines = { atom: "*" }; } - let tag = findTagForVer(ver, opts); + let tag = opts.tag; sha = tag.commit.sha ?? false; tarball = tag.tarball_url ?? false; @@ -180,7 +173,7 @@ function buildAbsentVer(ver, opts) { // Here we will build an "absent" version object. Since we don't have the // `package.json` of this version, it's considered absent, and will only receive // the mandatory fields we can discover via the current version, and it's tag - let tag = findTagForVer(ver, opts); + let tag = opts.tag; let sha = false; let tarball = false; @@ -213,21 +206,3 @@ function buildAbsentVer(ver, opts) { return out; } - -function findTagForVer(wantedTag, opts) { - let tag = semver.clean(wantedTag); - let tagFound = false; - - for (let i = 0; i < opts.tags.length; i++) { - if (semver.clean(opts.tags[i].name) === tag) { - tagFound = opts.tags[i]; - } - } - - throwIfFalse(tagFound, "", () => { - throw new Error( - `Unable to locate the tag for 'package.json' version '${tag}'. Are you sure you published a matching tag?` - ); - }); - return tagFound; -} From c971f823f04bc1dec08bf81156b174feba71412a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Thu, 4 Jul 2024 02:37:06 -0300 Subject: [PATCH 4/6] Code to get a single "tag" from GitHub --- src/vcs_providers/github.js | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/vcs_providers/github.js b/src/vcs_providers/github.js index 71c0f7fb..46d6152a 100644 --- a/src/vcs_providers/github.js +++ b/src/vcs_providers/github.js @@ -288,6 +288,56 @@ class GitHub extends Git { } } + async tag(userObj, ownerRepo, tagString) { + try { + const raw = await this._webRequestAuth( + `/repos/${ownerRepo}/commits/${tagString}`, + userObj.token + ); + + if (!raw.ok) { + if (raw.short === "Failed Request") { + switch (raw.content.status) { + case 401: + return { + ok: false, + short: "Bad Auth", + content: raw.content.status, + }; + default: + return { + ok: false, + short: "Server Error", + content: raw.content.status, + }; + } + } + return { + ok: false, + short: "Server Error", + content: raw.content.status, + }; + } + + // We have valid commit, let's "coerce" into a tag. + return { + ok: true, + content: { + name: tagString, + commit: { sha: raw.content.body.sha }, + tarball_url: `${this.apiUrl}/repos/${ownerRepo}/tarball/${tagString}` + }, + }; + } catch (err) { + return { + ok: false, + short: "Server Error", + content: null, + error: err, + }; + } + } + /** * @async * @function packageJSON From 44efbcc5003d0a6e0e4a6b7eeb37ec4d3f2cb064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Thu, 4 Jul 2024 02:39:34 -0300 Subject: [PATCH 5/6] Considering a single tag on package creation --- src/vcs.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vcs.js b/src/vcs.js index 2b28a64b..a1820f38 100644 --- a/src/vcs.js +++ b/src/vcs.js @@ -129,9 +129,10 @@ async function newPackageData(userObj, ownerRepo, service, possibleTag) { // information. // See: https://github.com/pulsar-edit/package-backend/issues/205 - let tags; + let tag; if(possibleTag) { - tags = [{name: possibleTag}]; + tag = await provider.tag(userObj, ownerRepo, possibleTag); + tag = tag.content } else { tags = await provider.tags(userObj, ownerRepo); @@ -144,15 +145,16 @@ async function newPackageData(userObj, ownerRepo, service, possibleTag) { } // Sort the tags into descending order - tags = tags.content.sort((a, b) => { + tags.content.sort((a, b) => { return semver.rcompare(a.name, b.name); }); + tag = tags.content[0] } let pack = await provider.packageJSON( userObj, ownerRepo, - tags[0]?.name + tag.name ); if (!pack.ok) { @@ -167,7 +169,7 @@ async function newPackageData(userObj, ownerRepo, service, possibleTag) { const readme = await provider.readme( userObj, ownerRepo, - tags[0]?.name + tag.name ); if (!readme.ok) { @@ -208,7 +210,7 @@ async function newPackageData(userObj, ownerRepo, service, possibleTag) { ownerRepo: ownerRepo, provider: packRepoObj, packageJson: pack.content, - tags: tags, + tag: tag, readme: readme.content, }); } catch (err) { From 0e13bbfcc159fd4735c39a94fe514fcaa1adf51a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Sat, 10 Aug 2024 00:37:43 -0300 Subject: [PATCH 6/6] Capturing only the latest tag --- tests/full/publish.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/full/publish.test.js b/tests/full/publish.test.js index dcdca496..261ef45d 100644 --- a/tests/full/publish.test.js +++ b/tests/full/publish.test.js @@ -358,7 +358,9 @@ describe("publish packages", () => { const pack = res.body; expect(pack.name).toBe("b-pulsar-package"); - expect(pack).toMatchObject(require("./fixtures/b-pulsar-package/match.js")); + let fixture = require("./fixtures/b-pulsar-package/match.js") + fixture.versions = { "2.0.0": fixture.versions["2.0.0"] } + expect(pack).toMatchObject(fixture); await database.removePackageByName("b-pulsar-package", true); });