mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-14 08:34:43 +00:00
repo: remove working_copy(), only used in tests
This is another step towards removing coupling between the repo and the working copy, so we can have multiple working copies for a single repo (#13).
This commit is contained in:
parent
afe3bd5c2f
commit
c08adba424
3 changed files with 65 additions and 62 deletions
|
@ -307,14 +307,6 @@ impl ReadonlyRepo {
|
||||||
self.index()
|
self.index()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn working_copy(&self) -> WorkingCopy {
|
|
||||||
WorkingCopy::load(
|
|
||||||
self.store.clone(),
|
|
||||||
self.wc_path.clone(),
|
|
||||||
self.repo_path.join("working_copy"),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn store(&self) -> &Arc<Store> {
|
pub fn store(&self) -> &Arc<Store> {
|
||||||
&self.store
|
&self.store
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,10 +35,10 @@ use test_case::test_case;
|
||||||
fn test_root(use_git: bool) {
|
fn test_root(use_git: bool) {
|
||||||
// Test that the working copy is clean and empty after init.
|
// Test that the working copy is clean and empty after init.
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
|
|
||||||
let mut wc = repo.working_copy();
|
let wc = test_workspace.workspace.working_copy_mut();
|
||||||
let locked_wc = wc.write_tree();
|
let locked_wc = wc.write_tree();
|
||||||
let new_tree_id = locked_wc.new_tree_id();
|
let new_tree_id = locked_wc.new_tree_id();
|
||||||
locked_wc.discard();
|
locked_wc.discard();
|
||||||
|
@ -55,7 +55,7 @@ fn test_checkout_file_transitions(use_git: bool) {
|
||||||
// additions and removals as well.
|
// additions and removals as well.
|
||||||
|
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
let store = repo.store().clone();
|
let store = repo.store().clone();
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ fn test_checkout_file_transitions(use_git: bool) {
|
||||||
.write_to_repo(tx.mut_repo());
|
.write_to_repo(tx.mut_repo());
|
||||||
tx.commit();
|
tx.commit();
|
||||||
|
|
||||||
let mut wc = repo.working_copy();
|
let wc = test_workspace.workspace.working_copy_mut();
|
||||||
wc.check_out(left_commit).unwrap();
|
wc.check_out(left_commit).unwrap();
|
||||||
wc.check_out(right_commit.clone()).unwrap();
|
wc.check_out(right_commit.clone()).unwrap();
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ fn test_checkout_file_transitions(use_git: bool) {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_untrack() {
|
fn test_untrack() {
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, false);
|
let mut test_workspace = testutils::init_repo(&settings, false);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
|
|
||||||
let wanted_path = RepoPath::from_internal_string("wanted");
|
let wanted_path = RepoPath::from_internal_string("wanted");
|
||||||
|
@ -318,7 +318,7 @@ fn test_untrack() {
|
||||||
)
|
)
|
||||||
.write_to_repo(tx.mut_repo());
|
.write_to_repo(tx.mut_repo());
|
||||||
let repo = tx.commit();
|
let repo = tx.commit();
|
||||||
let mut wc = repo.working_copy();
|
let wc = test_workspace.workspace.working_copy_mut();
|
||||||
wc.check_out(initial_commit.clone()).unwrap();
|
wc.check_out(initial_commit.clone()).unwrap();
|
||||||
|
|
||||||
// Now we untrack the file called "unwanted"
|
// Now we untrack the file called "unwanted"
|
||||||
|
@ -357,12 +357,12 @@ fn test_commit_racy_timestamps(use_git: bool) {
|
||||||
// millisecond as the updated working copy state.
|
// millisecond as the updated working copy state.
|
||||||
let _home_dir = testutils::new_user_home();
|
let _home_dir = testutils::new_user_home();
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
|
|
||||||
let file_path = repo.working_copy_path().join("file");
|
let file_path = repo.working_copy_path().join("file");
|
||||||
let mut previous_tree_id = repo.store().empty_tree_id().clone();
|
let mut previous_tree_id = repo.store().empty_tree_id().clone();
|
||||||
let mut wc = repo.working_copy();
|
let wc = test_workspace.workspace.working_copy_mut();
|
||||||
for i in 0..100 {
|
for i in 0..100 {
|
||||||
{
|
{
|
||||||
let mut file = OpenOptions::new()
|
let mut file = OpenOptions::new()
|
||||||
|
@ -388,9 +388,9 @@ fn test_gitignores(use_git: bool) {
|
||||||
|
|
||||||
let _home_dir = testutils::new_user_home();
|
let _home_dir = testutils::new_user_home();
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
let workspace_root = &test_workspace.workspace.workspace_root();
|
let workspace_root = test_workspace.workspace.workspace_root().clone();
|
||||||
|
|
||||||
let gitignore_path = RepoPath::from_internal_string(".gitignore");
|
let gitignore_path = RepoPath::from_internal_string(".gitignore");
|
||||||
let added_path = RepoPath::from_internal_string("added");
|
let added_path = RepoPath::from_internal_string("added");
|
||||||
|
@ -400,13 +400,13 @@ fn test_gitignores(use_git: bool) {
|
||||||
let subdir_modified_path = RepoPath::from_internal_string("dir/modified");
|
let subdir_modified_path = RepoPath::from_internal_string("dir/modified");
|
||||||
let subdir_ignored_path = RepoPath::from_internal_string("dir/ignored");
|
let subdir_ignored_path = RepoPath::from_internal_string("dir/ignored");
|
||||||
|
|
||||||
testutils::write_working_copy_file(workspace_root, &gitignore_path, "ignored\n");
|
testutils::write_working_copy_file(&workspace_root, &gitignore_path, "ignored\n");
|
||||||
testutils::write_working_copy_file(workspace_root, &modified_path, "1");
|
testutils::write_working_copy_file(&workspace_root, &modified_path, "1");
|
||||||
testutils::write_working_copy_file(workspace_root, &removed_path, "1");
|
testutils::write_working_copy_file(&workspace_root, &removed_path, "1");
|
||||||
std::fs::create_dir(workspace_root.join("dir")).unwrap();
|
std::fs::create_dir(workspace_root.join("dir")).unwrap();
|
||||||
testutils::write_working_copy_file(workspace_root, &subdir_modified_path, "1");
|
testutils::write_working_copy_file(&workspace_root, &subdir_modified_path, "1");
|
||||||
|
|
||||||
let mut wc = repo.working_copy();
|
let wc = test_workspace.workspace.working_copy_mut();
|
||||||
let locked_wc = wc.write_tree();
|
let locked_wc = wc.write_tree();
|
||||||
let new_tree_id1 = locked_wc.new_tree_id();
|
let new_tree_id1 = locked_wc.new_tree_id();
|
||||||
locked_wc.discard();
|
locked_wc.discard();
|
||||||
|
@ -426,16 +426,16 @@ fn test_gitignores(use_git: bool) {
|
||||||
);
|
);
|
||||||
|
|
||||||
testutils::write_working_copy_file(
|
testutils::write_working_copy_file(
|
||||||
workspace_root,
|
&workspace_root,
|
||||||
&gitignore_path,
|
&gitignore_path,
|
||||||
"ignored\nmodified\nremoved\n",
|
"ignored\nmodified\nremoved\n",
|
||||||
);
|
);
|
||||||
testutils::write_working_copy_file(workspace_root, &added_path, "2");
|
testutils::write_working_copy_file(&workspace_root, &added_path, "2");
|
||||||
testutils::write_working_copy_file(workspace_root, &modified_path, "2");
|
testutils::write_working_copy_file(&workspace_root, &modified_path, "2");
|
||||||
std::fs::remove_file(removed_path.to_fs_path(workspace_root)).unwrap();
|
std::fs::remove_file(removed_path.to_fs_path(&workspace_root)).unwrap();
|
||||||
testutils::write_working_copy_file(workspace_root, &ignored_path, "2");
|
testutils::write_working_copy_file(&workspace_root, &ignored_path, "2");
|
||||||
testutils::write_working_copy_file(workspace_root, &subdir_modified_path, "2");
|
testutils::write_working_copy_file(&workspace_root, &subdir_modified_path, "2");
|
||||||
testutils::write_working_copy_file(workspace_root, &subdir_ignored_path, "2");
|
testutils::write_working_copy_file(&workspace_root, &subdir_ignored_path, "2");
|
||||||
|
|
||||||
let locked_wc = wc.write_tree();
|
let locked_wc = wc.write_tree();
|
||||||
let new_tree_id2 = locked_wc.new_tree_id();
|
let new_tree_id2 = locked_wc.new_tree_id();
|
||||||
|
@ -464,7 +464,7 @@ fn test_gitignores_checkout_overwrites_ignored(use_git: bool) {
|
||||||
|
|
||||||
let _home_dir = testutils::new_user_home();
|
let _home_dir = testutils::new_user_home();
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
let workspace_root = test_workspace.workspace.workspace_root();
|
let workspace_root = test_workspace.workspace.workspace_root();
|
||||||
|
|
||||||
|
@ -490,7 +490,7 @@ fn test_gitignores_checkout_overwrites_ignored(use_git: bool) {
|
||||||
// Now check out the commit that adds the file "modified" with contents
|
// Now check out the commit that adds the file "modified" with contents
|
||||||
// "contents". The exiting contents ("garbage") should be replaced in the
|
// "contents". The exiting contents ("garbage") should be replaced in the
|
||||||
// working copy.
|
// working copy.
|
||||||
let mut wc = repo.working_copy();
|
let wc = test_workspace.workspace.working_copy_mut();
|
||||||
wc.check_out(commit).unwrap();
|
wc.check_out(commit).unwrap();
|
||||||
|
|
||||||
// Check that the new contents are in the working copy
|
// Check that the new contents are in the working copy
|
||||||
|
@ -522,7 +522,7 @@ fn test_gitignores_ignored_directory_already_tracked(use_git: bool) {
|
||||||
|
|
||||||
let _home_dir = testutils::new_user_home();
|
let _home_dir = testutils::new_user_home();
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
|
|
||||||
// Add a .gitignore file saying to ignore the directory "ignored/"
|
// Add a .gitignore file saying to ignore the directory "ignored/"
|
||||||
|
@ -548,7 +548,7 @@ fn test_gitignores_ignored_directory_already_tracked(use_git: bool) {
|
||||||
let repo = tx.commit();
|
let repo = tx.commit();
|
||||||
|
|
||||||
// Check out the commit with the file in ignored/
|
// Check out the commit with the file in ignored/
|
||||||
let mut wc = repo.working_copy();
|
let wc = test_workspace.workspace.working_copy_mut();
|
||||||
wc.check_out(commit).unwrap();
|
wc.check_out(commit).unwrap();
|
||||||
|
|
||||||
// Check that the file is still in the tree created by committing the working
|
// Check that the file is still in the tree created by committing the working
|
||||||
|
@ -571,22 +571,20 @@ fn test_dotgit_ignored(use_git: bool) {
|
||||||
|
|
||||||
let _home_dir = testutils::new_user_home();
|
let _home_dir = testutils::new_user_home();
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
let workspace_root = test_workspace.workspace.workspace_root();
|
let workspace_root = test_workspace.workspace.workspace_root().clone();
|
||||||
|
|
||||||
let mut wc = repo.working_copy();
|
|
||||||
|
|
||||||
// Test with a .git/ directory (with a file in, since we don't write empty
|
// Test with a .git/ directory (with a file in, since we don't write empty
|
||||||
// trees)
|
// trees)
|
||||||
let dotgit_path = repo.working_copy_path().join(".git");
|
let dotgit_path = repo.working_copy_path().join(".git");
|
||||||
std::fs::create_dir(&dotgit_path).unwrap();
|
std::fs::create_dir(&dotgit_path).unwrap();
|
||||||
testutils::write_working_copy_file(
|
testutils::write_working_copy_file(
|
||||||
workspace_root,
|
&workspace_root,
|
||||||
&RepoPath::from_internal_string(".git/file"),
|
&RepoPath::from_internal_string(".git/file"),
|
||||||
"contents",
|
"contents",
|
||||||
);
|
);
|
||||||
let locked_working_copy = wc.write_tree();
|
let locked_working_copy = test_workspace.workspace.working_copy_mut().write_tree();
|
||||||
let new_tree_id = locked_working_copy.new_tree_id();
|
let new_tree_id = locked_working_copy.new_tree_id();
|
||||||
assert_eq!(new_tree_id, *repo.store().empty_tree_id());
|
assert_eq!(new_tree_id, *repo.store().empty_tree_id());
|
||||||
locked_working_copy.discard();
|
locked_working_copy.discard();
|
||||||
|
@ -594,11 +592,11 @@ fn test_dotgit_ignored(use_git: bool) {
|
||||||
|
|
||||||
// Test with a .git file
|
// Test with a .git file
|
||||||
testutils::write_working_copy_file(
|
testutils::write_working_copy_file(
|
||||||
workspace_root,
|
&workspace_root,
|
||||||
&RepoPath::from_internal_string(".git"),
|
&RepoPath::from_internal_string(".git"),
|
||||||
"contents",
|
"contents",
|
||||||
);
|
);
|
||||||
let locked_working_copy = wc.write_tree();
|
let locked_working_copy = test_workspace.workspace.working_copy_mut().write_tree();
|
||||||
let new_tree_id = locked_working_copy.new_tree_id();
|
let new_tree_id = locked_working_copy.new_tree_id();
|
||||||
assert_eq!(new_tree_id, *repo.store().empty_tree_id());
|
assert_eq!(new_tree_id, *repo.store().empty_tree_id());
|
||||||
locked_working_copy.discard();
|
locked_working_copy.discard();
|
||||||
|
|
|
@ -17,10 +17,10 @@ use std::collections::HashSet;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
use jujutsu_lib::commit_builder::CommitBuilder;
|
use jujutsu_lib::commit_builder::CommitBuilder;
|
||||||
use jujutsu_lib::repo::ReadonlyRepo;
|
|
||||||
use jujutsu_lib::repo_path::RepoPath;
|
use jujutsu_lib::repo_path::RepoPath;
|
||||||
use jujutsu_lib::testutils;
|
use jujutsu_lib::testutils;
|
||||||
use jujutsu_lib::working_copy::CheckoutError;
|
use jujutsu_lib::working_copy::CheckoutError;
|
||||||
|
use jujutsu_lib::workspace::Workspace;
|
||||||
use test_case::test_case;
|
use test_case::test_case;
|
||||||
|
|
||||||
#[test_case(false ; "local backend")]
|
#[test_case(false ; "local backend")]
|
||||||
|
@ -29,28 +29,33 @@ fn test_concurrent_checkout(use_git: bool) {
|
||||||
// Test that we error out if a concurrent checkout is detected (i.e. if the
|
// Test that we error out if a concurrent checkout is detected (i.e. if the
|
||||||
// current checkout changed on disk after we read it).
|
// current checkout changed on disk after we read it).
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace1 = testutils::init_repo(&settings, use_git);
|
||||||
let repo1 = &test_workspace.repo;
|
let repo1 = test_workspace1.repo.clone();
|
||||||
|
let workspace1_root = test_workspace1.workspace.workspace_root().clone();
|
||||||
|
|
||||||
let mut tx1 = repo1.start_transaction("test");
|
let mut tx1 = repo1.start_transaction("test");
|
||||||
let commit1 = testutils::create_random_commit(&settings, repo1)
|
let commit1 = testutils::create_random_commit(&settings, &repo1)
|
||||||
.set_open(true)
|
.set_open(true)
|
||||||
.write_to_repo(tx1.mut_repo());
|
.write_to_repo(tx1.mut_repo());
|
||||||
let commit2 = testutils::create_random_commit(&settings, repo1)
|
let commit2 = testutils::create_random_commit(&settings, &repo1)
|
||||||
.set_open(true)
|
.set_open(true)
|
||||||
.write_to_repo(tx1.mut_repo());
|
.write_to_repo(tx1.mut_repo());
|
||||||
let commit3 = testutils::create_random_commit(&settings, repo1)
|
let commit3 = testutils::create_random_commit(&settings, &repo1)
|
||||||
.set_open(true)
|
.set_open(true)
|
||||||
.write_to_repo(tx1.mut_repo());
|
.write_to_repo(tx1.mut_repo());
|
||||||
tx1.commit();
|
tx1.commit();
|
||||||
|
|
||||||
// Check out commit1
|
// Check out commit1
|
||||||
let mut wc1 = repo1.working_copy();
|
let wc1 = test_workspace1.workspace.working_copy_mut();
|
||||||
wc1.check_out(commit1).unwrap();
|
wc1.check_out(commit1).unwrap();
|
||||||
|
|
||||||
// Check out commit2 from another process (simulated by another repo instance)
|
// Check out commit2 from another process (simulated by another workspace
|
||||||
let repo2 = ReadonlyRepo::load(&settings, repo1.working_copy_path().clone()).unwrap();
|
// instance)
|
||||||
repo2.working_copy().check_out(commit2.clone()).unwrap();
|
let mut workspace2 = Workspace::load(&settings, workspace1_root.clone()).unwrap();
|
||||||
|
workspace2
|
||||||
|
.working_copy_mut()
|
||||||
|
.check_out(commit2.clone())
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
// Checking out another commit (via the first repo instance) should now fail.
|
// Checking out another commit (via the first repo instance) should now fail.
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
@ -59,9 +64,9 @@ fn test_concurrent_checkout(use_git: bool) {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Check that the commit2 is still checked out on disk.
|
// Check that the commit2 is still checked out on disk.
|
||||||
let repo3 = ReadonlyRepo::load(&settings, repo1.working_copy_path().clone()).unwrap();
|
let workspace3 = Workspace::load(&settings, workspace1_root).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
repo3.working_copy().current_tree_id(),
|
workspace3.working_copy().current_tree_id(),
|
||||||
commit2.tree().id().clone()
|
commit2.tree().id().clone()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -72,9 +77,10 @@ fn test_checkout_parallel(use_git: bool) {
|
||||||
// Test that concurrent checkouts by different processes (simulated by using
|
// Test that concurrent checkouts by different processes (simulated by using
|
||||||
// different repo instances) is safe.
|
// different repo instances) is safe.
|
||||||
let settings = testutils::user_settings();
|
let settings = testutils::user_settings();
|
||||||
let test_workspace = testutils::init_repo(&settings, use_git);
|
let mut test_workspace = testutils::init_repo(&settings, use_git);
|
||||||
let repo = &test_workspace.repo;
|
let repo = &test_workspace.repo;
|
||||||
let store = repo.store();
|
let store = repo.store();
|
||||||
|
let workspace_root = test_workspace.workspace.workspace_root().clone();
|
||||||
|
|
||||||
let num_threads = max(num_cpus::get(), 4);
|
let num_threads = max(num_cpus::get(), 4);
|
||||||
let mut tree_ids = HashSet::new();
|
let mut tree_ids = HashSet::new();
|
||||||
|
@ -100,19 +106,26 @@ fn test_checkout_parallel(use_git: bool) {
|
||||||
.set_open(true)
|
.set_open(true)
|
||||||
.write_to_repo(tx.mut_repo());
|
.write_to_repo(tx.mut_repo());
|
||||||
tx.commit();
|
tx.commit();
|
||||||
repo.working_copy().check_out(commit).unwrap();
|
test_workspace
|
||||||
|
.workspace
|
||||||
|
.working_copy_mut()
|
||||||
|
.check_out(commit)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let mut threads = vec![];
|
let mut threads = vec![];
|
||||||
for commit_id in &commit_ids {
|
for commit_id in &commit_ids {
|
||||||
let tree_ids = tree_ids.clone();
|
let tree_ids = tree_ids.clone();
|
||||||
let commit_id = commit_id.clone();
|
let commit_id = commit_id.clone();
|
||||||
let settings = settings.clone();
|
let settings = settings.clone();
|
||||||
let working_copy_path = repo.working_copy_path().clone();
|
let workspace_root = workspace_root.clone();
|
||||||
let handle = thread::spawn(move || {
|
let handle = thread::spawn(move || {
|
||||||
let repo = ReadonlyRepo::load(&settings, working_copy_path).unwrap();
|
let mut workspace = Workspace::load(&settings, workspace_root).unwrap();
|
||||||
let mut wc = repo.working_copy();
|
let commit = workspace
|
||||||
let commit = repo.store().get_commit(&commit_id).unwrap();
|
.repo_loader()
|
||||||
let stats = wc.check_out(commit).unwrap();
|
.store()
|
||||||
|
.get_commit(&commit_id)
|
||||||
|
.unwrap();
|
||||||
|
let stats = workspace.working_copy_mut().check_out(commit).unwrap();
|
||||||
assert_eq!(stats.updated_files, 0);
|
assert_eq!(stats.updated_files, 0);
|
||||||
assert_eq!(stats.added_files, 1);
|
assert_eq!(stats.added_files, 1);
|
||||||
assert_eq!(stats.removed_files, 1);
|
assert_eq!(stats.removed_files, 1);
|
||||||
|
@ -120,7 +133,7 @@ fn test_checkout_parallel(use_git: bool) {
|
||||||
// different tree than the one we just checked out, but since
|
// different tree than the one we just checked out, but since
|
||||||
// write_tree() should take the same lock as check_out(), write_tree()
|
// write_tree() should take the same lock as check_out(), write_tree()
|
||||||
// should never produce a different tree.
|
// should never produce a different tree.
|
||||||
let locked_wc = wc.write_tree();
|
let locked_wc = workspace.working_copy_mut().write_tree();
|
||||||
let new_tree_id = locked_wc.new_tree_id();
|
let new_tree_id = locked_wc.new_tree_id();
|
||||||
locked_wc.discard();
|
locked_wc.discard();
|
||||||
assert!(tree_ids.contains(&new_tree_id));
|
assert!(tree_ids.contains(&new_tree_id));
|
||||||
|
|
Loading…
Reference in a new issue