// // aegis - project change supervisor // Copyright (C) 2007, 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 ustate_ty * user_ty::ustate_get(project_ty *pp) { trace(("user_ty::ustate_get(this = %08lX, pp = %08lX)\n{\n", (long)this, (long)pp)); lock_sync(); if (!ustate_path) { project_ty *ppp = pp->trunk_get(); nstring pn(project_name_get(ppp)); ustate_path = gonzo_ustate_path(pn, name()); } if (!ustate_data) { gonzo_become(); if (os_exists(ustate_path)) { ustate_data = ustate_read_file(ustate_path); } else { ustate_data = (ustate_ty *)ustate_type.alloc(); ustate_is_new = true; } gonzo_become_undo(); if (!ustate_data->own) { ustate_data->own = (ustate_own_list_ty *)ustate_own_list_type.alloc(); } } trace(("return %08lX;\n", (long)ustate_data)); trace(("}\n")); return ustate_data; } void user_ty::own_add(project_ty *pp, long change_number) { trace(("user_ty::own_add(this = %8.8lX, project_name = \"%s\", " "change_number = %ld)\n{\n", (long)this, project_name_get(pp)->str_text, change_number)); ustate_ty *usp = ustate_get(pp); assert(usp->own); // // See if the project is already known. // ustate_own_ty *own_data = 0; size_t j = 0; for (j = 0; j < usp->own->length; ++j) { own_data = usp->own->list[j]; if (str_equal(own_data->project_name, project_name_get(pp))) break; } // // If the project isn't known, append it to the list. // if (j >= usp->own->length) { meta_type *type_p = 0; ustate_own_ty **own_data_p = (ustate_own_ty **) ustate_own_list_type.list_parse(usp->own, &type_p); assert(type_p == &ustate_own_type); own_data = (ustate_own_ty *)ustate_own_type.alloc(); *own_data_p = own_data; own_data->project_name = str_copy(project_name_get(pp)); } assert(own_data); // // Create a changes for the project, if necessary. // if (!own_data->changes) { own_data->changes = (ustate_own_changes_list_ty *)ustate_own_changes_list_type.alloc(); } // // Add another item to the changes list for the project. // meta_type *type_p = 0; long *change_p = (long int *) ustate_own_changes_list_type.list_parse(own_data->changes, &type_p); assert(type_p == &integer_type); *change_p = change_number; ustate_modified = true; trace(("}\n")); } bool user_ty::own_nth(project_ty *pp, long n, long &change_number) { trace(("user_ty::own_nth(this = %08lX, project_name = \"%s\", " "n = %ld)\n{\n", (long)this, project_name_get(pp)->str_text, n)); assert(n >= 0); if (n < 0) { trace(("return false;\n")); trace(("}\n")); return false; } ustate_ty *usp = ustate_get(pp); assert(usp->own); if (!usp->own) { trace(("return false;\n")); trace(("}\n")); return false; } // // find the relevant project // and extract the n'th change // for (size_t j = 0; j < usp->own->length; ++j) { ustate_own_ty *own_data = usp->own->list[j]; if (str_equal(project_name_get(pp), own_data->project_name)) { bool result = false; if (own_data->changes && n < (long)own_data->changes->length) { change_number = own_data->changes->list[n]; result = true; } trace(("return %d;\n", result)); trace(("}\n")); return result; } } trace(("return false;\n")); trace(("}\n")); return false; } void user_ty::own_remove(project_ty *pp, long change_number) { trace(("user_ty::own_remove(this = %08lX, pp = %08lX, cn = %ld)\n{\n", (long)this, (long)pp, change_number)); ustate_ty *usp = ustate_get(pp); assert(usp->own); // // Search for the project in the "own" list. // ustate_own_ty *own_data = 0; size_t j = 0; for (j = 0;; ++j) { if (j >= usp->own->length) { trace(("}\n")); return; } own_data = usp->own->list[j]; if (str_equal(own_data->project_name, project_name_get(pp))) break; } // // Create the "changes" list for the project, if necessary. // if (!own_data->changes) { own_data->changes = (ustate_own_changes_list_ty *)ustate_own_changes_list_type.alloc(); } // // Search for the change in the "changes" list. // for (size_t k = 0; k < own_data->changes->length; ++k) { if (own_data->changes->list[k] == change_number) { own_data->changes->list[k] = own_data->changes->list[own_data->changes->length - 1]; own_data->changes->length--; ustate_modified = true; break; } } // // If the changes list for the project is now empty, // remove the project from the "own" list. // if (!own_data->changes->length) { ustate_own_type.free(own_data); usp->own->list[j] = usp->own->list[usp->own->length - 1]; usp->own->length--; ustate_modified = true; } trace(("}\n")); }