接口调用脚本(Gitea迁移)

前言

Gitea迁移的时候一个一个迁移太慢了,我们可以调用官方提供的API使用脚本迁移。

使用BAT

Win下使用curl请求接口 参数中的双引号要转义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
rem 定义接口的 URL
set url=http://git.yyy.com/api/v1/repos/migrate
set auth_username=xxx
set auth_password=xxx
set clone_addr=https://git.xxx.com/aaa/abc.git
set repo_name=abc
set repo_owner=xh

rem 定义要发送的数据
set data={\"auth_username\": \"%auth_username%\",\"auth_password\": \"%auth_password%\",\"clone_addr\": \"%clone_addr%\",\"repo_name\": \"%repo_name%\",\"repo_owner\": \"%repo_owner%\"}

rem 发起 POST 请求
curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic emhhbmdqaWFuOnpoYW5namlhbg==" -d "%data%" %url%

pause

NodeJS

安装依赖

需要先安装 Node.js 环境,然后安装 axios 库,安装命令为:

1
npm install axios

请求示例

POST 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const axios = require('axios');

function merge(clone_addr, repo_name, description) {
let url = "http://git.xxx.com/api/v1/repos/migrate"
let auth_username = "xxx"
let auth_password = "yyy"
let repo_owner = "xh"

let data = {
"auth_username": auth_username,
"auth_password": auth_password,
"clone_addr": clone_addr,
"repo_name": repo_name,
"description": description,
"repo_owner": repo_owner
}

axios
.post(
url,
data, {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic emhhbmdqaWFuOnpoYW5namlhbg=='
}
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error('请求出错:', "迁移失败");
});
}

merge("https://git.aaa.com/aaa/dataView.git", "dataView", "")

完整脚本

save_status.js

1
2
3
4
5
6
7
8
9
const fs = require('fs');

exports.saveStatus = function (status) {
try {
fs.writeFileSync('repository_list.json', JSON.stringify(status, null, 2));
} catch (error) {
console.error('Error saving status:', error);
}
}

merge.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const axios = require('axios');
const repository_list = require('./repository_list.json')
const { saveStatus } = require('./save_status');
// 创建一个 Axios 实例
const instance = axios.create();
// 修改实例的超时时间为 300 秒
instance.defaults.timeout = 1000 * 300;
async function merge(clone_addr, repo_name, description) {
let isSuccess = false;
let url = "http://git.bbb.com/api/v1/repos/migrate"
let auth_username = "aaa"
let auth_password = "aaa"
let repo_owner = "xh"

let data = {
"auth_username": auth_username,
"auth_password": auth_password,
"clone_addr": clone_addr,
"repo_name": repo_name,
"description": description,
"repo_owner": repo_owner
}

try {
let response = await instance
.post(
url,
data, {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic emhhbmdqaWFuOnpoYW5namlhbg=='
}
})
// console.log(response.data);
console.error("迁移成功:", repo_name);
isSuccess = true;
} catch (error) {
if (error.status === 409) {
//仓库已存在
console.error("迁移成功:", repo_name);
isSuccess = true;
} else {
console.error("迁移失败:", repo_name);
isSuccess = false;
}
}
return isSuccess;
}

async function main() {
for (let i = 0; i < repository_list.length; i++) {
let item = repository_list[i];
if (item.success) continue;
let { username, name, description } = item;
let repo_name = name;
console.log("===> 开始迁移:", repo_name);
let clone_addr = `https://git.aaa.com/${username}/${repo_name}.git`
let isSuccess = await merge(clone_addr, repo_name, description)
item.success = isSuccess;
saveStatus(repository_list);
console.log("-----------------------------------------------------");
}
}

main();

Gitea查询

查询所有仓库

1
select user.name as username,repository.name,repository.description from repository LEFT JOIN user where repository.owner_id=user.id;

查询的数据导出为JSON即可。

查询没有设置团队的项目

1
select repository.name,team.name as teamname FROM team_repo LEFT JOIN team on team_repo.team_id=team.id LEFT JOIN repository on team_repo.repo_id=repository.id  where repository.name not in (select repository.name FROM team_repo LEFT JOIN team on team_repo.team_id=team.id LEFT JOIN repository on team_repo.repo_id=repository.id where team.name!='Owners');

查询所有团队

1
2
--查询所有的团队
select team.name as team_name,team.description as team_description from team WHERE team.name!='Owners' ORDER BY team.name ASC;

查询有团队的项目

1
select user.name as username,repository.name,repository.description,team.name as team_name,team.description as team_description from repository LEFT JOIN user on repository.owner_id=user.id LEFT JOIN team_repo on repository.id=team_repo.repo_id LEFT JOIN team ON team_repo.team_id=team.id WHERE team.name!='Owners' ORDER BY team.name ASC;