# # patch "git_export.cc" # from [6d48058e821c6420f85cb1d9f615594f55308f61] # to [9249425b1b39932b7baed6685ba2537bf1a9798a] # # patch "revision.cc" # from [5da47400b94576212afb4a0471753dc9f9d756db] # to [22f2699a53461b5d249b00a27dfafd3b7bca4317] # # patch "revision.hh" # from [7a14bc821a3399957cf44fc6d983eafecf2034cf] # to [b0e792eac3ee0e3c70b8577f38829caa9a72afd9] # ======================================================================== --- git_export.cc 6d48058e821c6420f85cb1d9f615594f55308f61 +++ git_export.cc 9249425b1b39932b7baed6685ba2537bf1a9798a @@ -509,7 +509,7 @@ vector revlist; revlist.clear(); // fill revlist with all the revisions, toposorted set empty; empty.clear(); - toposort(empty, revlist, app); + toposort(empty, revlist, app, topo_any); //reverse(revlist.begin(), revlist.end()); system_path headpath(gitrepo / "refs/heads/mtexport"); ======================================================================== --- revision.cc 5da47400b94576212afb4a0471753dc9f9d756db +++ revision.cc 22f2699a53461b5d249b00a27dfafd3b7bca4317 @@ -732,15 +732,23 @@ } } +static bool +topofilter(list const &revs, revision_id const &rev, + toposort_filter filter) +{ + if (filter == topo_any) + return true; + bool in_revs = (revs.find(rev) != revs.end()); + return (filter == topo_include) ? in_revs : !in_revs; +} + // this function actually toposorts the whole graph, and then filters by the -// passed in set. if anyone ever needs to toposort the whole graph, then, -// this function would be a good thing to generalize... -// -// if @revisions is empty, no filtering is performed +// passed in set (unless filter is set to topo_all). void toposort(std::set const & revisions, std::vector & sorted, - app_state & app) + app_state & app, + toposort_filter filter) { sorted.clear(); typedef std::multimap::iterator gi; @@ -764,7 +772,7 @@ // now stick them in our ordering (if wanted) and remove them from the // graph, calculating the new roots as we go L(F("new root: %s\n") % (roots.front())); - if (revisions.empty() || revisions.find(roots.front()) != revisions.end()) + if (topofilter(revisions, roots.front(), filter)) sorted.push_back(roots.front()); for(gi i = graph.lower_bound(roots.front()); i != graph.upper_bound(roots.front()); i++) @@ -779,7 +787,7 @@ i != leaves.end(); ++i) { L(F("new leaf: %s\n") % (*i)); - if (revisions.empty() || revisions.find(*i) != revisions.end()) + if (topofilter(revisions, *i, filter)) sorted.push_back(*i); } } ======================================================================== --- revision.hh 7a14bc821a3399957cf44fc6d983eafecf2034cf +++ revision.hh b0e792eac3ee0e3c70b8577f38829caa9a72afd9 @@ -139,10 +139,13 @@ revision_id const & descendent, app_state & app); +enum { topo_all, topo_include, topo_exclude } toposort_filter; + void toposort(std::set const & revisions, std::vector & sorted, - app_state & app); + app_state & app, + toposort_filter filter = topo_include); void erase_ancestors(std::set & revisions, app_state & app);