diff --git a/internal/core/domain/dependency.go b/internal/core/domain/dependency.go index df0878a..997b18a 100644 --- a/internal/core/domain/dependency.go +++ b/internal/core/domain/dependency.go @@ -154,6 +154,15 @@ func (p *Dependency) GetKey() string { return strings.ToLower(p.Repository) } +// RepositoryName returns the normalized, collision-free name for a raw +// repository string, ignoring protocol, credentials and a .git suffix. +// Use it to compare user-supplied dependency arguments against boss.json +// keys, which may or may not carry a protocol prefix. +func RepositoryName(repo string) string { + d := Dependency{Repository: repo} + return d.Name() +} + // NeedsVersionUpdate checks if a version update is needed based on semver comparison. func NeedsVersionUpdate(currentVersion, newVersion string) bool { parsedNew, err := semver.NewVersion(newVersion) diff --git a/internal/core/domain/package.go b/internal/core/domain/package.go index e19fadb..608d639 100644 --- a/internal/core/domain/package.go +++ b/internal/core/domain/package.go @@ -48,8 +48,9 @@ func NewPackage() *Package { // AddDependency adds or updates a dependency in the package. func (p *Package) AddDependency(dep string, ver string) { + depName := RepositoryName(dep) for key := range p.Dependencies { - if strings.EqualFold(key, dep) { + if strings.EqualFold(key, dep) || strings.EqualFold(RepositoryName(key), depName) { p.Dependencies[key] = ver return } @@ -74,8 +75,9 @@ func (p *Package) GetParsedDependencies() []Dependency { // UninstallDependency removes a dependency from the package. func (p *Package) UninstallDependency(dep string) { if p.Dependencies != nil { + depName := RepositoryName(dep) for key := range p.Dependencies { - if strings.EqualFold(key, dep) { + if strings.EqualFold(key, dep) || strings.EqualFold(RepositoryName(key), depName) { delete(p.Dependencies, key) return } diff --git a/internal/core/services/installer/core.go b/internal/core/services/installer/core.go index 3a1ca21..9e14e03 100644 --- a/internal/core/services/installer/core.go +++ b/internal/core/services/installer/core.go @@ -54,8 +54,7 @@ func newInstallContext(config env.ConfigProvider, pkg *domain.Package, options I requestedDeps := make(map[string]bool) if len(options.Args) > 0 { for _, arg := range options.Args { - normalized := ParseDependency(arg) - requestedDeps[normalized] = true + requestedDeps[strings.ToLower(requestedDependencyName(arg))] = true } } @@ -172,9 +171,12 @@ func collectDependenciesToInstall(pkg *domain.Package, args []string) []domain.D var filtered []domain.Dependency for _, arg := range args { - normalized := ParseDependency(arg) + // Compare by normalized name: boss.json keys may lack the protocol + // prefix the user typed, and the argument may carry a version suffix + // (EnsureDependency strips both on save). + requestedName := requestedDependencyName(arg) for _, dep := range allDeps { - if dep.Repository == normalized { + if strings.EqualFold(dep.Name(), requestedName) { filtered = append(filtered, dep) break } @@ -201,7 +203,7 @@ func (ic *installContext) ensureDependencies(pkg *domain.Package) ([]domain.Depe var deps []domain.Dependency if pkg == ic.root && len(ic.requestedDeps) > 0 { for _, dep := range allDeps { - if ic.requestedDeps[dep.Repository] { + if ic.requestedDeps[strings.ToLower(dep.Name())] { deps = append(deps, dep) } } diff --git a/internal/core/services/installer/installer.go b/internal/core/services/installer/installer.go index e323829..7ce5602 100644 --- a/internal/core/services/installer/installer.go +++ b/internal/core/services/installer/installer.go @@ -62,6 +62,11 @@ func UninstallModules(args []string, noSave bool) { for _, arg := range args { dependencyRepository := ParseDependency(arg) + // Drop any ":version"/"@version" suffix so the argument matches the + // stored key regardless of how the dependency was installed. + if url, _ := parseURLAndVersion(dependencyRepository); url != "" { + dependencyRepository = url + } pkg.UninstallDependency(dependencyRepository) } diff --git a/internal/core/services/installer/utils.go b/internal/core/services/installer/utils.go index 5b994c4..15f4545 100644 --- a/internal/core/services/installer/utils.go +++ b/internal/core/services/installer/utils.go @@ -59,6 +59,18 @@ func parseURLAndVersion(input string) (string, string) { return url, version } +// requestedDependencyName normalizes a user-supplied dependency argument — +// optionally carrying a ":version" or "@version" suffix — to the same +// collision-free name boss.json keys resolve to. +func requestedDependencyName(arg string) string { + parsed := ParseDependency(arg) + url, _ := parseURLAndVersion(parsed) + if url == "" { + url = parsed + } + return domain.RepositoryName(url) +} + // EnsureDependency ensures that the dependencies are added to the package. func EnsureDependency(pkg *domain.Package, args []string) { for _, dependency := range args {