Merge All Button for GitLab

Add a button to GitLab dashboard page to merge all merge requests

2022-06-06 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name                Merge All Button for GitLab
// @name:zh-CN          GitLab一键合并按钮
// @namespace           https://greasyfork.org/users/692574
// @version             0.0.91
// @description         Add a button to GitLab dashboard page to merge all merge requests 
// @description:zh-CN   在GitLab仪表盘界面添加一个合并所有请求的按钮
// @author              Chase Choi
// @license             MIT
// @match               https://gitlab.com/dashboard/merge_requests*
// @require             https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js
// @grant               GM.xmlHttpRequest
// ==/UserScript==

const SUCCESS = 200;
const BASE_URL = window.location.origin;
const ACCESS_TOKEN = '<YOUR_ACCESS_TOKEN>';

(function() {
    'use strict';
    
    // Update DOM
    const mergeAllElement = `
        <div class="gl-ml-3">
            <a class="btn gl-button btn-confirm merge-all-btn">Merge All</a>
        </div>
    `;
    $(`${mergeAllElement}`).insertAfter($('.filter-dropdown-container'));
    $('.merge-all-btn').css('background-color', '#3C824E');

    // add event listener
    $('.merge-all-btn').click(function() {
        if (ACCESS_TOKEN == '<YOUR_ACCESS_TOKEN>') {
            alert("Empty access token!");
            return;
        }
        const text = "Are you sure to merge all?"
        if (confirm(text) == true) {
            console.log("Start merging all...");
            mergeAll();
        }
    });
})();

/**
 * Iterate all merge requests on current page and perform merge action for each one.
 */
function mergeAll() {
    // iterate merge request list
    let elements = $('li.merge-request .issuable-info .issuable-reference');
    if (elements.length) {
        elements.each(function () {
            const mergeRequestReference = $(this).text();
            if (mergeRequestReference.length) {
                const projectNamespace = mergeRequestReference.split('!')[0].trim().replace('/', '%2F');
                const mergeRequestID = mergeRequestReference.split('!')[1];
                console.log(projectNamespace, mergeRequestID);
                mergeProject(projectNamespace, mergeRequestID);
            }
        });
    }
}

/**
 * Get project ID and perform merge action.
 *
 * @param {string} projectNamespace The project name with namespace.
 * @param {number} mergeRequestID The merge request ID.
 */
function mergeProject(projectNamespace, mergeRequestID) {
    GM.xmlHttpRequest({
        method: "GET",
        url: `${BASE_URL}/api/v4/projects/${projectNamespace}`,
        headers: {
            "Authorization": `Bearer ${ACCESS_TOKEN}`
        },
        onload: function (response) {
            if (response.status == SUCCESS) {
                const projectInfo = JSON.parse(response.responseText);
                console.log(`project ID: ${projectInfo.id}; merge request ID: ${mergeRequestID}`);
                performMergeAction(projectInfo.id, mergeRequestID);
            }
        }
    });
}

/**
 * Perform actual merge action for specific project.
 *
 * @param {number} projectID The project ID.
 * @param {number} mergeRequestID The merge request ID.
 */
function performMergeAction(projectID, mergeRequestID) {
    GM.xmlHttpRequest({
        method: "PUT",
        url: `${BASE_URL}/api/v4/projects/${projectID}/merge_requests/${mergeRequestID}/merge`,
        headers: {
            "Authorization": `Bearer ${ACCESS_TOKEN}`
        },
        onload: function (response) {
            if (response.status == SUCCESS) {
                console.log("Merged successfully!");
            }
        }
    });
}