106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
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
|
||
}
|