yuanoook / Gitlab MR Auto Checker

// ==UserScript==
// @namespace     https://openuserjs.org/users/yuanoook
// @name          Gitlab MR Auto Checker
// @description   Showing the current basic and recommended format for a User script.
// @copyright     2020, yuanoook (https://openuserjs.org/users/yuanoook)
// @license       MIT
// @version       1.0.1
// @include       https://git*
// @grant none
// ==/UserScript==

// ==OpenUserJS==
// @author yuanoook
// ==/OpenUserJS==

// ==Configuration==

// localStorage.defaultReviewerId
// localStorage.defaultReviewerName
// localStorage.jiraHost

// ==/Configuration==

const triggerEvent = (target, name) => {
  if (typeof target[name] === 'function') {
    target[name]();
    return;
  }
  const oldFashion = 'createEvent' in document;
  const event = oldFashion ? document.createEvent('Event') : new Event(name, {
    bubbles: true,
    cancelable: true,
  });
  if (oldFashion) {
    event.initEvent(name, true, true);
  }
  target.dispatchEvent(event);
};

const isMRReady = () => Boolean(window.merge_request_title && window.merge_request_title.value);

const getSearchArray = () => {
  return decodeURIComponent(location.search || '').split(/[\=\&\?]/);
};

const getSourceBranch = () => {
  const searchArray = getSearchArray();
  const sourceBranchKeyIndex = searchArray.indexOf('merge_request[source_branch]');
  const sourceBranchValueIndex = sourceBranchKeyIndex + 1;
  return searchArray[sourceBranchValueIndex];
};

const getIssueNumber = () => {
  const sourceBranch = getSourceBranch();
  const matchRes = (sourceBranch || '').match(/[A-Z]+-\d+/);
  if (matchRes) {
    return matchRes[0];
  }
};

const updateDescription = () => {
  const issueNumber = getIssueNumber();
  if (!issueNumber) {
    return;
  }
  const issueLink = `${localStorage.jiraHost}${issueNumber}`;
  window.merge_request_description.value = issueLink + '\n\n' + merge_request_description.value;
};

const updateAssignee = () => {
  const assigneeInput = document.querySelector('[name="merge_request[assignee_ids][]"');
  assigneeInput.value = localStorage.defaultReviewerId;
  const assigneeText = assigneeInput.parentElement.querySelector('.dropdown .dropdown-toggle-text');
  assigneeText.innerText = localStorage.defaultReviewerName;
};

const checkMergeOptions = () => {
  const removeSourceBranchCheckbox = document.querySelector('[for="merge_request_force_remove_source_branch"]');
  const squashCheckbox = document.querySelector('[for="merge_request_squash"]');
  triggerEvent(removeSourceBranchCheckbox, 'click');
  triggerEvent(squashCheckbox, 'click');
};

const prepareForMR = () => {
  updateDescription();
  updateAssignee();
  checkMergeOptions();
};


const 等待 = (时间 = 1) => new Promise(释放 => setTimeout(释放, 时间 * 1000));

const startPrepareForMR = () => {
  if (!isMRReady()) {
    setTimeout(startPrepareForMR, 300);
  } else {
    prepareForMR();
  }
};

(async () => {
    await 等待(1);
    startPrepareForMR();
})();