# # patch "cset.cc" # from [660a3ad508172ce30bed32190af359fa347f0c13] # to [d08253f6ba29d649d6f5dfa2d3798cd741b0716d] # # patch "cset.hh" # from [5b0ab3620c8958cb2d0eb86fae29674ef1ddb52e] # to [35dd18413c314261b8869dae3455958329aeed1d] # # patch "roster4.cc" # from [b4311d375e26d686ea5fa4dd249699914588b6a7] # to [7bbd28a5912b7e855df56cfb0bff32cf5d4715c3] # # patch "roster4.hh" # from [f6640297d9df914997c4e77dfc43353424509b05] # to [3103b059c8adac3b1dd2f1315f33284e8f3c811d] # ======================================================================== --- cset.cc 660a3ad508172ce30bed32190af359fa347f0c13 +++ cset.cc d08253f6ba29d649d6f5dfa2d3798cd741b0716d @@ -1,15 +1,22 @@ // copyright (C) 2005 nathaniel smith // copyright (C) 2005 graydon hoare // all rights reserved. // licensed to the public under the terms of the GNU GPL (>= 2) // see the file COPYING for details +#include "basic_io.hh" #include "cset.hh" #include "sanity.hh" +#include +#include +#include + using std::set; using std::map; using std::pair; +using std::string; +using std::make_pair; struct detach @@ -122,6 +129,18 @@ && attrs_set.empty(); } +void +cset::clear() +{ + nodes_deleted.clear(); + dirs_added.clear(); + files_added.clear(); + nodes_renamed.clear(); + deltas_applied.clear(); + attrs_cleared.clear(); + attrs_set.clear(); +} + void cset::apply_to(editable_tree & t) const { @@ -201,21 +220,183 @@ t.set_attr(i->first.first, i->first.second, i->second); } +//////////////////////////////////////////////////////////////////// +// I/O routines +//////////////////////////////////////////////////////////////////// +namespace +{ + namespace syms + { + // cset symbols + string const delete_node("delete"); + string const rename_node("rename"); + string const content("content"); + string const add_file("add_file"); + string const add_dir("add_dir"); + string const patch("patch"); + string const from("from"); + string const to("to"); + string const clear("clear"); + string const set("set"); + string const attr("attr"); + string const value("value"); + } +} + void print_cset(basic_io::printer & printer, cset const & cs) { - // FIXME: implement - I(false); + for (set::const_iterator i = cs.nodes_deleted.begin(); + i != cs.nodes_deleted.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::delete_node, file_path(*i)); + printer.print_stanza(st); + } + + for (map::const_iterator i = cs.nodes_renamed.begin(); + i != cs.nodes_renamed.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::rename_node, file_path(i->first)); + st.push_file_pair(syms::to, file_path(i->second)); + printer.print_stanza(st); + } + + for (set::const_iterator i = cs.dirs_added.begin(); + i != cs.dirs_added.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::add_dir, file_path(*i)); + printer.print_stanza(st); + } + + for (map::const_iterator i = cs.files_added.begin(); + i != cs.files_added.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::add_file, file_path(i->first)); + st.push_hex_pair(syms::content, i->second.inner()()); + printer.print_stanza(st); + } + + for (map >::const_iterator i = cs.deltas_applied.begin(); + i != cs.deltas_applied.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::patch, file_path(i->first)); + st.push_hex_pair(syms::from, i->second.first.inner()()); + st.push_hex_pair(syms::to, i->second.second.inner()()); + printer.print_stanza(st); + } + + for (set >::const_iterator i = cs.attrs_cleared.begin(); + i != cs.attrs_cleared.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::clear, file_path(i->first)); + st.push_str_pair(syms::attr, i->second()); + printer.print_stanza(st); + } + + for (map, attr_value>::const_iterator i = cs.attrs_set.begin(); + i != cs.attrs_set.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::set, file_path(i->first.first)); + st.push_str_pair(syms::attr, i->first.second()); + st.push_str_pair(syms::value, i->second()); + printer.print_stanza(st); + } } +inline split_path +string_to_path(string const & str) +{ + split_path sp; + file_path_internal(str).split(sp); + return sp; +} + void parse_cset(basic_io::parser & parser, cset & cs) { - // FIXME: implement - I(false); + cs.clear(); + while (parser.symp()) + { + string t1, t2, t3; + if (parser.symp(syms::delete_node)) + { + parser.sym(); + parser.str(t1); + safe_insert(cs.nodes_deleted, string_to_path(t1)); + } + else if (parser.symp(syms::rename_node)) + { + parser.sym(); + parser.str(t1); + parser.esym(syms::to); + parser.str(t2); + safe_insert(cs.nodes_renamed, make_pair(string_to_path(t1), + string_to_path(t2))); + } + else if (parser.symp(syms::add_dir)) + { + parser.sym(); + parser.str(t1); + safe_insert(cs.dirs_added, string_to_path(t1)); + } + else if (parser.symp(syms::add_file)) + { + parser.sym(); + parser.str(t1); + parser.esym(syms::content); + parser.hex(t2); + safe_insert(cs.files_added, make_pair(string_to_path(t1), + file_id(t2))); + } + else if (parser.symp(syms::patch)) + { + parser.sym(); + parser.str(t1); + parser.esym(syms::from); + parser.hex(t2); + parser.esym(syms::to); + parser.hex(t3); + safe_insert(cs.deltas_applied, + make_pair(string_to_path(t1), + make_pair(file_id(t2), + file_id(t3)))); + } + else if (parser.symp(syms::clear)) + { + parser.sym(); + parser.str(t1); + parser.esym(syms::attr); + parser.str(t2); + safe_insert(cs.attrs_cleared, + make_pair(string_to_path(t1), + attr_key(t2))); + } + else if (parser.symp(syms::set)) + { + parser.sym(); + parser.str(t1); + parser.esym(syms::attr); + parser.str(t2); + parser.esym(syms::value); + parser.str(t3); + safe_insert(cs.attrs_set, + make_pair(make_pair(string_to_path(t1), + attr_key(t2)), + attr_value(t3))); + } + else + break; + } } ======================================================================== --- cset.hh 5b0ab3620c8958cb2d0eb86fae29674ef1ddb52e +++ cset.hh 35dd18413c314261b8869dae3455958329aeed1d @@ -15,6 +15,7 @@ #include "numeric_vocab.hh" #include "paths.hh" #include "vocab.hh" +#include "sanity.hh" typedef std::map attr_map_t; @@ -74,6 +75,7 @@ void apply_to(editable_tree & t) const; bool empty() const; + void clear(); }; namespace basic_io { struct printer; struct parser; } @@ -86,4 +88,32 @@ parse_cset(basic_io::parser & parser, cset & cs); + +// Some helpers. + +template +void +safe_erase(T & container, typename T::key_type const & key) +{ + I(container.erase(key)); +} + +template +typename T::iterator +safe_insert(T & container, typename T::value_type const & val) +{ + std::pair r = container.insert(val); + I(r.second); + return r.first; +} + +template +typename T::mapped_type const & +safe_get(T & container, typename T::key_type const & key) +{ + typename T::const_iterator i = container.find(key); + I(i != container.end()); + return i->second; +} + #endif // __CSET_HH__ ======================================================================== --- roster4.cc b4311d375e26d686ea5fa4dd249699914588b6a7 +++ roster4.cc 7bbd28a5912b7e855df56cfb0bff32cf5d4715c3 @@ -34,31 +34,7 @@ /////////////////////////////////////////////////////////////////// -template -void -safe_erase(T & container, typename T::key_type const & key) -{ - I(container.erase(key)); -} -template -typename T::iterator -safe_insert(T & container, typename T::value_type const & val) -{ - std::pair r = container.insert(val); - I(r.second); - return r.first; -} - -template -typename T::mapped_type const & -safe_get(T & container, typename T::key_type const & key) -{ - typename T::const_iterator i = container.find(key); - I(i != container.end()); - return i->second; -} - /////////////////////////////////////////////////////////////////// namespace @@ -1327,26 +1303,14 @@ string const dir("dir"); string const file("file"); string const content("content"); + string const attr("attr"); - // 'local' roster symbols + // 'local' roster and marking symbols string const ident("ident"); string const birth("birth"); string const path_mark("path_mark"); string const content_mark("content_mark"); string const attr_mark("attr_mark"); - - // cset symbols - string const delete_file("delete"); - string const rename_node("rename"); - string const add_file("add_file"); - string const add_dir("add_dir"); - string const patch("patch"); - string const from("from"); - string const to("to"); - string const clear("clear"); - string const set("set"); - string const attr("attr"); - string const value("value"); } } @@ -1384,8 +1348,6 @@ } - - void roster_t::print_to(basic_io::printer & pr, marking_map const & mm, @@ -1438,6 +1400,14 @@ } } +void +roster_t::parse_from(basic_io::parser & pa, + marking_map & mm, + bool parse_local_parts) +{ + // FIXME: implement + I(false); +} ======================================================================== --- roster4.hh f6640297d9df914997c4e77dfc43353424509b05 +++ roster4.hh 3103b059c8adac3b1dd2f1315f33284e8f3c811d @@ -169,6 +169,10 @@ marking_map const & mm, bool print_local_parts) const; + void parse_from(basic_io::parser & pa, + marking_map & mm, + bool parse_local_parts); + private: void check_finite_depth() const; dir_t root_dir;