Skip to content

Commit d8dce31

Browse files
authored
Merge pull request #1 from sh1doy/init-impl
Implement initial version
2 parents a4349c7 + ccae77a commit d8dce31

5 files changed

Lines changed: 160 additions & 0 deletions

File tree

background.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
2+
if (
3+
changeInfo.status === "complete" &&
4+
tab.url.indexOf("https://github.com/") > -1
5+
) {
6+
console.log(`updated: ${tab.url}`);
7+
chrome.scripting.executeScript({
8+
target: { tabId: tab.id, allFrames: true },
9+
files: ["./script.js"],
10+
});
11+
}
12+
});

images/128.png

6.32 KB
Loading

images/48.png

3.14 KB
Loading

manifest.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"manifest_version": 3,
3+
"name": "GitHub Release Tag Version Bumper",
4+
"version": "0.0.1",
5+
"description": "One click to bump version and generate release note",
6+
"content_scripts": [
7+
{
8+
"matches": ["https://github.com/*"],
9+
"js": ["script.js"]
10+
}
11+
],
12+
"background": {
13+
"service_worker": "background.js"
14+
},
15+
"permissions": ["tabs", "scripting"],
16+
"host_permissions": ["*://github.com/*"],
17+
"icons": {
18+
"48": "images/48.png",
19+
"128": "images/128.png"
20+
}
21+
}

script.js

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
function getButtonClassName() {
2+
return "version-bumper-buttons";
3+
}
4+
5+
function getDescription() {
6+
return document.createTextNode("Or use Version Bumper. Latest version is ");
7+
}
8+
9+
function getVersionElement(version) {
10+
let elem = document.createElement("code");
11+
elem.textContent = version;
12+
elem.id = "description-version";
13+
return elem;
14+
}
15+
16+
var newDiv = document.createElement("div");
17+
var latestVersion = "v0.0.0";
18+
var buttonDescription = document.createElement("p");
19+
var buttonContainer = document.createElement("div");
20+
var buttonMajor = document.createElement("span");
21+
buttonMajor.onclick = function () {
22+
onBumpButtonClick("major");
23+
};
24+
var buttonMinor = document.createElement("span");
25+
buttonMinor.onclick = function () {
26+
onBumpButtonClick("minor");
27+
};
28+
var buttonPatch = document.createElement("span");
29+
buttonPatch.onclick = function () {
30+
onBumpButtonClick("patch");
31+
};
32+
33+
function onBumpButtonClick(target) {
34+
// Parse version
35+
var parseResult = latestVersion.match(
36+
/(^.*)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(.*$)/
37+
);
38+
if (parseResult == null) {
39+
[prefix, major, minor, patch] = ["v", "0", "0", "0"];
40+
} else {
41+
var [_, prefix, major, minor, patch, suffix] = parseResult;
42+
}
43+
44+
// Bump version
45+
if (target == "major") {
46+
major++;
47+
minor = 0;
48+
patch = 0;
49+
} else if (target == "minor") {
50+
minor++;
51+
patch = 0;
52+
} else if (target == "patch") {
53+
patch++;
54+
}
55+
var newVersion = [prefix, major, ".", minor, ".", patch, suffix].join("");
56+
57+
// Input new version
58+
document
59+
.querySelector(
60+
"input[name='release[tag_name]'][id='release_tag_name__refname_']"
61+
)
62+
.setAttribute("value", newVersion);
63+
document
64+
.querySelector("[id^=tag-select-menu]")
65+
.querySelector("span[data-menu-button]").textContent = newVersion;
66+
var completeTextElement = document.createElement("h4");
67+
completeTextElement.textContent = "Version bumped! 🚀";
68+
var releaseTagTextContainer = document
69+
.querySelector("div[class*='js-release-tag']")
70+
.querySelector("div[aria-live='polite'");
71+
releaseTagTextContainer.innerHTML = "";
72+
releaseTagTextContainer.appendChild(completeTextElement);
73+
74+
// Enable generate release note button
75+
document
76+
.querySelector("button[id='generate-notes-btn']")
77+
.setAttribute("aria-disabled", "false");
78+
}
79+
80+
function main() {
81+
// Return if not on new release screen
82+
if (location.href.indexOf("/releases/new") == -1) return;
83+
84+
// Create buttons if not exist
85+
if (document.getElementById(getButtonClassName()) == null) {
86+
newDiv.className = getButtonClassName();
87+
newDiv.id = getButtonClassName();
88+
buttonDescription.appendChild(getDescription());
89+
buttonDescription.appendChild(getVersionElement());
90+
newDiv.appendChild(buttonDescription);
91+
92+
// Prepare Buttons
93+
buttonMajor.className = "btn";
94+
buttonMajor.textContent = "major";
95+
buttonMajor.style.marginRight = "4px";
96+
buttonMinor.className = "btn";
97+
buttonMinor.textContent = "minor";
98+
buttonMinor.style.marginRight = "4px";
99+
buttonPatch.className = "btn";
100+
buttonPatch.textContent = "patch";
101+
buttonContainer.append(buttonMajor, buttonMinor, buttonPatch);
102+
103+
newDiv.appendChild(buttonContainer);
104+
document
105+
.getElementsByClassName("js-release-tag")[0]
106+
.appendChild(newDiv);
107+
}
108+
109+
// Trigger fetching letest version
110+
var tagSelectMenu = document.querySelector("[id^=tag-select-menu]");
111+
if (tagSelectMenu instanceof HTMLElement) {
112+
tagSelectMenu.dispatchEvent(new Event("mouseover"));
113+
} else return;
114+
115+
var tagItems = tagSelectMenu.getElementsByClassName("SelectMenu-item");
116+
if (tagItems.length > 0) {
117+
var latestItem =
118+
tagItems[0].getElementsByTagName("span")[0].textContent;
119+
} else return;
120+
if (latestItem !== null) {
121+
latestVersion = latestItem;
122+
document.getElementById("description-version").textContent =
123+
latestVersion;
124+
}
125+
}
126+
127+
main();

0 commit comments

Comments
 (0)