>(
cfg_path: Option,
log_level: LevelFilter,
- module_logging: HashMap,
+ module_logging: BTreeMap,
) -> Result {
let base = RpcContextConfig::load(cfg_path).await?;
let log_epoch = Arc::new(AtomicU64::new(rand::random()));
diff --git a/appmgr/src/install/cleanup.rs b/appmgr/src/install/cleanup.rs
index 1b8b25a48..416123f68 100644
--- a/appmgr/src/install/cleanup.rs
+++ b/appmgr/src/install/cleanup.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::{BTreeMap, HashMap};
use std::path::Path;
use anyhow::anyhow;
diff --git a/appmgr/src/install/mod.rs b/appmgr/src/install/mod.rs
index 8df85d61a..f18c57fd1 100644
--- a/appmgr/src/install/mod.rs
+++ b/appmgr/src/install/mod.rs
@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap, HashSet};
+use std::collections::{BTreeMap, BTreeSet};
use std::io::SeekFrom;
use std::path::Path;
use std::process::Stdio;
@@ -606,7 +606,7 @@ pub async fn install_s9pk(
current_dependents
.keys()
.chain(prev.current_dependents.keys())
- .collect::>(),
+ .collect::>(),
)
.await?;
let mut configured = prev.status.configured;
diff --git a/appmgr/src/manager/mod.rs b/appmgr/src/manager/mod.rs
index eb0960fc2..3c4167327 100644
--- a/appmgr/src/manager/mod.rs
+++ b/appmgr/src/manager/mod.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use std::future::Future;
use std::sync::atomic::AtomicUsize;
use std::sync::Arc;
@@ -21,7 +21,7 @@ use crate::util::{Container, NonDetachingJoinHandle, Version};
use crate::Error;
#[derive(Default)]
-pub struct ManagerMap(RwLock>>);
+pub struct ManagerMap(RwLock>>);
impl ManagerMap {
pub async fn init(
&self,
@@ -32,7 +32,7 @@ impl ManagerMap {
where
for<'a> &'a mut Ex: Executor<'a, Database = Sqlite>,
{
- let mut res = HashMap::new();
+ let mut res = BTreeMap::new();
for package in crate::db::DatabaseModel::new()
.package_data()
.keys(db, true)
@@ -65,7 +65,7 @@ impl ManagerMap {
&self,
ctx: RpcContext,
manifest: Manifest,
- tor_keys: HashMap,
+ tor_keys: BTreeMap,
) -> Result<(), Error> {
let mut lock = self.0.write().await;
let id = (manifest.id.clone(), manifest.version.clone());
@@ -125,7 +125,7 @@ struct ManagerSharedState {
on_stop: Sender,
manifest: Manifest,
container_name: String,
- tor_keys: HashMap,
+ tor_keys: BTreeMap,
}
#[derive(Clone, Copy)]
@@ -246,7 +246,7 @@ impl Manager {
async fn create(
ctx: RpcContext,
manifest: Manifest,
- tor_keys: HashMap,
+ tor_keys: BTreeMap,
) -> Result {
let (on_stop, mut recv) = channel(OnStop::Sleep);
let shared = Arc::new(ManagerSharedState {
diff --git a/appmgr/src/net/interface.rs b/appmgr/src/net/interface.rs
index 76d14fb8c..fa6131e2c 100644
--- a/appmgr/src/net/interface.rs
+++ b/appmgr/src/net/interface.rs
@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap, HashMap};
+use std::collections::BTreeMap;
use std::path::Path;
use anyhow::anyhow;
@@ -72,7 +72,7 @@ impl Interfaces {
&self,
secrets: &mut Ex,
package_id: &PackageId,
- ) -> Result, Error>
+ ) -> Result, Error>
where
for<'a> &'a mut Ex: Executor<'a, Database = Sqlite>,
{
diff --git a/appmgr/src/net/mdns.rs b/appmgr/src/net/mdns.rs
index 121dd438e..cbed5819f 100644
--- a/appmgr/src/net/mdns.rs
+++ b/appmgr/src/net/mdns.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use avahi_sys::{
self, avahi_entry_group_add_service, avahi_entry_group_commit, avahi_entry_group_free,
@@ -35,7 +35,7 @@ impl MdnsController {
pub struct MdnsControllerInner {
hostname: Vec,
entry_group: *mut AvahiEntryGroup,
- services: HashMap<(PackageId, InterfaceId), TorSecretKeyV3>,
+ services: BTreeMap<(PackageId, InterfaceId), TorSecretKeyV3>,
}
unsafe impl Send for MdnsControllerInner {}
unsafe impl Sync for MdnsControllerInner {}
@@ -115,7 +115,7 @@ impl MdnsControllerInner {
MdnsControllerInner {
hostname: hostname_buf,
entry_group: group,
- services: HashMap::new(),
+ services: BTreeMap::new(),
}
}
}
diff --git a/appmgr/src/net/nginx.rs b/appmgr/src/net/nginx.rs
index 751c5e61d..b0725ad74 100644
--- a/appmgr/src/net/nginx.rs
+++ b/appmgr/src/net/nginx.rs
@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap, HashMap};
+use std::collections::BTreeMap;
use std::net::Ipv4Addr;
use std::path::PathBuf;
@@ -35,14 +35,14 @@ impl NginxController {
pub struct NginxControllerInner {
nginx_root: PathBuf,
- interfaces: HashMap,
+ interfaces: BTreeMap,
ssl_manager: SslManager,
}
impl NginxControllerInner {
async fn init(nginx_root: PathBuf, db: SqlitePool) -> Result {
Ok(NginxControllerInner {
nginx_root,
- interfaces: HashMap::new(),
+ interfaces: BTreeMap::new(),
ssl_manager: SslManager::init(db).await?,
})
}
@@ -60,7 +60,7 @@ impl NginxControllerInner {
// also don't add nginx unless it has at least one exposed port
&& meta.lan_config.len() > 0
})
- .collect::>();
+ .collect::>();
for (id, meta) in interface_map.iter() {
for (port, lan_port_config) in meta.lan_config.iter() {
@@ -197,7 +197,7 @@ impl NginxControllerInner {
}
struct PackageNetInfo {
ip: Ipv4Addr,
- interfaces: HashMap,
+ interfaces: BTreeMap,
}
pub struct InterfaceMetadata {
pub dns_base: String,
diff --git a/appmgr/src/net/tor.rs b/appmgr/src/net/tor.rs
index 7aa5d6a3f..ba332339b 100644
--- a/appmgr/src/net/tor.rs
+++ b/appmgr/src/net/tor.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use std::net::{Ipv4Addr, SocketAddr};
use std::time::Duration;
@@ -137,7 +137,7 @@ pub struct TorControllerInner {
embassyd_tor_key: TorSecretKeyV3,
control_addr: SocketAddr,
connection: Option,
- services: HashMap<(PackageId, InterfaceId), (TorSecretKeyV3, TorConfig, Ipv4Addr)>,
+ services: BTreeMap<(PackageId, InterfaceId), (TorSecretKeyV3, TorConfig, Ipv4Addr)>,
}
impl TorControllerInner {
async fn add<'a, I: IntoIterator- >(
@@ -230,7 +230,7 @@ impl TorControllerInner {
embassyd_tor_key,
control_addr: tor_control,
connection: Some(connection),
- services: HashMap::new(),
+ services: BTreeMap::new(),
};
controller.add_embassyd_onion().await?;
Ok(controller)
@@ -314,7 +314,7 @@ impl TorControllerInner {
self.connection.replace(new_connection);
// swap empty map for owned old service map
- let old_services = std::mem::replace(&mut self.services, HashMap::new());
+ let old_services = std::mem::replace(&mut self.services, BTreeMap::new());
// re add all of the services on the new control socket
for ((package_id, interface_id), (tor_key, tor_cfg, ipv4)) in old_services {
diff --git a/appmgr/src/net/wifi.rs b/appmgr/src/net/wifi.rs
index f85e9e9e2..95c655710 100644
--- a/appmgr/src/net/wifi.rs
+++ b/appmgr/src/net/wifi.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use std::path::Path;
use std::time::Duration;
@@ -353,7 +353,7 @@ impl<'a> WpaCli<'a> {
.await?;
Ok(())
}
- pub async fn list_networks_low(&self) -> Result, Error> {
+ pub async fn list_networks_low(&self) -> Result, Error> {
let r = Command::new("wpa_cli")
.arg("-i")
.arg(self.interface)
@@ -369,7 +369,7 @@ impl<'a> WpaCli<'a> {
let ssid = cs.next()?.to_owned();
Some((ssid, nid))
})
- .collect::>())
+ .collect::>())
}
pub async fn select_network_low(&self, id: &NetworkId) -> Result<(), Error> {
let _ = Command::new("wpa_cli")
diff --git a/appmgr/src/notifications.rs b/appmgr/src/notifications.rs
index 4efd599a7..261bd069d 100644
--- a/appmgr/src/notifications.rs
+++ b/appmgr/src/notifications.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use std::fmt;
use std::str::FromStr;
@@ -187,7 +187,7 @@ pub enum NotificationSubtype {
BackupReport {
server_attempted: bool,
server_error: Option,
- packages: HashMap>,
+ packages: BTreeMap>,
},
}
impl NotificationSubtype {
diff --git a/appmgr/src/s9pk/header.rs b/appmgr/src/s9pk/header.rs
index f35894d86..86f7e971a 100644
--- a/appmgr/src/s9pk/header.rs
+++ b/appmgr/src/s9pk/header.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use std::io::Write;
use anyhow::anyhow;
@@ -100,12 +100,12 @@ impl TableOfContents {
reader.read_exact(&mut toc_len).await?;
let toc_len = u32::from_be_bytes(toc_len);
let mut reader = reader.take(toc_len as u64);
- let mut table = HashMap::new();
+ let mut table = BTreeMap::new();
while let Some((label, section)) = FileSection::deserialize_entry(&mut reader).await? {
table.insert(label, section);
}
fn from_table(
- table: &HashMap, FileSection>,
+ table: &BTreeMap, FileSection>,
label: &str,
) -> std::io::Result {
table.get(label.as_bytes()).copied().ok_or_else(|| {
diff --git a/appmgr/src/status/mod.rs b/appmgr/src/status/mod.rs
index f525c17ac..614c61e63 100644
--- a/appmgr/src/status/mod.rs
+++ b/appmgr/src/status/mod.rs
@@ -1,4 +1,4 @@
-use std::collections::{BTreeMap, HashMap, HashSet};
+use std::collections::{BTreeMap, BTreeSet};
use std::sync::Arc;
use anyhow::anyhow;
@@ -113,7 +113,7 @@ pub async fn check_all(ctx: &RpcContext) -> Result<(), Error> {
.0
.into_iter()
.map(|x| x.0)
- .collect::>();
+ .collect::>();
status_manifest.push((
installed.clone().status(),
Arc::new(installed.clone().manifest().get(&mut db, true).await?),
@@ -151,7 +151,7 @@ pub async fn check_all(ctx: &RpcContext) -> Result<(), Error> {
Ok(res)
}
let (status_sender, mut statuses_recv) = tokio::sync::mpsc::channel(status_manifest.len() + 1);
- let mut statuses = HashMap::with_capacity(status_manifest.len());
+ let mut statuses = BTreeMap::new();
futures::stream::iter(
status_manifest
.into_iter()
@@ -179,7 +179,7 @@ pub async fn check_all(ctx: &RpcContext) -> Result<(), Error> {
let statuses = Arc::new(statuses);
async fn dependency_status(
id: &PackageId,
- statuses: Arc>,
+ statuses: Arc>,
model: InstalledPackageDataEntryModel,
current_deps: Arc>,
mut db: Db,
diff --git a/appmgr/src/util/logger.rs b/appmgr/src/util/logger.rs
index 66d15ba57..70652384b 100644
--- a/appmgr/src/util/logger.rs
+++ b/appmgr/src/util/logger.rs
@@ -1,4 +1,4 @@
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
use std::sync::Arc;
@@ -12,7 +12,7 @@ pub struct ModuleMap {
trie: SequenceTrie,
}
impl ModuleMap {
- fn new(vals: HashMap) -> Self {
+ fn new(vals: BTreeMap) -> Self {
let mut module_trie = SequenceTrie::new();
for (k, v) in vals {
let mut include_submodules = false;
@@ -97,7 +97,7 @@ impl EmbassyLogger {
log_epoch: Arc,
share_dest: Option,
share_errors: bool,
- module_map: HashMap,
+ module_map: BTreeMap,
) -> Self {
let share_dest = match share_dest {
None => Url::parse("https://beta-registry-0-3.start9labs.com/error-logs").unwrap(), // TODO
@@ -145,7 +145,7 @@ impl log::Log for EmbassyLogger {
}
if self.sharing.load(Ordering::SeqCst) {
if record.level() <= log::Level::Warn {
- let mut body = HashMap::new();
+ let mut body = BTreeMap::new();
body.insert(
"log-epoch",
format!("{}", self.log_epoch.load(Ordering::SeqCst)),
@@ -180,7 +180,7 @@ proptest::proptest! {
#[test]
fn submodules_handled_by_parent(s0 in "[a-z][a-z0-9_]+", s1 in "[a-z][a-z0-9_]+", level in filter_strategy()) {
proptest::prop_assume!(level > LevelFilter::Off);
- let mut hm = HashMap::new();
+ let mut hm = BTreeMap::new();
hm.insert(format!("{}::*", s0.clone()), level);
let mod_map = ModuleMap::new(hm);
proptest::prop_assert_eq!(mod_map.level_for(&format!("{}::{}", s0, s1)), &level)
@@ -188,7 +188,7 @@ proptest::proptest! {
#[test]
fn submodules_ignored_by_parent(s0 in "[a-z][a-z0-9_]+", s1 in "[a-z][a-z0-9_]+", level in filter_strategy()) {
proptest::prop_assume!(level > LevelFilter::Off);
- let mut hm = HashMap::new();
+ let mut hm = BTreeMap::new();
hm.insert(s0.clone(), level);
let mod_map = ModuleMap::new(hm);
proptest::prop_assert_eq!(mod_map.level_for(&format!("{}::{}", s0, s1)), &LevelFilter::Off)
@@ -196,7 +196,7 @@ proptest::proptest! {
#[test]
fn duplicate_insertion_ignored(s0 in "[a-z][a-z0-9_]+", s1 in "[a-z][a-z0-9_]+", level in filter_strategy()) {
proptest::prop_assume!(level > LevelFilter::Off);
- let mut hm = HashMap::new();
+ let mut hm = BTreeMap::new();
hm.insert(format!("{}::*", s0.clone()), level);
let sub = format!("{}::{}", s0, s1);
hm.insert(sub.clone(), level);
@@ -205,7 +205,7 @@ proptest::proptest! {
}
#[test]
fn parent_child_simul(s0 in "[a-z][a-z0-9_]+", s1 in "[a-z][a-z0-9_]+", level0 in filter_strategy(), level1 in filter_strategy()) {
- let mut hm = HashMap::new();
+ let mut hm = BTreeMap::new();
hm.insert(s0.clone(), level0);
let sub = format!("{}::{}", s0, s1);
hm.insert(sub.clone(), level1);
diff --git a/appmgr/src/util/mod.rs b/appmgr/src/util/mod.rs
index fe59f6aa6..ee70c3fce 100644
--- a/appmgr/src/util/mod.rs
+++ b/appmgr/src/util/mod.rs
@@ -387,6 +387,16 @@ impl PartialEq for Version {
}
}
impl Eq for Version {}
+impl PartialOrd for Version {
+ fn partial_cmp(&self, other: &Self) -> Option {
+ self.version.partial_cmp(&other.version)
+ }
+}
+impl Ord for Version {
+ fn cmp(&self, other: &Self) -> std::cmp::Ordering {
+ self.version.cmp(&other.version)
+ }
+}
impl Hash for Version {
fn hash(&self, state: &mut H) {
self.version.hash(state)