# # # patch "cmd_merging.cc" # from [8253dd6a55ffc02d922f4dc21b634802a1ac5a2d] # to [50ed90a707097cc80a682898565937886da2f0c9] # # patch "cmd_netsync.cc" # from [951e1911bb05335819bd88ec2254abc3a7a6b3e2] # to [8bfd914c3727818036e83c65f72cff22cca86222] # # patch "cmd_ws_commit.cc" # from [1ccfaf790bb0726d0c797c230a6c85d67070d7ae] # to [54df19fed3d750a201af7c6274d534b0694b0dec] # # patch "tests/resolve_conflicts_content/update-1" # from [6442c128317eb0b4b8597c8ed25188937c572f1b] # to [bf2839ab5ecb18963df0ed50fa3545ff359b2fac] # # patch "tests/resolve_conflicts_none/update-1" # from [af464efb1d785cb2cf673b32721e1de3c5db91e4] # to [9e140e34be5c104056d061ed65dd2efdf9a56c44] # # patch "tests/update_loses_execute/__driver__.lua" # from [0d7f4a816cfb09b45f2aac8c0af968f95a9fe157] # to [24e8224764ac73b9e7795bb5b520ab1632037575] # # patch "work.cc" # from [766cbbfd5b78c442ed6fc650846daa55f9d42768] # to [c51fba22fdcce8d71385eb0aded4c4df512eb640] # # patch "work.hh" # from [d6167a82e9e8fefa17d892c09af2ed0c78f8ded5] # to [7f17b163136dcf7b5c1640a637433ff7f4ac2cc8] # ============================================================ --- cmd_merging.cc 8253dd6a55ffc02d922f4dc21b634802a1ac5a2d +++ cmd_merging.cc 50ed90a707097cc80a682898565937886da2f0c9 @@ -329,7 +329,7 @@ CMD(update, "update", "", CMD_REF(worksp // Now finally modify the workspace cset update; make_cset(*working_roster, merged_roster, update); - work.perform_content_update(db, update, wca); + work.perform_content_update(*working_roster, merged_roster, update, wca); revision_t remaining; make_revision_for_workspace(chosen_rid, chosen_roster, @@ -839,7 +839,7 @@ CMD(merge_into_workspace, "merge_into_wo make_cset(*left.first, merge_result.roster, update); // small race condition here... - work.perform_content_update(db, update, wca); + work.perform_content_update(*left.first, merge_result.roster, update, wca); work.put_work_rev(merged_rev); work.maybe_update_inodeprints(db); @@ -1333,7 +1333,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac MM(update); make_cset(*working_roster, merged_roster, update); E(!update.empty(), origin::no_fault, F("no changes were applied")); - work.perform_content_update(db, update, wca); + work.perform_content_update(*working_roster, merged_roster, update, wca); P(F("applied changes to workspace")); ============================================================ --- cmd_netsync.cc 951e1911bb05335819bd88ec2254abc3a7a6b3e2 +++ cmd_netsync.cc 8bfd914c3727818036e83c65f72cff22cca86222 @@ -445,7 +445,7 @@ CMD(clone, "clone", "", CMD_REF(network) make_cset(empty_roster, current_roster, checkout); content_merge_checkout_adaptor wca(db); - work.perform_content_update(db, checkout, wca, false); + work.perform_content_update(empty_roster, current_roster, checkout, wca, false); work.maybe_update_inodeprints(db); guard.commit(); ============================================================ --- cmd_ws_commit.cc 1ccfaf790bb0726d0c797c230a6c85d67070d7ae +++ cmd_ws_commit.cc 54df19fed3d750a201af7c6274d534b0694b0dec @@ -697,7 +697,7 @@ CMD(checkout, "checkout", "co", CMD_REF( make_cset(empty_roster, current_roster, checkout); content_merge_checkout_adaptor wca(db); - work.perform_content_update(db, checkout, wca, false); + work.perform_content_update(empty_roster, current_roster, checkout, wca, false); work.maybe_update_inodeprints(db); guard.commit(); @@ -750,7 +750,7 @@ drop_attr(app_state & app, args_vector c make_cset(old_roster, new_roster, cs); content_merge_empty_adaptor empty; - work.perform_content_update(db, cs, empty); + work.perform_content_update(old_roster, new_roster, cs, empty); parent_map parents; work.get_parent_rosters(db, parents); @@ -856,7 +856,7 @@ set_attr(app_state & app, args_vector co make_cset(old_roster, new_roster, cs); content_merge_empty_adaptor empty; - work.perform_content_update(db, cs, empty); + work.perform_content_update(old_roster, new_roster, cs, empty); parent_map parents; work.get_parent_rosters(db, parents); ============================================================ --- tests/resolve_conflicts_content/update-1 6442c128317eb0b4b8597c8ed25188937c572f1b +++ tests/resolve_conflicts_content/update-1 bf2839ab5ecb18963df0ed50fa3545ff359b2fac @@ -2,6 +2,6 @@ mtn: [right] d18cecd65445fa5b10732c6ca8a mtn: selected update target d18cecd65445fa5b10732c6ca8a8bbdac2a6610a mtn: [left] e9d684d80d320d181793766e43a2feb525d254f8 mtn: [right] d18cecd65445fa5b10732c6ca8a8bbdac2a6610a -mtn: modifying files/bar -mtn: modifying files/baz +mtn: updating files/bar +mtn: updating files/baz mtn: updated to base revision d18cecd65445fa5b10732c6ca8a8bbdac2a6610a ============================================================ --- tests/resolve_conflicts_none/update-1 af464efb1d785cb2cf673b32721e1de3c5db91e4 +++ tests/resolve_conflicts_none/update-1 9e140e34be5c104056d061ed65dd2efdf9a56c44 @@ -2,7 +2,7 @@ mtn: [right] 7f38dd536c4f995a4a7ccd788d2 mtn: selected update target 7f38dd536c4f995a4a7ccd788d2b5be2755805cf mtn: [left] 9c1b716d160fd291ed7c68f5b6387cfbf8afb6fb mtn: [right] 7f38dd536c4f995a4a7ccd788d2b5be2755805cf -mtn: modifying bar -mtn: modifying baz -mtn: modifying foo +mtn: updating bar +mtn: updating baz +mtn: updating foo mtn: updated to base revision 7f38dd536c4f995a4a7ccd788d2b5be2755805cf ============================================================ --- tests/update_loses_execute/__driver__.lua 0d7f4a816cfb09b45f2aac8c0af968f95a9fe157 +++ tests/update_loses_execute/__driver__.lua 24e8224764ac73b9e7795bb5b520ab1632037575 @@ -26,7 +26,7 @@ check(mtn("update", "-r", "p:"), 0, fals -- to 0.43 and permissions are now handled through the editable_tree interface. check(mtn("update", "-r", "p:"), 0, false, false) -xfail({"test", "-x","foo"}, 0, false, false) +check({"test", "-x","foo"}, 0, false, false) check(mtn("update"), 0, false, false) -xfail({"test", "-x","foo"}, 0, false, false) +check({"test", "-x","foo"}, 0, false, false) ============================================================ --- work.cc 766cbbfd5b78c442ed6fc650846daa55f9d42768 +++ work.cc c51fba22fdcce8d71385eb0aded4c4df512eb640 @@ -1165,7 +1165,7 @@ editable_working_tree::apply_delta(file_ calculate_ident(pth, curr_id); E(curr_id == old_id, origin::system, F("content of file '%s' has changed, not overwriting") % pth); - P(F("modifying %s") % pth); + P(F("updating %s") % pth); file_data dat; source.get_version(new_id, dat); @@ -1749,18 +1749,19 @@ workspace::perform_pivot_root(database & bool bookkeep_only) { temp_node_id_source nis; - roster_t new_roster; + roster_t old_roster, new_roster; + MM(old_roster); MM(new_roster); - get_current_roster_shape(db, nis, new_roster); + get_current_roster_shape(db, nis, old_roster); - I(new_roster.has_root()); - E(new_roster.has_node(new_root), origin::user, + I(old_roster.has_root()); + E(old_roster.has_node(new_root), origin::user, F("proposed new root directory '%s' is not versioned or does not exist") % new_root); - E(is_dir_t(new_roster.get_node(new_root)), origin::user, + E(is_dir_t(old_roster.get_node(new_root)), origin::user, F("proposed new root directory '%s' is not a directory") % new_root); { - E(!new_roster.has_node(new_root / bookkeeping_root_component), origin::user, + E(!old_roster.has_node(new_root / bookkeeping_root_component), origin::user, F("proposed new root directory '%s' contains illegal path %s") % new_root % bookkeeping_root); } @@ -1770,14 +1771,14 @@ workspace::perform_pivot_root(database & file_path current_path_to_put_old_parent = current_path_to_put_old.dirname(); - E(new_roster.has_node(current_path_to_put_old_parent), origin::user, + E(old_roster.has_node(current_path_to_put_old_parent), origin::user, F("directory '%s' is not versioned or does not exist") % current_path_to_put_old_parent); - E(is_dir_t(new_roster.get_node(current_path_to_put_old_parent)), + E(is_dir_t(old_roster.get_node(current_path_to_put_old_parent)), origin::user, F("'%s' is not a directory") % current_path_to_put_old_parent); - E(!new_roster.has_node(current_path_to_put_old), + E(!old_roster.has_node(current_path_to_put_old), origin::user, F("'%s' is in the way") % current_path_to_put_old); } @@ -1787,6 +1788,7 @@ workspace::perform_pivot_root(database & safe_insert(cs.nodes_renamed, make_pair(new_root, file_path_internal(""))); { + new_roster = old_roster; editable_roster_base e(new_roster, nis); cs.apply_to(e); } @@ -1802,20 +1804,20 @@ workspace::perform_pivot_root(database & if (!bookkeep_only) { content_merge_empty_adaptor cmea; - perform_content_update(db, cs, cmea); + perform_content_update(old_roster, new_roster, cs, cmea); } } void -workspace::perform_content_update(database & db, +workspace::perform_content_update(roster_t const & old_roster, + roster_t const & new_roster, cset const & update, content_merge_adaptor const & ca, bool const messages) { - roster_t roster; + roster_t test_roster; temp_node_id_source nis; set known; - roster_t new_roster; bookkeeping_path detached = path_for_detached_nids(); E(!directory_exists(detached), origin::user, @@ -1823,13 +1825,12 @@ workspace::perform_content_update(databa "you must clean up and remove the %s directory") % detached); - get_current_roster_shape(db, nis, new_roster); - new_roster.extract_path_set(known); + old_roster.extract_path_set(known); - workspace_itemizer itemizer(roster, known, nis); + workspace_itemizer itemizer(test_roster, known, nis); walk_tree(file_path(), itemizer); - simulated_working_tree swt(roster, nis); + simulated_working_tree swt(test_roster, nis); update.apply_to(swt); mkdir_p(detached); @@ -1837,6 +1838,24 @@ workspace::perform_content_update(databa editable_working_tree ewt(*this, this->lua, ca, messages); update.apply_to(ewt); + // attributes on updated files must be reset because apply_delta writes + // new versions of files to _MTN/tmp and then renames them over top of the + // old versions and doesn't reset attributes (mtn:execute). + + for (map >::const_iterator + i = update.deltas_applied.begin(); i != update.deltas_applied.end(); + ++i) + { + node_t node = new_roster.get_node(i->first); + for (attr_map_t::const_iterator a = node->attrs.begin(); + a != node->attrs.end(); ++a) + { + if (a->second.first) + this->lua.hook_set_attribute(a->first(), i->first, + a->second.second()); + } + } + delete_dir_shallow(detached); } ============================================================ --- work.hh d6167a82e9e8fefa17d892c09af2ed0c78f8ded5 +++ work.hh 7f17b163136dcf7b5c1640a637433ff7f4ac2cc8 @@ -151,7 +151,8 @@ public: file_path const & put_old, bool bookkeep_only); - void perform_content_update(database & db, + void perform_content_update(roster_t const & old_roster, + roster_t const & new_roster, cset const & cs, content_merge_adaptor const & ca, bool messages = true);