// // aegis - project change supervisor // Copyright (C) 2004-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 // . // // // expand-modules // // Expand the modules which are specified in the arguments. Returns the // data in Module-expansion responses. Note that the server can assume // that this is checkout or export, not rtag or rdiff; the latter do not // access the working directory and thus have no need to expand modules // on the client side. // // Expand may not be the best word for what this request does. It does // not necessarily tell you all the files contained in a module, // for example. Basically it is a way of telling you which working // directories the server needs to know about in order to handle a // checkout of the specified modules. // // Directory expected: yes. // Response expected: yes. // Root required: yes. // // // For example, suppose that the server has a module defined by // // aliasmodule -a 1dir // // That is, one can check out aliasmodule and it will take 1dir in // the repository and check it out to 1dir in the working directory. // Now suppose the client already has this module checked out and // is planning on using the co request to update it. Without using // expand-modules, the client would have two bad choices: it could // either send information about *all* working directories under the // current directory, which could be unnecessarily slow, or it could be // ignorant of the fact that aliasmodule stands for 1dir, and neglect // to send information for 1dir, which would lead to incorrect operation. // // With expand-modules, the client would first ask for the module to // be expanded: // // C: Root /home/kingdon/zwork/cvsroot // . . . // C: Argument aliasmodule // C: Directory . // C: /home/kingdon/zwork/cvsroot // C: expand-modules // S: Module-expansion 1dir // S: ok // // and then it knows to check the "1dir" directory and send requests // such as Entry and Modified for the files in that directory. // #include // for assert #include #include #include #include #include request_expand_modules::~request_expand_modules() { } request_expand_modules::request_expand_modules() { } void request_expand_modules::run_inner(server_ty *sp, string_ty *) const { size_t j; assert(sp); if (server_root_required(sp, "expand-modules")) return; if (server_directory_required(sp, "expand-modules")) return; // // There should be exactly one argument, and exactly one directory. // We actually ignore the directory. // if (sp->np->argument_count() < 1) { server_error(sp, "expand-modules: at least one Argument required"); return; } for (j = 0; j < sp->np->argument_count(); ++j) { string_ty *aname = sp->np->argument_nth(j); module mp = module::find(aname); if (mp->is_bogus()) { response_error *rp = new response_error ( str_format ( "expand-modules: module \"%s\" unknown", aname->str_text ), str_from_c("ENOENT") ); server_response_queue(sp, rp); return; } // // We don't use the name we were given, we ask the module what // its name is and return that. This will translate Aegis' // project aliases. // server_response_queue ( sp, new response_module_expansion(mp->name()) ); } server_ok(sp); } const char * request_expand_modules::name() const { return "expand-modules"; } bool request_expand_modules::reset() const { return true; }