1
0
Files
Skill/manager/internal/config/repository.go

106 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package config
import (
"encoding/json"
"fmt"
"os"
"skillmgr/internal/types"
)
// LoadRepositoryConfig 加载仓库配置
func LoadRepositoryConfig() (*types.RepositoryConfig, error) {
path, err := GetRepositoryConfigPath()
if err != nil {
return nil, err
}
// 如果文件不存在,返回空配置
if _, err := os.Stat(path); os.IsNotExist(err) {
return &types.RepositoryConfig{
Repositories: []types.Repository{},
}, nil
}
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
var cfg types.RepositoryConfig
if err := json.Unmarshal(data, &cfg); err != nil {
return nil, fmt.Errorf("解析 repository.json 失败: %w请检查 JSON 格式)", err)
}
return &cfg, nil
}
// SaveRepositoryConfig 保存仓库配置
func SaveRepositoryConfig(cfg *types.RepositoryConfig) error {
path, err := GetRepositoryConfigPath()
if err != nil {
return err
}
data, err := json.MarshalIndent(cfg, "", " ")
if err != nil {
return err
}
return os.WriteFile(path, data, 0644)
}
// AddRepository 添加仓库
// 如果仓库名已存在,返回错误提示先移除
func AddRepository(repo types.Repository) error {
cfg, err := LoadRepositoryConfig()
if err != nil {
return err
}
// 检查是否已存在同名仓库
for _, r := range cfg.Repositories {
if r.Name == repo.Name {
return fmt.Errorf("仓库名称 '%s' 已存在,请先使用 `skillmgr remove %s` 移除", repo.Name, repo.Name)
}
}
// 新增
cfg.Repositories = append(cfg.Repositories, repo)
return SaveRepositoryConfig(cfg)
}
// RemoveRepository 移除仓库
func RemoveRepository(name string) error {
cfg, err := LoadRepositoryConfig()
if err != nil {
return err
}
for i, r := range cfg.Repositories {
if r.Name == name {
cfg.Repositories = append(cfg.Repositories[:i], cfg.Repositories[i+1:]...)
return SaveRepositoryConfig(cfg)
}
}
// 仓库不存在,不报错
return nil
}
// FindRepository 查找仓库
func FindRepository(name string) (*types.Repository, error) {
cfg, err := LoadRepositoryConfig()
if err != nil {
return nil, err
}
for _, r := range cfg.Repositories {
if r.Name == name {
return &r, nil
}
}
return nil, nil
}