Switch to BTreeMap in project to make iteration order deterministic

This commit is contained in:
Lucien Greathouse 2019-03-12 18:23:10 -07:00
parent 80a8e0e985
commit ec12ec25f6
2 changed files with 10 additions and 10 deletions

View file

@ -1,5 +1,5 @@
use std::{
collections::{HashMap, HashSet},
collections::{HashMap, HashSet, BTreeMap},
fmt,
fs::{self, File},
io,
@ -128,7 +128,7 @@ fn serialize_unresolved_map<S>(value: &HashMap<String, UnresolvedRbxValue>, seri
/// Similar to SourceProject, the structure of nodes in the project tree is
/// slightly different on-disk than how we want to handle them in the rest of
/// Rojo.
#[derive(Debug, Serialize, Deserialize)]
#[derive(Debug, Clone, Serialize, Deserialize)]
struct SourceProjectNode {
#[serde(rename = "$className", skip_serializing_if = "Option::is_none")]
class_name: Option<String>,
@ -148,14 +148,14 @@ struct SourceProjectNode {
path: Option<String>,
#[serde(flatten)]
children: HashMap<String, SourceProjectNode>,
children: BTreeMap<String, SourceProjectNode>,
}
impl SourceProjectNode {
/// Consumes the SourceProjectNode and turns it into a ProjectNode.
pub fn into_project_node(mut self, project_file_location: &Path) -> ProjectNode {
let children = self.children.drain()
.map(|(key, value)| (key, value.into_project_node(project_file_location)))
pub fn into_project_node(self, project_file_location: &Path) -> ProjectNode {
let children = self.children.iter()
.map(|(key, value)| (key.clone(), value.clone().into_project_node(project_file_location)))
.collect();
// Make sure that paths are absolute, transforming them by adding the
@ -264,7 +264,7 @@ pub enum ProjectSaveError {
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct ProjectNode {
pub class_name: Option<String>,
pub children: HashMap<String, ProjectNode>,
pub children: BTreeMap<String, ProjectNode>,
pub properties: HashMap<String, UnresolvedRbxValue>,
pub ignore_unknown_instances: Option<bool>,

View file

@ -1,7 +1,7 @@
#[macro_use] extern crate lazy_static;
use std::{
collections::HashMap,
collections::{HashMap, BTreeMap},
path::{Path, PathBuf},
};
@ -53,7 +53,7 @@ fn single_partition_game() {
..Default::default()
};
let mut replicated_storage_children = HashMap::new();
let mut replicated_storage_children = BTreeMap::new();
replicated_storage_children.insert("Foo".to_string(), foo);
let replicated_storage = ProjectNode {
@ -73,7 +73,7 @@ fn single_partition_game() {
..Default::default()
};
let mut root_children = HashMap::new();
let mut root_children = BTreeMap::new();
root_children.insert("ReplicatedStorage".to_string(), replicated_storage);
root_children.insert("HttpService".to_string(), http_service);