//
// aegis - project change supervisor
// Copyright (C) 2006, 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 // for assert
#include
#include
#include
#include
#include
repository_cvs::~repository_cvs()
{
trace(("repository_cvs::~repository_cvs()\n"));
}
repository_cvs::repository_cvs()
{
trace(("repository_cvs::repository_cvs()\n"));
//
// Make sure the necessary environment variables have been set, so
// that we can proceed without user interaction.
//
const char *cp = getenv("CVSROOT");
if (!cp || !*cp)
{
error_raw("the CVSROOT environment variable has not been set");
cp = getenv("CVS_RSH");
if (!cp || !*cp)
{
error_raw
(
"you probably need to set the CVS_RSH environment "
"variable as well"
);
}
exit(1);
}
env_unset("CVSREADONLYFS");
env_unset("CVSREAD");
// env_set("USER", ...name of change's developer);
// env_set("LOGIN", ...name of change's developer);
}
void
repository_cvs::checkout(const nstring &a_mod, const nstring &a_dir)
{
trace(("repository_cvs::checkout(module = %s, directory = %s)\n{\n",
a_mod.quote_c().c_str(), a_dir.quote_c().c_str()));
module = a_mod;
assert(!module.empty());
directory = a_dir;
if (directory.empty())
directory = nstring(os_edit_filename(0));
else if (directory[0] != '/')
directory = os_path_cat(nstring(os_curdir()), directory);
//
// If anything goes wrong from here, remove the checkout directory
// and everything below it.
//
undo_rmdir_bg(directory);
//
// Run the CVS checkout command.
//
nstring command = "cvs checkout -d " + directory.quote_shell() + " "
+ module.quote_shell();
int flags = 0;
os_execute(command, flags, os_dirname_relative(directory));
trace(("}\n"));
}
nstring
repository_cvs::get_directory()
const
{
return directory;
}
void
repository_cvs::remove_file(const nstring &file_name)
{
trace(("repository_cvs::remove_file(file_name = %s)\n{\n",
file_name.quote_c().c_str()));
nstring path = os_path_cat(directory, file_name);
if (os_exists(path))
os_unlink(path);
nstring command = "cvs delete " + path.quote_shell();
int flags = 0;
os_execute(command, flags, directory);
trace(("}\n"));
}
void
repository_cvs::add_file(const nstring &file_name, const nstring &from)
{
trace(("repository_cvs::add_file(file_name = %s, from = %s)\n{\n",
file_name.quote_c().c_str(), from.quote_c().c_str()));
//
// Make sure all the directories exist,
// and cvs add them if they don't.
//
for (const char *cp = file_name.c_str(); *cp; ++cp)
{
if (*cp != '/')
continue;
nstring s1(file_name.c_str(), cp - file_name.c_str());
nstring s2(os_path_cat(directory, s1));
if (!os_exists(s2))
{
trace(("mkdir %s\n", s2.c_str()));
os_mkdir(s2, 0755);
nstring command = "cvs add " + s2.quote_shell();
int flags = 0;
os_execute(command, flags, directory);
}
}
//
// Copy the baseline file into the CVS work area.
//
nstring dest = os_path_cat(directory, file_name);
copy_whole_file(from, dest, false);
//
// Now let CVS know it is supposed to manage this new file.
//
nstring keywords = (is_binary(dest) ? "-kb" : "-ko");
nstring command = "cvs add " + keywords + " " + dest.quote_shell();
int flags = 0;
os_execute(command, flags, directory);
trace(("}\n"));
}
void
repository_cvs::modify_file(const nstring &file_name, const nstring &from)
{
trace(("repository_cvs::modify_file(file_name = %s, from = %s)\n{\n",
file_name.quote_c().c_str(), from.quote_c().c_str()));
//
// Copy the baseline file into the CVS work area.
// No special command lets CVS know it was changed.
//
copy_whole_file(from, os_path_cat(directory, file_name), false);
trace(("}\n"));
}
void
repository_cvs::commit(const nstring &comment)
{
trace(("repository_cvs::commit(comment = %s)\n{\n",
comment.quote_c().c_str()));
//
// Give all of the files to CVS
//
// FIME: how do you set the ,v author field for the checkin? It
// would be nice to use that option to set the developer, rather
// than the project owner.
//
nstring command = "cvs commit -m " + comment.quote_shell();
int flags = 0;
os_execute(command, flags, directory);
//
// Get rid of the work area.
//
os_rmdir_tree(directory);
trace(("}\n"));
}