// // aegis - project change supervisor // Copyright (C) 2001-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 // for assert #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define VERSION_WIDTH 10 static bool is_a_rename_with_uuid(change::pointer cp, fstate_src_ty *src) { if (src->action != file_action_create) return false; if (!src->move) return false; if (!src->uuid) return false; fstate_src_ty *other = change_file_find(cp, src->move, view_path_first); if (!other) return false; if (!other->uuid) return false; return str_equal(src->uuid, other->uuid); } void list_change_file_history(change_identifier &cid, string_list_ty *) { output::pointer usage_col; output::pointer action_col; output::pointer when_col; output::pointer file_name_col; int j; string_ty *line1; output::pointer delta_col; output::pointer change_col; output::pointer description_col; trace(("list_change_file_history()\n{\n")); assert(change_file_nth(cid.get_cp(), 0, view_path_none)); // // Reconstruct the project file history. // time_t when = change_completion_timestamp(cid.get_cp()); project_file_roll_forward historian ( cid.get_pp(), when, option_verbose_get() ); // // create the columns // col::pointer colp = col::open((string_ty *)0); line1 = str_format ( "Project \"%s\" Change %ld", project_name_get(cid.get_pp())->str_text, magic_zero_decode(cid.get_cp()->number) ); colp->title(line1->str_text, "Change File History"); str_free(line1); file_name_col = colp->create(0, 0, "File Name\n-----------"); int left = 2; usage_col = colp->create(left, left + USAGE_WIDTH, 0); left += USAGE_WIDTH + 1; action_col = colp->create(left, left + ACTION_WIDTH, 0); left += ACTION_WIDTH + 1; delta_col = colp->create(left, left + VERSION_WIDTH, "Delta\n---------"); left += VERSION_WIDTH + 1; when_col = colp->create(left, left + WHEN_WIDTH, "Date and Time\n---------------"); left += WHEN_WIDTH + 1; change_col = colp->create(left, left + CHANGE_WIDTH, "Change\n-------"); left += CHANGE_WIDTH + 1; description_col = colp->create(left, 0, "Description\n-------------"); // // list the change's files' histories // for (j = 0;; ++j) { fstate_src_ty *src_data; file_event_list::pointer felp; size_t k; int usage_track; int action_track; src_data = change_file_nth(cid.get_cp(), j, view_path_first); if (!src_data) break; assert(src_data->file_name); colp->need(4); string_ty *file_name_track = 0; usage_track = -1; action_track = -1; felp = historian.get(src_data); if (felp) { for (k = 0; k < felp->size(); ++k) { file_event *fep; string_ty *s; fep = felp->get(k); assert(fep->get_src()); // // See if the file's name changed. // if (!str_equal(file_name_track, fep->get_src()->file_name)) { file_name_col->fputs(fep->get_src()->file_name->str_text); colp->eoln(); file_name_track = fep->get_src()->file_name; } s = change_version_get(fep->get_change()); delta_col->fputs(s->str_text); str_free(s); change_col->fprintf("%4ld", fep->get_change()->number); if (usage_track != fep->get_src()->usage) { usage_col->fputs(file_usage_ename(fep->get_src()->usage)); usage_track = fep->get_src()->usage; action_track = -1; } if (action_track != fep->get_src()->action) { if ( is_a_rename_with_uuid(fep->get_change(), fep->get_src()) ) { action_col->fputs("rename"); action_track = -1; } else { action_col->fputs ( file_action_ename(fep->get_src()->action) ); action_track = fep->get_src()->action; } } time_t when3 = fep->get_when(); when_col->fputs(ctime(&when3)); description_col->fputs ( change_brief_description_get(fep->get_change())->str_text ); colp->eoln(); } } // // Now output details of this change, as the "end" // of the history. // if (!cid.get_cp()->is_completed()) { // // See if the file's name changed. // if (!str_equal(file_name_track, src_data->file_name)) { file_name_col->fputs(src_data->file_name->str_text); colp->eoln(); } delta_col->fputs(change_version_get(cid.get_cp())->str_text); change_col->fprintf("%4ld", cid.get_cp()->number); if (usage_track != src_data->usage) { usage_col->fputs(file_usage_ename(src_data->usage)); action_track = -1; } if (action_track != src_data->action) { if (is_a_rename_with_uuid(cid.get_cp(), src_data)) { action_col->fputs("rename"); } else { action_col->fputs(file_action_ename(src_data->action)); } } description_col->fputs(change_brief_description_get(cid.get_cp())); colp->eoln(); } } trace(("}\n")); }