GitPySearch: 全局Python代码搜索工具

news2024/11/14 11:09:13

一 、背景

在某些情况下,我们需要快速了解哪些项目包含特定的配置,例如使用了fastjson库或数据库的连接配置。然而,在GitLab上逐个代码仓库进行搜索是非常耗时的。为了提高效率,我们开发了一个Python脚本工具,用于实现全局搜索功能。

该脚本能够在GitLab上对所有项目进行全局搜索,帮助我们快速确定哪些项目使用了特定的配置。无论项目数量是几个、几十个还是上百个,这个脚本都能够节省大量的时间和精力。

使用这个工具,我们可以根据关键词(如库名、配置项等)进行搜索,并获取包含该关键词的项目列表。脚本会自动遍历所有项目,并返回符合条件的项目链接,方便我们进一步查看和分析。

无论是对大型团队还是个人开发者,这个工具都能提供便利。它能够高效地帮助我们了解项目中的配置使用情况,加快问题排查和代码审查的速度。

如果你的项目数量较少,只有几个项目,并且能够轻松在GitLab上逐个搜索,那么这个脚本可能并不适用于你。但是,当你面对数十甚至上百个项目时,这个脚本将成为你的得力助手,提供高效的全局搜索能力。

通过这个GitLab全局搜索文本工具,我们能够更快地发现项目中的配置使用情况,优化代码结构,提高开发效率,以及更好地管理和维护项目。

二、原理流程

  1. 用户输入GitLab的URL和访问令牌。
  2. 系统使用输入的URL和访问令牌与GitLab建立连接。
  3. 系统调用GitLab模块,获取GitLab中的所有项目ID。
  4. 对于每个项目ID,系统构建搜索接口URL,包括关键字和项目ID作为参数。
  5. 系统使用请求库向搜索接口发送HTTP请求,获取搜索结果页面内容。
  6. 系统使用XPath解析搜索结果页面内容,提取相关信息。
  7. 如果搜索结果存在:
    • 系统判断关键字匹配成功,并将匹配到的项目ID和关键字相关信息存储起来。
    • 可选:系统展示匹配到关键字的项目信息给用户。
  8. 继续处理下一个项目ID,重复步骤4-7,直到所有项目ID处理完毕。
  9. 系统输出所有匹配到关键字的项目信息。
  10. 项目流程结束。

三、python版本与依赖

python:3.8.0 (如果本地已有python3的环境则不需要通过docker)
python依赖的module如下:

import json
import os

import requests
from lxml import etree
from multiprocessing import Pool
import gitlab

四、 操作步骤

1、安装上面的模块

pip install lxml     -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install    gitlab  -i https://pypi.tuna.tsinghua.edu.cn/simple

2、获取Gitlab的token

要获取GitLab的访问令牌(Token),请按照以下步骤操作:

  1. 登录到GitLab账户。
  2. 在右上角的用户菜单中,点击"Settings"选项。
  3. 在左侧导航栏中,选择"Access Tokens"选项。
  4. 在"Personal Access Tokens"部分,点击"Create a token"按钮。
  5. 输入访问令牌的名称和过期日期(可选)。
  6. 选择所需的权限范围(API、读取用户信息等)。
  7. 点击"Create personal access token"按钮。
  8. 访问令牌将被生成,并显示在屏幕上。请务必复制该令牌并妥善保存,因为它将在创建后只显示一次。

注意事项:

  • 访问令牌具有与您的账户相同的权限,请谨慎保管,并仅将其用于受信任的应用程序或脚本。
  • 如果不再需要访问令牌或想要撤销访问权限,请返回到"Access Tokens"页面,并点击相应的撤销按钮。

请注意,获取访问令牌需要有相应的权限,如果您无法找到或访问"Access Tokens"选项,请联系您的GitLab管理员以获取帮助。
在这里插入图片描述

3、获取Gitlab接口的cookie

要获取GitLab接口的Cookie,可以按照以下步骤操作:

  1. 打开浏览器并登录到GitLab账户。
  2. 在登录成功后,打开浏览器的开发者工具(通常是按F12键或右键点击页面并选择"检查"或"开发者工具"选项)。
  3. 在开发者工具中,切换到"网络"(Network)选项卡。
  4. 在浏览器中执行需要获取Cookie的操作,例如访问某个页面或执行某个API请求。
  5. 在开发者工具中,您将看到所有网络请求的记录。
  6. 在请求列表中,找到与GitLab相关的请求。
  7. 点击该请求,在请求详细信息的右侧面板中,可以找到请求头(Headers)的信息。
  8. 在请求头中,查找名为"Cookie"的字段。该字段的值即为GitLab接口的Cookie。

请注意,Cookie包含了用户的身份验证信息,因此请妥善保管Cookie,并仅将其用于合法和授权的用途。同时,获取Cookie需要有相应的权限,如果您无法获取Cookie,请联系您的GitLab管理员以获取帮助。
在这里插入图片描述

4、Python代码

# -*- coding: utf-8 -*-
# @Time    : 2023/6/21 14:20
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : git_prod_scan.py
# @Software: PyCharm
import json
import os

import requests
from lxml import etree
from multiprocessing import Pool
import gitlab

# 需要检索的内容关键字
search_content = 'yunkedai'
token = 'xxxxx-Y9FLN'
gitlab_url = 'https://gitlab.xxxx.com/'
gl = gitlab.Gitlab(gitlab_url, token)
private_Cookie = 'xxxxxxx'

headers = {
    'Cookie': private_Cookie
}


def get_all_projects():
    data = []
    for g in gl.groups.list(all=True):
        for p in g.projects.list(all=True):
            project = gl.projects.get(p.id)
            item = {
                "id": p.id,
                "group": g.name,
                "project": p.name
            }
            data.append(item)

    # 将数据保存为 JSON 文件
    with open('all_output.json', 'w') as file:
        json.dump(data, file, indent=4)


def getProject(s):
    """
    根据项目 ID 获取项目信息并打印项目链接
    """
    url = "%s/search?utf8=&snippets=&scope=&search=%s&project_id=%s" % (gitlab_url, search_content, s)
    response = requests.get(url, headers=headers)
    pagehtml = etree.HTML(response.text)
    try:
        li_element = pagehtml.xpath('//li[@data-qa-selector="code_tab"]')[0]
        projecttitle = li_element.xpath('.//span/text()')[0]

        if int(projecttitle) > 0:
            # 查询项目信息
            project = gl.projects.get(s)

            # 获取项目链接
            project_url = project.web_url

            print("项目存在关键词:" + project_url)
        else:
            return
    except IndexError:
        pass


def start_project():
    pool = Pool(processes=5)
    # 读取项目数据
    with open('all_output.json', 'r') as file:
        data = file.read()
    data = json.loads(data)

    # 并发调用 getProject 函数
    for i in data:
        id = i.get('id')
        pool.apply_async(func=getProject, args=(id,))

    print('end')
    pool.close()
    pool.join()
    print("================================================================")
    print("所有项目已扫描完毕")


if __name__ == '__main__':
    file_path = 'all_output.json'
    if os.path.isfile(file_path):
        start_project()
    else:
        get_all_projects()
        start_project()

五、测试效果

我要 获取 所有项目 包含 hire_core 的关键字

请修改代码层面

search_content = 'hire_core'

执行脚本
在这里插入图片描述

六、总结

上面的GitLab全局Python代码搜索工具具有以下优势:

  1. 搜索效率高:该工具通过使用GitLab的API接口进行搜索,避免了手动在每个项目中进行搜索的繁琐过程。它能够快速扫描多个项目,从而节省了大量的时间和精力。
  2. 全面性:该工具可以在GitLab上进行全局搜索,即同时搜索所有项目,而不仅仅局限于单个项目。这样可以确保没有遗漏任何一个项目,提高了搜索的全面性和准确性。
  3. 多线程支持:工具采用了多线程的并发处理方式,可以同时处理多个项目的搜索请求,提高了搜索效率。这意味着可以快速地并发搜索大量的项目,更快地找到符合条件的代码片段。
  4. 输出结果清晰:工具会输出符合搜索条件的项目链接,让用户能够直观地查看项目和相关代码。这方便了用户对搜索结果的检查和进一步的处理。
  5. 灵活可扩展:工具的代码结构清晰,易于理解和修改。用户可以根据自己的需求进行定制和扩展,例如修改搜索关键字、调整并发线程数等,以适应不同的搜索场景和项目规模。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL的优势:为何它成为主流数据库管理系统

PostgreSQL的优势:为何它成为主流数据库管理系统 Stack Overflow 2023年报告PostgreSQL和MySQL同异我们在开发中如何选择PostgreSQL和MySQL呢? 摘要:本文主要比较了PostgreSQL和MySQL这两个流行的关系型数据库管理系统。我们首先介绍了它们的…

屏蔽箱的材质结构和使用事项介绍

屏蔽箱是一种用于屏蔽机电波干扰的设备,通常用于电磁兼容测试、天线测试、短波收发等需要屏蔽电磁辐射噪声的场合。这种箱子通常由导电或者导磁材料制成,内部配备高效屏蔽材料,能够在一定范围内有效地屏蔽电磁波辐射,避免电磁波干…

详细介绍mysql索引类型

目录 Normal 普通索引Unique 唯一索引Full Text 全文索引SPATIAL 空间索引btree索引和hash索引的区别在实际操作过程中,应该选取表中哪些字段作为索引? Normal 普通索引 表示普通索引,大多数情况下都可以使用 Unique 唯一索引 表示唯一的&…

Linux内核内存管理源码分析之init-mm.c(2)

接前一篇文章:Linux内核内存管理源码分析之init-mm.c(1) 本文内容参考:https://www.cnblogs.com/mysky007/p/12317831.html 上回说到了swapper_pg_dir和init_top_gpt。再次给出内核源码中init_top_gpt的说明,在Documen…

【基础】MQTT -- MQTT 特性:QoS、Retained 消息、LWT 以及 Keepalive

MQTT -- MQTT 特性:QoS、Retained 消息、LWT 以及 Keepalive QoS 及其最佳实践MQTT 协议中的 QoS 等级QoS 0QoS 1PUBACK 数据包 QoS 2PUBREC 数据包PUBREL 数据包PUBCOMP 数据包 实际的订阅者 QoSQoS 的最佳实践QoS 与会话QoS 的选择 Retained 消息LWT 遗嘱消息Keep…

FPGA_学习_12_IP核_FIFO

FIFO(Frist Input Frist Output),即先入先出,也是一种存储器,一般做数据缓冲。FIFO和 RAM的共同点在于都能存储数据、都有控制写和读的信号;不同点在于 FIFO 没有地址,所以不能任意指定读取某一个数据,数据只能按照数据…

一个女孩从软件测试工程师到主管的成长

说实话,我做测试工作的时间不是很长,学完软件测试工程师的课程后,到现在也就是一年多的时间吧,不过,我愿意自己学习和工作中积累起的这些点滴与大家分享。 如果你想学习自动化测试,我这边给你推荐一套视频…

C语言之程序环境和预处理(1)

本章主要以图片和文字的形式给大家讲解 程序的翻译环境和程序的执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码 2. 详解编译…

东南亚骑行类目热销品出炉!Shopee/Lazada跨境卖家有哪些优势产品可做?

菲律宾/巴西是Lazada/Shopee骑行品类卖家体量最大的2个站点,新加坡/越南/马来西亚紧随其后. 体量:在东南亚,菲律宾与新加坡对骑行的需求最强烈,其次是越南,三地总订单占总体70%以上,在南美地区&#xff0c…

Revit碰撞检查:Navisworks“复合对象碰撞”的使用

一、Navisworks 中碰撞检查中“复合对象碰撞”有什么用? 通常情况下我们使用 Revit 做好了模型,然后使用 Navisworks这款软件进行碰撞检查等优化工作。因为 Navisworks 相对于 Revit的软件数据要“轻”很多,可以让多专业的模型都在一起导入来进行全专业…

对接口进行限流?

在高并发的情况下,我们可以把消息放入队列,在从队列消费,达到限流的目的。但这里说的限流指的是当我们请求其他服务器接口,防止高并发下把对面服务器压垮,于是对我们要求每秒限制在100QPS。 如果使用springCloud可以用…

准备换工作跳槽面试人一定要看的的18条忠告

1、如果想好要跳槽就别犹豫,不用纠结太多外在因素,很多事情只有去做了才知道。(当然,如果你是非某家公司不可的话,那可以慢慢等待机会) 2、关于跳槽的渠道,主要有四种:直接被公司挖…

测试自动化的演进,从录制回放到对象映射

概要:在短时间的市场化和短期冲刺的文化中,测试人员通过使用测试自动化实践和工具保持同步是至关重要的。本文跟踪从基于脚本的测试与硬编码数据到自动化框架的转变,探索测试自动化的开始和到今天的演变 - 并且可能的未来走向。 今天的软件市…

Qt之QDial选择器

文章目录 前言一、QDial是什么二、操作api信号与槽示例代码总结 前言 Qt是一种流行的跨平台的C GUI应用程序开发框架,用于构建图形用户界面(GUI)和其他桌面应用程序。QDial是Qt框架中的一个小部件,用于创建旋转式的拨号器。本文将介绍如何使用QDial进行…

ChatGLM Efficient Tuning效率调试PEFT

ChatGLM Efficient Tuning 基于 PEFT 的高效 ChatGLM-6B 微调。 [ English | 中文 ] 更新日志 [23/06/05] 现在我们实现了 4 比特的 LoRA 训练(也称 QLoRA)。请尝试使用 --quantization_bit 4 参数进行 4 比特量化微调。(实验性功能&#…

Echarts实现流程图关系图拓扑图

实现如下&#xff0c;可以横着排竖着排都可以 1.先写个div做画布 ref值随意&#xff0c;但是一点要写 <div style"height: 400px;" ref"echartdom"></div> 2.下载echarts 我这边下载的是 "echarts": "^4.9.0",最新版应…

奢侈品回收APP系统开发功能有哪些?

奢侈品售卖回收APP系统开发功能有哪些&#xff1f; 1.回收品牌分类&#xff1a;奢侈品回收APP平台可以将支持回收鉴定的奢侈品品牌及商品进行分类展示&#xff0c;方便用户查看自己的想要出售的是不是平台支持的商品。 2.商品在线检索&#xff1a;客户可以直接按…

STM32F4_红外遥控

目录 1. 红外遥控简介 2. NEC协议 3. 硬件设计 4. 实验程序详解 4.1 main.c 4.2 Remote.c 4.3 Remote.h 1. 红外遥控简介 红外遥控是一种无线、非接触的控制技术。具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等优…

深入理解Redis的AOF和RDB持久化机制

Redis的AOF&#xff08;Append-Only File&#xff09;和RDB&#xff08;Redis Database&#xff09;是两种常见的持久化机制&#xff0c;用于将内存中的数据保存到磁盘上&#xff0c;确保数据在Redis重新启动时的持久性。本文将深入介绍AOF和RDB的原理和使用&#xff0c;帮助读…

HQChart实战教程65-自定义手机端分时图tooltip显示数据

HQChart实战教程65-自定义手机端分时图tooltip显示数据 手机端分时图tooltip步骤1. 配置手机端tooltip2. 替换k线tooltip格式化输出函数2. 格式化输出函数说明HQChart插件源码地址完整的demo源码手机端分时图tooltip hqchart手机端内置一个tooltip,显示手势所在K线的信息。默认…