NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name GitLab Accidental merge accept dialog // @namespace http://tampermonkey.net/ // @version 0.3 // @description Workaround for https://gitlab.com/gitlab-org/gitlab/-/issues/29735 // @author JombY // @author Martin // @license Apache-2.0 // @include /https?:\/\/gitlab.*/merge_requests/.* // @icon https://www.google.com/s2/favicons?domain=gitlab.com // @grant none // ==/UserScript== /* jshint esversion: 8 */ const processedClass = '__CONFIRM_ADDED__'; (function () { const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE) process(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); function process(el) { el.querySelectorAll(`button.accept-merge-request:not(.${processedClass})`).forEach(mergeButton => { mergeButton.classList.add(processedClass); addConfirmDialog(mergeButton, "Are you sure you want to MERGE?"); console.log('Found merge button', mergeButton); }); } function addConfirmDialog(el, text) { el.addEventListener('click', e => { if (!confirm(text)) { e.stopImmediatePropagation(); } }, true); }