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