完成一个简易的全局skill、command管理器
This commit is contained in:
105
manager/internal/config/repository.go
Normal file
105
manager/internal/config/repository.go
Normal file
@@ -0,0 +1,105 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user