From 1c439735fd97607aa714583a2a1a08caeff85305 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Wed, 5 Jun 2024 17:01:19 +0800 Subject: [PATCH] Only add version to `.git-blame-ignore-revs` when files changed (#16352) --- .git-blame-ignore-revs | 60 --------------------- scripts/clean-git-blame-ignore-revs-file.js | 49 +++++++++++++++++ scripts/release/steps/bump-prettier.js | 26 ++++++--- 3 files changed, 68 insertions(+), 67 deletions(-) create mode 100644 scripts/clean-git-blame-ignore-revs-file.js diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index c5c644441..0ab5c82ef 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -5,18 +5,8 @@ # See https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revs-fileltfilegt # Prettier bump after release -# 3.3.0 -1af485ad2602b8de23dfa244b59fe6d6534263eb -# 3.2.5 -9a794f9cdbcfdc1536db97e4656e58414523a2f2 -# 3.2.4 -b77b958aecba1d230bd73ce308bdb70163a1c231 # 3.2.3 4985be553e911fef7d83f3341eb143c443473c58 -# 3.2.2 -afc0a6b5fae11c86c18bbc345775821607d4d41d -# 3.2.1 -5811ad00705488365e0d0baf50c92965edddf58e # 3.2.0 ee0d667fa2bf175c194f2f93c98c25a575454476 # 3.1.1 @@ -31,68 +21,18 @@ eebf0e4b5ec8ac24393c56ced4b4819d4c551f31 64b6e83884c2fa513ec6199b1812e03315ebbb4e # 3.0.0 fa484156174a6553b4155a0a7455f69e404b61a7 -# 2.8.8 -fe8fcb5f9888ddbe9c749da01439dbdc7d28e367 -# 2.8.7 -0e26a75ebf0cb5b436f6a2d26a7bb88d04f23b90 -# 2.8.6 -0461cdd8149f0bb9bb95dfac5faed75b47f77689 -# 2.8.5 -c1808e86a3c7c2c8f43093f99e78fce3b6d0a97d -# 2.8.4 -f3b23ab63c9387329dc1993e1d0aa71583d67a0b -# 2.8.3 -9e9f8ec13f0420a4825fdba85d79ddeaaef1e00c # 2.8.2 b9c3cd4c7016dfb1bb3539c5b3db15fdd54b9f6f -# 2.8.1 -b87de09bcf9a523fe3da31394ba0e6f5d107cf3e -# 2.8.0 -4049e49fe2a939facd6f46be338a3be9c1c0489e -# 2.7.1 -1f9baef429df2516ff8eb835fd8c020b5e854a5f # 2.7.0 59ec4f2ef4aef37c10a265aa7fc568c596fb4427 -# 2.6.2 -e2d9e9139d34043c8e6c45cda2777de013340e2e -# 2.6.1 -678fe1562dc1347fc0539334ee5cbaea79ea8af7 # 2.6.0 f7c44237331348c001c2907e844cd0d1530b23ff -# 2.5.1 -4683a6284d53b913f129694a5be666fc55b06982 -# 2.5.0 -846dbdd7e8c9deb315b3e663b3103c559e798a89 -# 2.4.1 -2b5b22056e7e180ba52b04c849b6e8a1e26d87d1 -# 2.4.0 -ef514b9b5c817cf5105bac31a59e88cbdbdf189b -# 2.3.2 -0747d9204113ee4bb4e3c2bab113dc3772a5e8d9 # 2.3.1 a34b4a711ed9928f8809bed3f4c8572dc3a40efb # 2.3.0 3d8dc612b54cef741a1c31da1011a2d48748a1dd -# 2.2.1 -80961835a68e3de1b14819a7b77583a54d2b63d7 -# 2.2.0 -cf354c205de9841a2d306387473dac369359ca2b -# 2.1.2 -c4d3014b95122f4ad19c319a9b3f5f9625d6003f -# 2.1.1 -a8363197118e530d948978da6e5c414a765ba9c0 # 2.1.0 cef4bcafc7867050582d3107632bde7e722575d1 -# 2.0.5 -d33f8a3e2c0a59cb9f383ddec5bbf8d296bb1a23 -# 2.0.4 -592149791e4fea656d8c5fa34c25d4d19076a07a -# 2.0.3 -64b3ac9e8e933a09f049b7cace540ee526f4d5a4 -# 2.0.2 -c1dd17cf383b78fd8fd43442bb5db59b51900410 -# 2.0.1 -f56d620be529b60c13032681446c1eb76e0fb088 # 2.0.0 9dad95b35f935edce4c3d6cfa45c79a0b9c82b9f diff --git a/scripts/clean-git-blame-ignore-revs-file.js b/scripts/clean-git-blame-ignore-revs-file.js new file mode 100644 index 000000000..fbaaf0033 --- /dev/null +++ b/scripts/clean-git-blame-ignore-revs-file.js @@ -0,0 +1,49 @@ +#!/usr/bin/env node + +/* +Clean up `.git-blame-ignore-revs` + +Remove revs without actual file change +*/ + +import fs from "node:fs/promises"; + +import { execa } from "execa"; + +const FILE = new URL("../.git-blame-ignore-revs", import.meta.url); +const content = await fs.readFile(FILE, "utf8"); + +const lines = content.split("\n"); +const revsToRemove = new Set(); + +const IGNORED_FILES = new Set(["package.json", "yarn.lock"]); +async function getChangedFiles(rev) { + const { stdout } = await execa("git", [ + "show", + "--name-only", + "--pretty=", + rev, + ]); + + const files = stdout.split("\n"); + return files; +} + +for (const line of lines) { + if (!line || line.startsWith("#")) { + continue; + } + + const rev = line; + const changedFiles = await getChangedFiles(rev); + + if (changedFiles.every((file) => IGNORED_FILES.has(file))) { + revsToRemove.add(rev); + } +} + +if (revsToRemove.size > 0) { + const updated = lines.filter((line) => !revsToRemove.has(line)).join("\n"); + + await fs.writeFile(FILE, updated); +} diff --git a/scripts/release/steps/bump-prettier.js b/scripts/release/steps/bump-prettier.js index 08992bdd8..5dfe98643 100644 --- a/scripts/release/steps/bump-prettier.js +++ b/scripts/release/steps/bump-prettier.js @@ -9,17 +9,29 @@ async function format() { await runYarn(["lint:prettier", "--write"]); } +// Only add commit to `.git-blame-ignore-revs` when files except `package.json` and `yarn.lock` changed +const IGNORED_FILES = new Set(["package.json", "yarn.lock"]); +async function shouldAddToGitBlameIgnoreRevsFile() { + const { stdout } = await runGit(["diff", "--name-only"]); + const changedFiles = stdout.split("\n"); + return changedFiles.some((file) => !IGNORED_FILES.has(file)); +} + async function commit({ version, repo }) { + const filesChanged = shouldAddToGitBlameIgnoreRevsFile(); + await runGit(["commit", "-am", `Bump Prettier dependency to ${version}`]); // Add rev to `.git-blame-ignore-revs` file - const file = ".git-blame-ignore-revs"; - const mark = "# Prettier bump after release"; - const { stdout: rev } = await runGit(["rev-parse", "HEAD"]); - let text = fs.readFileSync(file, "utf8"); - text = text.replace(mark, `${mark}\n# ${version}\n${rev}`); - fs.writeFileSync(file, text); - await runGit(["commit", "-am", `Git blame ignore ${version}`]); + if (filesChanged) { + const file = ".git-blame-ignore-revs"; + const mark = "# Prettier bump after release"; + const { stdout: rev } = await runGit(["rev-parse", "HEAD"]); + let text = fs.readFileSync(file, "utf8"); + text = text.replace(mark, `${mark}\n# ${version}\n${rev}`); + fs.writeFileSync(file, text); + await runGit(["commit", "-am", `Git blame ignore ${version}`]); + } await runGit(["push", "--repo", repo]); }