Files
2026-06-03 15:49:54 -05:00

74 lines
1.9 KiB
Go

package cmd
import (
"fmt"
"github.com/jasonross/text-shark/internal/fileops"
"github.com/jasonross/text-shark/internal/runner"
"github.com/spf13/cobra"
)
var (
deleteLineDryRun bool
deleteLineType string
deleteLineGlob string
deleteLineRegex bool
)
var deleteLineCmd = &cobra.Command{
Use: "delete-line <pattern> [path]",
Short: "Delete all lines matching <pattern> from files",
Args: cobra.RangeArgs(1, 2),
RunE: func(cmd *cobra.Command, args []string) error {
pattern := args[0]
path := "."
if len(args) == 2 {
path = args[1]
}
var rgExtra []string
if deleteLineType != "" {
rgExtra = append(rgExtra, "--type", deleteLineType)
}
if deleteLineGlob != "" {
rgExtra = append(rgExtra, "--glob", deleteLineGlob)
}
files, err := runner.RgListFiles(pattern, path, rgExtra...)
if err != nil {
return err
}
if len(files) == 0 {
fmt.Println("No matches found.")
return nil
}
var results []fileops.DeleteResult
for _, f := range files {
var res fileops.DeleteResult
if deleteLineRegex {
res, err = fileops.DeleteLinesInFileRegex(f, pattern, deleteLineDryRun)
} else {
res, err = fileops.DeleteLinesInFile(f, pattern, deleteLineDryRun)
}
if err != nil {
return fmt.Errorf("%s: %w", f, err)
}
results = append(results, res)
}
if deleteLineDryRun {
fmt.Println("[dry-run] would modify:")
}
fileops.PrintDeleteResults(results)
return nil
},
}
func init() {
deleteLineCmd.Flags().BoolVar(&deleteLineDryRun, "dry-run", false, "Print what would change without writing")
deleteLineCmd.Flags().StringVarP(&deleteLineType, "type", "t", "", "File type filter (e.g. go, py)")
deleteLineCmd.Flags().StringVarP(&deleteLineGlob, "glob", "g", "", "Glob pattern for file paths")
deleteLineCmd.Flags().BoolVarP(&deleteLineRegex, "regex", "r", false, "Treat pattern as a regular expression")
}