您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Filter Cloud Hypervisor passed or non-required checks.
- // ==UserScript==
- // @name GitHub Actions Filter Button
- // @namespace http://www.nxw.name
- // @version 1.0.10
- // @description Filter Cloud Hypervisor passed or non-required checks.
- // @author Xuewei Niu
- // @match *://github.com/cloud-hypervisor/cloud-hypervisor*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
- // @grant none
- // @license Apache-2.0
- // ==/UserScript==
- var filteredItems = 0;
- var checkCount = 0;
- var filterButton;
- function onFilterButtonClicked() {
- var checks = document.querySelectorAll('div.merge-status-list.hide-closed-list.js-updatable-content-preserve-scroll-position > div');
- if (checks.length == 0) {
- console.log('stop hiding checks: they aren\'t ready')
- return;
- }
- if (checkCount === 0) {
- checkCount = checks.length;
- }
- var hidden = (filteredItems === 0);
- if (!hidden) {
- // Count the number of showing checks
- var showingCheckCount = 0;
- checks.forEach(function(check) {
- if (!check.classList.contains('hidden-check')) {
- showingCheckCount += 1;
- }
- });
- // GitHub updates periodly to restore the hidden checks.
- // We need to update `hidden` to fit the above issue.
- if (checkCount === showingCheckCount) {
- console.log('checks were updated, hide checks again');
- hidden = true;
- }
- filteredItems = 0
- }
- checks.forEach(function(check) {
- if (hidden) {
- // There is no github icon in the case of non-gha,
- // so the indexes of status element and details element
- // are required to calculate dynamically.
- var elemCount = check.childElementCount;
- var statusElement = check.querySelector('div:nth-child('+ (elemCount-1) +')');
- if (!statusElement) {
- console.debug(statusElement, 'check status not found');
- return;
- }
- var detailsElement = check.querySelector('div:nth-child('+ elemCount +')');
- if (!detailsElement) {
- console.debug(detailsElement, 'check details not found');
- return;
- }
- var statusText = statusElement.textContent;
- var requiredText = detailsElement.textContent;
- // 'Successful in' for GHA, 'Build finished' for Jenkins
- var successful = statusText.includes('Successful in') || statusText.includes('Build finished');
- var required = requiredText.includes('Required');
- if (successful || !required) {
- console.debug('check item is hidden: successful: ' + successful + ', required: ' + required, check);
- check.classList.add('hidden-check');
- } else {
- console.info('check item isn\'t hidden: successful: ' + successful + ', required: ' + required, check);
- }
- filteredItems += 1;
- } else {
- check.classList.remove('hidden-check');
- }
- });
- }
- function insertFilterButton() {
- var body = document.querySelector('body');
- var bodyFirstChild = document.querySelector('body div:nth-child(1)');
- filterButton = document.createElement('button');
- filterButton.type = 'button';
- filterButton.textContent = 'Filter Checks';
- filterButton.classList.add('gha-filter-button');
- filterButton.classList.add('hidden-check');
- filterButton.addEventListener('click', onFilterButtonClicked);
- body.insertBefore(filterButton, bodyFirstChild);
- }
- function insertHiddenCheckCssStyle() {
- var styleElement = document.createElement('style');
- styleElement.type = 'text/css';
- var cssRule = document.createTextNode('.hidden-check { display: none !important }\n.gha-filter-button { position: fixed; bottom: 100px; right: 20px; display: block; z-index: 10000; background-color: #218bff; color: #fff; padding: 5px 16px; border: none; border-radius: 6px;}');
- styleElement.appendChild(cssRule);
- document.head.appendChild(styleElement);
- }
- function updateFilterButton(href) {
- const regex = /github\.com\/cloud-hypervisor\/cloud-hypervisor\/pull\/\d+(#pullrequestreview-\d+)?(#discussion_r\d+)?(#issuecomment-\d+)?$/;
- if (regex.test(href)) {
- console.debug('show filter button', href);
- filterButton.classList.remove('hidden-check');
- } else {
- console.debug('hide filter button', href);
- filterButton.classList.add('hidden-check');
- }
- }
- function listenUrlChanged(callback) {
- var _wr = function (type) {
- var orig = history[type];
- return function () {
- var rv = orig.apply(this, arguments);
- var e = new Event(type);
- e.arguments = arguments;
- window.dispatchEvent(e);
- return rv;
- };
- };
- history.pushState = _wr('pushState');
- window.addEventListener('pushState', function (e) {
- console.debug('pushState: url changed', window.location.href);
- callback();
- });
- window.addEventListener('popstate', function (e) {
- console.debug('popstate: url changed', window.location.href);
- callback();
- });
- window.addEventListener('hashchange', function (e) {
- console.debug('hashchange: url changed', window.location.href);
- callback();
- });
- }
- (function() {
- 'use strict';
- insertHiddenCheckCssStyle();
- insertFilterButton();
- updateFilterButton(window.location.href);
- listenUrlChanged(function() {
- updateFilterButton(window.location.href);
- filteredItems = 0;
- });
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址