diff options
author | Fabio Berger <me@fabioberger.com> | 2018-06-19 18:35:32 +0800 |
---|---|---|
committer | Fabio Berger <me@fabioberger.com> | 2018-06-19 18:35:32 +0800 |
commit | 08ea71cb243067d8f4a4b08b2ed83ee11225d494 (patch) | |
tree | 0b9e213e05a050ede2be9d11ed2e040dc0947a81 /packages/monorepo-scripts/src/utils/utils.ts | |
parent | 0d0c1af7f741834f076a604b776d4542c4dbb6ec (diff) | |
parent | 0bfcf79e79b762a9fb98e90b8e6310c781cfae97 (diff) | |
download | dexon-sol-tools-08ea71cb243067d8f4a4b08b2ed83ee11225d494.tar dexon-sol-tools-08ea71cb243067d8f4a4b08b2ed83ee11225d494.tar.gz dexon-sol-tools-08ea71cb243067d8f4a4b08b2ed83ee11225d494.tar.bz2 dexon-sol-tools-08ea71cb243067d8f4a4b08b2ed83ee11225d494.tar.lz dexon-sol-tools-08ea71cb243067d8f4a4b08b2ed83ee11225d494.tar.xz dexon-sol-tools-08ea71cb243067d8f4a4b08b2ed83ee11225d494.tar.zst dexon-sol-tools-08ea71cb243067d8f4a4b08b2ed83ee11225d494.zip |
Merge branch 'v2-prototype' into feature/combinatorial-testing
* v2-prototype: (40 commits)
Increase number of columns in relayer grid for small screens
Make isValidSignature public
Make batchFill methods return FIllResults struct
Remove remove_tags script
Small fixes
Use semver package instead of getNextPatchVersion
Use semver library instead of semverUtils
small fixes
Show all errors of a given kind at once rather then throwing after the first instance is encountered
fix package.json
Add more prepublish checks
remove remove_tags script
Create a shared Image component
Adjust version in changelog
Update RelayerGridTile render logic to incorportate colors and logos
Add max width to top bar
Set max-width for LargeLayout
Finish last onboarding step
Finish set allowance step
Add onboarding assets
...
Diffstat (limited to 'packages/monorepo-scripts/src/utils/utils.ts')
-rw-r--r-- | packages/monorepo-scripts/src/utils/utils.ts | 110 |
1 files changed, 82 insertions, 28 deletions
diff --git a/packages/monorepo-scripts/src/utils/utils.ts b/packages/monorepo-scripts/src/utils/utils.ts index 0b8ac4c0b..20bc57bae 100644 --- a/packages/monorepo-scripts/src/utils/utils.ts +++ b/packages/monorepo-scripts/src/utils/utils.ts @@ -1,27 +1,17 @@ -import * as fs from 'fs'; import lernaGetPackages = require('lerna-get-packages'); import * as _ from 'lodash'; import { exec as execAsync } from 'promisify-child-process'; +import semver = require('semver'); import { constants } from '../constants'; -import { UpdatedPackage } from '../types'; +import { GitTagsByPackageName, UpdatedPackage } from '../types'; + +import { changelogUtils } from './changelog_utils'; export const utils = { log(...args: any[]): void { console.log(...args); // tslint:disable-line:no-console }, - getNextPatchVersion(currentVersion: string): string { - const versionSegments = currentVersion.split('.'); - const patch = _.parseInt(_.last(versionSegments) as string); - const newPatch = patch + 1; - const newPatchVersion = `${versionSegments[0]}.${versionSegments[1]}.${newPatch}`; - return newPatchVersion; - }, - async prettifyAsync(filePath: string, cwd: string): Promise<void> { - await execAsync(`prettier --write ${filePath} --config .prettierrc`, { - cwd, - }); - }, async getUpdatedLernaPackagesAsync(shouldIncludePrivate: boolean): Promise<LernaPackage[]> { const updatedPublicPackages = await this.getLernaUpdatedPackagesAsync(shouldIncludePrivate); const updatedPackageNames = _.map(updatedPublicPackages, pkg => pkg.name); @@ -43,22 +33,86 @@ export const utils = { } return updatedPackages; }, - getChangelogJSONIfExists(changelogPath: string): string | undefined { - try { - const changelogJSON = fs.readFileSync(changelogPath, 'utf-8'); - return changelogJSON; - } catch (err) { - return undefined; + async getNextPackageVersionAsync( + currentVersion: string, + packageName: string, + packageLocation: string, + ): Promise<string> { + let nextVersionIfValid; + const changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, packageLocation); + if (_.isEmpty(changelog)) { + nextVersionIfValid = semver.inc(currentVersion, 'patch'); + } + const lastEntry = changelog[0]; + nextVersionIfValid = semver.eq(lastEntry.version, currentVersion) + ? semver.inc(currentVersion, 'patch') + : lastEntry.version; + if (_.isNull(nextVersionIfValid)) { + throw new Error(`Encountered invalid semver: ${currentVersion} associated with ${packageName}`); } + return nextVersionIfValid; }, - getChangelogJSONOrCreateIfMissing(changelogPath: string): string { - const changelogIfExists = this.getChangelogJSONIfExists(changelogPath); - if (_.isUndefined(changelogIfExists)) { - // If none exists, create new, empty one. - const emptyChangelogJSON = JSON.stringify([]); - fs.writeFileSync(changelogPath, emptyChangelogJSON); - return emptyChangelogJSON; + async getRemoteGitTagsAsync(): Promise<string[]> { + const result = await execAsync(`git ls-remote --tags`, { + cwd: constants.monorepoRootPath, + }); + const tagsString = result.stdout; + const tagOutputs: string[] = tagsString.split('\n'); + const tags = _.compact( + _.map(tagOutputs, tagOutput => { + const tag = tagOutput.split('refs/tags/')[1]; + // Tags with `^{}` are duplicateous so we ignore them + // Source: https://stackoverflow.com/questions/15472107/when-listing-git-ls-remote-why-theres-after-the-tag-name + if (_.endsWith(tag, '^{}')) { + return undefined; + } + return tag; + }), + ); + return tags; + }, + async getLocalGitTagsAsync(): Promise<string[]> { + const result = await execAsync(`git tags`, { + cwd: constants.monorepoRootPath, + }); + const tagsString = result.stdout; + const tags = tagsString.split('\n'); + return tags; + }, + async getGitTagsByPackageNameAsync(packageNames: string[], gitTags: string[]): Promise<GitTagsByPackageName> { + const tagVersionByPackageName: GitTagsByPackageName = {}; + _.each(gitTags, tag => { + const packageNameIfExists = _.find(packageNames, name => { + return _.includes(tag, `${name}@`); + }); + if (_.isUndefined(packageNameIfExists)) { + return; // ignore tags not related to a package we care about. + } + const splitTag = tag.split(`${packageNameIfExists}@`); + if (splitTag.length !== 2) { + throw new Error(`Unexpected tag name found: ${tag}`); + } + const version = splitTag[1]; + (tagVersionByPackageName[packageNameIfExists] || (tagVersionByPackageName[packageNameIfExists] = [])).push( + version, + ); + }); + return tagVersionByPackageName; + }, + async removeLocalTagAsync(tagName: string): Promise<void> { + const result = await execAsync(`git tag -d ${tagName}`, { + cwd: constants.monorepoRootPath, + }); + if (!_.isEmpty(result.stderr)) { + throw new Error(`Failed to delete local git tag. Got err: ${result.stderr}`); + } + }, + async removeRemoteTagAsync(tagName: string): Promise<void> { + const result = await execAsync(`git push origin ${tagName}`, { + cwd: constants.monorepoRootPath, + }); + if (!_.isEmpty(result.stderr)) { + throw new Error(`Failed to delete remote git tag. Got err: ${result.stderr}`); } - return changelogIfExists; }, }; |