39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {exec} from '../utils/shelljs';
|
|
|
|
import {parseCommitMessage, ParsedCommitMessage} from './parse';
|
|
|
|
/** Retrieve and parse each commit message in a provide range. */
|
|
export function parseCommitMessagesForRange(range: string): ParsedCommitMessage[] {
|
|
/** A random number used as a split point in the git log result. */
|
|
const randomValueSeparator = `${Math.random()}`;
|
|
/**
|
|
* Custom git log format that provides the commit header and body, separated as expected with the
|
|
* custom separator as the trailing value.
|
|
*/
|
|
const gitLogFormat = `%s%n%n%b${randomValueSeparator}`;
|
|
|
|
// Retrieve the commits in the provided range.
|
|
const result = exec(`git log --reverse --format=${gitLogFormat} ${range}`);
|
|
if (result.code) {
|
|
throw new Error(`Failed to get all commits in the range:\n ${result.stderr}`);
|
|
}
|
|
|
|
return result
|
|
// Separate the commits from a single string into individual commits.
|
|
.split(randomValueSeparator)
|
|
// Remove extra space before and after each commit message.
|
|
.map(l => l.trim())
|
|
// Remove any superfluous lines which remain from the split.
|
|
.filter(line => !!line)
|
|
// Parse each commit message.
|
|
.map(commit => parseCommitMessage(commit));
|
|
}
|