Release v0.5.0

This commit is contained in:
Ajeet D'Souza 2020-10-31 00:22:09 +05:30
parent 9dd1679e5a
commit c82ef66fac
13 changed files with 92 additions and 95 deletions

View File

@ -5,13 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased ## [0.5.0] - 2020-10-30
### Added ### Added
- Inaccessible directories are no longer removed; zoxide can now remember paths on removable devices. - Inaccessible directories are no longer removed; zoxide can now remember paths on removable devices.
- `$_ZO_EXCLUDE_DIRS` now supports globs. - `$_ZO_EXCLUDE_DIRS` now supports globs.
- `zoxide init` now defines `__zoxide_z*` functions that can be aliased as needed. - `zoxide init` now defines `__zoxide_z*` functions that can be aliased as needed.
- Support for the [xonsh](https://xon.sh/) shell.
- `zoxide import` can now import from Autojump.
### Changed ### Changed
@ -19,7 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed ### Fixed
- Clobber conflicting alias definitions in Bash/POSIX/Zsh shells. - Clobber conflicting alias definitions in bash/fish/zsh/POSIX shells.
### Removed ### Removed
@ -176,6 +178,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- GitHub Actions pipeline to build and upload releases. - GitHub Actions pipeline to build and upload releases.
- Support for the `zsh` shell. - Support for the `zsh` shell.
[0.5.0]: https://github.com/ajeetdsouza/zoxide/compare/v0.4.3...v0.5.0
[0.4.3]: https://github.com/ajeetdsouza/zoxide/compare/v0.4.2...v0.4.3 [0.4.3]: https://github.com/ajeetdsouza/zoxide/compare/v0.4.2...v0.4.3
[0.4.2]: https://github.com/ajeetdsouza/zoxide/compare/v0.4.1...v0.4.2 [0.4.2]: https://github.com/ajeetdsouza/zoxide/compare/v0.4.1...v0.4.2
[0.4.1]: https://github.com/ajeetdsouza/zoxide/compare/v0.4.0...v0.4.1 [0.4.1]: https://github.com/ajeetdsouza/zoxide/compare/v0.4.0...v0.4.1

2
Cargo.lock generated
View File

@ -585,7 +585,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "zoxide" name = "zoxide"
version = "0.4.3" version = "0.5.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"askama", "askama",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "zoxide" name = "zoxide"
version = "0.4.3" version = "0.5.0"
authors = ["Ajeet D'Souza <98ajeet@gmail.com>"] authors = ["Ajeet D'Souza <98ajeet@gmail.com>"]
description = "A faster way to navigate your filesystem" description = "A faster way to navigate your filesystem"
repository = "https://github.com/ajeetdsouza/zoxide/" repository = "https://github.com/ajeetdsouza/zoxide/"

View File

@ -17,6 +17,7 @@ A faster way to navigate your filesystem
- [fish](#fish) - [fish](#fish)
- [POSIX](#posix-shells) - [POSIX](#posix-shells)
- [PowerShell](#powershell) - [PowerShell](#powershell)
- [xonsh](#xonsh)
- [zsh](#zsh) - [zsh](#zsh)
- [Configuration](#configuration) - [Configuration](#configuration)
- [`init` flags](#init-flags) - [`init` flags](#init-flags)
@ -168,21 +169,6 @@ Add the following line to your shell's configuration file:
eval "$(zoxide init posix --hook prompt)" eval "$(zoxide init posix --hook prompt)"
``` ```
The `prompt` hook is recommended for POSIX shells because the default `pwd`
hook creates a temporary file for every session, which are only deleted upon
reboot. If you do want to use `pwd` hooks instead, you may want to set up traps
to perform a cleanup once the shell exits:
```sh
trap '_zoxide_cleanup' EXIT HUP KILL TERM
trap '_zoxide_cleanup; trap - INT; kill -s INT "$$"' INT
trap '_zoxide_cleanup; trap - QUIT; kill -s QUIT "$$"' QUIT
```
NOTE: If you modify your `PS1` at any point, you may need to re-run the above
command. This is due to the fact that the hook is stored in `PS1`, in order to
be evaluated every time the prompt is displayed.
#### PowerShell #### PowerShell
Add the following line to your profile: Add the following line to your profile:
@ -194,6 +180,14 @@ Invoke-Expression (& {
}) })
``` ```
#### xonsh
Add the following line to your profile (usually `~/.xonshrc`):
```xonsh
execx($(zoxide init xonsh), 'exec', __xonsh__.ctx, filename='zoxide')
```
#### zsh #### zsh
Add the following line to your `~/.zshrc`: Add the following line to your `~/.zshrc`:

View File

@ -1,4 +1,4 @@
use crate::cmd::Cmd; use super::Cmd;
use crate::config; use crate::config;
use crate::util; use crate::util;

View File

@ -1,4 +1,4 @@
use crate::cmd::Cmd; use super::Cmd;
use crate::config; use crate::config;
use crate::import::{Autojump, Import as _, Z}; use crate::import::{Autojump, Import as _, Z};
use crate::util; use crate::util;

View File

@ -1,4 +1,4 @@
use crate::cmd::Cmd; use super::Cmd;
use crate::config; use crate::config;
use crate::shell::{self, Hook, Opts}; use crate::shell::{self, Hook, Opts};

View File

@ -5,6 +5,7 @@ mod query;
mod remove; mod remove;
use anyhow::Result; use anyhow::Result;
use clap::{AppSettings, Clap};
pub use add::Add; pub use add::Add;
pub use import::Import; pub use import::Import;
@ -15,3 +16,25 @@ pub use remove::Remove;
pub trait Cmd { pub trait Cmd {
fn run(&self) -> Result<()>; fn run(&self) -> Result<()>;
} }
#[derive(Debug, Clap)]
#[clap(about, author, global_setting(AppSettings::GlobalVersion), global_setting(AppSettings::VersionlessSubcommands), version = env!("ZOXIDE_VERSION"))]
pub enum App {
Add(Add),
Import(Import),
Init(Init),
Query(Query),
Remove(Remove),
}
impl Cmd for App {
fn run(&self) -> Result<()> {
match self {
App::Add(cmd) => cmd.run(),
App::Import(cmd) => cmd.run(),
App::Init(cmd) => cmd.run(),
App::Query(cmd) => cmd.run(),
App::Remove(cmd) => cmd.run(),
}
}
}

View File

@ -1,4 +1,4 @@
use crate::cmd::Cmd; use super::Cmd;
use crate::config; use crate::config;
use crate::fzf::Fzf; use crate::fzf::Fzf;
use crate::util; use crate::util;

View File

@ -1,4 +1,4 @@
use crate::cmd::Cmd; use super::Cmd;
use crate::config; use crate::config;
use crate::fzf::Fzf; use crate::fzf::Fzf;
use crate::store::Query; use crate::store::Query;
@ -48,9 +48,13 @@ impl Cmd for Remove {
None => self.path.as_ref().unwrap(), None => self.path.as_ref().unwrap(),
}; };
if !store.remove(path) {
let path = util::resolve_path(&path)?;
let path = util::path_to_str(&path)?;
if !store.remove(path) { if !store.remove(path) {
bail!("path not found in store: {}", &path) bail!("path not found in store: {}", &path)
} }
}
Ok(()) Ok(())
} }

View File

@ -1,11 +1,9 @@
use super::Import; use super::Import;
use crate::util;
use crate::store::{Dir, Epoch, Store}; use crate::store::{Dir, Epoch, Store};
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use std::fs::File; use std::fs;
use std::io::{BufRead, BufReader};
use std::path::Path; use std::path::Path;
pub struct Autojump { pub struct Autojump {
@ -15,44 +13,50 @@ pub struct Autojump {
impl Import for Autojump { impl Import for Autojump {
fn import<P: AsRef<Path>>(&self, store: &mut Store, path: P) -> Result<()> { fn import<P: AsRef<Path>>(&self, store: &mut Store, path: P) -> Result<()> {
let file = File::open(path).context("could not open autojump database")?; let path = path.as_ref();
let reader = BufReader::new(file); let buffer = fs::read_to_string(path)
.with_context(|| format!("could not open autojump database: {}", path.display()))?;
for (idx, line) in reader.lines().enumerate() { let mut entries = Vec::new();
for (idx, line) in buffer.lines().enumerate() {
(|| -> Result<()> { (|| -> Result<()> {
let line = line?;
if line.is_empty() { if line.is_empty() {
return Ok(()); return Ok(());
} }
let split_idx = line let (rank, path) = (|| {
.find('\t') let mut split = line.splitn(2, '\t');
let rank = split.next()?;
let path = split.next()?;
Some((rank, path))
})()
.with_context(|| format!("invalid entry: {}", line))?; .with_context(|| format!("invalid entry: {}", line))?;
let (rank, path) = line.split_at(split_idx);
let rank = rank let rank = rank
.parse() .parse::<f64>()
.with_context(|| format!("invalid rank: {}", rank))?; .with_context(|| format!("invalid rank: {}", rank))?;
let path = if self.resolve_symlinks { entries.push((path, rank));
util::canonicalize Ok(())
} else { })()
util::resolve_path .with_context(|| format!("line {}: error reading from autojump database", idx + 1))?;
}(&path)?; }
let path = util::path_to_str(&path)?;
if store.dirs.iter_mut().find(|dir| dir.path == path).is_none() { let rank_sum = entries.iter().map(|(_, rank)| rank).sum::<f64>();
for (path, rank) in entries.iter() {
if store
.dirs
.iter_mut()
.find(|dir| &dir.path == path)
.is_none()
{
store.dirs.push(Dir { store.dirs.push(Dir {
path: path.into(), path: path.to_string(),
rank, rank: rank / rank_sum,
last_accessed: self.now, last_accessed: self.now,
}); });
store.modified = true; store.modified = true;
} }
Ok(())
})()
.with_context(|| format!("line {}: error reading from z database", idx + 1))?;
} }
Ok(()) Ok(())

View File

@ -1,5 +1,4 @@
use super::Import; use super::Import;
use crate::util;
use crate::store::{Dir, Store}; use crate::store::{Dir, Store};
use anyhow::{Context, Result}; use anyhow::{Context, Result};
@ -33,13 +32,6 @@ impl Import for Z {
})() })()
.with_context(|| format!("invalid entry: {}", line))?; .with_context(|| format!("invalid entry: {}", line))?;
let path = if self.resolve_symlinks {
util::canonicalize
} else {
util::resolve_path
}(&path)?;
let path = util::path_to_str(&path)?;
let rank = rank let rank = rank
.parse() .parse()
.with_context(|| format!("invalid rank: {}", rank))?; .with_context(|| format!("invalid rank: {}", rank))?;
@ -54,7 +46,7 @@ impl Import for Z {
dir.last_accessed = dir.last_accessed.max(last_accessed); dir.last_accessed = dir.last_accessed.max(last_accessed);
} }
None => store.dirs.push(Dir { None => store.dirs.push(Dir {
path: path.into(), path: path.to_string(),
rank, rank,
last_accessed, last_accessed,
}), }),

View File

@ -7,41 +7,18 @@ mod shell;
mod store; mod store;
mod util; mod util;
use crate::cmd::{Add, Cmd, Import, Init, Query, Remove}; use crate::cmd::{App, Cmd};
use crate::error::SilentExit; use crate::error::SilentExit;
use anyhow::Result; use anyhow::Result;
use clap::{AppSettings, Clap}; use clap::Clap;
use std::process; use std::process;
#[derive(Debug, Clap)]
#[clap(
about,
author,
global_setting(AppSettings::GlobalVersion),
global_setting(AppSettings::VersionlessSubcommands),
version = env!("ZOXIDE_VERSION"))]
enum Opts {
Add(Add),
Import(Import),
Init(Init),
Query(Query),
Remove(Remove),
}
pub fn main() -> Result<()> { pub fn main() -> Result<()> {
let opts = Opts::parse(); App::parse()
.run()
let result: Result<()> = match opts { .map_err(|e| match e.downcast::<SilentExit>() {
Opts::Add(cmd) => cmd.run(),
Opts::Import(cmd) => cmd.run(),
Opts::Init(cmd) => cmd.run(),
Opts::Query(cmd) => cmd.run(),
Opts::Remove(cmd) => cmd.run(),
};
result.map_err(|e| match e.downcast::<SilentExit>() {
Ok(SilentExit { code }) => process::exit(code), Ok(SilentExit { code }) => process::exit(code),
// TODO: change the error prefix to `zoxide:` // TODO: change the error prefix to `zoxide:`
Err(e) => e, Err(e) => e,