Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions internal/core/domain/dependency.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 4 additions & 2 deletions internal/core/domain/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down
12 changes: 7 additions & 5 deletions internal/core/services/installer/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

Expand Down Expand Up @@ -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
}
Expand All @@ -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)
}
}
Expand Down
5 changes: 5 additions & 0 deletions internal/core/services/installer/installer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
12 changes: 12 additions & 0 deletions internal/core/services/installer/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down