From 42442264213307d87c2bfdffdd8201092d8ccbd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BChler?= Date: Thu, 18 Jan 2018 10:49:10 +0100 Subject: [PATCH] chore(semantic-release): custom script for now to get git head --- etc/get-last-release.js | 102 ++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- yarn.lock | 18 +------ 3 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 etc/get-last-release.js diff --git a/etc/get-last-release.js b/etc/get-last-release.js new file mode 100644 index 0000000..ff11e27 --- /dev/null +++ b/etc/get-last-release.js @@ -0,0 +1,102 @@ +const fetch = require('node-fetch'); +const semver = require('semver'); +const getPkg = require('read-pkg-up'); +const execa = require('execa'); +const registry = 'vs code marketplace'; + +/** + * Get the commit sha for a given tag. + * + * @param {string} tagName Tag name for which to retrieve the commit sha. + * + * @return {string} The commit sha of the tag in parameter or `null`. + */ +async function gitTagHead(tagName, logger) { + try { + return await execa.stdout('git', ['rev-list', '-1', tagName]); + } catch (err) { + logger.error(err); + return null; + } +} + +/** + * Unshallow the git repository (retriving every commits and tags). + */ +async function unshallow() { + await execa('git', ['fetch', '--unshallow', '--tags'], { reject: false }); +} + +async function getVersionHead(version, logger) { + let tagHead = (await gitTagHead(`v${version}`)) || (await gitTagHead(version)); + + // Check if tagHead is found + if (tagHead) { + logger.log('Use tagHead: %s', tagHead); + return tagHead; + } + await unshallow(); + + // Check if tagHead is found + tagHead = (await gitTagHead(`v${version}`)) || (await gitTagHead(version)); + if (tagHead) { + logger.log('Use tagHead: %s', tagHead); + return tagHead; + } +} + +/** + References: + * https://github.com/Microsoft/vscode/blob/master/src/vs/platform/extensionManagement/node/extensionGalleryService.ts#L423 + * https://github.com/Microsoft/vscode/blob/b00945fc8c79f6db74b280ef53eba060ed9a1388/product.json#L17-L21 +*/ + +module.exports = async (_pluginConfig, { logger }) => { + const { pkg: { name, publisher } } = await getPkg(); + const extensionId = `${publisher}.${name}`; + logger.log(`Lookup extension details for "${extensionId}".`); + const body = JSON.stringify({ + filters: [ + { + pageNumber: 1, + pageSize: 1, + criteria: [ + { filterType: 7, value: extensionId } + ] + } + ], + 'assetTypes': [], + 'flags': 512 + }); + + const res = await fetch('https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery', { + method: 'POST', + headers: { + 'Accept': 'application/json;api-version=3.0-preview.1', + 'Content-Type': 'application/json', + 'Content-Length': body.length + }, + body + }); + const { results = [] } = await res.json(); + const [{ extensions = [] } = {}] = results; + + const [{ versions = [] }] = extensions.filter(({ extensionName, publisher: { publisherName } }) => { + return extensionId === `${publisherName}.${extensionName}`; + }); + const [version] = versions + .map(({ version }) => version) + .sort(semver.compare) + .reverse(); + + if (!version) { + logger.log('No version found of package %s found on %s', extensionId, registry); + return {}; + } + + logger.log('Found version %s of package %s', version, extensionId); + return { + gitHead: await getVersionHead(version, logger), + version + }; +}; diff --git a/package.json b/package.json index 5639b44..8bf9fb7 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "semantic-release-vsce", "@semantic-release/github" ], - "getLastRelease": "semantic-release-visualstudio-marketplace-version", + "getLastRelease": "./etc/get-last-release", "publish": [ { "path": "semantic-release-vsce", @@ -90,7 +90,6 @@ "filewalker": "^0.1.3", "jest": "^22.1.2", "semantic-release": "^12.2.2", - "semantic-release-visualstudio-marketplace-version": "^1.0.0", "semantic-release-vsce": "^1.0.2", "ts-jest": "^22.0.1", "tslint": "^5.9.1", diff --git a/yarn.lock b/yarn.lock index a0efaae..617d773 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,10 +20,6 @@ import-from "^2.1.0" lodash "^4.17.4" -"@semantic-release/error@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-1.0.0.tgz#bb8f8eeedd5c7f8c46f96b37ef39e1b8c376c1cc" - "@semantic-release/error@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-2.1.0.tgz#44771f676f5b148da309111285a97901aa95a6e0" @@ -3293,10 +3289,6 @@ lodash.escape@^3.0.0: dependencies: lodash._root "^3.0.0" -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -4375,7 +4367,7 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.74.0, request@^2.79.0, request@^2.83.0: +request@^2.74.0, request@^2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -4520,14 +4512,6 @@ sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -semantic-release-visualstudio-marketplace-version@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semantic-release-visualstudio-marketplace-version/-/semantic-release-visualstudio-marketplace-version-1.0.0.tgz#917ef82ba19ee6a860cf835273a8e0b78778bd2d" - dependencies: - "@semantic-release/error" "^1.0.0" - lodash.get "^4.4.2" - request "^2.79.0" - semantic-release-vsce@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/semantic-release-vsce/-/semantic-release-vsce-1.0.2.tgz#333fe5121f004dddd1d3eccc79ff0d84cc231175"