@jwpkg/gitversion
Version:
Gitversion is a complete customizable git-based release management system
157 lines • 16.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PublishCommand = void 0;
const clipanion_1 = require("clipanion");
const colorize_node_1 = require("colorize-node");
const path_1 = require("path");
const application_1 = require("../core/application");
const configuration_1 = require("../core/configuration");
const format_utils_1 = require("../core/format-utils");
const pack_artifact_1 = require("../core/pack-artifact");
const context_1 = require("./context");
class PublishCommand extends context_1.GitVersionCommand {
static paths = [
['publish'],
];
push = clipanion_1.Option.Boolean('--push', true, { description: 'Push the changes to the remote repository' });
tag = clipanion_1.Option.Boolean('--tag', true, { description: 'Tag the commit with the version' });
dryRun = clipanion_1.Option.Boolean('--dry-run', false);
async execute() {
const application = await application_1.Application.init(this.context.application, {
dryRun: this.dryRun,
});
const context = {
...this.context,
application,
};
const { project, git, configuration, branch, hooks, packManagers, logger } = application;
if (!project) {
return 1;
}
let packManifest = await pack_artifact_1.PackArtifact.load(configuration, git);
if (!packManifest) {
logger.reportInfo('No pack manifest found. Running pack on current workspace');
const result = await this.cli.run(['pack'], context);
if (result !== 0) {
return result;
}
packManifest = await pack_artifact_1.PackArtifact.load(configuration, git);
}
else {
logger.reportInfo('Pack manifest found. Publishing from pack');
}
if (packManifest === null) {
logger.reportError('Still invalid pack manifest. Breaking off');
return 1;
}
if (!(await packManifest.validateGitStatusForPublish())) {
logger.reportWarning('Git status has changed since pack. Please make sure you have a valid flow', true);
console.log('Git status output:');
console.log(await git.exec('status', '--porcelain'));
}
const packedPackages = packManifest.packages;
if (packedPackages.length > 0) {
await this.publishPackages(packManagers, packedPackages, configuration, branch, logger);
if (this.tag) {
await this.addTags(packedPackages, git, logger);
}
else {
logger.reportInfo('Skipping tagging step');
}
if (this.push) {
await git.push();
}
else {
logger.reportInfo('Skipping push step');
}
await this.updateChangelogs(packedPackages, project, git, logger);
const isDefaultChangelogBranch = application.branch.type !== configuration_1.BranchType.FEATURE;
const shouldPushChangelogs = this.push && (isDefaultChangelogBranch || configuration.options.featurePushChangelogs);
if (shouldPushChangelogs) {
await git.push();
}
else {
logger.reportInfo('Skipping push step');
}
await hooks.dispatchOnPublish(application, packedPackages);
}
else {
logger.reportWarning('Nothing to publish');
}
return 0;
}
async publishPackages(packManagers, packedPackages, configuration, branch, logger) {
const publish = logger.beginSection('Publish step');
const promises = packedPackages.map(async (packedPackage) => {
if (packedPackage.packFiles) {
await this.publishPackage(packManagers, packedPackage, configuration, branch, logger);
}
});
await Promise.all(promises);
logger.endSection(publish);
}
async publishPackage(packManagers, packedPackage, configuration, branch, logger) {
return logger.runSection(`Publishing ${(0, format_utils_1.formatPackageName)(packedPackage.packageName)}`, async () => {
const releaseTag = branch.type === configuration_1.BranchType.MAIN ? 'latest' : branch.name;
const publishCommands = packManagers.map(async (packManager) => {
if (packedPackage.packFiles?.[packManager.ident]) {
try {
const packFiles = packedPackage.packFiles[packManager.ident];
if (Array.isArray(packFiles)) {
for (const file of packFiles) {
await packManager.publish(packedPackage, (0, path_1.join)(configuration.packFolder, packManager.ident, file), releaseTag, this.dryRun);
}
}
else if (typeof packFiles === 'string') {
await packManager.publish(packedPackage, (0, path_1.join)(configuration.packFolder, packManager.ident, packFiles), releaseTag, this.dryRun);
}
else if (typeof packFiles === 'object' && packFiles !== null) {
// If packFiles is an object, we assume it's a record of files
for (const [key, file] of Object.entries(packFiles)) {
await packManager.publish(packedPackage, (0, path_1.join)(configuration.packFolder, packManager.ident, file), releaseTag, this.dryRun, key);
}
}
}
catch (error) {
logger.reportError(`Error publishing ${(0, format_utils_1.formatPackageName)(packedPackage.packageName)}@${(0, format_utils_1.formatVersion)(packedPackage.version)} with plugin ${colorize_node_1.colorize.yellowBright('name' in packManager && typeof packManager.name === 'string' ? packManager.name : packManager.ident)}`, true);
throw error;
}
}
});
await Promise.all(publishCommands);
});
}
async addTags(packages, git, logger) {
const section = logger.beginSection('Tagging step');
const allTags = packages.map(p => p.tag);
const tags = allTags.filter((tag, pos) => {
return allTags.indexOf(tag) == pos;
});
const commands = tags.map(async (tag) => {
await git.addTag(tag, 'Tag added by gitversion');
});
await Promise.all(commands);
logger.endSection(section);
}
async updateChangelogs(packages, project, git, logger) {
const section = logger.beginSection('Updating changelogs');
const files = [];
const commands = packages.map(async (p) => {
const workspace = project.workspaces.find(w => w.relativeCwd === p.packageRelativeCwd);
if (workspace) {
const file = await workspace.updateChangelog(p.changeLog);
if (!files.includes(file)) {
logger.reportInfo(`Updating: ${colorize_node_1.colorize.yellow(colorize_node_1.colorize.underline((0, path_1.join)(workspace.cwd, 'CHANGELOG.md')))}`);
files.push(file);
}
}
});
await Promise.all(commands);
if (files.length > 0) {
await git.addAndCommitFiles('Updated changelogs', files);
}
logger.endSection(section);
}
}
exports.PublishCommand = PublishCommand;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wdWJsaXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFtQztBQUNuQyxpREFBeUM7QUFDekMsK0JBQTRCO0FBRTVCLHFEQUFrRDtBQUNsRCx5REFBa0Y7QUFDbEYsdURBQXdFO0FBR3hFLHlEQUFvRTtBQUlwRSx1Q0FBOEM7QUFFOUMsTUFBYSxjQUFlLFNBQVEsMkJBQWlCO0lBQ25ELE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixDQUFDLFNBQVMsQ0FBQztLQUNaLENBQUM7SUFFRixJQUFJLEdBQUcsa0JBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSwyQ0FBMkMsRUFBRSxDQUFDLENBQUM7SUFDcEcsR0FBRyxHQUFHLGtCQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxXQUFXLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sR0FBRyxrQkFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFNUMsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLFdBQVcsR0FBRyxNQUFNLHlCQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQ25FLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNwQixDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsSUFBSSxDQUFDLE9BQU87WUFDZixXQUFXO1NBQ1osQ0FBQztRQUVGLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFFekYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2Is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