4 Commity

Autor SHA1 Zpráva Datum
305e4300cc Fix off-by-one in CLI 2021-04-05 10:43:54 +02:00
b02911c9b4 Add 'delete' subcommand to delete matching records from log 2021-04-05 10:29:50 +02:00
8477ba5bfe CLI: Properly parse cli flags for subcommands
Previously we parsed cli flags globally instead of per subcommand, which was weird.
2021-04-05 10:18:35 +02:00
54697be895 Search: Properly exit on error 2021-04-05 09:53:25 +02:00
2 změnil soubory, kde provedl 56 přidání a 18 odebrání

Zobrazit soubor

@ -39,7 +39,7 @@ Add this to .bashrc
``` ```
if [ -n "$PS1" ] ; then if [ -n "$PS1" ] ; then
PROMPT_COMMAND='hs9001 -ret $? add "$(history 1)"' PROMPT_COMMAND='hs9001 add -ret $? "$(history 1)"'
fi fi
``` ```
By default, every system user gets his own database. You can override this by setting the environment variable By default, every system user gets his own database. You can override this by setting the environment variable

72
main.go
Zobrazit soubor

@ -77,6 +77,21 @@ func search(conn *sql.DB, q string) {
} }
} }
func delete(conn *sql.DB, q string) {
queryStmt := "DELETE FROM history WHERE command LIKE ?"
_, err := conn.Exec(queryStmt, "%"+q+"%")
if err != nil {
log.Panic(err)
}
_, err = conn.Exec("VACUUM")
if err != nil {
log.Panic(err)
}
}
func add(conn *sql.DB, cmd string) { func add(conn *sql.DB, cmd string) {
user := os.Getenv("USER") user := os.Getenv("USER")
hostname, err := os.Hostname() hostname, err := os.Hostname()
@ -124,53 +139,76 @@ func printUsage() {
} }
func main() { func main() {
var ret int addCmd := flag.NewFlagSet("add", flag.ExitOnError)
flag.IntVar(&ret, "ret", 0, "Return value of the command to add") searchCmd := flag.NewFlagSet("search", flag.ExitOnError)
flag.Parse() deleteCmd := flag.NewFlagSet("delete", flag.ExitOnError)
args := flag.Args()
argslen := len(args)
if argslen < 1 { if len(os.Args) < 2 {
printUsage() printUsage()
return return
} }
cmd := args[0] cmd := os.Args[1]
globalargs := os.Args[2:]
conn := createConnection() conn := createConnection()
if cmd == "add" { switch cmd {
case "add":
var ret int
addCmd.IntVar(&ret, "ret", 0, "Return value of the command to add")
addCmd.Parse(globalargs)
args := addCmd.Args()
if ret == 23 { // 23 is our secret do not log status code if ret == 23 { // 23 is our secret do not log status code
return return
} }
if argslen < 2 { if len(args) < 1 {
fmt.Fprint(os.Stderr, "Error: You need to provide the command to be added") fmt.Fprint(os.Stderr, "Error: You need to provide the command to be added")
} }
historycmd := args[1] historycmd := args[0]
var rgx = regexp.MustCompile("\\s+\\d+\\s+(.*)") var rgx = regexp.MustCompile("\\s+\\d+\\s+(.*)")
rs := rgx.FindStringSubmatch(historycmd) rs := rgx.FindStringSubmatch(historycmd)
if len(rs) == 2 { if len(rs) == 2 {
add(conn, rs[1]) add(conn, rs[1])
} }
} else if cmd == "search" { case "search":
if argslen < 2 { searchCmd.Parse(globalargs)
args := searchCmd.Args()
if len(args) < 1 {
fmt.Fprint(os.Stderr, "Please provide the search query\n") fmt.Fprint(os.Stderr, "Please provide the search query\n")
os.Exit(1)
} }
q := strings.Join(args[1:], " ")
q := strings.Join(args, " ")
search(conn, q) search(conn, q)
os.Exit(23) os.Exit(23)
} else if cmd == "init" { case "delete":
deleteCmd.Parse(globalargs)
args := deleteCmd.Args()
if len(args) < 1 {
fmt.Fprint(os.Stderr, "Error: You need to provide a search query for records to delete")
}
q := strings.Join(args, " ")
delete(conn, q)
//we do not want to leak what we just deleted :^)
os.Exit(23)
case "init":
err := os.MkdirAll(filepath.Dir(databaseLocation()), 0755) err := os.MkdirAll(filepath.Dir(databaseLocation()), 0755)
if err != nil { if err != nil {
log.Panic(err) log.Panic(err)
} }
initDatabase(conn) initDatabase(conn)
} else if cmd == "import" { case "import":
importFromStdin(conn) importFromStdin(conn)
} else { default:
fmt.Fprint(os.Stderr, "Error: Unknown command supplied\n\n") fmt.Fprintf(os.Stderr, "Error: Unknown subcommand '%s' supplied\n\n", cmd)
printUsage() printUsage()
return return
} }
} }