# # patch "commands.cc" # from [ef6e6476c09bdad79aacc4e06559bce106d7f9c4] # to [83e0270a190a283e41cc469ef566b6a8715abacf] # # patch "file_io.cc" # from [d23d71abc9d8347fbeca187af912c290c652476a] # to [11a614b3266a45b699b2fcd8bd8a544df7216fdf] # # patch "file_io.hh" # from [26fcbfa41357c4f16c935aaa6227808f35c292c6] # to [6d4b568f339a9c8fbb429a9f75322e795fedd8c0] # # patch "work.cc" # from [b2fa1d82afee362d21de6e861334cd2424fb3088] # to [53b12eecef51f3b52858f82796a917b775f660f8] # # patch "work.hh" # from [05e6b510752a602e407b64f73da50818837b2689] # to [d5acb63e57d1c10431bf74bfded502517a8ef8a4] # ======================================================================== --- commands.cc ef6e6476c09bdad79aacc4e06559bce106d7f9c4 +++ commands.cc 83e0270a190a283e41cc469ef566b6a8715abacf @@ -2301,23 +2301,22 @@ I(false); } -/* -// FIXME_ROSTERS: disabled until rewritten to use roster CMD(commit, N_("working copy"), N_("[PATH]..."), N_("commit working copy to database"), - OPT_BRANCH_NAME % OPT_MESSAGE % OPT_MSGFILE % OPT_DATE % OPT_AUTHOR % OPT_DEPTH % OPT_EXCLUDE) + OPT_BRANCH_NAME % OPT_MESSAGE % OPT_MSGFILE % OPT_DATE % + OPT_AUTHOR % OPT_DEPTH % OPT_EXCLUDE) { string log_message(""); revision_set rs; revision_id rid; - manifest_map m_old, m_new; + roster_t old_roster, new_roster; app.make_branch_sticky(); app.require_working_copy(); // preserve excluded work for future commmits - change_set::path_rearrangement excluded_work; - calculate_restricted_revision(app, args, rs, m_old, m_new, excluded_work); + cset excluded_work; + get_working_revision_and_rosters(app, args, rs, old_roster, new_roster, excluded_work); calculate_ident(rs, rid); N(!(rs.edges.size() == 0 || @@ -2390,75 +2389,73 @@ edge_map::const_iterator edge = rs.edges.begin(); I(edge != rs.edges.end()); - // process manifest delta or new manifest - if (app.db.manifest_version_exists(rs.new_manifest)) + // process file deltas or new files + cset const & cs = edge_changes(edge); + + for (std::map >::const_iterator i = cs.deltas_applied.begin(); + i != cs.deltas_applied.end(); ++i) { - L(F("skipping manifest %s, already in database\n") % rs.new_manifest); - } - else if (app.db.manifest_version_exists(edge_old_manifest(edge))) - { - L(F("inserting manifest delta %s -> %s\n") - % edge_old_manifest(edge) - % rs.new_manifest); - delta del; - diff(m_old, m_new, del); - dbw.consume_manifest_delta(edge_old_manifest(edge), - rs.new_manifest, - manifest_delta(del)); - } - else - { - L(F("inserting full manifest %s\n") % rs.new_manifest); - manifest_data m_new_data; - write_manifest_map(m_new, m_new_data); - dbw.consume_manifest_data(rs.new_manifest, m_new_data); - } + file_path path(i->first); + file_id old_content = i->second.first; + file_id new_content = i->second.second; - // process file deltas or new files - for (change_set::delta_map::const_iterator i = edge_changes(edge).deltas.begin(); - i != edge_changes(edge).deltas.end(); ++i) - { - if (! delta_entry_src(i).inner()().empty() && - app.db.file_version_exists(delta_entry_dst(i))) + if (app.db.file_version_exists(new_content)) { L(F("skipping file delta %s, already in database\n") % delta_entry_dst(i)); } - else if (! delta_entry_src(i).inner()().empty() && - app.db.file_version_exists(delta_entry_src(i))) + else if (app.db.file_version_exists(old_content)) { L(F("inserting delta %s -> %s\n") - % delta_entry_src(i) % delta_entry_dst(i)); + % old_content % new_content); file_data old_data; data new_data; - app.db.get_file_version(delta_entry_src(i), old_data); - read_localized_data(delta_entry_path(i), new_data, app.lua); + app.db.get_file_version(old_content, old_data); + read_localized_data(path, new_data, app.lua); // sanity check hexenc tid; calculate_ident(new_data, tid); - N(tid == delta_entry_dst(i).inner(), + N(tid == new_content.inner(), F("file '%s' modified during commit, aborting") - % delta_entry_path(i)); + % path); delta del; diff(old_data.inner(), new_data, del); - dbw.consume_file_delta(delta_entry_src(i), - delta_entry_dst(i), + dbw.consume_file_delta(old_content, + new_content, file_delta(del)); } else { - L(F("inserting full version %s\n") % delta_entry_dst(i)); + L(F("inserting full version %s\n") % new_content); data new_data; - read_localized_data(delta_entry_path(i), new_data, app.lua); + read_localized_data(path, new_data, app.lua); // sanity check hexenc tid; calculate_ident(new_data, tid); - N(tid == delta_entry_dst(i).inner(), + N(tid == new_content.inner(), F("file '%s' modified during commit, aborting") - % delta_entry_path(i)); - dbw.consume_file_data(delta_entry_dst(i), file_data(new_data)); + % path); + dbw.consume_file_data(new_content, file_data(new_data)); } } + + for (std::map::const_iterator i = cs.files_added.begin(); + i != cs.files_added.end(); ++i) + { + file_path path(i->first); + file_id new_content = i->second; + + L(F("inserting full version %s\n") % new_content); + data new_data; + read_localized_data(path, new_data, app.lua); + // sanity check + hexenc tid; + calculate_ident(new_data, tid); + N(tid == new_content.inner(), + F("file '%s' modified during commit, aborting") + % path); + dbw.consume_file_data(new_content, file_data(new_data)); + } } revision_data rdat; @@ -2479,7 +2476,7 @@ } // small race condition here... - put_path_rearrangement(excluded_work); + put_work_cset(excluded_work); put_revision_id(rid); P(F("committed revision %s\n") % rid); @@ -2516,8 +2513,8 @@ } ALIAS(ci, commit); -*/ + /* // FIXME_ROSTERS: disabled until rewritten to use rosters static void ======================================================================== --- file_io.cc d23d71abc9d8347fbeca187af912c290c652476a +++ file_io.cc 11a614b3266a45b699b2fcd8bd8a544df7216fdf @@ -481,9 +481,10 @@ if (!fs::exists(entry) || di->string() == "." || di->string() == "..") - ; // ignore - else if (fs::is_directory(entry)) - walk_tree_recursive(entry, rel_entry, walker); + { + // ignore + continue; + } else { file_path p; @@ -497,8 +498,17 @@ W(F("caught runtime error %s constructing file path for %s\n") % c.what() % rel_entry.string()); continue; - } - walker.visit_file(p); + } + if (fs::is_directory(entry)) + { + walker.visit_dir(p); + walk_tree_recursive(entry, rel_entry, walker); + } + else + { + walker.visit_file(p); + } + } } } ======================================================================== --- file_io.hh 26fcbfa41357c4f16c935aaa6227808f35c292c6 +++ file_io.hh 6d4b568f339a9c8fbb429a9f75322e795fedd8c0 @@ -98,6 +98,7 @@ class tree_walker { public: + virtual void visit_dir(file_path const & path) {}; virtual void visit_file(file_path const & path) = 0; virtual ~tree_walker(); }; ======================================================================== --- work.cc b2fa1d82afee362d21de6e861334cd2424fb3088 +++ work.cc 53b12eecef51f3b52858f82796a917b775f660f8 @@ -28,6 +28,12 @@ string const attr_file_name(".mt-attrs"); void +file_itemizer::visit_dir(file_path const & path) +{ + this->visit_file(path); +} + +void file_itemizer::visit_file(file_path const & path) { split_path sp; @@ -55,10 +61,17 @@ editable_roster_base & e) : app(a), ros(r), er(e) {} + virtual void visit_dir(file_path const & path); virtual void visit_file(file_path const & path); }; void +addition_builder::visit_dir(file_path const & path) +{ + this->visit_file(path); +} + +void addition_builder::visit_file(file_path const & path) { if (app.lua.hook_ignore_file(path)) @@ -90,7 +103,7 @@ } break; case path::directory: - er.create_dir_node(); + nid = er.create_dir_node(); break; } @@ -120,6 +133,15 @@ editable_roster_base er(new_roster, nis); work.apply_to(er); + + if (!new_roster.has_root()) + { + split_path root; + root.push_back(the_null_component); + er.attach_node(er.create_dir_node(), root); + } + + I(new_roster.has_root()); addition_builder build(app, new_roster, er); for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) ======================================================================== --- work.hh 05e6b510752a602e407b64f73da50818837b2689 +++ work.hh d5acb63e57d1c10431bf74bfded502517a8ef8a4 @@ -56,7 +56,8 @@ path_set & ignored; file_itemizer(app_state & a, path_set & k, path_set & u, path_set & i) : app(a), known(k), unknown(u), ignored(i) {} - virtual void file_itemizer::visit_file(file_path const & path); + virtual void visit_dir(file_path const & path); + virtual void visit_file(file_path const & path); }; void