Auto-detect package by target

This commit is contained in:
2026-02-19 17:24:36 +00:00
parent 6333da0a3b
commit 5affeb76ee

63
main.go
View File

@@ -235,12 +235,33 @@ func addCmd(args []string) error {
}
reader := bufio.NewReader(os.Stdin)
pkgName := promptWithDefault(reader, "Package name", defaultPkg)
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
}
}
if pkgName == "" {
pkgName = promptWithDefault(reader, "Package name", defaultPkg)
if pkgName == "" {
return errors.New("package name cannot be empty")
}
}
targetRootInput := promptWithDefault(reader, "Target path", defaultTarget)
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 {