镜像自地址
https://github.com/quitesimpleorg/hs9001.git
已同步 2025-07-07 22:04:56 +02:00
比较提交
4 次代码提交
ebcdfa5ff4
...
master
作者 | SHA1 | 提交日期 | |
---|---|---|---|
e1375f237c | |||
ac9aab63bd | |||
d0e07640e8 | |||
6d4e7a96dc |
13
README.md
13
README.md
@ -20,12 +20,13 @@ hs -cwd .
|
||||
Lists all commands ever entered in this directory
|
||||
|
||||
```
|
||||
hs -after yesterday -cwd . git
|
||||
hs -today -cwd . git
|
||||
```
|
||||
Lists all git commands in the current directory which have been entered today.
|
||||
|
||||
Also, it (by default) replaces bash's built-in CTRL-R mechanism, so hs9001's database will be used instead
|
||||
of bash's limited history files.
|
||||
Also, it (by default) replaces bash's built-in CTRL-R mechanism, so hs9001's database will be used instead of bash's limited history files.
|
||||
|
||||
When in reverse-search mode, you can only search the history of the current directory by pressing CTRL+A and then "w".
|
||||
|
||||
## Install
|
||||
|
||||
@ -51,9 +52,6 @@ apk add hs9001
|
||||
go build
|
||||
#move hs9001 to a PATH location
|
||||
```
|
||||
|
||||
## Setup / Config
|
||||
|
||||
Add this to .bashrc
|
||||
|
||||
```
|
||||
@ -62,8 +60,7 @@ eval "$(hs9001 bash-enable)"
|
||||
|
||||
This will also create a `hs`alias so you have to type less in everyday usage.
|
||||
|
||||
By default, every system user gets his own database. You can override this by setting the environment variable
|
||||
for all users that should write to your unified database.
|
||||
By default, every system user gets his own database. You can override this by setting the environment variable for all users that should write to your unified database.
|
||||
```
|
||||
export HS9001_DB_PATH="/home/db/history.sqlite"
|
||||
```
|
||||
|
29
main.go
29
main.go
@ -66,6 +66,11 @@ func migrateDatabase(conn *sql.DB, currentVersion int) {
|
||||
migrations := []string{
|
||||
"ALTER TABLE history ADD COLUMN workdir varchar(4096) DEFAULT ''",
|
||||
"ALTER TABLE history ADD COLUMN retval integer DEFAULT -9001",
|
||||
"ALTER TABLE history ADD COLUMN unix_tmp integer",
|
||||
"UPDATE history SET unix_tmp = strftime('%s', timestamp)",
|
||||
"DROP VIEW count_by_date",
|
||||
"ALTER TABLE history DROP COLUMN timestamp",
|
||||
"ALTER TABLE history RENAME COLUMN unix_tmp TO timestamp",
|
||||
}
|
||||
|
||||
if !(len(migrations) > currentVersion) {
|
||||
@ -164,7 +169,7 @@ type searchopts struct {
|
||||
func search(conn *sql.DB, opts searchopts) list.List {
|
||||
args := make([]interface{}, 0)
|
||||
var sb strings.Builder
|
||||
sb.WriteString("SELECT id, command, workdir, user, hostname, retval ")
|
||||
sb.WriteString("SELECT id, command, workdir, user, hostname, retval, timestamp ")
|
||||
sb.WriteString("FROM history ")
|
||||
sb.WriteString("WHERE 1=1 ") //1=1 so we can append as many AND foo as we want, or none
|
||||
|
||||
@ -177,11 +182,11 @@ func search(conn *sql.DB, opts searchopts) list.List {
|
||||
args = append(args, opts.workdir)
|
||||
}
|
||||
if opts.after != nil {
|
||||
sb.WriteString("AND timestamp > datetime(?, 'unixepoch') ")
|
||||
sb.WriteString("AND timestamp > ? ")
|
||||
args = append(args, opts.after.Unix())
|
||||
}
|
||||
if opts.before != nil {
|
||||
sb.WriteString("AND timestamp < datetime(?, 'unixepoch') ")
|
||||
sb.WriteString("AND timestamp < ? ")
|
||||
args = append(args, opts.before.Unix())
|
||||
}
|
||||
if opts.retval != nil {
|
||||
@ -213,10 +218,12 @@ func search(conn *sql.DB, opts searchopts) list.List {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var entry HistoryEntry
|
||||
err = rows.Scan(&entry.id, &entry.cmd, &entry.cwd, &entry.user, &entry.hostname, &entry.retval)
|
||||
var timestamp int64
|
||||
err = rows.Scan(&entry.id, &entry.cmd, &entry.cwd, &entry.user, &entry.hostname, &entry.retval, ×tamp)
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
entry.timestamp = time.Unix(timestamp, 0)
|
||||
result.PushBack(&entry)
|
||||
}
|
||||
return result
|
||||
@ -232,7 +239,7 @@ func delete(conn *sql.DB, entryId uint32) {
|
||||
}
|
||||
|
||||
func add(conn *sql.DB, entry HistoryEntry) {
|
||||
stmt, err := conn.Prepare("INSERT INTO history (user, command, hostname, workdir, timestamp, retval) VALUES (?, ?, ?, ?, datetime(?, 'unixepoch'),?)")
|
||||
stmt, err := conn.Prepare("INSERT INTO history (user, command, hostname, workdir, timestamp, retval) VALUES (?, ?, ?, ?, ?,?)")
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
@ -351,13 +358,14 @@ func main() {
|
||||
var afterTime string
|
||||
var beforeTime string
|
||||
var distinct bool = true
|
||||
var today bool = false
|
||||
var retVal int
|
||||
searchCmd.StringVar(&workDir, "cwd", "", "Search only within this workdir")
|
||||
searchCmd.StringVar(&afterTime, "after", "", "Start searching from this timeframe")
|
||||
searchCmd.StringVar(&beforeTime, "before", "", "End searching from this timeframe")
|
||||
searchCmd.BoolVar(&distinct, "distinct", true, "Remove consecutive duplicate commands from output")
|
||||
searchCmd.BoolVar(&today, "today", false, "Search only today's entries. Overrides --after")
|
||||
searchCmd.IntVar(&retVal, "ret", -9001, "Only query commands that returned with this exit code. -9001=all (default)")
|
||||
|
||||
searchCmd.Parse(globalargs)
|
||||
|
||||
args := searchCmd.Args()
|
||||
@ -378,6 +386,11 @@ func main() {
|
||||
}
|
||||
opts.workdir = &wd
|
||||
}
|
||||
|
||||
if today {
|
||||
afterTime = "today"
|
||||
}
|
||||
|
||||
if afterTime != "" {
|
||||
afterTimestamp, err := naturaldate.Parse(afterTime, time.Now())
|
||||
if err != nil {
|
||||
@ -398,6 +411,7 @@ func main() {
|
||||
results := search(conn, opts)
|
||||
|
||||
previousCmd := ""
|
||||
previousReturn := -1
|
||||
|
||||
fi, err := os.Stdout.Stat()
|
||||
if err != nil {
|
||||
@ -415,7 +429,7 @@ func main() {
|
||||
if !ok {
|
||||
log.Panic("Failed to retrieve entries")
|
||||
}
|
||||
if !distinct || previousCmd != entry.cmd {
|
||||
if !distinct || !(previousCmd == entry.cmd && previousReturn == entry.retval) {
|
||||
prefix := ""
|
||||
postfix := ""
|
||||
if printColors && entry.retval != 0 {
|
||||
@ -425,6 +439,7 @@ func main() {
|
||||
fmt.Printf("%s%s%s\n", prefix, entry.cmd, postfix)
|
||||
}
|
||||
previousCmd = entry.cmd
|
||||
previousReturn = entry.retval
|
||||
}
|
||||
|
||||
if cmd == "delete" {
|
||||
|
在新工单中引用
屏蔽一个用户