gig-gitignore工具实战开发(五):gig add完善

发布于:2025-07-28 ⋅ 阅读:(18) ⋅ 点赞:(0)

gig-gitignore工具实战开发(五):gig add完善

✨ ​​前言​​: 在前几篇我们介绍了gig add的基础代码编写,本篇我们继续来完善gig add命令,重点介绍GitHub模板、API模板和TUI界面的实现。

🌐 GitHub模板支持

GitHub模板流程
存在
不存在
模板检查
用户执行命令
使用缓存
克隆模板
保存模板
合并内容
更新文件

核心代码实现:

func handleAdd(languages []string, source string, update bool) {
    if source == "github" {
        var templateDir string
        var err error

        if update {
            // 强制更新GitHub模板
            templateDir, err = ensureRemoteTemplatesAreCloned(true)
            if err != nil {
                fmt.Printf("无法更新 GitHub 模板:%v\n", err)
                return
            }
        } else {
            // 检查本地缓存
            home, err := utils.GetUserHomeDir()
            if err != nil {
                fmt.Println("查找用户主目录时出错:", err)
                os.Exit(1)
            }
            templateDir = filepath.Join(home, ".ciclebyte", "gig", "template_github")

            // 自动克隆如果不存在
            if !utils.FileExists(templateDir) {
                templateDir, err = ensureRemoteTemplatesAreCloned(false)
                if err != nil {
                    fmt.Printf("无法准备 GitHub 模板:%v\n", err)
                    return
                }
            }
        }
    }
    // ...合并模板内容逻辑...
}

使用gig add Go Python -t github -u可以确保获取最新的GitHub模板!

🔌 API模板支持

User CLI API gig add go -t api 发送GET请求获取go模板 返回模板内容 显示差异并确认 User CLI API

核心代码实现:

func getGitignoreFromAPI(languages []string) (string, error) {
    client := &http.Client{}
    var result strings.Builder
    
    for _, lang := range languages {
        url := fmt.Sprintf("https://api.gitignore.io/templates/%s", lang)
        req, err := http.NewRequest("GET", url, nil)
        if err != nil {
            return "", err
        }
        
        resp, err := client.Do(req)
        if err != nil {
            return "", err
        }
        defer resp.Body.Close()
        
        body, err := io.ReadAll(resp.Body)
        if err != nil {
            return "", err
        }
        
        result.WriteString(string(body))
        result.WriteString("\n\n")
    }
    
    return result.String(), nil
}

⚠️ ​​注意​​:API方式需要网络连接,离线环境下无法使用。

🖥️ TUI界面增强

确认
取消
用户输入--tui参数
初始化TUI应用
创建左右文本视图
计算内容差异
渲染带颜色的差异内容
设置键盘事件处理
显示交互界面
用户操作
返回true
返回false
功能特点
  1. ​直观的差异对比​​:

    • 左侧显示原始内容,右侧显示更新内容
    • 红色标记删除的行(-)
    • 绿色标记新增的行(+)
  2. ​便捷的导航控制​​:

    • Tab/Shift+Tab在视图间切换
    • 支持多种确认/取消方式
  3. ​响应式布局​​:

    • 自动适应终端大小
    • 内容过多时支持滚动
# 使用TUI界面添加Go语言模板
gig add go --tui

# 效果示意
+-------------------------------------------+
| 原始版本                    更新版本       |
|+-----------------------------------------+|
||                           + bin/        ||
||                           + pkg/        ||
||                           + *.exe       ||
|+-----------------------------------------+|

核心代码实现:

func (dv *DiffViewer) ShowDiff(original, updated string) (bool, error) {
    // 创建左右文本视图
    leftView := tview.NewTextView()
    rightView := tview.NewTextView()
    
    // 生成差异内容
    dmp := diffmatchpatch.New()
    a, b, lineArray := dmp.DiffLinesToChars(original, updated)
    diffs := dmp.DiffMain(a, b, false)
    diffs = dmp.DiffCharsToLines(diffs, lineArray)
    
    // 渲染差异
    var leftBuilder, rightBuilder strings.Builder
    for _, diff := range diffs {
        lines := strings.Split(diff.Text, "\n")
        for i, line := range lines {
            if i == len(lines)-1 && line == "" {
                continue
            }
            switch diff.Type {
            case diffmatchpatch.DiffInsert:
                rightBuilder.WriteString("[black:green]+ " + line + "[white:black]\n")
            case diffmatchpatch.DiffDelete:
                leftBuilder.WriteString("[black:red]- " + line + "[white:black]\n")
            case diffmatchpatch.DiffEqual:
                leftBuilder.WriteString("  " + line + "\n")
                rightBuilder.WriteString("  " + line + "\n")
            }
        }
    }
    
    // ...界面布局和事件处理代码...
}

🎮 ​​体验优化​​:通过--tui参数即可启用图形界面,比纯文本差异更直观!

🚀 总结

本次完善为gig add带来了三大增强:

  1. 🌐 ​​GitHub模板​​ - 支持离线缓存和强制更新
  2. 🔌 ​​API模板​​ - 提供最新内容的即时获取
  3. 🖥️ ​​TUI界面​​ - 提升交互体验

网站公告

今日签到

点亮在社区的每一天
去签到