1 use super::*;
2 use crate::working_copy::{WorkingCopy, WorkingCopyRead};
3 use std::io::Write;
4 
5 #[test]
clone_simple() -> Result<(), anyhow::Error>6 fn clone_simple() -> Result<(), anyhow::Error> {
7     env_logger::try_init().unwrap_or(());
8 
9     let contents = b"a\nb\nc\nd\ne\nf\n";
10     let contents2 = b"a\nb\n\nc\nd\nx\nf\n";
11 
12     let repo = working_copy::memory::Memory::new();
13     let changes = changestore::memory::Memory::new();
14     repo.add_file("file", contents.to_vec());
15 
16     let env = pristine::sanakirja::Pristine::new_anon()?;
17     let mut recorded_changes = Vec::new();
18     let txn = env.arc_txn_begin().unwrap();
19     {
20         let channel = txn.write().open_or_create_channel("main").unwrap();
21 
22         txn.write().add_file("file", 0)?;
23         recorded_changes.push(record_all(&repo, &changes, &txn, &channel, "").unwrap());
24         repo.write_file("file")
25             .unwrap()
26             .write_all(contents2)
27             .unwrap();
28         recorded_changes.push(record_all(&repo, &changes, &txn, &channel, "").unwrap());
29     }
30     txn.commit().unwrap();
31 
32     let mut channel_changes = Vec::new();
33     {
34         let txn = env.txn_begin()?;
35         for channel in txn.iter_channels("").unwrap() {
36             let channel = channel.unwrap();
37             for x in txn.log(&channel.1.read(), 0).unwrap() {
38                 let (_, (i, _)) = x.unwrap();
39                 channel_changes.push(i.into())
40             }
41         }
42     }
43     info!("{:?}", channel_changes);
44     assert_eq!(channel_changes, recorded_changes);
45     let repo2 = working_copy::memory::Memory::new();
46     let env2 = pristine::sanakirja::Pristine::new_anon()?;
47     let txn2 = env2.arc_txn_begin().unwrap();
48     {
49         let channel = txn2.write().open_or_create_channel("main2").unwrap();
50         for h in channel_changes.iter() {
51             info!("applying {:?}", h);
52             apply::apply_change(&changes, &mut *txn2.write(), &mut *channel.write(), h).unwrap();
53             output::output_repository_no_pending(
54                 &repo2, &changes, &txn2, &channel, "", true, None, 1, 0,
55             )
56             .unwrap();
57         }
58         assert_eq!(repo2.list_files(), vec!["file".to_string()]);
59         let mut file = Vec::new();
60         repo2.read_file("file", &mut file).unwrap();
61         assert_eq!(file, contents2);
62     }
63     txn2.commit().unwrap();
64     Ok(())
65 }
66 
67 #[test]
clone_prefixes() -> Result<(), anyhow::Error>68 fn clone_prefixes() -> Result<(), anyhow::Error> {
69     env_logger::try_init().unwrap_or(());
70 
71     let contents = b"a\nb\nc\nd\ne\nf\n";
72 
73     let mut repo = working_copy::memory::Memory::new();
74     let changes = changestore::memory::Memory::new();
75     repo.add_file("a/b/c/d", contents.to_vec());
76     repo.add_file("e/f/g/h", contents.to_vec());
77     repo.add_file("i/j/k/l", contents.to_vec());
78 
79     let env = pristine::sanakirja::Pristine::new_anon()?;
80     let txn = env.arc_txn_begin().unwrap();
81     let h = {
82         let channel = txn.write().open_or_create_channel("main").unwrap();
83         txn.write().add_file("a/b/c/d", 0)?;
84         txn.write().add_file("e/f/g/h", 0)?;
85         txn.write().add_file("i/j/k/l", 0)?;
86         record_all(&repo, &changes, &txn, &channel, "")?
87     };
88     let h2 = {
89         let channel = txn.write().open_or_create_channel("main").unwrap();
90         repo.write_file("a/b/c/d").unwrap().write_all(b"edits\n")?;
91         repo.write_file("e/f/g/h").unwrap().write_all(b"edits\n")?;
92         record_all(&mut repo, &changes, &txn, &channel, "a/b/c/d")?
93     };
94 
95     txn.commit().unwrap();
96 
97     // Cloning
98     debug!("Cloning");
99     let repo2 = working_copy::memory::Memory::new();
100     let env2 = pristine::sanakirja::Pristine::new_anon()?;
101     let txn2 = env2.arc_txn_begin().unwrap();
102     {
103         let channel = txn2.write().open_or_create_channel("main2").unwrap();
104         apply::apply_change(&changes, &mut *txn2.write(), &mut *channel.write(), &h).unwrap();
105         output::output_repository_no_pending(
106             &repo2, &changes, &txn2, &channel, "e/f", true, None, 1, 0,
107         )?;
108         assert_eq!(
109             repo2.list_files(),
110             ["e", "e/f", "e/f/g", "e/f/g/h"]
111                 .iter()
112                 .map(|x| x.to_string())
113                 .collect::<Vec<_>>()
114         );
115 
116         apply::apply_change(&changes, &mut *txn2.write(), &mut *channel.write(), &h2).unwrap();
117         output::output_repository_no_pending(
118             &repo2, &changes, &txn2, &channel, "", true, None, 1, 0,
119         )?;
120         let mut buf = Vec::new();
121         repo2.read_file("a/b/c/d", &mut buf)?;
122         assert_eq!(buf, b"edits\n");
123         buf.clear();
124         repo2.read_file("e/f/g/h", &mut buf)?;
125         assert_eq!(buf, contents);
126     }
127     txn2.commit().unwrap();
128     let mut txn2 = env2.mut_txn_begin().unwrap();
129     txn2.open_or_create_channel("main2").unwrap();
130     Ok(())
131 }
132