temp commit to address part of the review
This commit is contained in:
parent
ee8f3427d1
commit
5637996171
88
src/db.rs
88
src/db.rs
|
|
@ -73,53 +73,71 @@ impl DB {
|
||||||
|
|
||||||
pub fn migrate<P: AsRef<Path>>(&mut self, path: P) -> Result<()> {
|
pub fn migrate<P: AsRef<Path>>(&mut self, path: P) -> Result<()> {
|
||||||
if !self.dirs.is_empty() {
|
if !self.dirs.is_empty() {
|
||||||
|
// FIXME: just for testing
|
||||||
|
#[cfg(not(debug_assertions))]
|
||||||
return Err(anyhow!(
|
return Err(anyhow!(
|
||||||
"To prevent conflicts, you can only migrate from z with an empty \
|
"To prevent conflicts, you can only migrate from z with an empty \
|
||||||
zoxide database!"
|
zoxide database!"
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let zdata = File::open(path)?;
|
let z_db_file = File::open(path).with_context(|| anyhow!("could not open z db file"))?;
|
||||||
let reader = BufReader::new(zdata);
|
let reader = BufReader::new(z_db_file);
|
||||||
|
|
||||||
for line in reader.lines().filter_map(|l| l.ok()) {
|
for (idx, read_line) in reader.lines().enumerate() {
|
||||||
let first_pipe_idx = line
|
let line_number = idx + 1;
|
||||||
.find('|')
|
let line = if let Ok(line) = read_line {
|
||||||
.with_context(|| anyhow!("missing separator"))?;
|
line
|
||||||
let last_pipe_idx = line
|
} else {
|
||||||
.rfind('|')
|
eprintln!("could not read line {}: {:?}", line_number, read_line);
|
||||||
.with_context(|| anyhow!("missing separator"))?;
|
continue;
|
||||||
|
|
||||||
if first_pipe_idx == last_pipe_idx {
|
|
||||||
return Err(anyhow!("invalid data file format -- only 1 separator"));
|
|
||||||
}
|
|
||||||
|
|
||||||
let path = PathBuf::from(&line[..first_pipe_idx]);
|
|
||||||
let rank = line[first_pipe_idx + 1..last_pipe_idx]
|
|
||||||
.parse::<f64>()
|
|
||||||
.with_context(|| anyhow!("could not parse rank"))?;
|
|
||||||
|
|
||||||
// otherwise, the rank will get scaled down, depending on how old
|
|
||||||
// the entry is
|
|
||||||
let epoch = util::get_current_time()?;
|
|
||||||
|
|
||||||
let path_abs = match path.canonicalize() {
|
|
||||||
Ok(path) => path,
|
|
||||||
Err(_) => continue, // ignore dead paths
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let path_str = path_abs
|
let split_line = line.rsplitn(3, '|').collect::<Vec<&str>>();
|
||||||
.to_str()
|
|
||||||
.ok_or_else(|| anyhow!("invalid unicode in path: {}", path_abs.display()))?;
|
|
||||||
|
|
||||||
self.dirs.push(Dir {
|
match split_line.as_slice() {
|
||||||
path: path_str.to_owned(),
|
[_, rank_str, path_str] => {
|
||||||
last_accessed: epoch,
|
let path = PathBuf::from(path_str);
|
||||||
rank,
|
let rank = rank_str
|
||||||
});
|
.parse::<f64>()
|
||||||
|
.with_context(|| anyhow!("could not parse rank"))?;
|
||||||
|
|
||||||
|
// otherwise, the rank will get scaled down, depending on
|
||||||
|
// how old the entry is (import in-place and let zoxide
|
||||||
|
// scale down organically)
|
||||||
|
let epoch = util::get_current_time()?;
|
||||||
|
|
||||||
|
// TODO: does this *need* to be canonicalized?
|
||||||
|
// 1) the z db already stores canonicalized paths
|
||||||
|
// 2) zoxide purges nonexistent paths upon query invocation
|
||||||
|
let path_abs = match path.canonicalize() {
|
||||||
|
Ok(path) => path,
|
||||||
|
Err(_) => continue, // ignore dead paths
|
||||||
|
};
|
||||||
|
|
||||||
|
// FIXME: Remove when we switch to PathBuf for storing
|
||||||
|
// diectories inside Dir and just pass `path` (the PathBuf
|
||||||
|
// constructed from `path-str`)
|
||||||
|
let path_str = path_abs.to_str().ok_or_else(|| {
|
||||||
|
anyhow!("invalid unicode in path: {}", path_abs.display())
|
||||||
|
})?;
|
||||||
|
|
||||||
|
self.dirs.push(Dir {
|
||||||
|
path: path_str.to_owned(),
|
||||||
|
last_accessed: epoch,
|
||||||
|
rank,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
[] | [""] => (),
|
||||||
|
line => {
|
||||||
|
eprintln!("invalid line {}: {:?}", line_number, line);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
self.modified = true;
|
// FIXME: just for testing
|
||||||
|
self.modified = false;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue