您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A simple userscript to view the very first commit of a GitHub repository.
- // ==UserScript==
- // @name GitHub First Commit
- // @namespace https://github.com/lazypolymath
- // @version 1.0.0
- // @author https://github.com/lazypolymath
- // @description A simple userscript to view the very first commit of a GitHub repository.
- // @license MIT
- // @icon https://github.githubassets.com/favicons/favicon.svg
- // @source https://github.com/lazypolymath/first-commit
- // @match https://github.com/*/*
- // @connect api.github.com
- // ==/UserScript==
- (function () {
- 'use strict';
- (async () => {
- const tabContainerSelector = ".position-relative.header-wrapper.js-header-wrapper > header > div.AppHeader-localBar > nav > ul";
- const renderTab = async () => {
- var _a, _b;
- const url = new URL(document.location.href);
- let pathname = url.pathname.substring(1);
- const segments = pathname.split("/");
- const author = segments[0].trim();
- const repositoryName = segments[1].trim();
- if (author === "" || repositoryName === "") {
- return;
- }
- const tabContainerEl = document.querySelector(tabContainerSelector);
- if (!tabContainerEl) {
- return;
- }
- const lastEl = tabContainerEl.querySelector("li:last-child");
- if (!lastEl) {
- return;
- }
- let response = await fetch(
- `https://api.github.com/repos/${author}/${repositoryName}/commits?per_page=1&page=1`
- );
- const linkHeader = response.headers.get("link");
- const matches = /rel="next",\s\<(.*?)\>;\srel="last"/.exec(
- linkHeader || ""
- );
- if (!matches || !matches.length) {
- return;
- }
- const firstCommitURL = matches[1];
- response = await fetch(firstCommitURL);
- const json = await response.json();
- if (json && json.length && json[0].sha) {
- const data = json[0];
- const sha = data.sha;
- const commit = data.commit;
- const firstCommitTabEl = lastEl.cloneNode(true);
- (_a = firstCommitTabEl.querySelector("a")) == null ? void 0 : _a.remove();
- const tabLinkEl = document.createElement("a");
- tabLinkEl.id = "first-commit-tab-link";
- tabLinkEl.title = `Message: ${commit.message}
- Author: ${commit.committer.name || "Anonymous"}
- DateTime: ${commit.committer.date}
- Comments: ${commit.comment_count || 0}`;
- tabLinkEl.setAttribute(
- "class",
- ((_b = lastEl.querySelector("a")) == null ? void 0 : _b.getAttribute("class")) || ""
- );
- tabLinkEl.href = `https://github.com/${author}/${repositoryName}/commit/${sha}`;
- tabLinkEl.innerHTML = `
- <svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 -2 20 20" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg>
- <span data-content="First Commit">First Commit</span>
- `;
- tabContainerEl.append(tabLinkEl);
- }
- };
- const handleHistoryChange = async () => {
- setTimeout(async () => {
- if (document.querySelector("#first-commit-tab-link")) {
- return;
- }
- await renderTab();
- }, 1e3);
- };
- (function(history) {
- const originalPushState = history.pushState;
- history.pushState = function(...args) {
- const result = originalPushState.apply(this, args);
- const pushStateEvent = new CustomEvent("pushState", {
- detail: { ...args }
- });
- window.dispatchEvent(pushStateEvent);
- return result;
- };
- })(window.history);
- window.addEventListener("popstate", handleHistoryChange);
- window.addEventListener("pushState", handleHistoryChange);
- await renderTab();
- })();
- })();