您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a link to a GitHub repo's first commit
当前为
- // ==UserScript==
- // @name GitHub First Commit
- // @description Add a link to a GitHub repo's first commit
- // @author chocolateboy
- // @copyright chocolateboy
- // @namespace https://github.com/chocolateboy/userscripts
- // @version 2.2.0
- // @license GPL: http://www.gnu.org/copyleft/gpl.html
- // @include https://github.com/*/*
- // @require https://code.jquery.com/jquery-3.3.1.min.js
- // @require https://cdn.rawgit.com/eclecto/jQuery-onMutate/79bbb2b8caccabfc9b9ade046fe63f15f593fef6/src/jquery.onmutate.min.js
- // @grant GM_log
- // ==/UserScript==
- // XXX note: the unused grant is a workaround for a Greasemonkey bug:
- // https://github.com/greasemonkey/greasemonkey/issues/1614
- const COMMIT_BAR = 'div.commit-tease.js-details-container > span.float-right'
- const FIRST_COMMIT =
- `<span id="first-commit">
- |
- <a id="first-commit-link" style="cursor: pointer" class="message">First commit</a>
- </span>`
- // this function extracts (and navigates to) the URL of the repo's first-commit.
- // it is based on:
- //
- // https://gist.github.com/pitaj/e52862409dd5726711214a55189f332d
- //
- // similar/related snippets are listed here:
- //
- // https://github.com/wong2/first-commit/issues/15#issuecomment-317750579
- function openFirstCommit (user, repo) {
- return fetch(`https://api.github.com/repos/${user}/${repo}/commits`)
- // the `Link` header has additional URLs for paging.
- // parse the original JSON for the case where no other pages exist
- .then(res => Promise.all([res.headers.get('link'), res.json()]))
- .then(([link, commits]) => {
- if (link) {
- // the link header contains two URLs and has the following
- // format in a single line (wrapped for readability):
- //
- // <https://api.github.com/repositories/1234/commits?page=2>;
- // rel="next",
- // <https://api.github.com/repositories/1234/commits?page=9>;
- // rel="last"
- // extract the URL of the last page
- const lastPage = link.match(/^.+?<([^>]+)>;/)[1]
- // fetch the last page of results
- return fetch(lastPage).then(res => res.json())
- }
- // if no link, we know we're on the only page
- return commits
- })
- // get the last commit and extract the target URL
- .then(commits => commits[commits.length - 1].html_url)
- // navigate there
- .then(url => location.href = url)
- }
- // add the "First commit" link as the last child of the commit bar
- function addLink ($commitBar) {
- const [user, repo] = $('meta[name="octolytics-dimension-repository_network_root_nwo"]')
- .attr('content')
- .split('/')
- // the "First commit" link already exists when navigating to a repo's
- // homepage via the back button. however, resurrecting the link in this way
- // causes its onclick event handler to be unregistered (XXX why?), so we
- // need to re-attach it
- let $firstCommit = $commitBar.find('#first-commit')
- if (!$firstCommit.length) {
- $firstCommit = $(FIRST_COMMIT)
- $commitBar.append($firstCommit)
- }
- const $link = $firstCommit.find('#first-commit-link')
- $link.on('click', event => {
- $link.text('Loading...')
- openFirstCommit(user, repo)
- return false
- })
- }
- // the commit bar (div.commit-tease) is statically defined in the HTML
- // for users who aren't logged in. for logged in users, it's loaded dynamically
- // via an <include-fragment> custom element:
- //
- // https://github.com/github/include-fragment-element
- //
- // jQuery-onMutate fires the callback immediately if the element already exists,
- // so it handles both cases
- // #js-repo-pjax-container is only created on repo homepages
- // see here for more details: https://github.com/Mottie/GitHub-userscripts/wiki/How-to
- $('#js-repo-pjax-container').onCreate(COMMIT_BAR, addLink, true /* multi */)
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址