// // aegis - project change supervisor // Copyright (C) 2005-2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include #include #include void project_change_walk(project_ty *pp, change_functor &func) { trace(("project_change_walk(pp = %08lX)\n{\n", (long)pp)); time_t earliest = func.earliest(); time_t latest = func.latest(); bool include_branches = func.include_branches(); bool recurse_branches = func.recurse_branches(); bool all_changes = func.all_changes(); if (all_changes || recurse_branches) { // // Walk all change sets // for (size_t j = 0; ; ++j) { long cn = 0; if (!project_change_nth(pp, j, &cn)) break; change::pointer cp = change_alloc(pp, cn); change_bind_existing(cp); time_t when = change_completion_timestamp(cp); if (change_was_a_branch(cp)) { if (include_branches) { if (when >= earliest && when <= latest) func(cp); } if (recurse_branches) { project_ty *sub_pp = pp->bind_branch(change_copy(cp)); project_change_walk(sub_pp, func); project_free(sub_pp); } } else if (all_changes || cp->is_completed()) { if (when >= earliest && when <= latest) { // // Call the functor. // func(cp); } } change_free(cp); } } else { // // Get the changes in integration order. Because this is the // historical order, there is no need to sort once we have the // full set of changes. // for (size_t j = 0; ; ++j) { long cn = 0; long dn = 0; string_list_ty name; if (!project_history_nth(pp, j, &cn, &dn, &name)) break; change::pointer cp = change_alloc(pp, cn); change_bind_existing(cp); time_t when = change_completion_timestamp(cp); if (change_was_a_branch(cp)) { if (include_branches) { if (when >= earliest && when <= latest) func(cp); } if (recurse_branches) { project_ty *sub_pp = pp->bind_branch(change_copy(cp)); project_change_walk(sub_pp, func); project_free(sub_pp); } } else { if (when >= earliest && when <= latest) { // // Call the functor. // func(cp); } } change_free(cp); } } trace(("}\n")); }