# # # patch "cmd.hh" # from [644db6cc97abb6bb3b3d4941f23ebb6c4ea3c7b4] # to [ba16e077901c1aafb55d306f3173bfaf95c0ffa9] # # patch "cmd_merging.cc" # from [2ffc506db55287542ea8ecf0adff067e00e4ef89] # to [c6a59d9e24ab56399eb7b12db935bbd0ff956e21] # # patch "cmd_ws_commit.cc" # from [7b5a002cee1999001da225552e6f764ef55f1960] # to [e4f5b0100b3153cc4d5a06cf8285869d92eae2a0] # # patch "commands.cc" # from [761151c7fe666887a6e0b83a2f9a3a7ea4d854fe] # to [a15a57664c8a134a2ba174826d805cd4fc5b848c] # # patch "tests/checkout_does_not_clobber_workspace/__driver__.lua" # from [0e1e6b0578395046eb6c66998c6cd09c55c361f3] # to [6da54aaa4a77b6e624ea745dbdfcdba14cba139d] # # patch "tests/delete_work_file_on_checkout/__driver__.lua" # from [66e951affad4a36e349c7f7633f2b9e2f639840d] # to [50b8a6cb1349cd4d275d0431471b929363c79303] # # patch "tests/merging_(add_a)_with_(add_a,_drop_a)/__driver__.lua" # from [3f4e249683aefc5e4bea43428a972b0d11f5556e] # to [40ff359a25f6c765645a432641b5c3a941c05055] # # patch "tests/multiple_version_committing/__driver__.lua" # from [6dd27e704a0a01fa5fe09e1f08db6b8825d82434] # to [4bb3430ccf9b6ca9d3764aae2373ea8a2cc50784] # # patch "tests/persistent_netsync_server_-_revs_&_certs/__driver__.lua" # from [1ab3a65b825dfaaaba49b2dc363141fd10b6a0c7] # to [ae88e5fbf13f1c3b47befa86b9e0397e9b835f20] # # patch "tests/selecting_arbitrary_certs/__driver__.lua" # from [544b55e39785bae7734b74cfcdeb4048429e7603] # to [7983b55fd4facf13866cec15c72f0791524054c1] # # patch "tests/test_annotate_command/__driver__.lua" # from [34919c677de86ef1b09e43b36d05b6f90abb98ec] # to [46efc71c1e02bc32a0238b3c6e8904be42530422] # # patch "testsuite.lua" # from [5eede3a9b7af96abf4ba26ea5c6f5b9baba62f99] # to [3d725116a2b86466878734b211db0cd208fdb94a] # # patch "work.cc" # from [cf8f95a423c6ba25d545fa216b3a13dbbd7cba48] # to [5305bdc81b311119aaa4dce9398661a39cf95c54] # # patch "work.hh" # from [c1436ab26917e810efa4a53d5f09a97170c159b0] # to [2d45d988d3808a1fdabd443d0e9171ec4762a779] # ============================================================ --- cmd.hh 644db6cc97abb6bb3b3d4941f23ebb6c4ea3c7b4 +++ cmd.hh ba16e077901c1aafb55d306f3173bfaf95c0ffa9 @@ -132,6 +132,11 @@ process_commit_message_args(bool & given app_state & app, utf8 message_prefix = utf8("")); +void +get_content_paths(roster_t const & roster, + std::map & paths); + #define CMD(C, group, params, desc, opts) \ namespace commands { \ struct cmd_ ## C : public command \ ============================================================ --- cmd_merging.cc 2ffc506db55287542ea8ecf0adff067e00e4ef89 +++ cmd_merging.cc c6a59d9e24ab56399eb7b12db935bbd0ff956e21 @@ -71,23 +71,6 @@ three_way_merge(roster_t const & ancesto result); } -static void -get_content_paths(roster_t const & roster, map & paths) -{ - node_map const & nodes = roster.all_nodes(); - for (node_map::const_iterator i = nodes.begin(); i != nodes.end(); ++i) - { - node_t node = roster.get_node(i->first); - if (is_file_t(node)) - { - split_path sp; - roster.get_name(i->first, sp); - file_t file = downcast_to_file_t(node); - paths.insert(make_pair(file->content, file_path(sp))); - } - } -} - CMD(update, N_("workspace"), "", N_("update workspace.\n" "This command modifies your workspace to be based off of a\n" ============================================================ --- cmd_ws_commit.cc 7b5a002cee1999001da225552e6f764ef55f1960 +++ cmd_ws_commit.cc e4f5b0100b3153cc4d5a06cf8285869d92eae2a0 @@ -23,6 +23,7 @@ using std::pair; using std::cout; using std::make_pair; using std::pair; +using std::make_pair; using std::map; using std::set; using std::string; @@ -567,10 +568,14 @@ CMD(checkout, N_("tree"), N_("[DIRECTORY cset checkout; make_cset(*empty_roster, current_roster, checkout); - content_merge_workspace_adaptor wca(app, empty_roster); - app.work.perform_content_update(checkout, wca); + map paths; + get_content_paths(*empty_roster, paths); + content_merge_workspace_adaptor wca(app, empty_roster, paths); + + app.work.perform_content_update(checkout, wca, false); + app.work.update_any_attrs(); app.work.maybe_update_inodeprints(); guard.commit(); ============================================================ --- commands.cc 761151c7fe666887a6e0b83a2f9a3a7ea4d854fe +++ commands.cc a15a57664c8a134a2ba174826d805cd4fc5b848c @@ -26,6 +26,7 @@ using std::cin; #endif using std::cin; +using std::make_pair; using std::map; using std::ostream; using std::pair; @@ -510,6 +511,24 @@ process_commit_message_args(bool & given given = false; } +void +get_content_paths(roster_t const & roster, map & paths) +{ + node_map const & nodes = roster.all_nodes(); + for (node_map::const_iterator i = nodes.begin(); i != nodes.end(); ++i) + { + node_t node = roster.get_node(i->first); + if (is_file_t(node)) + { + split_path sp; + roster.get_name(i->first, sp); + file_t file = downcast_to_file_t(node); + paths.insert(make_pair(file->content, file_path(sp))); + } + } +} + + // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- tests/checkout_does_not_clobber_workspace/__driver__.lua 0e1e6b0578395046eb6c66998c6cd09c55c361f3 +++ tests/checkout_does_not_clobber_workspace/__driver__.lua 6da54aaa4a77b6e624ea745dbdfcdba14cba139d @@ -10,18 +10,16 @@ check(indir("test1", mtn("checkout", "." check(indir("test1", mtn("checkout", "."))) -- checkout to workspace with an unversioned file blocking a versioned file --- still clobbers unversioned file; should not mkdir("test2") writefile("test2/file1", "blocker") -xfail(indir("test2", mtn("checkout", ".")), 1, false, true) -check(samefile("file1", "test2/file1")) +check(indir("test2", mtn("checkout", ".")), 1, false, true) +check(not samefile("file1", "test2/file1")) -- checkout to workspace with an unversioned directory blocking a versioned directory --- uses existing workspace directory; should not mkdir("test3") mkdir("test3/foo") writefile("test3/foo/asdf", "asdf") -xfail(indir("test3", mtn("checkout", ".")), 1, false, true) +check(indir("test3", mtn("checkout", ".")), 1, false, true) check(exists("test3/foo/asdf")) -- checkout to workspace with an unversioned directory blocking a versioned file ============================================================ --- tests/delete_work_file_on_checkout/__driver__.lua 66e951affad4a36e349c7f7633f2b9e2f639840d +++ tests/delete_work_file_on_checkout/__driver__.lua 50b8a6cb1349cd4d275d0431471b929363c79303 @@ -8,5 +8,6 @@ remove("_MTN") addfile("testfile1") check(qgrep("add_file","_MTN/revision")) remove("_MTN") +remove("testfile0") check(mtn("checkout", "--revision", v1, "."), 0, false, false) check(not qgrep("add_file","_MTN/revision")) ============================================================ --- tests/merging_(add_a)_with_(add_a,_drop_a)/__driver__.lua 3f4e249683aefc5e4bea43428a972b0d11f5556e +++ tests/merging_(add_a)_with_(add_a,_drop_a)/__driver__.lua 40ff359a25f6c765645a432641b5c3a941c05055 @@ -66,6 +66,9 @@ remove("_MTN") -- check remove("_MTN") +remove("foo") +remove("iced") +remove("quux") check(mtn("--branch=branch.fork", "checkout", "."), 0, false, true) check(mtn("automate", "get_manifest_of"), 0, true) ============================================================ --- tests/multiple_version_committing/__driver__.lua 6dd27e704a0a01fa5fe09e1f08db6b8825d82434 +++ tests/multiple_version_committing/__driver__.lua 4bb3430ccf9b6ca9d3764aae2373ea8a2cc50784 @@ -22,7 +22,6 @@ for i = 1, 6 do check(mtn("automate", "get_file", fsha[i]), 0, true) canonicalize("stdout") check(samefile("stdout", "testfile")) - remove("_MTN") - check(mtn("checkout", "--revision", rsha[i], "."), 0, true, true) + revert_to(rsha[i]) check(sha1("testfile") == fsha[i]) end ============================================================ --- tests/persistent_netsync_server_-_revs_&_certs/__driver__.lua 1ab3a65b825dfaaaba49b2dc363141fd10b6a0c7 +++ tests/persistent_netsync_server_-_revs_&_certs/__driver__.lua ae88e5fbf13f1c3b47befa86b9e0397e9b835f20 @@ -43,6 +43,7 @@ remove("_MTN") revs[3] = base_revision() remove("_MTN") +remove("testfile") check(mtn2("checkout", "--revision", revs[1], "."), 0, false, false) writefile("testfile", "ptang") check(mtn2("commit", "--branch=testbranch", "--message=foo"), 0, false, false) ============================================================ --- tests/selecting_arbitrary_certs/__driver__.lua 544b55e39785bae7734b74cfcdeb4048429e7603 +++ tests/selecting_arbitrary_certs/__driver__.lua 7983b55fd4facf13866cec15c72f0791524054c1 @@ -37,9 +37,11 @@ remove("_MTN") -- Check that exact value succeed... remove("_MTN") +remove("testfile") check(mtn("co", "--revision=c:testcert=value", "."), 0, false, false) check(samefile("testfile", "testfile2")) remove("_MTN") +remove("testfile") check(mtn("co", "--revision=c:testcert=value=with=equal=signs", "."), 0, false, false) check(samefile("testfile", "testfile1")) ============================================================ --- tests/test_annotate_command/__driver__.lua 34919c677de86ef1b09e43b36d05b6f90abb98ec +++ tests/test_annotate_command/__driver__.lua 46efc71c1e02bc32a0238b3c6e8904be42530422 @@ -91,8 +91,7 @@ revs[6] = base_revision() revs[6] = base_revision() -- Now make right side -remove("_MTN") -check(mtn("co", "--revision", revs[4], "."), 0, false, false) +revert_to(revs[4]) writefile("bar0", "bar\non right side of fork\n") commit() revs[7] = base_revision() ============================================================ --- testsuite.lua 5eede3a9b7af96abf4ba26ea5c6f5b9baba62f99 +++ testsuite.lua 3d725116a2b86466878734b211db0cd208fdb94a @@ -184,7 +184,29 @@ function revert_to(rev, branch, mt) if mt == nil then mt = mtn end remove("_MTN.old") rename("_MTN", "_MTN.old") - + + check(mt("automate", "get_manifest_of", rev), 0, true, false) + rename("stdout", "paths") + + -- remove all of the files and dirs in this + -- manifest to clear the way for checkout + + for path in io.lines("paths") do + len = string.len(path) - 1 + + if (string.match(path, "^ file \"")) then + path = string.sub(path, 10, len) + elseif (string.match(path, "^dir \"")) then + path = string.sub(path, 6, len) + else + path = "" + end + + if (string.len(path) > 0) then + remove(path) + end + end + if branch == nil then check(mt("checkout", "--revision", rev, "."), 0, false, true) else ============================================================ --- work.cc cf8f95a423c6ba25d545fa216b3a13dbbd7cba48 +++ work.cc 5305bdc81b311119aaa4dce9398661a39cf95c54 @@ -447,6 +447,7 @@ struct file_itemizer : public tree_walke virtual void visit_file(file_path const & path); }; + bool file_itemizer::visit_dir(file_path const & path) { @@ -476,15 +477,26 @@ struct workspace_itemizer : public tree_ struct workspace_itemizer : public tree_walker { roster_t & roster; - path_set & known; + path_set const & known; node_id_source & nis; - workspace_itemizer(roster_t & r, path_set & k, node_id_source & n) - : roster(r), known(k), nis(n) {} + workspace_itemizer(roster_t & roster, path_set const & paths, + node_id_source & nis); virtual bool visit_dir(file_path const & path); virtual void visit_file(file_path const & path); }; +workspace_itemizer::workspace_itemizer(roster_t & roster, + path_set const & paths, + node_id_source & nis) + : roster(roster), known(paths), nis(nis) +{ + split_path root_path; + file_path().split(root_path); + node_id root_nid = roster.create_dir_node(nis); + roster.attach_node(root_nid, root_path); +} + bool workspace_itemizer::visit_dir(file_path const & path) { @@ -609,8 +621,10 @@ struct editable_working_tree : public ed struct editable_working_tree : public editable_tree { - editable_working_tree(lua_hooks & lua, content_merge_adaptor const & source) - : lua(lua), source(source), next_nid(1), root_dir_attached(true) + editable_working_tree(lua_hooks & lua, content_merge_adaptor const & source, + bool const messages) + : lua(lua), source(source), next_nid(1), root_dir_attached(true), + messages(messages) {}; virtual node_id detach_node(split_path const & src); @@ -638,12 +652,13 @@ private: node_id next_nid; std::map rename_add_drop_map; bool root_dir_attached; + bool messages; }; struct simulated_working_tree : public editable_tree { - roster_t & roster; + roster_t & workspace; node_id_source & nis; path_set blocked_paths; @@ -651,7 +666,7 @@ struct simulated_working_tree : public e int conflicts; simulated_working_tree(roster_t & r, temp_node_id_source & n) - : roster(r), nis(n), conflicts(0) {} + : workspace(r), nis(n), conflicts(0) {} virtual node_id detach_node(split_path const & src); virtual void drop_detached_node(node_id nid); @@ -792,11 +807,12 @@ editable_working_tree::attach_node(node_ = rename_add_drop_map.find(src_pth); if (i != rename_add_drop_map.end()) { - P(F("renaming %s to %s") % i->second % dst_pth); + if (messages) + P(F("renaming %s to %s") % i->second % dst_pth); safe_erase(rename_add_drop_map, src_pth); } - else - P(F("adding %s") % dst_pth); + else if (messages) + P(F("adding %s") % dst_pth); if (dst_pth == file_path()) { @@ -872,7 +888,7 @@ simulated_working_tree::detach_node(spli node_id simulated_working_tree::detach_node(split_path const & src) { - node_id nid = roster.detach_node(src); + node_id nid = workspace.detach_node(src); nid_map.insert(make_pair(nid, src)); return nid; } @@ -880,7 +896,7 @@ simulated_working_tree::drop_detached_no void simulated_working_tree::drop_detached_node(node_id nid) { - node_t node = roster.get_node(nid); + node_t node = workspace.get_node(nid); if (is_dir_t(node)) { dir_t dir = downcast_to_dir_t(node); @@ -898,21 +914,29 @@ simulated_working_tree::create_dir_node( node_id simulated_working_tree::create_dir_node() { - return roster.create_dir_node(nis); + return workspace.create_dir_node(nis); } node_id simulated_working_tree::create_file_node(file_id const & content) { - return roster.create_file_node(content, nis); + return workspace.create_file_node(content, nis); } void simulated_working_tree::attach_node(node_id nid, split_path const & dst) { - if (roster.has_node(dst)) + // this check is needed for checkout because we're using a roster to + // represent paths that *may* block the checkout. however to represent + // these we *must* have a root node in the roster which will *always* + // block us. so here we check for that case and avoid it. + + if (workspace_root(dst) && workspace.has_root()) + return; + + if (workspace.has_node(dst)) { - W(F("attach blocked by unversioned path '%s'") % dst); + W(F("attach node %d blocked by unversioned path '%s'") % nid % dst); blocked_paths.insert(dst); conflicts++; } @@ -923,10 +947,10 @@ simulated_working_tree::attach_node(node dirname_basename(dst, dirname, basename); if (blocked_paths.find(dirname) == blocked_paths.end()) - roster.attach_node(nid, dst); + workspace.attach_node(nid, dst); else { - W(F("attach blocked by unversioned path '%s'") % dst); + W(F("attach node %d blocked by blocked parent '%s'") % nid % dst); blocked_paths.insert(dst); } } @@ -1537,11 +1561,11 @@ workspace::perform_content_update(cset c void workspace::perform_content_update(cset const & update, - content_merge_adaptor const & ca) + content_merge_adaptor const & ca, + bool const messages) { roster_t roster; temp_node_id_source nis; - split_path root; path_set known; roster_t new_roster; bookkeeping_path detached = path_for_detached_nids(); @@ -1553,10 +1577,6 @@ workspace::perform_content_update(cset c mkdir_p(detached); - file_path().split(root); - node_id nid = roster.create_dir_node(nis); - roster.attach_node(nid, root); - get_current_roster_shape(new_roster, nis); new_roster.extract_path_set(known); @@ -1566,7 +1586,7 @@ workspace::perform_content_update(cset c simulated_working_tree swt(roster, nis); update.apply_to(swt); - editable_working_tree ewt(lua, ca); + editable_working_tree ewt(lua, ca, messages); update.apply_to(ewt); delete_dir_shallow(detached); ============================================================ --- work.hh c1436ab26917e810efa4a53d5f09a97170c159b0 +++ work.hh 2d45d988d3808a1fdabd443d0e9171ec4762a779 @@ -93,7 +93,8 @@ struct workspace bool execute); void perform_content_update(cset const & cs, - content_merge_adaptor const & ca); + content_merge_adaptor const & ca, + bool messages = true); void update_any_attrs();