Python3 将 Gitlab issue 导出到 markdown

前言
既然写了G站,那我再写一个G2站的吧,gitlab的issue导出。

  • 支持comments
  • 支持labels

核心的方法是用gitlab 提供的api接口来获取issue和notes里的markdown字符串。
G2 api:https://docs.gitlab.com/ce/api/

小可爱们【转载请注明出处】谢谢。

1 获取token 获取 project id

首先要获取token,获取地址: https://gitlab.com/profile/personal_access_tokens

记得勾选 api哈。

接着获取 project id

2 使用代码下载issue

换上自己的 project_id、token、out_dir ,然后就可以愉快地用shell下载了。
脚本是这样子的:

python3 issue_to_markdown.py -p project_id -t token -o out_dir

也可以在 issue_to_markdown.py 的49行,写上 project_id、token、out_dir的值,就不需要给参数了。

代码文件: issue_to_markdown.py

from tqdm import tqdm
import os
import argparse
import codecs
import json
import re
import requests
requests.session().keep_alive = False  # 及时释放


def get_info(api_url, token):
    headers = {'Private-Token': "%s" % token}
    r = requests.get(
        api_url, headers=headers)
    ret = json.loads(r.text)
    if r.status_code > 300:
        print('error %s', r.text)
        return False
    return ret


def to_markdown(page, mk_note):
    mk = '# ' + page['title'] + '\n'
    mk += "created_at: "+page['created_at']+"\n"
    mk += "updated_at: "+page['updated_at']+"\n"

    labels = "label: "
    for idx, item in enumerate(page['labels']):
        if (idx+1) == len(page['labels']):
            labels += item+'\n'
        else:
            labels += item+','
    mk += labels+'\n'

    mk += page['description']+'\n'

    mk += mk_note
    return mk


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--id', help="gitlab project id")
    parser.add_argument('-t', '--token', help="gitlab personal access token")
    parser.add_argument('-o', '--dir', help="out put dir")

    args = parser.parse_args()

    # args.id = ?
    # args.token = ""
    # args.dir = "out"

    if not os.path.exists(args.dir):
        os.makedirs(args.dir)

    base = "https://gitlab.com/api/v4"
    # 当然你也可以自建gitlab

    issue_url = base+"/projects/%d/issues?per_page=%d"
    # gitlab默认服务器端每次只返回20条数据给客户端,可以用设置page和per_page参数的值,指定服务器端返回的数据个数。

    note_url = base+"/projects/%d/issues/%d/notes?sort=asc"

    # 包含了所有的issue both open and closed
    ret = get_info(issue_url % (args.id, 100), args.token)

    for page in tqdm(ret):
        if page['state'] == 'opened':  # 去掉关闭的issue
            _pid = page['project_id']
            _iid = page['iid']

            mk_note = ""  # 获取评价
            if page['user_notes_count'] > 0:
                notes = get_info(note_url % (_pid, _iid), args.token)
                for note in notes:
                    if not note['system']:  # 过滤系统的notes
                        mk_note += note['body']+'\n'

            mk = to_markdown(page, mk_note)

            # save
            filename = page['created_at'].split('T')[0]+','+page['title']+'.md'
            filename = re.sub(r'[/:*?"<>|]', " ", filename)  # check filename
            filename = os.path.join(args.dir, filename)

            with codecs.open(filename, 'w', 'utf-8') as file:
                file.write(mk)

3 用issue写作

记得用 ## 作为小节标题哈,在导出的文档里主次清晰,不乱的。

4 结果

下面是导出数据的结果,md文件的标题是 时间+issue title.md

再会!!!

笔者还写了,Github 导出 issue:https://blog.csdn.net/github_25176023/article/details/105725979

还写了,Gitee 导出 issue:
https://blog.csdn.net/github_25176023/article/details/105739634

小可爱们,点赞收藏分享走一波?

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值