iWhaleCloudGit

git 批量操作

目前为 2024-05-10 提交的版本。查看 最新版本

// ==UserScript==
// @name         iWhaleCloudGit
// @namespace    http://tampermonkey.net/
// @version      0.1.0
// @description  git 批量操作
// @author       HolmesZhao
// @match        *://globaltech-code.alipay.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=alipay.com
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
  "use strict";

// 吕廷元,4913
// 林伟,4896
// 赵五一,4940

  const beProjectUrl =
    "https://globaltech-code.alipay.com/webapi/groups/Banco/overview?types=&page=1&per_page=15&events_page=1&_output_charset=utf-8&_input_charset=utf-8&ctoken=VXzCenNuvtS5YEzN";
  const beProjectReferrerUrl =
    "https://globaltech-code.alipay.com/groups/Banco";
  // Your code here...
  async function getProjects(url, referrer) {
    const source = await fetch(url, {
      headers: {
        accept: "*/*",
        "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
        "antcode-request-type": "ANTCODE_WEB_REQUEST",
        "linkc-request-type": "LINKC_WEB_REQUEST",
        priority: "u=1, i",
        "sec-ch-ua": '"Not-A.Brand";v="99", "Chromium";v="124"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"macOS"',
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "x-request-lib": "@alipay/bigfish/sdk/fetch",
      },
      referrer: referrer,
      referrerPolicy: "strict-origin-when-cross-origin",
      body: null,
      method: "GET",
      mode: "cors",
      credentials: "include",
    });
    return source.json();
  }

  function createList(datas, top, left) {
    var myDiv = document.getElementById("myDiv");
    if (myDiv == null) {
      myDiv = document.createElement("div");
      myDiv.setAttribute("id", "myDiv");
      myDiv.setAttribute(
        "style",
        `position: fixed;top: ${top}px;left: ${left}px;background-color: #ddd;border: 1px solid #000;padding: 10px;z-index:1000`
      );
      document.body.appendChild(myDiv);
    } else {
      myDiv.innerHTML = "";
    }

    var selectList = document.createElement("select");
    selectList.setAttribute("multiple", "");
    selectList.setAttribute(
      "style",
      "background-color: white; padding-right: 9px; height:" +
        datas.length * 22 +
        "px;" // 22 = 18(字号) + 4(间隙)
    );

    const selectedValues = [];
    selectList.addEventListener("change", () => {
      selectedValues.length = 0;
      for (let i = 0; i < selectList.options.length; i++) {
        const option = selectList.options[i];
        if (option.selected) {
          selectedValues.push(option.value);
        }
      }
    });

    const inputHTML = `
    <div style="padding: 10px;">
        <div style="display: flex;">
            <span style="width: 80px;">标题</span>
            <textarea id="iwc_title" placeholder="请输入标题" style="margin-left: 5px;"></textarea>
        </div>
        <div style="display: flex;margin-top: 10px;">
            <span style="width: 80px;">描述</span>
            <textarea id="iwc_desc" placeholder="请输入描述" style="margin-left: 5px;"></textarea>
        </div>
        <div style="display: flex;margin-top: 10px;">
            <span style="width: 80px;">源分支</span>
            <textarea id="iwc_source" placeholder="请输入源分支, eg: develop-4b-xxxxx" style="margin-left: 5px;"></textarea>
        </div>
        <div style="display: flex;margin-top: 10px;">
            <span style="width: 80px;">目标分支</span>
            <textarea id="iwc_target" placeholder="请输入目标分支, eg: develop-4b" style="margin-left: 5px;"></textarea>
        </div>
        <div style="display: flex;margin-top: 10px;">
            <span style="width: 80px;">合并后删除来源分支</span>
            <textarea
            id="iwc_delete"
            placeholder="默认不删除 0 也可以代码为默认删除 1"
            style="margin-left: 5px;"
            >0</textarea>
        </div>
        <div style="display: flex;margin-top: 10px;">
            <span style="width: 80px;">合并指派给</span>
            <textarea id="iwc_assignee" placeholder="请输入合并人" style="margin-left: 5px;"></textarea>
        </div>
        <div style="display: flex;margin-top: 10px;">
            <span style="width: 80px;">审核人</span>
            <textarea
            id="iwc_reviewer_ids"
            placeholder="请输入审核人, 用英文逗号链接"
            style="margin-left: 5px;"
            ></textarea>
        </div>
        <div style="display: flex;margin-top: 10px;">
            <span style="width: 80px;">审核票数</span>
            <textarea
            id="iwc_threshold"
            placeholder="请输入审核票数"
            style="margin-left: 5px;"
            ></textarea>
        </div>
    </div>
    `;
    const inputDiv = document.createElement("div");
    inputDiv.innerHTML = inputHTML;

    var contentDiv = document.createElement("div");
    contentDiv.style.display = "flex";
    myDiv.appendChild(contentDiv);
    contentDiv.appendChild(selectList);
    contentDiv.appendChild(inputDiv);

    var buttonDiv = document.createElement("div");
    myDiv.appendChild(buttonDiv);

    var buttonClose = document.createElement("button");
    buttonClose.textContent = "关闭";
    buttonClose.style.marginLeft = "10px";
    buttonClose.style.marginTop = "10px";
    buttonClose.onclick = () => {
      myDiv.style.display = "none";
    };
    buttonDiv.appendChild(buttonClose);

    var buttonRefresh = document.createElement("button");
    buttonRefresh.textContent = "刷新列表";
    buttonRefresh.style.marginLeft = "10px";
    buttonRefresh.style.marginTop = "10px";
    buttonRefresh.onclick = async () => {
      // selectList 移除所有子节点
      while (selectList.firstChild) {
        selectList.removeChild(selectList.firstChild);
      }
      const result = await getProjects(beProjectUrl, beProjectReferrerUrl);
      let options = result.projects;

      for (var i = 0; i < options.length; i++) {
        var option = document.createElement("option");
        option.setAttribute("value", options[i].id);
        option.text = options[i].path_with_namespace;
        option.style.fontSize = "18px";
        selectList.appendChild(option);
      }
    };
    buttonDiv.appendChild(buttonRefresh);

    var button = document.createElement("button");
    button.textContent = "批量 MR";
    button.style.marginTop = "10px";
    button.style.marginLeft = "10px";
    button.onclick = () => {
      var textArr = [];
      datas.forEach((e) => {
        if (selectedValues.indexOf(e.id + "") === -1) return;

        const id = e.id;
        const title = e.path_with_namespace;
        const json = { id: id, title: title };
        textArr.push(json);
      });

      console.log(textArr);
      batchMR(textArr);
    };
    buttonDiv.appendChild(button);

    var options = datas;

    for (var i = 0; i < options.length; i++) {
      var option = document.createElement("option");
      option.setAttribute("value", options[i].id);
      option.text = options[i].path_with_namespace;
      option.style.fontSize = "18px";
      selectList.appendChild(option);
    }
  }

  function batchMR(datas) {
    if (datas.length === 0) {
      alert("请选择项目");
      return false;
    }

    const iwc_title = document.getElementById("iwc_title");
    const iwc_desc = document.getElementById("iwc_desc");
    const iwc_source = document.getElementById("iwc_source");
    const iwc_target = document.getElementById("iwc_target");
    const iwc_delete = document.getElementById("iwc_delete");
    const iwc_assignee = document.getElementById("iwc_assignee");
    const iwc_reviewer_ids = document.getElementById("iwc_reviewer_ids");
    const iwc_threshold = document.getElementById("iwc_threshold");
    // 校验是否存在并且字符串长度是否满足要求
    if (!iwc_title || iwc_title.value.trim().length === 0) {
      alert("Title is required");
      return false;
    }

    if (!iwc_desc || iwc_desc.value.trim().length === 0) {
      alert("Description is required");
      return false;
    }

    if (!iwc_source || iwc_source.value.trim().length === 0) {
      alert("Source is required");
      return false;
    }

    if (!iwc_target || iwc_target.value.trim().length === 0) {
      alert("Target is required");
      return false;
    }

    if (!iwc_delete || iwc_delete.value.trim().length === 0) {
      alert("Delete is required");
      return false;
    }

    if (!iwc_assignee || iwc_assignee.value.trim().length === 0) {
      alert("Assignee is required");
      return false;
    }

    if (!iwc_reviewer_ids || iwc_reviewer_ids.value.trim().length === 0) {
      alert("Reviewer IDs is required");
      return false;
    }

    if (!iwc_threshold || iwc_threshold.value.trim().length === 0) {
      alert("Threshold is required");
      return false;
    }
    const myHeaders = new Headers();
    myHeaders.append("accept", "application/json");
    myHeaders.append("accept-language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
    myHeaders.append("antcode-request-type", "ANTCODE_WEB_REQUEST");
    myHeaders.append("content-type", "application/json");
    myHeaders.append("dnt", "1");
    myHeaders.append("linkc-request-type", "LINKC_WEB_REQUEST");
    myHeaders.append("origin", "https://globaltech-code.alipay.com");
    myHeaders.append("priority", "u=1, i");
    myHeaders.append("sec-ch-ua", "\"Not-A.Brand\";v=\"99\", \"Chromium\";v=\"124\"");
    myHeaders.append("sec-ch-ua-mobile", "?0");
    myHeaders.append("sec-ch-ua-platform", "\"macOS\"");
    myHeaders.append("sec-fetch-dest", "empty");
    myHeaders.append("sec-fetch-mode", "cors");
    myHeaders.append("sec-fetch-site", "same-origin");
    myHeaders.append("x-request-lib", "@alipay/bigfish/sdk/fetch");

    const raw = JSON.stringify({
      "title": iwc_title.value,
      "source_branch": iwc_source.value,
      "target_branch": iwc_target.value,
      "description": iwc_desc.value,
      "labels": "",
      "should_remove_source_branch": iwc_delete.value === "1",
      "squash_merge": false,
      "assignee_id": iwc_assignee.value,
      "review_required": true,
      "reviewer_ids": iwc_reviewer_ids.value,
      "threshold": iwc_threshold.value
    });

    const requestOptions = {
      method: "POST",
      headers: myHeaders,
      body: raw,
      redirect: "follow"
    };

    datas.forEach((e) => {
      fetch(`https://globaltech-code.alipay.com/api/v3/projects/${e.id}/pull_requests?_output_charset=utf-8&_input_charset=utf-8`, requestOptions)
      .then((response) => response.text())
      .then((result) => console.log(result))
      .catch((error) => console.error(error));
    });
  }

  async function startLoad(title) {
    const myDiv = document.getElementById("myDiv");
    if (myDiv) {
      myDiv.style.display = "block";
      return;
    }
    const buttons = document.getElementsByClassName("mmbutton");
    let button = null;
    for (let index = 0; index < buttons.length; index++) {
      const element = buttons[index];
      if (element.innerText == title) {
        button = element;
      }
    }
    if (button == null) {
      alert(`没有找到 ${title} 按钮`);
      return;
    }
    const result = await getProjects(beProjectUrl, beProjectReferrerUrl);
    createList(result.projects, button.offsetHeight, button.offsetLeft);
  }

  function addButton(name, marginLeft, top, fun) {
    var txt = document.createTextNode(name);
    var btn = document.createElement("button");
    btn.className = "mmbutton";
    btn.style =
      "z-index: 9999; font-size: large; position: fixed; top: " +
      top +
      "px; left: " +
      marginLeft +
      "px;border:1px solid black; padding: 0 10px;";
    btn.onclick = () => {
      fun(name);
    };
    btn.appendChild(txt);
    document.body.appendChild(btn);
    return btn.offsetWidth + btn.offsetLeft;
  }

  // onload
  const isFunction = (variable) => {
    return typeof variable === "function";
  };
  const bakOnload = window.onload;
  window.onload = async () => {
    if (isFunction(bakOnload)) {
      bakOnload();
    }
  };

  var btnLeft = screen.width / 8;
  var marginLeft = 30;
  btnLeft += marginLeft;
  btnLeft = addButton("批量 MR", btnLeft, 0, startLoad);
  //   addButton('批量 MR', btnLeft, 40, copyImagesJSON2);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址