# # # patch "cset.cc" # from [1b8e927062fb4ba517fd3b5ce905dd7a85d0e14f] # to [6ec7af6d52972da09db692725e2ef5b6e7cd128c] # ============================================================ --- cset.cc 1b8e927062fb4ba517fd3b5ce905dd7a85d0e14f +++ cset.cc 6ec7af6d52972da09db692725e2ef5b6e7cd128c @@ -325,6 +325,14 @@ } +static inline void +parse_path(basic_io::parser & parser, split_path & sp) +{ + std::string s; + parser.str(s); + file_path_internal(s).split(sp); +} + void parse_cset(basic_io::parser & parser, cset & cs) @@ -334,86 +342,89 @@ MM(t1); MM(t2); MM(t3); - // prev is used to enforce monotonically increasing filename ordering - string prev; MM(prev); - pair prev_pair; + split_path p1, p2; + MM(p1); + MM(p2); + + split_path prev_path; + MM(prev_path); + pair prev_pair; MM(prev_pair.first); MM(prev_pair.second); - + + // we make use of the fact that a valid split_path is never empty + prev_path.clear(); while (parser.symp(syms::delete_node)) { parser.sym(); - parser.str(t1); - I(prev.empty() || t1 > prev); - prev = t1; - safe_insert(cs.nodes_deleted, internal_string_to_split_path(t1)); + parse_path(parser, p1); + I(prev_path.empty() || p1 > prev_path); + prev_path = p1; + safe_insert(cs.nodes_deleted, p1); } - prev.clear(); + prev_path.clear(); while (parser.symp(syms::rename_node)) { parser.sym(); - parser.str(t1); - I(prev.empty() || t1 > prev); - prev = t1; + parse_path(parser, p1); + I(prev_path.empty() || p1 > prev_path); + prev_path = p1; parser.esym(syms::to); parser.str(t2); - safe_insert(cs.nodes_renamed, make_pair(internal_string_to_split_path(t1), - internal_string_to_split_path(t2))); + parse_path(parser, p2); + safe_insert(cs.nodes_renamed, make_pair(p1, p2)); } - prev.clear(); + prev_path.clear(); while (parser.symp(syms::add_dir)) { parser.sym(); - parser.str(t1); - I(prev.empty() || t1 > prev); - prev = t1; - safe_insert(cs.dirs_added, internal_string_to_split_path(t1)); + parse_path(parser, p1); + I(prev_path.empty() || p1 > prev_path); + prev_path = p1; + safe_insert(cs.dirs_added, p1); } - prev.clear(); + prev_path.clear(); while (parser.symp(syms::add_file)) { parser.sym(); - parser.str(t1); - I(prev.empty() || t1 > prev); - prev = t1; + parse_path(parser, p1); + I(prev_path.empty() || p1 > prev_path); + prev_path = p1; parser.esym(syms::content); - parser.hex(t2); - safe_insert(cs.files_added, make_pair(internal_string_to_split_path(t1), - file_id(t2))); + parser.hex(t1); + safe_insert(cs.files_added, make_pair(p1, file_id(t1))); } - prev.clear(); + prev_path.clear(); while (parser.symp(syms::patch)) { parser.sym(); - parser.str(t1); - I(prev.empty() || t1 > prev); - prev = t1; + parse_path(parser, p1); + I(prev_path.empty() || p1 > prev_path); + prev_path = p1; parser.esym(syms::from); - parser.hex(t2); + parser.hex(t1); parser.esym(syms::to); - parser.hex(t3); + parser.hex(t2); safe_insert(cs.deltas_applied, - make_pair(internal_string_to_split_path(t1), - make_pair(file_id(t2), - file_id(t3)))); + make_pair(p1, make_pair(file_id(t1), file_id(t2)))); } + prev_pair.first.clear(); + prev_pair.second.clear(); while (parser.symp(syms::clear)) { parser.sym(); - parser.str(t1); + parse_path(p1) parser.esym(syms::attr); - parser.str(t2); - pair new_pair(t1, t2); - I(new_pair > prev_pair); + parser.str(t1); + pair prev_pair); prev_pair = new_pair; - safe_insert(cs.attrs_cleared, - make_pair(internal_string_to_split_path(t1), - attr_key(t2))); + safe_insert(cs.attrs_cleared, new_pair); } prev_pair.first.clear(); @@ -421,18 +432,15 @@ while (parser.symp(syms::set)) { parser.sym(); - parser.str(t1); + parse_path(parser, p1); parser.esym(syms::attr); - parser.str(t2); - pair new_pair(t1, t2); - I(new_pair > prev_pair); + parser.str(t1); + pair prev_pair); prev_pair = new_pair; parser.esym(syms::value); - parser.str(t3); - safe_insert(cs.attrs_set, - make_pair(make_pair(internal_string_to_split_path(t1), - attr_key(t2)), - attr_value(t3))); + parser.str(t2); + safe_insert(cs.attrs_set, make_pair(new_pair, attr_value(t2))); } }