From 5affeb76eeeeee166fda5e92874dbc1f0ed29c28 Mon Sep 17 00:00:00 2001 From: "Thomas G. Lopes" Date: Thu, 19 Feb 2026 17:24:36 +0000 Subject: [PATCH] Auto-detect package by target --- main.go | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index cc5218a..a4e28ef 100644 --- a/main.go +++ b/main.go @@ -235,12 +235,33 @@ func addCmd(args []string) error { } reader := bufio.NewReader(os.Stdin) - pkgName := promptWithDefault(reader, "Package name", defaultPkg) - if pkgName == "" { - return errors.New("package name cannot be empty") + var pkgName string + + matchedPkg, err := findPackageByTarget(repo, defaultTarget) + if err != nil { + return err + } + if matchedPkg != "" { + ok, err := promptYesNo(fmt.Sprintf("Merge into existing package %q?", matchedPkg), true) + if err != nil { + return err + } + if ok { + pkgName = matchedPkg + } } - targetRootInput := promptWithDefault(reader, "Target path", defaultTarget) + if pkgName == "" { + pkgName = promptWithDefault(reader, "Package name", defaultPkg) + if pkgName == "" { + return errors.New("package name cannot be empty") + } + } + + targetRootInput := defaultTarget + if pkgName != matchedPkg || matchedPkg == "" { + targetRootInput = promptWithDefault(reader, "Target path", defaultTarget) + } targetRoot, err := filepath.Abs(expandHome(targetRootInput)) if err != nil { return err @@ -749,6 +770,44 @@ func findStaleLinks(filesDir, targetRoot string) ([]string, error) { return stale, nil } +func findPackageByTarget(repo, targetRoot string) (string, error) { + repoEntries, err := os.ReadDir(repo) + if err != nil { + return "", err + } + + absTarget, err := filepath.Abs(expandHome(targetRoot)) + if err != nil { + return "", err + } + + for _, entry := range repoEntries { + if !entry.IsDir() || strings.HasPrefix(entry.Name(), ".") { + continue + } + + pkgDir := filepath.Join(repo, entry.Name()) + configPath := filepath.Join(pkgDir, configFileName) + cfg, err := loadConfig(configPath) + if err != nil { + continue + } + target, err := selectTarget(cfg.targets) + if err != nil { + continue + } + absPkgTarget, err := filepath.Abs(expandHome(target)) + if err != nil { + continue + } + if absPkgTarget == absTarget { + return entry.Name(), nil + } + } + + return "", nil +} + func removeLinks(paths []string, dryRun bool) error { for _, path := range paths { if dryRun {