* fix(bash/preexec): support termcap-based tput
The current uses of tput specify the terminfo entry names. However,
there are different implementations of the tput command. There are
two ways to specify the terminal capability: terminfo and termcap
names. Although recent implementations of tput (such as ncurses in
Linux) accepts the terminfo name, some accept both the terminfo and
termcap names, and some old implementations (such as in FreeBSD) only
accept the termcap names.
In this patch, we first attempt the terminfo name and then the termcap
name if the terminfo name fails.
Note: When both fail due to e.g. non-existent tput, we end up with
outputting nothing. This does not cause a serious problem because it
just does not clear the previous prompts.
* perf(bash/preexec): cache the results of tput
With the current implementation, we spwan 10 processes of the tput
command at most every time we perform `enter_accept`. In this patch,
to reduce the delay, we separate the related code into a function and
cache the results of the tput commands.
When the previous prompt is longer than the prompt calculated by the
current PS1, some extra characters from the previous prompt remains in
the terminal display. In this patch, we erase the content of the
previous prompt before outputting our new prompt.
Fixes https://github.com/atuinsh/atuin/issues/1668
When the prompt becomes longer after "enter_accept", Bash still uses
the previous shorter prompt, so the extra characters in the new prompt
drawn by Atuin is left in the terminal display. In this patch, we
remove the last line of the prompt drawn by Atuin so that it doesn't
interfere with the last line of the prompt drawn by Bash.
This allows the user to
1. Specify that they want to sync, but ONLY pull new data
2. Specify that they wish to force pull, which will wipe the local store
and download it from the remote
With the other set of changes, this allows the user to perform
sufficient maintenance to recovery from most errors I can think of right
now.
This will
1. Wipe the remote store
2. Upload all of the local store to remote
Imagine the scenario where you end up with some mixed keys locally :(
You confirm this with
```
atuin store verify
```
You then fix it locally with
```
atuin store purge
```
Ensure that your local changes are reflected remotely with
```
atuin store push --force
```
and then (another PR, coming soon), update all other hosts with
```
atuin store pull --force
```
This command will delete all records from the local store that cannot be
decrypted with the current key.
If a verify fails before running this, it should pass _after_ running
it.
Required afterwards:
- A `push --force`, to allow ensuring the remote store equals the local
store (deletions have now occured!)
- A `pull --force`, as once remote has been forced then local needs the
same
Nice to have:
- Provide "old" keys to purge, in case the are not lost. Or maybe rekey.
This ensures that the local store can be decrypted with the current
in-use key.
If it cannot, we can go on to perform maintenance operations and get
back into a happy state.
* feat: add prefers_reduced_motion flag
* use NO_MOTION, and ensure type is bool
* update default config
---------
Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
* feat: add record re-encrypting
* automatically re-encrypt store when logging in with a different key
* fix
* actually save the new key lmao
* add rekey
* save new key
* decode bip key
* "add test for sqlite store re encrypt"
I accidentially broke my atuin database by executing `atuin` from the
PR I was working on without setting these variables and had to manually
roll back my local database.
That shouldn't happen, so we set the database and record store path in
the devshell to something that does not overwrite our normal databases.
We also warn if these files already exist, because when entering the
devshell, a user might want to start from a clean slate here.
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Now that local history is stored encrypted, new_key should not overwrite
an existing one. This may be frustrating, but will remove the risk of
Atuin generating a new key and the user losing their old one.
* add support for getting the total length of a store
* tidy up sync
* auto call init if history is ahead
* fix import order, key regen
* fix import order, key regen
* do not delete key when user deletes account
* message output
* remote init store command; this is now automatic
* should probs make that function return u64 at some point
1. Test that multiple users can be registered without clobbering each
other
2. Test that one user can change their password without it affecting the
other
I'd like to also test sync with multiple users, to ensure we never
accidentally leak data cross-users.
For a few reasons
1. This step is really, really slow. I don't think there's sufficient
value in a slow CI step to keep it
2. Whenever we add an integration test it needs to be added to the
ignore list. I want to keep friction on adding such tests as low as
is possible.
3. We already run tests in a bunch of places, so I don't think this is
needed
Ref: #1123
* Add basic xonsh support
* Add init xonsh command
* Add Xonsh install instructions in docs
* Add xonsh ctrl-R search
* update xonsh script and instructions
Summary of changes:
* Added duration to postcommand hook
* Switched main search operation to use `subproccess.run()` rather than running as an xonsh shell command - this a) allows us to capture stderr without needing a temporary file and b) avoids a weird broken-buffer state that results from running a fullscreen TUI and then programmatically editing the buffer
* Added support for immediately executing chosen command via `__atuin_accept__:` (like bash/zsh/fish)
* strip newline from command before sending to atuin
* Add basic xonsh support
* Add init xonsh command
* Add xonsh ctrl-R search
* Remove advanced-install guide (was accidentally re-added during rebase)
* Clean up
Xonsh doesn't import private functions into the local namespace when sourcing a file
* Add xonsh ro readme
* Respect ATUIN_NOBIND
* Format with black, and improve PEP8 compliance
* Add up search
* Format rust code
---------
Co-authored-by: Joseph Montanaro <jfmonty2@gmail.com>
* Add change-password command & support on server
* Add a test for password change
* review: run format
---------
Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
* feat: make history list format configurable
* Update atuin-client/config.toml
* review: run format
---------
Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
The current widget names for Zsh start with "_", which gives an
impression to users that those widgets are internal API and should not
be bound by the users. However, we actually instruct users to set up
custom keybindings by specifying them to bindkey.
In other shells, a separate namespace for widgets are not prepared, so
we want to prefix "_" to shell function names to tell the users that
these are not the commands that are supposed to be called from the
command line. However, the widget names are separated in their own
namespace in Zsh, so we do not have to isolate them by prefixing "_".
In fact, other frameworks such as `fzf` define widgets with names not
starting with "_".
In this patch, we update the widget names to have the form "atuin-*".
The old widget names that existed in the release version <= 17.2.1 are
left for compatibility.
A search feature in the vi-normal mode of shells can be called by "/".
To make the shell-integration keybindings consistent with the existing
shell keybindings, we add the keybinding to "/" in this patch.
This patch removes the Ctrl-r binding in the "vicmd" keymap in Zsh.
The key Ctrl-r is used for the `redo` operation in the vi-normal mode
by default. We would like to avoid overwriting an existing keybinding
with a totally different feature.
* chore: add feature to allow always disable check update
In the packaging rules of some distributions, the software's self-update check needs to be permanently turned off
This commit will make it easier for these users to
* fix: formatting
---------
Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
The runtime formatting used to list history commands can fail in its
Display implementation and the error is not propagated through to the
write error it causes. Instead, the error is cached in the FormatArgs
being printed. It's a bit clumsy but by checking if there's a cached
error, we can get a more useful error for the user. eg,
atuin search cargo --format '{invalid}'
gives
history output failed with: The requested key "invalid" is unknown
instead of
history output failed with: formatter error
* fix(stats): Don't bail/error if no command is found
An empty history shouldn't be source of error when printing stats.
* fix(stats): Improve help message a bit.
It wasn't clear what the period format could be.
* fix(bash): strip control chars generated by \[\] in PS1 with bash-preexec
Fixes https://github.com/atuinsh/atuin/issues/1617
* perf(bash): count newlines using Bash built-in features
When piping the output of `atuin history list` to a file, it makes more
sense for the literal commands to be written rather than the escaped
ones that would be printed to the terminal.
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.
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
* 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
* 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
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.