add changelog script git-log.js and gitignore python virtual environments (#6092)

* add changelog script git-log.js

* apply PR feedback and remove HISTORY.md
This commit is contained in:
Steven Gum 2020-10-28 09:22:39 -07:00 коммит произвёл GitHub
Родитель 945a55fde7
Коммит 6a4e63e21a
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 149 добавлений и 1 удалений

3
.gitignore поставляемый
Просмотреть файл

@ -17,3 +17,6 @@ bones/
.vs/
.vscode/
.config/
# Python virtual environments
**/*env/

3
tools/changelog/.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,3 @@
# Ignore input and output files for git-log.js
*.txt
*.md

55
tools/changelog/README.md Normal file
Просмотреть файл

@ -0,0 +1,55 @@
# Generating repository changelogs
This script uses the developer's clone of the repository to generate a changelog via `git log`.
## Requirements:
- Node.js > 10.0.0
- Current clone of https://github.com/microsoft/botframework-sdk
- Current clone of the repository and branch to generate a changelog from
## Preferred setup:
- **Each repository should only permit squash merges**
- In most scenarios, the developer calling the script will need to manually update the final contents with better descriptions.
- If the repository accepts all PR merge types, the developer will need to perform more manual edits due to the commit messages.
- Squash merges on GitHub result in commit messages like the following: `"Fix fetch in token server used in E2E Streaming Test (#2944)"`
- Other merges will result in commit messages such as: `"Merge pull request #1411 from <fork/branch>"`
- This results in a non-descriptive format:
```md
- Merge pull request #4661 from microsoft/johtaylo/private-cloud-patch [[PR 4661]](https://github.com/microsoft/botbuilder-dotnet/pull/4661)
```
- **Developers should generate the changelog from the branch that is about to be released**
- Instead of generating it on the default or development branch (e.g `main`), the script should be run on the version branch (e.g. `4.11`).
## Steps
_The steps below use [botbuilder-dotnet](https://github.com/microsoft/botbuilder-dotnet) as an example._
- Clone the target repository and switch to the selected branch for generating a changelog.
- `git clone -b 4.11 https://github.com/microsoft/botbuilder-dotnet && cd botbuilder-dotnet`
- Run `git log` with the following flags and arguments.
- `git log --show-pulls --pretty=tformat:"%s" c6ff4a4.. > dotnet.txt`
- `c6ff4a4..` represents the desired range of commits to log **after commit `c6ff4a4`**.
- In this example, `c6ff4a4` was the latest commit included in the previous changelog.
- Move the `dotnet.txt` file to the folder containing [git-log.js](./git-log.js).
- Navigate to `botframework-sdk\tools\changelog` in your CLI.
- Execute the following command to generate the changelog.
- `node git-log.js dotnet.txt`
- With this command, the changelog can be found as `dotnet.md`.
- `git-log.js` takes an optional second argument which is used as the filename for the output. (Note: the files content will still be [Markdown](https://daringfireball.net/projects/markdown))
The contents of the file should look like the following snippet generated for the 4.11.0 release of the Bot Framework SDK for .NET:
```md
- Teams: MeetingParticipantInfo.InMeeting might be null, if unknown [[PR 4868]](https://github.com/microsoft/botbuilder-dotnet/pull/4868)
- Fix issues with ExpectReplies and Invoke [[PR 4845]](https://github.com/microsoft/botbuilder-dotnet/pull/4845)
- Enable middleware in TestScript and refactor BeginSkill tests [[PR 4866]](https://github.com/microsoft/botbuilder-dotnet/pull/4866)
```
## Questions and Help
For bug reports, feature requests or other feedback, please file an issue in https://github.com/microsoft/botframework-sdk.
## Additional reading
- [About merge methods on GitHub](https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/about-merge-methods-on-github)
- [Squashing your merge commits](https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/about-merge-methods-on-github#squashing-your-merge-commits)
- [Configuring commit squashing for pull requests](https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/configuring-commit-squashing-for-pull-requests)
- [Git - git-log Documentation](https://git-scm.com/docs/git-log)
- [Commit Limiting](https://git-scm.com/docs/git-log#_commit_limiting) (e.g. `--since`, `--before` options)
- [Git - gitrevisions Documentation](https://git-scm.com/docs/gitrevisions)

Просмотреть файл

@ -0,0 +1,87 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
const { createReadStream, createWriteStream, existsSync } = require('fs');
const { once } = require('events');
const { join } = require('path');
const { argv, exit } = require('process');
const { createInterface } = require('readline');
// Remove first two elements from argv, which are `node` and `script.js`.
// Currently the script takes two arguments, which are assigned to
// gitLogFromRepo and optionalOutputName.
const [ gitLogFromRepo, optionalOutputName ] = argv.slice(2);
if (!gitLogFromRepo) {
throw new TypeError('The captured output of `git log` must be passed in.');
}
if (!existsSync(join(__dirname, gitLogFromRepo))) {
throw new ReferenceError(`The provided file "${gitLogFromRepo}" was not found in ${__dirname}`);
}
// Determine the changelogFile (which contains the formatted merges to main)
// and the repository URL.
let changelogFile;
let repository;
if (gitLogFromRepo.startsWith('dotnet')) {
changelogFile = optionalOutputName || 'dotnet.md';
repository = 'botbuilder-dotnet';
} else if (gitLogFromRepo.startsWith('js')) {
changelogFile = optionalOutputName || 'js.md';
repository = 'botbuilder-js';
} else if (gitLogFromRepo.startsWith('python')) {
changelogFile = optionalOutputName || 'python.md';
repository = 'botbuilder-python';
} else if (gitLogFromRepo.startsWith('java')) {
changelogFile = optionalOutputName || 'java.md';
repository = 'botbuilder-java';
} else if (gitLogFromRepo.startsWith('bf-cli')) {
changelogFile = optionalOutputName || 'bf-cli.md';
repository = 'botframework-cli';
}
// git log --show-pulls --pretty=tformat:"%s" --since=2020-08-13 > dotnet.txt
// git log --show-pulls --pretty=tformat:"%s" --since=2020-08-07 > js.txt
// git log --show-pulls --pretty=tformat:"%s" --since=2020-08-10 > python.txt
// git log --show-pulls --pretty=tformat:"%s" --since=2020-08-17 > java.txt
// git log --show-pulls --pretty=tformat:"%s" --since=2020-08-10 > bf-cli.txt
const preparedStream = createWriteStream(changelogFile);
(async function processLineByLine() {
try {
const rl = createInterface({
input: createReadStream(gitLogFromRepo),
crlfDelay: Infinity
});
rl.on('line', (line) => {
// Check for squash merges first. This generates a bulletpoint that
// by default uses the title of the PR and appends the PR number to
// the end of the commit message.
// E.g. "Fix fetch in token server used in E2E Streaming Test (#2944)"
const matches = /(?<message>.*)\s\(#(?<num>\d*)\)$/gim.exec(line);
if (matches) {
const { message, num } = matches.groups;
preparedStream.write(`- ${message} [[PR ${num}]](https://github.com/microsoft/${repository}/pull/${num})\n`);
} else {
// This second check is for PRs that were not squashed and merged.
// E.g. "Merge pull request #1411 from <fork/branch>"
const otherFormatMatches = /^(?<message>Merge pull request #(?<num>\d*) from.*)/gim.exec(line);
if (otherFormatMatches) {
const { message, num } = otherFormatMatches.groups;
preparedStream.write(`- ${message} [[PR ${num}]](https://github.com/microsoft/${repository}/pull/${num})\n`)
}
}
});
await once(rl, 'close');
console.log(`Changelog "${changelogFile}" created.`);
} catch (err) {
const errMsgPrefix = `An error occurred during the creation of the changelog.
Please file an issue in https://github.com/microsoft/botframework-sdk and provide the necessary reproduction steps.\n`
console.error(errMsgPrefix);
console.error(err);
exit(1);
}
})();