git-release-manager
Version:
A tool to generate release notes from git commit history
149 lines • 7.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getChangeInformation = getChangeInformation;
exports.getRangeSummary = getRangeSummary;
exports.renderChangelogTemplate = renderChangelogTemplate;
const commitProcessor_1 = require("../git/commits/commitProcessor");
const context_1 = require("../git/context");
const commitUtils_1 = require("../git/utils/commitUtils");
const sections_1 = require("../sections");
const templateRenderer_1 = require("../../templates/templateRenderer");
const gitOperations_1 = require("../git/gitOperations");
const ReferenceTypesEnum_1 = require("../changes/types/ReferenceTypesEnum");
async function getChangeInformation(rangeInfo) {
var _a;
let header;
let summary;
let currentReference;
let changeCommitsCount = await (0, commitUtils_1.getCommitCount)(rangeInfo.resolvedRange);
currentReference = rangeInfo.latestReference;
header = (_a = currentReference === null || currentReference === void 0 ? void 0 : currentReference.name) !== null && _a !== void 0 ? _a : null;
if (currentReference) {
if ((currentReference === null || currentReference === void 0 ? void 0 : currentReference.reference) != rangeInfo.resolvedTo.reference) {
const commitsAhead = await (0, commitUtils_1.getCommitCount)(`${currentReference === null || currentReference === void 0 ? void 0 : currentReference.reference}..${rangeInfo.resolvedTo.reference}`);
header += ` (+${commitsAhead} commits)`;
}
}
// if (resolvedTo.type === ReferenceTypesEnum.commit) {}
// else if (resolvedTo.type === ReferenceTypesEnum.date) {}
// else if (resolvedTo.type === ReferenceTypesEnum.branch) {}
// else if (resolvedTo.type === ReferenceTypesEnum.ref) {}
// else if (resolvedTo.type === ReferenceTypesEnum.tag) {}
summary = 'Changes';
if (rangeInfo.resolvedFrom.value) {
switch (rangeInfo.resolvedFrom.type) {
case ReferenceTypesEnum_1.ReferenceTypesEnum.commit:
summary += ` from commit ${rangeInfo.resolvedFrom.value}`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.branch:
summary += ` from ${rangeInfo.resolvedFrom.value} branch`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.date:
summary += ` after ${rangeInfo.resolvedFrom.value}`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.tag:
summary += ` from ${rangeInfo.resolvedFrom.value} tag`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.ref:
summary += ` from reference ${rangeInfo.resolvedFrom.value}`;
break;
default:
break;
}
}
else {
summary += ` from initial commit`;
}
if (rangeInfo.resolvedTo.value) {
switch (rangeInfo.resolvedTo.type) {
case ReferenceTypesEnum_1.ReferenceTypesEnum.commit:
summary += ` to commit ${rangeInfo.resolvedTo.value}`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.branch:
summary += ` to ${rangeInfo.resolvedTo.value} branch`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.date:
summary += ` before ${rangeInfo.resolvedTo.value}`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.tag:
summary += ` to ${rangeInfo.resolvedTo.value} tag`;
break;
case ReferenceTypesEnum_1.ReferenceTypesEnum.ref:
summary += ` to reference ${rangeInfo.resolvedTo.value}`;
break;
default:
break;
}
}
else {
summary += ` to HEAD`;
}
return {
header,
summary,
currentReference,
changeCommitsCount,
};
}
async function getRangeSummary(resolvedFrom, resolvedTo) {
const gitInfo = await (0, gitOperations_1.collectGitInfo)(resolvedFrom, resolvedTo);
const rangeSummary = {
...gitInfo,
resolvedFrom,
resolvedTo,
};
return rangeSummary;
}
async function renderChangelogTemplate(templatePath, options, config) {
let fileData = '';
const date = new Date().toISOString().split('T')[0];
const repository = await (0, context_1.getCurrentRepositoryAsync)();
const { resolvedFrom, resolvedTo } = await (0, gitOperations_1.resolveGitReferences)(options);
if (!resolvedFrom || !resolvedTo) {
console.log('Unable to resolve git references');
return;
}
const rangeSummary = await getRangeSummary(resolvedFrom, resolvedTo);
if (rangeSummary.referenceList.length === 0) {
console.log('No tag found');
return;
}
if (options === null || options === void 0 ? void 0 : options.mergeAll) {
const context = await getContext(rangeSummary, config, date, repository);
fileData = await (0, templateRenderer_1.renderTemplate)(templatePath, options === null || options === void 0 ? void 0 : options.environment, context);
}
else {
//burda resolvedTo.type tag ise doğru, commit ise commitList, date ise dateList, branch ise branchList, ref ise refList'te bulunmalı ona göre döngü yapılmalı
// date ise gün gün commitleri alıp context oluşturup render etmek gerekiyor, veya opsionel olarak config'den alınacak parametreye göre bölünecek birim belirtilmeli
// branch ise branch'e göre commitleri alıp context oluşturup render etmek gerekiyor
// ref ise ref'e göre commitleri alıp context oluşturup render etmek gerekiyor, burda kaç ref alınacağı bilgisi bulunmalı
// commit ise commitList'te bulunan commitlerin hepsini alıp context oluşturup render etmek gerekiyor
for (let index = 0; index < rangeSummary.referenceList.length; index++) {
const { resolvedFrom, resolvedTo } = await (0, gitOperations_1.resolveGitReferencesFromRangeSummary)(rangeSummary, index);
if (!resolvedFrom || !resolvedTo) {
continue;
}
const newRangeSummary = await getRangeSummary(resolvedFrom, resolvedTo);
const context = await getContext(newRangeSummary, config, date, repository);
const renderedData = await (0, templateRenderer_1.renderTemplate)(templatePath, options === null || options === void 0 ? void 0 : options.environment, context);
fileData += `\n\n${renderedData}`;
}
}
return fileData;
}
async function getContext(rangeSummary, config, date, repository) {
const changeInfo = await getChangeInformation(rangeSummary);
const commits = await (0, commitProcessor_1.listCommitsAsync)(rangeSummary.resolvedRange, config);
const sections = (0, sections_1.createSections)(commits, config);
const context = {
date,
...rangeSummary,
changeInfo,
repository,
commits,
sections,
config,
};
return context;
}
//# sourceMappingURL=templateOperations.js.map