From fe5f728aa6f060a9f2c4cbbb22c5e10ea2ffbff9 Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Sun, 26 Feb 2023 21:22:29 +0000 Subject: [PATCH] Release v13 (#727) * Write release blog post * Bump versions * Update contributors --- Cargo.lock | 8 +- Cargo.toml | 8 +- atuin-client/Cargo.toml | 4 +- atuin-common/Cargo.toml | 2 +- atuin-server/Cargo.toml | 4 +- docs/blog/2023/02-26-release-v13/index.md | 173 +++++++++++++++++++++ docs/blog/2023/02-26-release-v13/stats.png | Bin 0 -> 16672 bytes docs/docs/commands/list.md | 17 ++ docs/docs/config/config.md | 15 +- src/command/contributors.rs | 128 ++++++++------- 10 files changed, 285 insertions(+), 74 deletions(-) create mode 100644 docs/blog/2023/02-26-release-v13/index.md create mode 100644 docs/blog/2023/02-26-release-v13/stats.png diff --git a/Cargo.lock b/Cargo.lock index 2b7786f..41622a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,7 +70,7 @@ dependencies = [ [[package]] name = "atuin" -version = "12.0.0" +version = "13.0.0" dependencies = [ "async-trait", "atuin-client", @@ -108,7 +108,7 @@ dependencies = [ [[package]] name = "atuin-client" -version = "12.0.0" +version = "13.0.0" dependencies = [ "async-trait", "atuin-common", @@ -147,7 +147,7 @@ dependencies = [ [[package]] name = "atuin-common" -version = "12.0.0" +version = "13.0.0" dependencies = [ "chrono", "serde", @@ -156,7 +156,7 @@ dependencies = [ [[package]] name = "atuin-server" -version = "12.0.0" +version = "13.0.0" dependencies = [ "async-trait", "atuin-common", diff --git a/Cargo.toml b/Cargo.toml index ebff2d5..c44e0b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atuin" -version = "12.0.0" +version = "13.0.0" authors = ["Ellie Huxtable "] edition = "2021" rust-version = "1.59" @@ -44,9 +44,9 @@ sync = ["atuin-client/sync"] server = ["atuin-server", "tracing-subscriber"] [dependencies] -atuin-server = { path = "atuin-server", version = "12.0.0", optional = true } -atuin-client = { path = "atuin-client", version = "12.0.0", optional = true, default-features = false } -atuin-common = { path = "atuin-common", version = "12.0.0" } +atuin-server = { path = "atuin-server", version = "13.0.0", optional = true } +atuin-client = { path = "atuin-client", version = "13.0.0", optional = true, default-features = false } +atuin-common = { path = "atuin-common", version = "13.0.0" } log = "0.4" env_logger = "0.10.0" diff --git a/atuin-client/Cargo.toml b/atuin-client/Cargo.toml index c0b9c15..7284191 100644 --- a/atuin-client/Cargo.toml +++ b/atuin-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atuin-client" -version = "12.0.0" +version = "13.0.0" authors = ["Ellie Huxtable "] edition = "2018" license = "MIT" @@ -23,7 +23,7 @@ sync = [ ] [dependencies] -atuin-common = { path = "../atuin-common", version = "12.0.0" } +atuin-common = { path = "../atuin-common", version = "13.0.0" } log = "0.4" chrono = { version = "0.4", features = ["serde"] } diff --git a/atuin-common/Cargo.toml b/atuin-common/Cargo.toml index 944d7fc..636a51d 100644 --- a/atuin-common/Cargo.toml +++ b/atuin-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atuin-common" -version = "12.0.0" +version = "13.0.0" authors = ["Ellie Huxtable "] edition = "2018" license = "MIT" diff --git a/atuin-server/Cargo.toml b/atuin-server/Cargo.toml index b085798..808826c 100644 --- a/atuin-server/Cargo.toml +++ b/atuin-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atuin-server" -version = "12.0.0" +version = "13.0.0" authors = ["Ellie Huxtable "] edition = "2018" license = "MIT" @@ -9,7 +9,7 @@ homepage = "https://atuin.sh" repository = "https://github.com/ellie/atuin" [dependencies] -atuin-common = { path = "../atuin-common", version = "12.0.0" } +atuin-common = { path = "../atuin-common", version = "13.0.0" } tracing = "0.1" chrono = { version = "0.4", features = ["serde"] } diff --git a/docs/blog/2023/02-26-release-v13/index.md b/docs/blog/2023/02-26-release-v13/index.md new file mode 100644 index 0000000..2493634 --- /dev/null +++ b/docs/blog/2023/02-26-release-v13/index.md @@ -0,0 +1,173 @@ +--- +title: Announcing Atuin v13 +description: Release notes for Atuin v13 +slug: release-v13 +authors: [ellie] +tags: [release] +--- + +Announcing a new release of Atuin! v13 is out now. Atuin allows you to easily search and sync your shell history across many machines. + +You can update your installation via your system package manager, or by downloading the latest release from the [release page](https://github.com/ellie/atuin/releases). + +We had a lot of changes in this release - I'll call out a few, but this is not exhaustive. + +## Crossterm + +Deserving of a special callout, we now use [Crossterm](https://github.com/ellie/atuin/pull/331) as our TUI backend - this has been a huge effort, and has taken almost a year. Thank you to Conrad for pushing through it, and [@pdecat](https://github.com/pdecat) for your contributions! + +In the future this will allow for things like (possible) Windows support, and only using a small part of the screen for the search UI. It also handles async input better. + +Please let us know if you experience any issues! + +## New features + +### Pretty Stats + +
+ + ![stats image](stats.png) + +
+ +While procrastinating writing [his talk](https://www.youtube.com/watch?v=7pU3gOVAeVQ), Conrad [added](https://github.com/ellie/atuin/pull/707) a new and improved stats display! Just run `atuin stats` to see your statistics. It'd be awesome to see what yours looks like, so please share it with us on [Twitter](https://twitter.com/atuinsh) or [Discord](https://discord.gg/Fq8bJSKPHh)! + +### Custom history list format +List history however you want! You can now specify the output format of `atuin history list` + +Example + +``` +atuin history list --format "{time} - [{duration}] - {directory}$\t{command}" +``` + +See more on the [docs page](/docs/commands/list)! + +### History filter +The history filter allows you to exclude commands from history tracking - maybe you want to keep ALL of your `curl` commands totally out of your shell history, or maybe just some matching a pattern. + +This supports regular expressions, so you can hide pretty much whatever you want! Thanks for the PR @jbaiter + +Configure it in your client-side Atuin config, for example + +``` +## Note that these regular expressions are unanchored, i.e. if they don't start +## with ^ or end with $, they'll match anywhere in the command. +history_filter = [ + "^secret-cmd", + "^innocuous-cmd .*--secret=.+" +] +``` + +### Mnemonic key (BIP39) +Previously, it was awkward to copy your Atuin key from machine to machine. Even more awkward to back it up! + +We now use BIP39 to display your key in a nice + easily readable haiku-style format. Still - please don't share it! + +## Improvements +- Better error messages +- Nix install files + instructions +- Exit when pushing the down arrow from the most recent entry +- Refactor to support generic server-side databases +- Make it easier to disable the ctrl-r and/or up arrow bindings +- Update to axum6 + +## Fixes +- Fish now handles multi-line commands properly +- Listing history for the current session now works +- Fix `atuin init` for Fish + +## Contributor Shoutout! + +### [@patricksjackson](https://github.com/patricksjackson) +* Fix minor typo in config.md in https://github.com/ellie/atuin/pull/615 +* Re-enable arm docker builds in https://github.com/ellie/atuin/pull/616 +* Handle multiline commands in fish shell in https://github.com/ellie/atuin/pull/623 +* install.sh: Fallback to using cargo in https://github.com/ellie/atuin/pull/639 +* Fix session history listing in https://github.com/ellie/atuin/pull/620 + +### [@pdecat](https://github.com/pdecat) +* Add support for some additional keys in interactive mode in https://github.com/ellie/atuin/pull/634 +* Allow overriding filter and search modes from CLI in https://github.com/ellie/atuin/pull/635 + +### [@Sciencentistguy](https://github.com/Sciencentistguy) +* Rework `atuin init` in https://github.com/ellie/atuin/pull/652 +* Improve error message when $AUTIN_SESSION is not set. in https://github.com/ellie/atuin/pull/654 +* Add nix files and install instructions in https://github.com/ellie/atuin/pull/477 + +### [@BapRx](https://github.com/BapRx) +* chore(#621): Exit atuin when pressing down arrow on most recent entry in https://github.com/ellie/atuin/pull/659 +* docs: Remove human short flag from docs, duplicate of help -h in https://github.com/ellie/atuin/pull/663 +* feat(history): Add new flag to allow custom output format in https://github.com/ellie/atuin/pull/662 + +### [@yolo2h](https://github.com/yolo2h) +* docs: Fix typo in zh-CN/README.md in https://github.com/ellie/atuin/pull/666 + +### [@s1ck](https://github.com/s1ck) +* Fix CI build badge in https://github.com/ellie/atuin/pull/683 + +### [@conradludgate](https://github.com/conradludgate) +* display mnemonic key in https://github.com/ellie/atuin/pull/694 +* axum6 with typesafe state in https://github.com/ellie/atuin/pull/674 +* crossterm support in https://github.com/ellie/atuin/pull/331 +* stats in https://github.com/ellie/atuin/pull/707 + +### [@evanpurkhiser](https://github.com/evanpurkhiser) +* Remove whitespace in template client config.tom in https://github.com/ellie/atuin/pull/697 +* Fix missing `-` in key-binding.md in https://github.com/ellie/atuin/pull/698 + +### [@eripa](https://github.com/eripa) +* docs(README): add static activity graph example by @eripa in https://github.com/ellie/atuin/pull/680 + +### [@trygveaa](https://github.com/trygveaa) +* Allow using existing key file on login by @trygveaa in https://github.com/ellie/atuin/pull/688 + +### [@frukto](https://github.com/frukto) +* Make the install script more robust by @frukto in https://github.com/ellie/atuin/pull/692 + +### [@jbaiter](https://github.com/jbaiter) +* Add `history_filter` setting to exclude commands from history by @jbaiter in https://github.com/ellie/atuin/pull/716 + +### [@hunger](https://github.com/hunger) +* fish: Fix `atuin init` for the fish shell by @hunger in https://github.com/ellie/atuin/pull/699 + +### [@ekroon](https://github.com/ekroon) +* Add support for generic database in AppState by @ekroon in https://github.com/ellie/atuin/pull/711 + + +## New Contributors +I very much appreciate the work from all contributors, but a special mention to everyone who made their _first_ contribution in this release, no matter how large or small + +* [@pdecat](https://github.com/pdecat) made their first contribution in https://github.com/ellie/atuin/pull/634 +* [@BapRx](https://github.com/BapRx) made their first contribution in https://github.com/ellie/atuin/pull/659 +* [@yolo2h](https://github.com/yolo2h) made their first contribution in https://github.com/ellie/atuin/pull/666 +* [@s1ck](https://github.com/s1ck) made their first contribution in https://github.com/ellie/atuin/pull/683 +* [@evanpurkhiser](https://github.com/evanpurkhiser) made their first contribution in https://github.com/ellie/atuin/pull/697 +* [@eripa](https://github.com/eripa) made their first contribution in https://github.com/ellie/atuin/pull/680 +* [@trygveaa](https://github.com/trygveaa) made their first contribution in https://github.com/ellie/atuin/pull/688 +* [@frukto](https://github.com/frukto) made their first contribution in https://github.com/ellie/atuin/pull/692 +* [@jbaiter](https://github.com/jbaiter) made their first contribution in https://github.com/ellie/atuin/pull/716 +* [@hunger](https://github.com/hunger) made their first contribution in https://github.com/ellie/atuin/pull/699 +* [@ekroon](https://github.com/ekroon) made their first contribution in https://github.com/ellie/atuin/pull/711 + +## Future plans +I've been talking about it for ages and ages, but now that my life has _finally_ settled down I'm going to be focusing on getting [deletions](https://github.com/ellie/atuin/issues/592) out for the next release. We will be switching to an event-based sync, which should allow for many more features and cool things in the future! + +## Other changes + +### Talk +I spoke about Atuin at FOSDEM! If you want to know more about the project + video is your thing, you can watch it here + + + +### Website + +Well... this is new. Previously I never bothered writing much about new releases, and basically just used the autogenerated GitHub release. The docs should be much easier to find here too! + +### Twitter + +I also opened a Twitter account for Atuin - [@atuinsh](https://twitter.com/atuinsh) + +If you fancy chatting to us about anything here, or otherwise, please feel free to drop by the [Discord](https://discord.gg/Fq8bJSKPHh)! + +**Full Changelog**: https://github.com/ellie/atuin/compare/v12.0.0...v13.0.0 diff --git a/docs/blog/2023/02-26-release-v13/stats.png b/docs/blog/2023/02-26-release-v13/stats.png new file mode 100644 index 0000000000000000000000000000000000000000..e68d057932531ca8e36fe0d7ec05ef9007834e78 GIT binary patch literal 16672 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 M#N +Bruce Huang +Conrad Ludgate +CosmicHorror +Daniel +Ellie Huxtable +Eric Crosson +Eric Ripa +Erwin Kroon +Evan Purkhiser +Frank Hamand +Herby Gillot +Ian Smith +Ilkin Bayramli +Violet Shreve +Jakob Schrettenbrunner +Jakob-Niklas See +Jakub Jirutka +Jakub Panek +Jamie Quigley +Jannik +Jerome Ducret +Johannes Baiter +Klas Mellbourn +Laurent le Beau-Martin +Lucas Burns +Lucy +Luke Baker +Manel Vilar +Mark Wotton +Martin Indra +Martin Junghanns +Mat Jones +Michael Bianco +Michael Mior +Omer Katz +Orhun Parmaksız +Patrick +Patrick Decat +Patrick Jackson +Plamen Dimitrov +Sam Edwards +Sam Lanning +Sandro +Satyarth Sampath +Simon Elsbrock +Tobias Hunger +Trygve Aaberge +TymanWasTaken +Ubiquitous Photon +Webmaster At Cosmic DNA +Will Fancher +Yolo +Yuvi Panda +ZhiHong Li +avinassh +b3nj5m1n +c-14 +frukto +jean-santos +lchausmann +mb6ockatf +morguldir +mundry +noyez +wpbrz +xfzv "#; pub fn run() {