|
1 |
| -mod init { |
2 |
| - use std::path::{Path, PathBuf}; |
3 |
| - |
4 |
| - use bstr::ByteSlice; |
5 |
| - use git_index::{entry, Version}; |
6 |
| - use git_testtools::hex_to_id; |
7 |
| - |
8 |
| - fn verify(index: git_index::File) -> git_index::File { |
9 |
| - index.verify_integrity().unwrap(); |
10 |
| - index.verify_entries().unwrap(); |
11 |
| - index |
12 |
| - .verify_extensions(false, git_index::verify::extensions::no_find) |
13 |
| - .unwrap(); |
14 |
| - index |
15 |
| - } |
16 |
| - |
17 |
| - fn loose_file(name: &str) -> git_index::File { |
18 |
| - let path = git_testtools::fixture_path(Path::new("loose_index").join(name).with_extension("git-index")); |
19 |
| - let file = git_index::File::at(path, git_index::decode::Options::default()).unwrap(); |
20 |
| - verify(file) |
21 |
| - } |
22 |
| - fn file(name: &str) -> git_index::File { |
23 |
| - let file = git_index::File::at(crate::fixture_path(name), git_index::decode::Options::default()).unwrap(); |
24 |
| - verify(file) |
25 |
| - } |
26 |
| - fn file_opt(name: &str, opts: git_index::decode::Options) -> git_index::File { |
27 |
| - let file = git_index::File::at(crate::fixture_path(name), opts).unwrap(); |
28 |
| - verify(file) |
29 |
| - } |
30 |
| - |
31 |
| - #[test] |
32 |
| - fn read_v2_with_single_entry_tree_and_eoie_ext() { |
33 |
| - let file_disallow_threaded_loading = file_opt( |
34 |
| - "v2", |
35 |
| - git_index::decode::Options { |
36 |
| - min_extension_block_in_bytes_for_threading: 100000, |
37 |
| - ..Default::default() |
38 |
| - }, |
39 |
| - ); |
40 |
| - for file in [file("v2"), file_disallow_threaded_loading] { |
41 |
| - assert_eq!(file.version(), Version::V2); |
42 |
| - |
43 |
| - assert_eq!(file.entries().len(), 1); |
44 |
| - |
45 |
| - let entry = &file.entries()[0]; |
46 |
| - assert_eq!(entry.id, hex_to_id("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391")); |
47 |
| - assert!(entry.flags.is_empty()); |
48 |
| - assert_eq!(entry.mode, entry::Mode::FILE); |
49 |
| - assert_eq!(entry.path(&file.state), "a"); |
50 |
| - |
51 |
| - let tree = file.tree().unwrap(); |
52 |
| - assert_eq!(tree.num_entries, 1); |
53 |
| - assert_eq!(tree.id, hex_to_id("496d6428b9cf92981dc9495211e6e1120fb6f2ba")); |
54 |
| - assert!(tree.name.is_empty()); |
55 |
| - assert!(tree.children.is_empty()); |
56 |
| - } |
57 |
| - } |
58 |
| - #[test] |
59 |
| - fn read_v2_empty() { |
60 |
| - let file = file("V2_empty"); |
61 |
| - assert_eq!(file.version(), Version::V2); |
62 |
| - assert_eq!(file.entries().len(), 0); |
63 |
| - let tree = file.tree().unwrap(); |
64 |
| - assert_eq!(tree.num_entries, 0); |
65 |
| - assert!(tree.name.is_empty()); |
66 |
| - assert!(tree.children.is_empty()); |
67 |
| - assert_eq!(tree.id, hex_to_id("4b825dc642cb6eb9a060e54bf8d69288fbee4904")); |
68 |
| - } |
69 |
| - |
70 |
| - #[test] |
71 |
| - fn read_v2_with_multiple_entries_without_eoie_ext() { |
72 |
| - let file = file("v2_more_files"); |
73 |
| - assert_eq!(file.version(), Version::V2); |
74 |
| - |
75 |
| - assert_eq!(file.entries().len(), 6); |
76 |
| - for (idx, path) in ["a", "b", "c", "d/a", "d/b", "d/c"].iter().enumerate() { |
77 |
| - let e = &file.entries()[idx]; |
78 |
| - assert_eq!(e.path(&file), path); |
79 |
| - assert!(e.flags.is_empty()); |
80 |
| - assert_eq!(e.mode, entry::Mode::FILE); |
81 |
| - assert_eq!(e.id, hex_to_id("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391")) |
82 |
| - } |
83 |
| - |
84 |
| - let tree = file.tree().unwrap(); |
85 |
| - assert_eq!(tree.id, hex_to_id("c9b29c3168d8e677450cc650238b23d9390801fb")); |
86 |
| - assert_eq!(tree.num_entries, 6); |
87 |
| - assert!(tree.name.is_empty()); |
88 |
| - assert_eq!(tree.children.len(), 1); |
89 |
| - |
90 |
| - let tree = &tree.children[0]; |
91 |
| - assert_eq!(tree.id, hex_to_id("765b32c65d38f04c4f287abda055818ec0f26912")); |
92 |
| - assert_eq!(tree.num_entries, 3); |
93 |
| - assert_eq!(tree.name.as_bstr(), "d"); |
94 |
| - } |
95 |
| - |
96 |
| - fn find_shared_index_for(index: impl AsRef<Path>) -> PathBuf { |
97 |
| - let mut matches = std::fs::read_dir(index.as_ref().parent().unwrap()) |
98 |
| - .unwrap() |
99 |
| - .map(Result::unwrap) |
100 |
| - .filter(|e: &std::fs::DirEntry| e.file_name().into_string().unwrap().starts_with("sharedindex.")); |
101 |
| - let res = matches.next().unwrap(); |
102 |
| - assert!(matches.next().is_none(), "found more than one shared indices"); |
103 |
| - res.path() |
104 |
| - } |
105 |
| - |
106 |
| - #[test] |
107 |
| - fn read_split_index_without_any_extension() { |
108 |
| - let file = git_index::File::at( |
109 |
| - find_shared_index_for(crate::fixture_path("v2_split_index")), |
110 |
| - git_index::decode::Options::default(), |
111 |
| - ) |
112 |
| - .unwrap(); |
113 |
| - assert_eq!(file.version(), Version::V2); |
114 |
| - } |
115 |
| - |
116 |
| - #[test] |
117 |
| - fn read_v2_split_index() { |
118 |
| - let file = file("v2_split_index"); |
119 |
| - assert_eq!(file.version(), Version::V2); |
120 |
| - |
121 |
| - assert!(file.link().is_some()); |
122 |
| - } |
123 |
| - |
124 |
| - #[test] |
125 |
| - fn read_v3_extended_flags() { |
126 |
| - let file = loose_file("extended-flags"); |
127 |
| - assert_eq!(file.version(), Version::V3); |
128 |
| - } |
129 |
| - |
130 |
| - #[test] |
131 |
| - fn read_v2_very_long_path() { |
132 |
| - let file = loose_file("very-long-path"); |
133 |
| - assert_eq!(file.version(), Version::V2); |
134 |
| - |
135 |
| - assert_eq!(file.state.entries().len(), 9); |
136 |
| - assert_eq!( |
137 |
| - file.state.entries()[0].path(&file.state), |
138 |
| - std::iter::repeat('a') |
139 |
| - .take(4096) |
140 |
| - .chain(std::iter::once('q')) |
141 |
| - .collect::<String>() |
142 |
| - ); |
143 |
| - } |
144 |
| - |
145 |
| - #[test] |
146 |
| - fn read_reuc_extension() { |
147 |
| - let file = loose_file("REUC"); |
148 |
| - assert_eq!(file.version(), Version::V2); |
149 |
| - |
150 |
| - assert!(file.resolve_undo().is_some()); |
151 |
| - } |
152 |
| - |
153 |
| - #[test] |
154 |
| - fn read_untr_extension() { |
155 |
| - let file = loose_file("UNTR"); |
156 |
| - assert_eq!(file.version(), Version::V2); |
157 |
| - |
158 |
| - assert!(file.untracked().is_some()); |
159 |
| - } |
160 |
| - |
161 |
| - #[test] |
162 |
| - fn read_untr_extension_with_oids() { |
163 |
| - let file = loose_file("UNTR-with-oids"); |
164 |
| - assert_eq!(file.version(), Version::V2); |
165 |
| - |
166 |
| - assert!(file.untracked().is_some()); |
167 |
| - } |
168 |
| - |
169 |
| - #[test] |
170 |
| - fn read_fsmn_v1() { |
171 |
| - let file = loose_file("FSMN"); |
172 |
| - assert_eq!(file.version(), Version::V2); |
173 |
| - |
174 |
| - assert!(file.fs_monitor().is_some()); |
175 |
| - } |
176 |
| - |
177 |
| - #[test] |
178 |
| - fn read_file_with_conflicts() { |
179 |
| - let file = loose_file("conflicting-file"); |
180 |
| - assert_eq!(file.version(), Version::V2); |
181 |
| - assert_eq!(file.entries().len(), 3); |
182 |
| - } |
183 |
| - |
184 |
| - #[test] |
185 |
| - fn read_v4_with_delta_paths_and_ieot_ext() { |
186 |
| - let file = file("v4_more_files_IEOT"); |
187 |
| - assert_eq!(file.version(), Version::V4); |
188 |
| - |
189 |
| - assert_eq!(file.entries().len(), 10); |
190 |
| - for (idx, path) in [ |
191 |
| - "a", |
192 |
| - "b", |
193 |
| - "c", |
194 |
| - "d/a", |
195 |
| - "d/b", |
196 |
| - "d/c", |
197 |
| - "d/last/123", |
198 |
| - "d/last/34", |
199 |
| - "d/last/6", |
200 |
| - "x", |
201 |
| - ] |
202 |
| - .iter() |
203 |
| - .enumerate() |
204 |
| - { |
205 |
| - let e = &file.entries()[idx]; |
206 |
| - assert_eq!(e.path(&file), path); |
207 |
| - assert!(e.flags.is_empty()); |
208 |
| - assert_eq!(e.mode, entry::Mode::FILE); |
209 |
| - assert_eq!(e.id, hex_to_id("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391")) |
210 |
| - } |
211 |
| - } |
212 |
| -} |
| 1 | +mod read; |
| 2 | +mod write; |
0 commit comments