Commit Graph

218 Commits

Author SHA1 Message Date
Ellie Huxtable
d84f5b2d33
feat: don't stop with invalid key (#1612)
An issue with the old sync was that if there was _one_ record encrypted
with a different key, sync would stop. You'd need to delete your account
and start from scratch. This sucked.

This change means we will carry on, and try to encrypt and build with as
much of the history as we are able to decrypt.

This is possible because we can quite happily store data on disk that we
cannot decrypt. The old store couldn't do this.

In future, we might consider a keyring containing multiple keys.
2024-01-22 20:07:19 +00:00
Ellie Huxtable
6af6c9066b
fix(tui): dedupe was removing history (#1610)
Related: https://forum.atuin.sh/t/search-ignoring-commands/74/5?u=ellie

When a user ran a duplicated command, but in another session, it was
removed by filters. This is because the subquery that was once used did
not have the same filters applied as the main query.

Instead of messing with subqueries, `group by` instead. This aligns with
the search() function
2024-01-22 17:06:34 +00:00
Ellie Huxtable
600ebc33ab
feat: make store init idempotent (#1609) 2024-01-22 16:48:21 +00:00
Koichi Murase
e484a68b8b
feat(search): make cursor style configurable (#1595)
* feat(search): make cursor style configurable

The vim mode of the interactive Atuin search changes the cursor style
on a mode change, but the current implementation has the following
issues.

* The terminal's cursor style set by the Atuin search remains after
  Atuin exits.  This causes an inconsistency with the shell's setting
  for the cursor style.

* Also, the cursor style for each keymap mode is currently hardcoded
  in the source code, which is not necessarily consistent with the
  user's cursor-style setting in the shell.

* Since the current implementation does not set the cursor style for
  the initial keymap mode but only sets the cursor style when the
  keymap mode is changed, it also causes inconsistency in the cursor
  style and the actual keymap when the shell's keymap and Atuin's
  initial keymap mode are different.

This patch solves those issues by introducing an opt-in configuration
variable `keymap_cursor`.  By default, the vim mode does not change
the cursor style because there is no way to automatically determine
the cursor style consistent with the shell settings.  We enable the
feature only when the user specifies the preferred cursor style in
each mode in their config.  Also, the cursor style is set on the
startup of the Atuin search (based on the initial keymap mode) and is
reset on the termination of the Atuin search (based on the shell's
keymap mode that started the Atuin search).

* chore(settings): remove dependency on crossterm
2024-01-22 10:56:44 +00:00
Ellie Huxtable
8899ce5089
fix: add acquire timeout to sqlite database connection (#1590)
* fix: add acquire timeout to sqlite database connection

This should fix #1503

I wasn't able to trigger enough IO pressure for the SQL connection to be
a problem.

This adds `local_timeout` to the client config. This is a float, and
represents the number of seconds (units in line with the other timeouts,
though those are ints). Users may well want to reduce this if they
regularly have issues, but by default I think 2s is fine and avoids a
non-responsive system in bad situations.

* tests
2024-01-19 15:45:42 +00:00
Peter Holloway
10f465da8f
fix: Use existing db querying for history list (#1589)
When printing the history list with either the session or cwd filter
enabled, use to same query method as without either to ensure that the
other options (hide deleted entries etc) are respected.
2024-01-19 11:21:05 +00:00
Ellie Huxtable
d9317a1a9c
feat: make deleting from the UI work with record store sync (#1580)
* feat: make deleting from the UI work with record store sync

* sort cli delete too

* teeny bit more logs
2024-01-17 09:58:09 +00:00
Koichi Murase
6bff8c8e1a
feat(search): introduce keymap-dependent vim-mode (#1570)
* feat(search): introduce keymap-dependent vim-mode

* fix(zsh): provide widgets with specific keymaps

* fix(settings): unify "vim" and "keymap_mode"
2024-01-16 13:35:10 +00:00
Ellie Huxtable
a2578c4521
feat: add history rebuild (#1575)
* feat: add history rebuild

This adds a function that will

1. List all history from the store
2. Segment by create/delete
3. Insert all creates into the database
4. Delete all deleted

This replaces the old history sync.

Presently it's incomplete. There is no incremental rebuild, it can only
do the entire thing at once.

This is ran by `atuin store rebuild history`

* fix tests

* add incremental sync

* add auto sync
2024-01-16 11:25:09 +00:00
Ellie Huxtable
c2439d1ed6
fix(sync): save sync time when it starts, not ends (#1573)
Imagine the scenario where a sync fails. The function touched here will
never save the sync time.

That means that external to this function, the sync never happened. The
next command will try and start one immediately.

The happy scenario is that this succeeds. The unhappy scenario is that
this fails. Fails, and isn't saved, so we try again...

Should add proper backoff but this is a good start.
2024-01-15 13:10:10 +00:00
Ellie Huxtable
ecce55b445
feat: add better error handling for sync (#1572)
Hopefully this helps users get more descriptive errors, and give more
descriptive bug reports
2024-01-15 12:57:28 +00:00
YummyOreo
a56085f059
feat(ui): vim mode (#1553)
* feat(config): add vim option to config

* feat(ui): simple vim mode

* fix(windows): windows sadly doesn't support the stuff

* feat(ui): blinking

* fix(merge)

* revert: reverts some debugging stuff

* feat(ui): changes the defaut to insert, don't know what should be the default

* feat(ui): implements some vim parity

* doc: adds this to the docs

* docs(keybindings): adds vim mode keybindsings to the list of keybindings

* refactor: rustfmt and remove the docs for pr in own repo

* refactor: use execute!

* Update atuin/src/command/client/search/interactive.rs

---------

Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
2024-01-13 17:15:49 +00:00
Ellie Huxtable
99249ea319
feat: Add interactive command inspector (#1296)
* Begin work on command inspector

This is a separate pane in the interactive mode that allows for
exploration and inspecting of specific commands.

I've restructured things a bit. It made logical sense that things
were nested under commands, however the whole point of `atuin` is to
provide commands. Breaking things out like this enables a bit less
crazy nesting as we add more functionality to things like interactive
search. I'd like to add a few more interactive things and it was
starting to feel very cluttered

* Some vague tab things

* functioning inspector with stats

* add interactive delete to inspector

* things

* clippy

* borders

* sus

* revert restructure for another pr

* Revert "sus"

This reverts commit d4bae8cf61.
2024-01-12 16:02:08 +00:00
Matthew Berryman
915bff6d28
feat: include atuin login in secret patterns (#1518)
* include atuin login in secret patterns

* doc catchup
2024-01-08 09:37:42 +00:00
Ellie Huxtable
4e56f5a41e
refactor: String -> HistoryId (#1512) 2024-01-06 17:19:31 +00:00
Ellie Huxtable
7bc6ccdd70
feat: rework record sync for improved reliability (#1478)
* feat: rework record sync for improved reliability

So, to tell a story

1. We introduced the record sync, intended to be the new algorithm to
   sync history.
2. On top of this, I added the KV store. This was intended as a simple
   test of the record sync, and to see if people wanted that sort of
   functionality
3. History remained syncing via the old means, as while it had issues it
   worked more-or-less OK. And we are aware of its flaws
4. If KV syncing worked ok, history would be moved across

KV syncing ran ok for 6mo or so, so I started to move across history.
For several weeks, I ran a local fork of Atuin + the server that synced
via records instead.

The record store maintained ordering via a linked list, which was a
mistake. It performed well in testing, but was really difficult to debug
and reason about. So when a few small sync issues occured, they took an
extremely long time to debug.

This PR is huge, which I regret. It involves replacing the "parent"
relationship that records once had (pointing to the previous record)
with a simple index (generally referred to as idx). This also means we
had to change the recordindex, which referenced "tails". Tails were the
last item in the chain.

Now that we use an "array" vs linked list, that logic was also replaced.
And is much simpler :D

Same for the queries that act on this data.

----

This isn't final - we still need to add

1. Proper server/client error handling, which has been lacking for a
   while
2. The actual history implementation on top
    This exists in a branch, just without deletions. Won't be much to
    add that, I just don't want to make this any larger than it already
    is

The _only_ caveat here is that we basically lose data synced via the old
record store. This is the KV data from before.

It hasn't been deleted or anything, just no longer hooked up. So it's
totally possible to write a migration script. I just need to do that.

* update .gitignore

* use correct endpoint

* fix for stores with length of 1

* use create/delete enum for history store

* lint, remove unneeded host_id

* remove prints

* add command to import old history

* add enable/disable switch for record sync

* add record sync to auto sync

* satisfy the almighty clippy

* remove file that I did not mean to commit

* feedback
2024-01-05 17:57:49 +00:00
Ellie Huxtable
9f79a34a9d
chore(release): prepare for release v17.2.1 (#1495) 2024-01-03 15:51:47 +00:00
Ellie Huxtable
999a98c577
chore(release): prepare for release v17.2.0 (#1492) 2024-01-03 12:46:08 +00:00
依云
c37147d619
fix(import/zsh): zsh use a special format to escape some characters (#1490)
* fix(import/zsh): zsh use a special format to escape some characters

unescape those correctly rather than throw them away.

zsh side code:
9f57ca4ac8/Src/utils.c (L4889-L4900)

* fix code style
2024-01-03 08:46:59 +00:00
Conrad Ludgate
e2a4e9cf13
fix(stats): time now_local not working 2024-01-01 16:42:36 +00:00
Ellie Huxtable
86f50e0356
feat: add semver checking to client requests (#1456)
* feat: add semver checking to client requests

This enforces that the client and the server run the same major version
in order to sync successfully.

We're using the `Atuin-Version` http header to transfer this information

If the user is not on the same MAJOR, then they will see an error like
this

> Atuin version mismatch! In order to successfully sync, the client and the server must run the same *major* version
> Client: 17.1.0
> Server: 18.1.0
> Error: could not sync records due to version mismatch

This change means two things

1. We will now only increment major versions if there is a breaking
   change for sync
2. We can now add breaking changes to sync, for any version >17.1.0.
   Clients will fail in a meaningful way.

* lint, fmt, etc

* only check for client newer than server

* Add version header to client too
2023-12-20 09:03:04 +00:00
Ramses
edc495895a
fix(stats): don't require all fields under [stats] (#1437)
Before this change, when configuring only `common_subcommands` and
not `common_prefix` (so it would take its default value),
atuin produces an error message:
```
Error: could not load client settings  Caused by:     failed to deserialize: missing field `common_prefix`  Location:     atuin-client/src/settings.rs:456:26
Error: could not load client settings

Caused by:
    failed to deserialize: missing field `common_prefix`

Location:
    atuin-client/src/settings.rs:456:26
Error:: command not found
```

With this change, the fields can be specified separately and missing
fields will take their default values.
2023-12-11 20:16:41 +00:00
Josef Friedrich
3c7f6991e3
fix(docs): fix typo (#1439) 2023-12-11 20:16:11 +00:00
Ellie Huxtable
da2e58fbb1
chore(release): prepare for release v17.1.0 (#1432) 2023-12-10 13:00:59 +00:00
Ellie Huxtable
839965a8d7
chore: update rusty_paseto and rusty_paserk (#1420) 2023-12-02 22:47:41 +00:00
Ellie Huxtable
b530d39c3f
docs: new stats config (#1412) 2023-11-23 09:59:56 +00:00
Ellie Huxtable
0c9d7367c6
feat: allow configuring stats prefix (#1411) 2023-11-23 09:48:43 +00:00
Ellie Huxtable
57a8db13c2
fix: initial list of history in workspace mode (#1356)
The initial list didn't correctly show all history while in workspace
mode, while it worked totally as expected while searching. Fix this.
2023-10-29 18:03:34 +00:00
Ellie Huxtable
2959891f58
Release v17.0.1 (#1354) 2023-10-28 19:19:10 +00:00
Michael Vincent
6bf35071dd
Remove duplicate "invert" in default config (#1338) 2023-10-26 17:32:00 +00:00
Ellie Huxtable
ce4573c5ee
Fix deleted history count (#1328) 2023-10-25 20:54:20 +01:00
Ellie Huxtable
0b22d06ad3
Prepare release v17.0.0 (#1327) 2023-10-25 18:06:59 +00:00
Ellie Huxtable
e5fae4dd76
Correct some secrets filter regex (#1326) 2023-10-25 18:31:28 +01:00
Ellie Huxtable
88f3e2a04f
Add enter_accept to immediately execute an accepted command (#1311)
* make enter execute the command, tab copy it

* Add config for enter_accept

enter_accept will make Atuin immediately accept an execute a command
when selected. It defaults to false in our binary, but the default
config enables it.

This means that users who already use atuin will not default to the new
behaviour unless they opt in, but new users will have it by default.

Thanks to @davidhewitt for the patch and bulk of this implementation!
Currently we have it just for zsh, but I'll follow up with other shells
(unless anyone beats me to it :D)

* Add docs

* we need to tidy up the ui code anyway

* Check if using zsh

* Update docs/docs/config/config.md

Co-authored-by: Conrad Ludgate <conradludgate@gmail.com>

---------

Co-authored-by: David Hewitt <1939362+davidhewitt@users.noreply.github.com>
Co-authored-by: Conrad Ludgate <conradludgate@gmail.com>
2023-10-20 07:16:54 +01:00
Tobias Genannt
20afcd2b63
Add commands to print the default configuration (#1241)
* Add commands to print the default configuration

When updating a software I often want to compare my configuration with the
configuration of the new version. To make this possible atuin can now print
the default configuration.
This also updates the example files with the actual values used as default in
the settings.rs files.

* Changed command name to 'default-config'

* Fixed merge
2023-10-12 22:13:50 +01:00
Conrad Ludgate
38172f3501
clear history id (#1263)
* clear history id

* fix nu
2023-10-08 16:15:14 +00:00
Dieter Eickstaedt
f25681d8b1
Fix/1207 deleted entries shown in interactive search (#1272) 2023-10-04 18:13:29 +00:00
Conrad Ludgate
7067d772bc
fix sync timestamps (#1258)
* fix timestamp

* add sync test

* skip all sync tests
2023-09-28 18:56:40 -07:00
Conrad Ludgate
fc1a48a4f2
handle missing entries (fixes #1236) (#1253)
* fix #1236

* lints
2023-09-26 14:52:45 +01:00
Conrad Ludgate
bdba88c11f
better sync error messages (#1254) 2023-09-26 14:44:56 +01:00
Dieter Eickstaedt
fbed2862fd
refactor: Duplications reduced in order to align implementations of reading history files (#1247) 2023-09-23 08:56:55 +00:00
Ellie Huxtable
351b3e8a57
Add connect timeout and overall timeout (#1238)
* Add connect timeout and overall timeout

* Make it configurable

* Fix test

* Add docs
2023-09-18 08:39:19 +01:00
Dieter Eickstaedt
ebef5cdaf0
feat(keyup): Configure SearchMode for KeyUp invocation #1216 (#1224)
* feat(keyup): Configure SearchMode for KeyUp invocation #1216

* docs: adjusted search mode documentation

* feat: setting search mode on engine

* chore: cargo fmt

* chore: removed redundant field name
2023-09-17 19:30:13 +01:00
Matheus Martins
0c2d5ce07b
Update config.toml: List inverted mode (#1226) 2023-09-14 21:04:13 +00:00
dependabot[bot]
93bb5a9609
Bump shellexpand from 2.1.2 to 3.1.0 (#1186)
Bumps [shellexpand](https://gitlab.com/ijackson/rust-shellexpand) from 2.1.2 to 3.1.0.
- [Commits](https://gitlab.com/ijackson/rust-shellexpand/compare/shellexpand/2.1.2...shellexpand-3.1.0)

---
updated-dependencies:
- dependency-name: shellexpand
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-13 08:45:08 +01:00
Conrad Ludgate
f90c01f702
replace chrono with time (#806)
* replace chrono with time

* Fix test chrono usage

---------

Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
2023-09-11 09:26:05 +01:00
Ellie Huxtable
73bd8015c3
Automatically filter out secrets (#1182)
I'd like to extend the regex list here very soon, but start off by
automatically filtering out secrets. Do not store them in history!

I've included regex for:

1. AWS key id
2. Github pat (old and new)
3. Slack oauth tokens (bot, user)
4. Slack webhooks
5. Stripe live/test keys

Will need updating after #806
2023-08-19 12:28:39 +01:00
Conrad Ludgate
aa8e5f5c04
Update dependencies (#1181) 2023-08-18 20:45:29 +00:00
Ellie Huxtable
69a772d1ca
Add kv map builder and list function (#1179)
* Add kv map builder and list function

1. BREAKING - default namespace is now called "default"
2. Build an in-memory hashmap from the kv store
3. Allow listing

I need to cache the hashmap next, probs with a write-through to avoid
constant rebuilds.

Also check if BTreeMap is suitable. Sorted is useful for listing but
there's probs a better ds to use.

* Allow pure kv set, no filesystem
2023-08-18 08:36:55 +01:00
Emanuele Panzeri
8080a172af
Update(docs) Add workspace to config.toml and config.md (#1157) 2023-08-09 23:06:27 +01:00