{"record":{"id":"1b1f32ba5c6077fa","repo":"benbjohnson/litestream","slug":"too-many-arguments-1b1f32","errorCode":null,"errorMessage":"too many arguments","messagePattern":"too many arguments","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/litestream/register.go","lineNumber":37,"sourceCode":"func (c *RegisterCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-register\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\treplicaFlag := fs.String(\"replica\", \"\", \"replica URL (e.g., s3://bucket/prefix, file:///backup/path)\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn &usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint:    \"litestream register -replica s3://bucket/prefix /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() > 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\tif *replicaFlag == \"\" {\n\t\treturn &usageError{\n\t\t\tmessage: \"-replica is required\",\n\t\t\thint:    \"litestream register -replica s3://bucket/prefix /path/to/db\",\n\t\t}\n\t}\n\tif *timeout <= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\treplicaURL := *replicaFlag\n\n\t// Create HTTP client that connects via Unix socket with timeout.\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := &http.Client{\n\t\tTimeout: clientTimeout,","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/benbjohnson/litestream/blob/4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3/cmd/litestream/register.go#L19-L55","documentation":"The `litestream register` command's Run enforces argument arity: after flags, exactly one positional argument (the database path) is accepted. Supplying more than one positional argument returns this usage error.","triggerScenarios":"Running `litestream register -replica s3://bucket/prefix db1.sqlite db2.sqlite` or passing extra positional tokens (e.g. trailing flags misplaced so they count as args).","commonSituations":"Trying to register multiple databases in one command; shell globbing expanding into several paths; pasting a command with an extra stray argument.","solutions":["Pass exactly one database path per invocation; run the command once per database.","Quote globs or check what the shell expanded (`echo /path/*.db`) to avoid multiple paths.","Reorder options so all flags come before the single positional DB path."],"exampleFix":"// before\nlitestream register -replica s3://bucket/prefix db1.sqlite db2.sqlite\n// after\nlitestream register -replica s3://bucket/prefix db1.sqlite\nlitestream register -replica s3://bucket/prefix db2.sqlite","handlingStrategy":"validation","validationCode":"// Ensure exactly one positional arg is passed to register\nargs := flagArgs\nif len(args) != 1 {\n    return fmt.Errorf(\"register takes exactly one db path, got %d\", len(args))\n}","typeGuard":null,"tryCatchPattern":"if err := runRegister(args); err != nil {\n    var ue *usageError\n    if errors.As(err, &ue) {\n        fmt.Fprintf(os.Stderr, \"usage: %s\\n\", ue.hint)\n        os.Exit(2)\n    }\n}","preventionTips":["Register databases one at a time; loop in shell instead of passing multiple paths.","Quote file globs to prevent shell expansion into multiple arguments.","Check NArg with the -h usage hint when scripting the command."],"tags":["cli","arguments","register","usage"],"backgroundTag":"missing-cli-argument","analyzedSha":"4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3","analyzedAt":"2026-09-06T18:29:25.564Z","contentChangedAt":"2026-09-06T18:29:25.564Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}