Don't fail if we can't open the database
We make sure that even if there is no database file, we're still able to return `None` for the alias lookup.
This commit is contained in:
parent
eb701be033
commit
b27313bc5c
|
|
@ -1,5 +1,4 @@
|
||||||
#![allow(clippy::box_default)]
|
#![allow(clippy::box_default)]
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::ffi::OsString;
|
use std::ffi::OsString;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
|
@ -140,11 +139,8 @@ pub fn setup_remotes(
|
||||||
remotes: &[NodeId],
|
remotes: &[NodeId],
|
||||||
profile: &Profile,
|
profile: &Profile,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let aliases = if let Ok(aliases) = profile.aliases() {
|
let aliases = profile.aliases();
|
||||||
Box::new(aliases) as Box<dyn AliasStore>
|
|
||||||
} else {
|
|
||||||
Box::new(HashMap::new()) as Box<dyn AliasStore>
|
|
||||||
};
|
|
||||||
for remote_id in remotes {
|
for remote_id in remotes {
|
||||||
if let Err(e) = setup_remote(&setup, remote_id, None, &aliases) {
|
if let Err(e) = setup_remote(&setup, remote_id, None, &aliases) {
|
||||||
term::warning(format!("Failed to setup remote for {remote_id}: {e}").as_str());
|
term::warning(format!("Failed to setup remote for {remote_id}: {e}").as_str());
|
||||||
|
|
|
||||||
|
|
@ -416,7 +416,7 @@ fn list(
|
||||||
]);
|
]);
|
||||||
table.divider();
|
table.divider();
|
||||||
|
|
||||||
let aliases = profile.aliases()?;
|
let aliases = profile.aliases();
|
||||||
|
|
||||||
for (id, issue) in all {
|
for (id, issue) in all {
|
||||||
let assigned: String = issue
|
let assigned: String = issue
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ pub fn run(
|
||||||
is_me.then(by_rev_time).then(by_id)
|
is_me.then(by_rev_time).then(by_id)
|
||||||
});
|
});
|
||||||
|
|
||||||
let aliases = profile.aliases()?;
|
let aliases = profile.aliases();
|
||||||
|
|
||||||
let mut errors = Vec::new();
|
let mut errors = Vec::new();
|
||||||
for (id, patch) in &mut all {
|
for (id, patch) in &mut all {
|
||||||
|
|
@ -132,7 +132,7 @@ pub fn timeline(
|
||||||
patch: &Patch,
|
patch: &Patch,
|
||||||
repository: &Repository,
|
repository: &Repository,
|
||||||
) -> anyhow::Result<Vec<term::Line>> {
|
) -> anyhow::Result<Vec<term::Line>> {
|
||||||
let aliases = profile.aliases()?;
|
let aliases = profile.aliases();
|
||||||
let alias = aliases.alias(patch.author().id());
|
let alias = aliases.alias(patch.author().id());
|
||||||
let open = term::Line::spaced([
|
let open = term::Line::spaced([
|
||||||
term::format::positive("●").into(),
|
term::format::positive("●").into(),
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ pub fn run(
|
||||||
profile: &Profile,
|
profile: &Profile,
|
||||||
repo: &git::Repository,
|
repo: &git::Repository,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let aliases = profile.aliases()?;
|
let aliases = profile.aliases();
|
||||||
let setup = SetupRemote {
|
let setup = SetupRemote {
|
||||||
rid,
|
rid,
|
||||||
tracking,
|
tracking,
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ impl<'a> Identity<'a> {
|
||||||
impl<'a> fmt::Display for Identity<'a> {
|
impl<'a> fmt::Display for Identity<'a> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
let nid = self.profile.id();
|
let nid = self.profile.id();
|
||||||
let alias = self.profile.aliases().ok().and_then(|a| a.alias(nid));
|
let alias = self.profile.aliases().alias(nid);
|
||||||
let node_id = match self.short {
|
let node_id = match self.short {
|
||||||
true => self::node(nid),
|
true => self::node(nid),
|
||||||
false => nid.to_human(),
|
false => nid.to_human(),
|
||||||
|
|
|
||||||
|
|
@ -324,7 +324,7 @@ async fn remotes_handler(State(ctx): State<Context>, Path(project): Path<Id>) ->
|
||||||
let storage = &ctx.profile.storage;
|
let storage = &ctx.profile.storage;
|
||||||
let repo = storage.repository(project)?;
|
let repo = storage.repository(project)?;
|
||||||
let delegates = repo.delegates()?;
|
let delegates = repo.delegates()?;
|
||||||
let aliases = &ctx.profile.aliases()?;
|
let aliases = &ctx.profile.aliases();
|
||||||
let remotes = repo
|
let remotes = repo
|
||||||
.remotes()?
|
.remotes()?
|
||||||
.filter_map(|r| r.map(|r| r.1).ok())
|
.filter_map(|r| r.map(|r| r.1).ok())
|
||||||
|
|
@ -454,7 +454,7 @@ async fn issues_handler(
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
issues.sort_by(|(_, a, _), (_, b, _)| b.timestamp().cmp(&a.timestamp()));
|
issues.sort_by(|(_, a, _), (_, b, _)| b.timestamp().cmp(&a.timestamp()));
|
||||||
let aliases = &ctx.profile.aliases()?;
|
let aliases = &ctx.profile.aliases();
|
||||||
let issues = issues
|
let issues = issues
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(id, issue, _)| api::json::issue(id, issue, aliases))
|
.map(|(id, issue, _)| api::json::issue(id, issue, aliases))
|
||||||
|
|
@ -568,7 +568,7 @@ async fn issue_handler(
|
||||||
let issue = issue::Issues::open(&repo)?
|
let issue = issue::Issues::open(&repo)?
|
||||||
.get(&issue_id.into())?
|
.get(&issue_id.into())?
|
||||||
.ok_or(Error::NotFound)?;
|
.ok_or(Error::NotFound)?;
|
||||||
let aliases = ctx.profile.aliases()?;
|
let aliases = ctx.profile.aliases();
|
||||||
|
|
||||||
Ok::<_, Error>(Json(api::json::issue(issue_id.into(), issue, &aliases)))
|
Ok::<_, Error>(Json(api::json::issue(issue_id.into(), issue, &aliases)))
|
||||||
}
|
}
|
||||||
|
|
@ -732,7 +732,7 @@ async fn patches_handler(
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
patches.sort_by(|(_, a, _), (_, b, _)| b.timestamp().cmp(&a.timestamp()));
|
patches.sort_by(|(_, a, _), (_, b, _)| b.timestamp().cmp(&a.timestamp()));
|
||||||
let aliases = ctx.profile.aliases()?;
|
let aliases = ctx.profile.aliases();
|
||||||
let patches = patches
|
let patches = patches
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(id, patch, _)| api::json::patch(id, patch, &repo, &aliases))
|
.map(|(id, patch, _)| api::json::patch(id, patch, &repo, &aliases))
|
||||||
|
|
@ -754,7 +754,7 @@ async fn patch_handler(
|
||||||
let patch = patch::Patches::open(&repo)?
|
let patch = patch::Patches::open(&repo)?
|
||||||
.get(&patch_id.into())?
|
.get(&patch_id.into())?
|
||||||
.ok_or(Error::NotFound)?;
|
.ok_or(Error::NotFound)?;
|
||||||
let aliases = ctx.profile.aliases()?;
|
let aliases = ctx.profile.aliases();
|
||||||
|
|
||||||
Ok::<_, Error>(Json(api::json::patch(
|
Ok::<_, Error>(Json(api::json::patch(
|
||||||
patch_id.into(),
|
patch_id.into(),
|
||||||
|
|
|
||||||
|
|
@ -232,14 +232,14 @@ impl Profile {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a multi-source store for aliases.
|
/// Return a multi-source store for aliases.
|
||||||
pub fn aliases(&self) -> Result<Aliases, Error> {
|
pub fn aliases(&self) -> Aliases {
|
||||||
let tracking = self.tracking()?;
|
let tracking = self.tracking().ok();
|
||||||
let addresses = self.addresses()?;
|
let addresses = self.addresses().ok();
|
||||||
|
|
||||||
Ok(Aliases {
|
Aliases {
|
||||||
tracking,
|
tracking,
|
||||||
addresses,
|
addresses,
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the path to the keys folder.
|
/// Return the path to the keys folder.
|
||||||
|
|
@ -261,8 +261,8 @@ impl Profile {
|
||||||
/// Holds multiple alias stores, and will try
|
/// Holds multiple alias stores, and will try
|
||||||
/// them one by one when asking for an alias.
|
/// them one by one when asking for an alias.
|
||||||
pub struct Aliases {
|
pub struct Aliases {
|
||||||
tracking: tracking::store::Config,
|
tracking: Option<tracking::store::Config>,
|
||||||
addresses: address::Book,
|
addresses: Option<address::Book>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AliasStore for Aliases {
|
impl AliasStore for Aliases {
|
||||||
|
|
@ -270,8 +270,9 @@ impl AliasStore for Aliases {
|
||||||
/// First looks in `tracking.db` and then `addresses.db`.
|
/// First looks in `tracking.db` and then `addresses.db`.
|
||||||
fn alias(&self, nid: &NodeId) -> Option<Alias> {
|
fn alias(&self, nid: &NodeId) -> Option<Alias> {
|
||||||
self.tracking
|
self.tracking
|
||||||
.alias(nid)
|
.as_ref()
|
||||||
.or_else(|| self.addresses.alias(nid))
|
.and_then(|db| db.alias(nid))
|
||||||
|
.or_else(|| self.addresses.as_ref().and_then(|db| db.alias(nid)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue