mirror of
https://github.com/ddworken/hishtory.git
synced 2025-01-14 18:28:24 +01:00
Support queries as part of the export command + more info sent to the banner endpoint
This commit is contained in:
parent
5fdb922801
commit
5e44e7ef36
@ -123,6 +123,7 @@ func TestParameterized(t *testing.T) {
|
|||||||
t.Run("testTimestampsAreReasonablyCorrect/"+tester.ShellName(), func(t *testing.T) { testTimestampsAreReasonablyCorrect(t, tester) })
|
t.Run("testTimestampsAreReasonablyCorrect/"+tester.ShellName(), func(t *testing.T) { testTimestampsAreReasonablyCorrect(t, tester) })
|
||||||
t.Run("testRequestAndReceiveDbDump/"+tester.ShellName(), func(t *testing.T) { testRequestAndReceiveDbDump(t, tester) })
|
t.Run("testRequestAndReceiveDbDump/"+tester.ShellName(), func(t *testing.T) { testRequestAndReceiveDbDump(t, tester) })
|
||||||
t.Run("testInstallViaPythonScript/"+tester.ShellName(), func(t *testing.T) { testInstallViaPythonScript(t, tester) })
|
t.Run("testInstallViaPythonScript/"+tester.ShellName(), func(t *testing.T) { testInstallViaPythonScript(t, tester) })
|
||||||
|
t.Run("testExportWithQuery/"+tester.ShellName(), func(t *testing.T) { testExportWithQuery(t, tester) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,6 +303,7 @@ echo thisisrecorded`)
|
|||||||
t.Fatalf("output is missing expected item %#v: %#v", item, out)
|
t.Fatalf("output is missing expected item %#v: %#v", item, out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO
|
||||||
// match, err = regexp.MatchString(`.*~/.*\s+[a-zA-Z]{3} \d+ 2022 \d\d:\d\d:\d\d PST\s+\d{1,2}ms\s+0\s+echo thisisrecorded.*`, out)
|
// match, err = regexp.MatchString(`.*~/.*\s+[a-zA-Z]{3} \d+ 2022 \d\d:\d\d:\d\d PST\s+\d{1,2}ms\s+0\s+echo thisisrecorded.*`, out)
|
||||||
// shared.Check(t, err)
|
// shared.Check(t, err)
|
||||||
// if !match {
|
// if !match {
|
||||||
@ -379,6 +381,17 @@ hishtory disable`)
|
|||||||
if strings.Count(out, "\n") != 3 {
|
if strings.Count(out, "\n") != 3 {
|
||||||
t.Fatalf("hishtory query has the wrong number of lines=%d, out=%#v", strings.Count(out, "\n"), out)
|
t.Fatalf("hishtory query has the wrong number of lines=%d, out=%#v", strings.Count(out, "\n"), out)
|
||||||
}
|
}
|
||||||
|
// And again, but with a strailing slash
|
||||||
|
out = hishtoryQuery(t, tester, `cwd:/tmp/`)
|
||||||
|
if !strings.Contains(out, "echo querybydir") {
|
||||||
|
t.Fatalf("hishtory query doesn't contain result matching cwd:/tmp, out=%#v", out)
|
||||||
|
}
|
||||||
|
if strings.Contains(out, "nevershouldappear") {
|
||||||
|
t.Fatalf("hishtory query contains unexpected entry, out=%#v", out)
|
||||||
|
}
|
||||||
|
if strings.Count(out, "\n") != 3 {
|
||||||
|
t.Fatalf("hishtory query has the wrong number of lines=%d, out=%#v", strings.Count(out, "\n"), out)
|
||||||
|
}
|
||||||
|
|
||||||
// Query based on cwd without the slash
|
// Query based on cwd without the slash
|
||||||
out = hishtoryQuery(t, tester, `cwd:tmp`)
|
out = hishtoryQuery(t, tester, `cwd:tmp`)
|
||||||
@ -1048,4 +1061,68 @@ func testInstallViaPythonScript(t *testing.T, tester shellTester) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testExportWithQuery(t *testing.T, tester shellTester) {
|
||||||
|
// Setup
|
||||||
|
defer shared.BackupAndRestore(t)()
|
||||||
|
installHishtory(t, tester, "")
|
||||||
|
|
||||||
|
// Test recording commands
|
||||||
|
out, err := tester.RunInteractiveShellRelaxed(t, `ls /a
|
||||||
|
ls /bar
|
||||||
|
ls /foo
|
||||||
|
echo foo
|
||||||
|
echo bar
|
||||||
|
hishtory disable
|
||||||
|
echo thisisnotrecorded
|
||||||
|
sleep 0.5
|
||||||
|
cd /tmp/
|
||||||
|
hishtory enable
|
||||||
|
echo thisisrecorded`)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if out != "foo\nbar\nthisisnotrecorded\nthisisrecorded\n" {
|
||||||
|
t.Fatalf("unexpected output from running commands: %#v", out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test querying for all commands
|
||||||
|
out = hishtoryQuery(t, tester, "")
|
||||||
|
expected := []string{"echo thisisrecorded", "hishtory enable", "echo bar", "echo foo", "ls /foo", "ls /bar", "ls /a"}
|
||||||
|
for _, item := range expected {
|
||||||
|
if !strings.Contains(out, item) {
|
||||||
|
t.Fatalf("output is missing expected item %#v: %#v", item, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test querying for a specific command
|
||||||
|
out = hishtoryQuery(t, tester, "foo")
|
||||||
|
expected = []string{"echo foo", "ls /foo"}
|
||||||
|
unexpected := []string{"echo thisisrecorded", "hishtory enable", "echo bar", "ls /bar", "ls /a"}
|
||||||
|
for _, item := range expected {
|
||||||
|
if !strings.Contains(out, item) {
|
||||||
|
t.Fatalf("output is missing expected item %#v: %#v", item, out)
|
||||||
|
}
|
||||||
|
if strings.Count(out, item) != 1 {
|
||||||
|
t.Fatalf("output has %#v in it multiple times! out=%#v", item, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, item := range unexpected {
|
||||||
|
if strings.Contains(out, item) {
|
||||||
|
t.Fatalf("output is containing unexpected item %#v: %#v", item, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test using export with a query
|
||||||
|
out = tester.RunInteractiveShell(t, `hishtory export foo`)
|
||||||
|
if out != "ls /foo\necho foo\nhishtory query foo\n" {
|
||||||
|
t.Fatalf("expected hishtory export to equal out=%#v", out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test a more complex query with export
|
||||||
|
out = tester.RunInteractiveShell(t, `hishtory export cwd:/tmp/`)
|
||||||
|
if out != "hishtory enable\necho thisisrecorded\n" {
|
||||||
|
t.Fatalf("expected hishtory export to equal out=%#v", out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: write a test that runs hishtroy export | grep -v pipefail and then see if that shows up in query/export, I think there is weird behavior here
|
// TODO: write a test that runs hishtroy export | grep -v pipefail and then see if that shows up in query/export, I think there is weird behavior here
|
||||||
|
@ -196,7 +196,7 @@ func parseAtomizedToken(token string) (string, interface{}, error) {
|
|||||||
return "(instr(hostname, ?) > 0)", val, nil
|
return "(instr(hostname, ?) > 0)", val, nil
|
||||||
case "cwd":
|
case "cwd":
|
||||||
// TODO: Can I make this support querying via ~/ too?
|
// TODO: Can I make this support querying via ~/ too?
|
||||||
return "(instr(current_working_directory, ?) > 0)", val, nil
|
return "(instr(current_working_directory, ?) > 0)", strings.TrimSuffix(val, "/"), nil
|
||||||
case "exit_code":
|
case "exit_code":
|
||||||
return "(exit_code = ?)", val, nil
|
return "(exit_code = ?)", val, nil
|
||||||
case "before":
|
case "before":
|
||||||
|
@ -27,7 +27,7 @@ func main() {
|
|||||||
case "query":
|
case "query":
|
||||||
query(strings.Join(os.Args[2:], " "))
|
query(strings.Join(os.Args[2:], " "))
|
||||||
case "export":
|
case "export":
|
||||||
export()
|
export(strings.Join(os.Args[2:], " "))
|
||||||
case "init":
|
case "init":
|
||||||
lib.CheckFatalError(lib.Setup(os.Args))
|
lib.CheckFatalError(lib.Setup(os.Args))
|
||||||
case "install":
|
case "install":
|
||||||
@ -122,7 +122,7 @@ func displayBannerIfSet() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get config: %v", err)
|
return fmt.Errorf("failed to get config: %v", err)
|
||||||
}
|
}
|
||||||
url := "/api/v1/banner?commit_hash=" + GitCommit + "&device_id=" + config.DeviceId + "&forced_banner=" + os.Getenv("FORCED_BANNER")
|
url := "/api/v1/banner?commit_hash=" + GitCommit + "&user_id=" + data.UserId(config.UserSecret) + "&device_id=" + config.DeviceId + "&version=" + lib.Version + "&forced_banner=" + os.Getenv("FORCED_BANNER")
|
||||||
respBody, err := lib.ApiGet(url)
|
respBody, err := lib.ApiGet(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -201,7 +201,7 @@ func saveHistoryEntry() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func export() {
|
func export(query string) {
|
||||||
db, err := lib.OpenLocalSqliteDb()
|
db, err := lib.OpenLocalSqliteDb()
|
||||||
lib.CheckFatalError(err)
|
lib.CheckFatalError(err)
|
||||||
err = retrieveAdditionalEntriesFromRemote(db)
|
err = retrieveAdditionalEntriesFromRemote(db)
|
||||||
@ -212,7 +212,7 @@ func export() {
|
|||||||
lib.CheckFatalError(err)
|
lib.CheckFatalError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data, err := data.Search(db, "", 0)
|
data, err := data.Search(db, query, 0)
|
||||||
lib.CheckFatalError(err)
|
lib.CheckFatalError(err)
|
||||||
for i := len(data) - 1; i >= 0; i-- {
|
for i := len(data) - 1; i >= 0; i-- {
|
||||||
fmt.Println(data[i].Command)
|
fmt.Println(data[i].Command)
|
||||||
|
Loading…
Reference in New Issue
Block a user