// // aegis - project change supervisor // Copyright (C) 1999, 2001-2008, 2011, 2012, 2014 Peter Miller // Copyright (C) 2006 Walter Franzini // // 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 #include #include #include #include #include #include #include #include #include #include #include #include #include static void output_reaper(void *p) { output::pointer *opp = (output::pointer *)p; delete opp; } void list_change_files(change_identifier &cid, string_list_ty *) { // // create the columns // col::pointer colp = col::open((string_ty *)0); string_ty *line1 = ( cid.get_cp()->is_trunk() ? str_format ( "Project \"%s\", Trunk", cid.get_pp()->name_get()->str_text ) : str_format ( "Project \"%s\" Change %ld", cid.get_pp()->name_get()->str_text, cid.get_change_number() ) ); colp->title(line1->str_text, "List of Change's Files"); str_free(line1); int left = 0; output::pointer usage_col; output::pointer action_col; output::pointer edit_col; symtab_ty *attr_col_stp = 0; if (!option_terse_get()) { usage_col = colp->create(left, left + USAGE_WIDTH, "Type\n-------"); left += USAGE_WIDTH + 1; action_col = colp->create(left, left + ACTION_WIDTH, "Action\n--------"); left += ACTION_WIDTH + 1; edit_col = colp->create(left, left + EDIT_WIDTH, "Edit\n-------"); left += EDIT_WIDTH + 1; if (option_verbose_get()) { // // Only print the file attributes in the verbose listing. // This is because the number of columns can vary depending // on which changes have which attributes. This is not good // for scripting. // attr_col_stp = new symtab_ty(5); attr_col_stp->set_reap(output_reaper); for (int j = 0;; ++j) { fstate_src_ty *src_data = change_file_nth(cid.get_cp(), j, view_path_first); if (!src_data) break; assert(src_data->file_name); if (src_data->attribute) { for (size_t k = 0; k < src_data->attribute->length; ++k) { attributes_ty *ap = src_data->attribute->list[k]; if (ael_attribute_listable(ap)) { string_ty *lc_name = str_downcase(ap->name); void *p = attr_col_stp->query(lc_name); if (!p) { string_ty *s; output::pointer op; s = ael_build_header(ap->name); op = colp->create ( left, left + ATTR_WIDTH, s->str_text ); str_free(s); attr_col_stp->assign ( lc_name, new output::pointer(op) ); left += ATTR_WIDTH + 1; } str_free(lc_name); } } } } } } output::pointer file_name_col = colp->create(left, 0, "File Name\n-----------"); // // list the change's files // for (int j = 0;; ++j) { fstate_src_ty *src_data = change_file_nth(cid.get_cp(), j, view_path_first); if (!src_data) break; assert(src_data->file_name); fstate_src_ty *psrc_data = 0; if (option_terse_get()) { switch (src_data->action) { case file_action_remove: continue; case file_action_create: case file_action_modify: case file_action_insulate: case file_action_transparent: break; } } else { usage_col->fputs(file_usage_ename(src_data->usage)); action_col->fputs(file_action_ename(src_data->action)); list_format_edit_number(edit_col, src_data); // // We use view_path_none because we want the transparent // files which exist simply to host the locked_by field. // But if the file has been removed, toss it. // psrc_data = cid.get_pp()->file_find(src_data, view_path_none); if (psrc_data && psrc_data->action == file_action_remove) psrc_data = 0; if ( cid.get_cp()->is_being_developed() && // watch out for ael cf -bl (cid.get_cp() != cid.get_pp()->change_get()) && !change_file_up_to_date(cid.get_pp(), src_data) ) { // // The current head revision of the branch may not equal // the version "originally" copied. // if (psrc_data && psrc_data->edit) { assert(psrc_data->edit->revision); edit_col->fprintf ( " (%s)", psrc_data->edit->revision->str_text ); } } if (src_data->edit_origin_new) { // // The "cross branch merge" version. // assert(src_data->edit_origin_new->revision); edit_col->end_of_line(); edit_col->fprintf ( "{cross %4s}", src_data->edit_origin_new->revision->str_text ); } } file_name_col->fputs(src_data->file_name); if ( cid.get_cp()->is_being_developed() && psrc_data && psrc_data->locked_by && psrc_data->locked_by != cid.get_cp()->number_get() ) { file_name_col->end_of_line(); file_name_col->fprintf ( "Locked by change %ld.", magic_zero_decode(psrc_data->locked_by) ); } if (src_data->about_to_be_created_by) { file_name_col->end_of_line(); file_name_col->fprintf ( "About to be created by change %ld.", magic_zero_decode(src_data->about_to_be_created_by) ); } if (src_data->deleted_by) { file_name_col->end_of_line(); file_name_col->fprintf ( "Deleted by change %ld.", magic_zero_decode(src_data->deleted_by) ); } if (src_data->locked_by) { file_name_col->end_of_line(); file_name_col->fprintf ( "Locked by change %ld.", magic_zero_decode(src_data->locked_by) ); } if (src_data->about_to_be_copied_by) { file_name_col->end_of_line(); file_name_col->fprintf ( "About to be copied by change %ld.", magic_zero_decode(src_data->about_to_be_copied_by) ); } if (src_data->move) { switch (src_data->action) { case file_action_create: file_name_col->end_of_line(); file_name_col->fputs("Moved from "); file_name_col->fputs(src_data->move->str_text); break; case file_action_remove: file_name_col->end_of_line(); file_name_col->fputs("Moved to "); file_name_col->fputs(src_data->move->str_text); break; case file_action_modify: case file_action_insulate: case file_action_transparent: assert(0); break; } } if (attr_col_stp && src_data->attribute) { for (size_t k = 0; k < src_data->attribute->length; ++k) { attributes_ty *ap = src_data->attribute->list[k]; if (ap->name && ap->value) { string_ty *lc_name = str_downcase(ap->name); void *vp = attr_col_stp->query(lc_name); if (vp) { output::pointer op = *(output::pointer *)vp; assert(op); if (op) op->fputs(ap->value); } str_free(lc_name); } } } colp->eoln(); } // // clean up and go home // if (attr_col_stp) delete attr_col_stp; trace(("}\n")); } // vim: set ts=8 sw=4 et :