Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Support updates to previous major versions #62

Merged
merged 5 commits into from
Sep 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
node: [16.x, 15.x, 14.x, 13.x, 12.x, 10.x]
node: [22.x, 20.x, 18.x, 16.x, 15.x, 14.x, 13.x, 12.x, 10.x]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
Expand Down
43 changes: 41 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,51 @@ When you run the release tool for a regular release, the following steps take pl
1. Calculates the next release version based on the [commit message format](http://eslint.org/docs/developer-guide/contributing/pull-requests#step-2-make-your-changes) of the changes since the last release
1. Updates `CHANGELOG.md` and commits the changes
1. Runs `npm version` to update the version
1. Pushes the repository to origin/master with tags (only outside of CI release)
1. Pushes the current branch to origin, with tags
1. Creates GitHub release marked as Latest
1. Converts all line endings to Unix style
1. Publishes the package to npm
1. Reverts any file changes

When you do a prerelease, the same steps are taken except that package is published to npm under the `next` tag instead of `latest`.
When you do a prerelease, the same steps are taken except that package is published to npm under the `next` tag instead of `latest`, and the GitHub release is marked as Pre-release.

## API Usage

This package exports two functions:

* `generateRelease(prereleaseId, packageTag)` - This corresponds to the CLI command `eslint-generate-release` when `prereleaseId` is `undefined`, and the CLI command `eslint-generate-prerelease prereleaseId` when `prereleaseId` is a string value.
* `publishRelease()` - This corresponds to the CLI command `eslint-publish-release`.

`packageTag` is used as the `--tag` value in the `npm publish` command. It's also used to determine whether a regular release will be marked as Latest on GitHub: it will be marked as Latest only if `packageTag` is `"latest"`. This parameter is optional and defaults to `"latest"` when `prereleaseId` is `undefined`, `"next"` otherwise.

### Examples

Publish a regular latest release:

```js
const ReleaseOps = require("eslint-release");

ReleaseOps.generateRelease();
ReleaseOps.publishRelease();
```

Publish a regular release with `maintenance` tag:

```js
const ReleaseOps = require("eslint-release");

ReleaseOps.generateRelease(undefined, "maintenance");
ReleaseOps.publishRelease();
```

Publish an `alpha` prerelease:

```js
const ReleaseOps = require("eslint-release");

ReleaseOps.generateRelease("alpha");
ReleaseOps.publishRelease();
```

## Contributing

Expand Down
23 changes: 14 additions & 9 deletions lib/release-ops.js
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,9 @@ function getPrereleaseVersion(currentVersion, prereleaseId, releaseType) {
* @private
*/
function getVersionTags() {
const tags = ShellOps.execSilent("git tag").trim().split("\n");

// Using `--merged` to only list tags whose commits are reachable from HEAD
const tags = ShellOps.execSilent("git tag --merged").trim().split("\n");

return tags.reduce((list, tag) => {
if (semver.valid(tag)) {
Expand Down Expand Up @@ -347,10 +349,12 @@ function writeChangelog(releaseInfo) {
const now = new Date(),
today = dateformat(now, "mmmm d, yyyy");

releaseInfo.markdownChangelog = `v${releaseInfo.version} - ${today}\n\n${releaseInfo.rawChangelog}\n\n`;

// output header and changelog
fs.writeFileSync(
"CHANGELOG.tmp",
`v${releaseInfo.version} - ${today}\n\n${releaseInfo.rawChangelog}\n\n`
releaseInfo.markdownChangelog
);

// ensure there's a CHANGELOG.md file
Expand All @@ -370,9 +374,10 @@ function writeChangelog(releaseInfo) {
* Creates a release version tag and pushes to origin and npm.
* @param {string} [prereleaseId] The prerelease ID (alpha, beta, rc, etc.).
* Only include when doing a prerelease.
* @param {string} [packageTag] Tag added to the package submitted to the npm registry.
* @returns {Object} The information about the release.
*/
function generateRelease(prereleaseId) {
function generateRelease(prereleaseId, packageTag = prereleaseId ? "next" : "latest") {

validateSetup();

Expand All @@ -382,7 +387,10 @@ function generateRelease(prereleaseId) {
console.log("Calculating changes for release");
const releaseInfo = calculateReleaseInfo(prereleaseId);

releaseInfo.packageTag = packageTag;

console.log("Release is %s", releaseInfo.version);
console.log("Package tag is %s", releaseInfo.packageTag);

console.log("Generating changelog");
writeChangelog(releaseInfo);
Expand Down Expand Up @@ -444,7 +452,8 @@ function publishReleaseToGitHub(releaseInfo) {
return repo.createRelease({
tag_name: tag, // eslint-disable-line camelcase
body: generateReleaseBody(releaseInfo.changelog),
prerelease: !!semver.prerelease(releaseInfo.version)
prerelease: !!semver.prerelease(releaseInfo.version),
make_latest: String(releaseInfo.packageTag === "latest") // eslint-disable-line camelcase
}).then(() => {
console.log("Posted release notes to GitHub");
}).catch(ex => {
Expand Down Expand Up @@ -480,11 +489,7 @@ function publishRelease() {
// if there's a prerelease ID, publish under "next" tag
console.log("Publishing to npm");

let command = "npm publish";

if (semver.prerelease(releaseInfo.version)) {
command += " --tag next";
}
let command = `npm publish --tag ${releaseInfo.packageTag}`;

if (process.env.NPM_OTP && /^\d+$/.test(process.env.NPM_OTP)) {
command += ` --otp=${process.env.NPM_OTP}`;
Expand Down
Loading