comparison rust/hg-core/src/dirstate/dirstate_map.rs @ 42850:b1b984f9c01d

rust-utils: add normalize_case util to mirror Python one While we still don't handle filenames properly cross-platform, this at least sticks closer to the Python behavior. Differential Revision: https://phab.mercurial-scm.org/D6756
author Raphaël Gomès <rgomes@octobus.net>
date Thu, 22 Aug 2019 14:31:07 +0200
parents 2e1f74cc3350
children 7a01778bc7b7
comparison
equal deleted inserted replaced
42849:ee0f511b7a22 42850:b1b984f9c01d
5 // This software may be used and distributed according to the terms of the 5 // This software may be used and distributed according to the terms of the
6 // GNU General Public License version 2 or any later version. 6 // GNU General Public License version 2 or any later version.
7 7
8 use crate::{ 8 use crate::{
9 dirstate::{parsers::PARENT_SIZE, EntryState}, 9 dirstate::{parsers::PARENT_SIZE, EntryState},
10 pack_dirstate, parse_dirstate, CopyMap, DirsMultiset, DirstateEntry, 10 pack_dirstate, parse_dirstate,
11 DirstateError, DirstateMapError, DirstateParents, DirstateParseError, 11 utils::files::normalize_case,
12 StateMap, 12 CopyMap, DirsMultiset, DirstateEntry, DirstateError, DirstateMapError,
13 DirstateParents, DirstateParseError, StateMap,
13 }; 14 };
14 use core::borrow::Borrow; 15 use core::borrow::Borrow;
15 use std::collections::{HashMap, HashSet}; 16 use std::collections::{HashMap, HashSet};
16 use std::convert::TryInto; 17 use std::convert::TryInto;
17 use std::iter::FromIterator; 18 use std::iter::FromIterator;
125 all_dirs.add_path(filename); 126 all_dirs.add_path(filename);
126 } 127 }
127 } 128 }
128 129
129 if let Some(ref mut file_fold_map) = self.file_fold_map { 130 if let Some(ref mut file_fold_map) = self.file_fold_map {
130 file_fold_map.remove(&filename.to_ascii_uppercase()); 131 file_fold_map.remove(&normalize_case(filename));
131 } 132 }
132 self.state_map.insert( 133 self.state_map.insert(
133 filename.to_owned(), 134 filename.to_owned(),
134 DirstateEntry { 135 DirstateEntry {
135 state: EntryState::Removed, 136 state: EntryState::Removed,
160 if let Some(ref mut all_dirs) = self.all_dirs { 161 if let Some(ref mut all_dirs) = self.all_dirs {
161 all_dirs.delete_path(filename)?; 162 all_dirs.delete_path(filename)?;
162 } 163 }
163 } 164 }
164 if let Some(ref mut file_fold_map) = self.file_fold_map { 165 if let Some(ref mut file_fold_map) = self.file_fold_map {
165 file_fold_map.remove(&filename.to_ascii_uppercase()); 166 file_fold_map.remove(&normalize_case(filename));
166 } 167 }
167 self.non_normal_set.remove(filename); 168 self.non_normal_set.remove(filename);
168 169
169 Ok(exists) 170 Ok(exists)
170 } 171 }
324 } 325 }
325 let mut new_file_fold_map = FileFoldMap::new(); 326 let mut new_file_fold_map = FileFoldMap::new();
326 for (filename, DirstateEntry { state, .. }) in self.state_map.borrow() 327 for (filename, DirstateEntry { state, .. }) in self.state_map.borrow()
327 { 328 {
328 if *state == EntryState::Removed { 329 if *state == EntryState::Removed {
329 new_file_fold_map.insert( 330 new_file_fold_map
330 filename.to_ascii_uppercase().to_owned(), 331 .insert(normalize_case(filename), filename.to_owned());
331 filename.to_owned(),
332 );
333 } 332 }
334 } 333 }
335 self.file_fold_map = Some(new_file_fold_map); 334 self.file_fold_map = Some(new_file_fold_map);
336 self.file_fold_map.as_ref().unwrap() 335 self.file_fold_map.as_ref().unwrap()
337 } 336 }