golang操作gitlab API:获取某个group下的所有仓库并写入文件 && 解决gitpab限制单次查询100条的限制
2023-09-14 09:01:53 时间
获取某个group下的仓库:
https://git.xxxxxx.com/api/v4/groups/group_id
/projects
获取所有仓库:
https://git.xxxxxx.com/api/v4/projects
package main
import (
"bufio"
"encoding/json"
"fmt"
"io"
"log"
"math"
"net/http"
"os"
"os/exec"
"strconv"
"github.com/bitly/go-simplejson"
)
const (
PRIVATE_TOKEN = "ThmspJQsBdf99nBYEo5Ns-wRxxx"
GET_DMCCA_HEAD = "https://git.xxxxxx.com/api/v4/groups/group_id/projects"
REPOS_FILE = "gitlab-url.txt"
)
var (
client *http.Client = &http.Client{}
repos string
)
func getTotal() {
head, err := http.NewRequest("HEAD", GET_DMCCA_HEAD, nil)
if err != nil {
log.Panicln(err)
}
head.Header.Add("PRIVATE-TOKEN", PRIVATE_TOKEN)
r, err := client.Do(head)
if err != nil {
log.Panicln(err)
}
defer r.Body.Close()
totalNums, _ := strconv.Atoi(r.Header.Get("X-Total"))
fmt.Printf("totalNums: %v\n", totalNums)
page := int(math.Ceil(float64(totalNums) / 100))
for i := 1; i <= page; i++ {
getProjects(i)
}
}
func getProjects(page int) {
GET_DMCCA_PROJECTS := "https://git.xxxxxx.com/api/v4/groups/group_id/projects?per_page=100&page=" + strconv.Itoa(page) + "&simple=true"
req, err := http.NewRequest("GET", GET_DMCCA_PROJECTS, nil)
if err != nil {
log.Panicln(err)
}
req.Header.Add("PRIVATE-TOKEN", PRIVATE_TOKEN)
resp, err := client.Do(req)
if err != nil {
log.Panicln(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Panicln(err)
}
var aa []map[string]interface{}
json.Unmarshal(body, &aa)
// http_url_to_repo
fmt.Printf("len(aa): %v\n", len(aa))
for _, project := range aa {
byt, _ := json.Marshal(project)
json, _ := simplejson.NewJson(byt)
s, _ := json.Get("http_url_to_repo").Interface().(string)
repos = s + "\n" + repos
}
}
func WriteFile() {
fmt.Printf("repos: %v\n", repos)
file, err2 := os.OpenFile(REPOS_FILE, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777)
defer file.Close()
if err2 != nil {
log.Panicln(err2)
}
w := bufio.NewWriter(file)
w.WriteString(repos)
w.Flush()
}
func main() {
// 获取group_id group下所有代码仓库
getTotal()
// 将git仓库URL地址写入文件
WriteFile()
// 删除最后一行的空行
sed := exec.Command("sed -i ':n;/^\n*$/{$! N;;bn}' ", REPOS_FILE)
sed.Run()
}
gitlab文档地址:
https://docs.gitlab.com/ee/api/groups.html#list-group-hooks
参考链接:
https://ranying666.github.io/2017/06/20/gitlab-api/
相关文章
- JS魔法堂:再识Bitwise Operation & Bitwise Shift
- 备份&添加无线网络配置
- Apache Spark源码走读(九)如何进行代码跟读&使用Intellij idea调试Spark源码
- Apache Spark技术实战(三)利用Spark将json文件导入Cassandra &SparkR的安装及使用
- [AWS DA - Cloud Fundamentals] 2.1 Cloud Computing & 2.2 Foundational & Compute Service
- Dubbo系统里面MultipartFile文件传输问题&Dubbo文件上传/传输服务
- 无法打开物理文件 "D:understructuredata _DAT.MDF"。操作系统错误 5:"5(拒绝访问。)"
- 华为OD机试 - 猜字谜(Java & JS & Python)
- webstorm设置作者信息&时间&文档描述(js文件里使用)
- DataScience&ML:金融科技领域之风控场景之风控指标/字段相关概念、口径逻辑之详细攻略
- 数据库面试题【九、视图&视图的优缺点】
- Java中的URL类&根据url获取网络文件&快速入门Java中的URL(网络编程)
- PHP代码为什么不能直接保存HTML文件——>PHP生成静态页面教程
- Peter's Hobby
- $('#checkbox').attr('checked'); 回报checked或undefined该解决方案
- 安全测试——验证&日志文件
- 【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符&的作用、C语言中的 联合体
- 安全测试——验证&日志文件