Fix bug with bash presaving that caused commands to not get properly recorded due to presaving looking like a duplicate command

This commit is contained in:
David Dworken 2023-09-29 21:03:12 -07:00
parent 0b57034c39
commit 2c77c3d9c9
No known key found for this signature in database
2 changed files with 16 additions and 7 deletions

View File

@ -145,7 +145,7 @@ func presaveHistoryEntry(ctx context.Context) {
// Augment it with os.Args // Augment it with os.Args
shellName := os.Args[2] shellName := os.Args[2]
cmd, err := extractCommandFromArg(ctx, shellName, os.Args[3]) cmd, err := extractCommandFromArg(ctx, shellName, os.Args[3] /* isPresave = */, true)
lib.CheckFatalError(err) lib.CheckFatalError(err)
entry.Command = cmd entry.Command = cmd
if strings.HasPrefix(" ", entry.Command) || strings.TrimSpace(entry.Command) == "" { if strings.HasPrefix(" ", entry.Command) || strings.TrimSpace(entry.Command) == "" {
@ -379,7 +379,7 @@ func buildHistoryEntry(ctx context.Context, args []string) (*data.HistoryEntry,
entry.EndTime = time.Now().UTC() entry.EndTime = time.Now().UTC()
// command // command
cmd, err := extractCommandFromArg(ctx, shell, args[4]) cmd, err := extractCommandFromArg(ctx, shell, args[4] /* isPresave = */, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -392,13 +392,13 @@ func buildHistoryEntry(ctx context.Context, args []string) (*data.HistoryEntry,
return entry, nil return entry, nil
} }
func extractCommandFromArg(ctx context.Context, shell, arg string) (string, error) { func extractCommandFromArg(ctx context.Context, shell, arg string, isPresave bool) (string, error) {
if shell == "bash" { if shell == "bash" {
cmd, err := getLastCommand(arg) cmd, err := getLastCommand(arg)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to build history entry: %w", err) return "", fmt.Errorf("failed to build history entry: %w", err)
} }
shouldBeSkipped, err := shouldSkipHiddenCommand(ctx, arg) shouldBeSkipped, err := shouldSkipHiddenCommand(ctx, arg, isPresave)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to check if command was hidden: %w", err) return "", fmt.Errorf("failed to check if command was hidden: %w", err)
} }
@ -566,12 +566,19 @@ func getLastCommand(history string) (string, error) {
return split[1], nil return split[1], nil
} }
func shouldSkipHiddenCommand(ctx context.Context, historyLine string) (bool, error) { func shouldSkipHiddenCommand(ctx context.Context, historyLine string, isPresave bool) (bool, error) {
config := hctx.GetConf(ctx) config := hctx.GetConf(ctx)
if config.LastSavedHistoryLine == historyLine { if isPresave && config.LastPreSavedHistoryLine == historyLine {
return true, nil return true, nil
} }
config.LastSavedHistoryLine = historyLine if !isPresave && config.LastSavedHistoryLine == historyLine {
return true, nil
}
if isPresave {
config.LastPreSavedHistoryLine = historyLine
} else {
config.LastSavedHistoryLine = historyLine
}
err := hctx.SetConfig(config) err := hctx.SetConfig(config)
if err != nil { if err != nil {
return false, err return false, err

View File

@ -168,6 +168,8 @@ type ClientConfig struct {
// A device ID used to track which history entry came from which device for remote syncing // A device ID used to track which history entry came from which device for remote syncing
DeviceId string `json:"device_id"` DeviceId string `json:"device_id"`
// Used for skipping history entries prefixed with a space in bash // Used for skipping history entries prefixed with a space in bash
LastPreSavedHistoryLine string `json:"last_presaved_history_line"`
// Used for skipping history entries prefixed with a space in bash
LastSavedHistoryLine string `json:"last_saved_history_line"` LastSavedHistoryLine string `json:"last_saved_history_line"`
// Used for uploading history entries that we failed to upload due to a missing network connection // Used for uploading history entries that we failed to upload due to a missing network connection
HaveMissedUploads bool `json:"have_missed_uploads"` HaveMissedUploads bool `json:"have_missed_uploads"`