# # # patch "cmd_list.cc" # from [5a80aa9fb82b10d989597d3b3c1b9177f8725073] # to [98ecd92c6f1b4c9f6ae21cec2a9a445837881101] # # patch "paths.cc" # from [0dc1996f499253e7f5663c528da8ce8e7e8c7d70] # to [b4d40d4343e4b591f3fbffd064a4dec5f7fdd4da] # # patch "paths.hh" # from [88bab6e0937c669fd1f37c3b3963a0079514cf34] # to [42f3e1a7fe8b77c1218504e3f327afd2b3d1b756] # ============================================================ --- cmd_list.cc 5a80aa9fb82b10d989597d3b3c1b9177f8725073 +++ cmd_list.cc 98ecd92c6f1b4c9f6ae21cec2a9a445837881101 @@ -330,6 +330,23 @@ static void } static void +print_paths(path_set const & paths) +{ + vector relative_paths; + + for (path_set::const_iterator i = paths.begin(); i != paths.end(); ++i) + { + relative_paths.push_back(make_relative(*i)); + } + + sort(relative_paths.begin(), relative_paths.end()); + + for (vector::const_iterator sp = relative_paths.begin(); + sp != relative_paths.end(); sp++) + cout << file_path(*sp).as_external() << "\n"; +} + +static void ls_known(app_state & app, vector const & args) { roster_t new_roster; @@ -343,8 +360,7 @@ ls_known(app_state & app, vector c app.opts.depth, new_roster, app); - // to be printed sorted - vector print_paths; + path_set paths; node_map const & nodes = new_roster.all_nodes(); for (node_map::const_iterator i = nodes.begin(); @@ -352,21 +368,15 @@ ls_known(app_state & app, vector c { node_id nid = i->first; - if (!new_roster.is_root(nid) - && mask.includes(new_roster, nid)) + if (mask.includes(new_roster, nid)) { split_path sp; new_roster.get_name(nid, sp); - print_paths.push_back(sp); + paths.insert(sp); } } - sort(print_paths.begin(), print_paths.end()); - for (vector::const_iterator sp = print_paths.begin(); - sp != print_paths.end(); sp++) - { - cout << *sp << "\n"; - } + print_paths(paths); } static void @@ -387,13 +397,9 @@ ls_unknown_or_ignored(app_state & app, b app.work.find_unknown_and_ignored(mask, roots, unknown, ignored); if (want_ignored) - for (path_set::const_iterator i = ignored.begin(); - i != ignored.end(); ++i) - cout << file_path(*i) << "\n"; + print_paths(ignored); else - for (path_set::const_iterator i = unknown.begin(); - i != unknown.end(); ++i) - cout << file_path(*i) << "\n"; + print_paths(unknown); } static void @@ -410,11 +416,7 @@ ls_missing(app_state & app, vector path_set missing; app.work.find_missing(current_roster_shape, mask, missing); - for (path_set::const_iterator i = missing.begin(); - i != missing.end(); ++i) - { - cout << file_path(*i) << "\n"; - } + print_paths(missing); } @@ -441,7 +443,7 @@ ls_changed(app_state & app, vector make_restricted_revision(parents, new_roster, mask, rrev); // to be printed sorted, with duplicates removed - set print_paths; + path_set paths; for (edge_map::const_iterator i = rrev.edges.begin(); i != rrev.edges.end(); i++) @@ -460,16 +462,11 @@ ls_changed(app_state & app, vector old_roster.get_name(*i, sp); else new_roster.get_name(*i, sp); - print_paths.insert(sp); + paths.insert(sp); } } - for (set::const_iterator sp = print_paths.begin(); - sp != print_paths.end(); sp++) - { - cout << *sp << endl; - } - + print_paths(paths); } ============================================================ --- paths.cc 0dc1996f499253e7f5663c528da8ce8e7e8c7d70 +++ paths.cc b4d40d4343e4b591f3fbffd064a4dec5f7fdd4da @@ -411,6 +411,48 @@ split_paths(std::vector const } } +split_path +make_relative(split_path const & sp) +{ + I(initial_rel_path.initialized); + fs::path base = initial_rel_path.get_but_unused(); + file_path fp = file_path_internal(base.string()); + split_path bp; + fp.split(bp); + + split_path relative; + static const path_component dot("."); + static const path_component dotdot(".."); + + relative.push_back(the_null_component); + + split_path::const_iterator i = sp.begin(); + split_path::const_iterator j = bp.begin(); + + while (i != sp.end() && j != bp.end() && *i == *j) + { + i++; + j++; + } + while (j != bp.end()) + { + relative.push_back(dotdot); + j++; + } + + if (relative.size() == 1) + relative.push_back(dot); + + while (i != sp.end()) + { + relative.push_back(*i); + i++; + } + + return relative; +} + + template <> void dump(split_path const & sp, string & out) { ============================================================ --- paths.hh 88bab6e0937c669fd1f37c3b3963a0079514cf34 +++ paths.hh 42f3e1a7fe8b77c1218504e3f327afd2b3d1b756 @@ -279,6 +279,9 @@ internal_string_to_split_path(std::strin void internal_string_to_split_path(std::string const & path, split_path & sp); +split_path +make_relative(split_path const & sp); + // Local Variables: // mode: C++ // fill-column: 76