/* -*- LPC -*- */
#include <creator.h>
inherit "/cmds/base";
#define CMD_NUM 5
mapping globals = ([]);
mapping ret = ([]);
mapping cmds = ([]);
mapping comments = ([ ]);
mapping locks = ([ ]);
mapping completed = ([ ]);
#define TP globals[fd]
#define RET ret[fd]
#define CMDS cmds[this_player()]
#define COMMENT comments[TP]
void ask_about_file(object player);
void get_answer(string answer, object player);
void start_input(object player);
int cmd() {
locks[this_player()] = RCS_HANDLER->query_locks(this_player());
if (sizeof(locks[this_player()]) == 0) {
printf("You don't have any files locked.\n");
map_delete(locks, this_player());
return 1;
}
ask_about_file(this_player());
return 1;
} /* cmd() */
void check_complete(object player) {
if (!completed[player])
call_out("check_complete", 1, player);
else {
map_delete(completed, player);
ask_about_file(player);
}
}
void ask_about_file(object player) {
string tmp;
tmp = sprintf("Check in %s? (y/N/q)\n", locks[player][0]);
tell_object(player, tmp);
input_to("get_answer", 0, player);
} /* ask_about_file() */
void start_input(object player) {
unguarded((:input_to((: get_answer :), 0, $(player)) :));
}
void get_answer(string answer, object player) {
string arg;
string *tmp;
if (answer == "y" || answer == "Y") {
tmp = explode(locks[player][0], "/");
if (file_size("/" + implode(tmp[0 .. <2], "/") + "/RCS/" + tmp[<1] +
",v") > 0)
{
arg = locks[player][0][1 .. ];
tell_object(player, "Enter a comment.\n");
CMDS = arg;
player->do_edit("", "do_ci", this_object(), "", player);
return;
}
else {
arg = sprintf("ERROR: No RCS file for %s\n", locks[player][0]);
tell_object(player, arg);
if (sizeof(locks[player]) > 1) {
locks[player] = locks[player][1 .. ];
ask_about_file(player);
}
else
map_delete(locks, player);
}
}
else if (answer == "q" || answer == "Q") {
map_delete(locks, player);
return;
}
else if (sizeof(locks[player]) > 1) {
locks[player] = locks[player][1 .. ];
ask_about_file(player);
}
else
map_delete(locks, player);
} /* get_answer() */
void do_ci(string comment, object player) {
int fd;
string *cmd = allocate(3);
if (!comment) {
tell_object(player, "No comment given, skipping.\n");
if (sizeof(locks[player]) > 1) {
locks[player] = locks[player][1 .. ];
ask_about_file(player);
}
else
map_delete(locks, player);
}
else {
cmd[0] = "-w" + player->query_name();
cmd[1] = "-u";
cmd[2] = "-m" + comment;
cmd += explode(CMDS, " ");
#ifdef DEBUG
tell_object(player, "CMD: %O\n", cmd);
#endif
fd = external_start(CMD_NUM, cmd, "read_call_back", "write_call_back",
"close_call_back");
TP = player;
RET = "";
COMMENT = comment;
if (sizeof(locks[player]) > 1) {
completed[player] = 0;
tell_object(player, "Checking in... please wait\n");
call_out("check_complete", 1, player);
}
}
} /* do_ci() */
// I _think_ this is the function to write the comment string to the
// ci command
void read_call_back(int fd, mixed mess) {
mess = replace(mess, "/home/atuin/lib", "");
RET += mess;
}
void write_call_back(int fd) {
tell_object(TP, "rcsin: Write_call_back called.\n");
}
void close_call_back(int fd) {
string file;
string *file_stuff;
string *bits;
string log;
string lname;
int i;
object master;
if (RET != "") {
TP->more_string(RET);
file_stuff = explode(RET, "\n");
i = 0;
while (i + 2 < sizeof(file_stuff)) {
if (file_stuff[i + 2] == "done") { /* success! */
sscanf(file_stuff[i], "%*s <-- %s", file);
RCS_HANDLER->remove_lock(TP, file);
if (file[0] == 'w')
lname = "";
else if (file[0] == 'd') {
bits = explode(file, "/");
if (sizeof(bits) >= 2 &&
member_array(bits[1],
"/secure/master"->query_domains()) != -1)
{
master = find_object("/d/" + bits[1] + "/master");
if (!master)
TP->tell_object("No master object for domain: " +
bits[1] + ".\n");
else
lname = master->query_changelog(file);
}
if (!lname)
lname = "/d/" + explode(file, "/")[1] + "/ChangeLog";
}
else
lname = "/log/ChangeLog";
if (lname != "") {
log = TP->fix_string(sprintf(" * %s %s %s\n%s\n",
ctime(time())[4 .. ],
file, TP->query_name(),
COMMENT), 80, 21);
log_file(lname, log);
}
i += 3;
}
else if (sscanf(file_stuff[i], "%*sNo such file or directory"))
++i;
else if (file_stuff[i + 1][0 .. 2] == "ci:")
i += 2;
else
i += 3;
}
}
else
tell_object(TP, "rcsin completed.\n");
if (sizeof(locks[TP]) > 1) {
locks[TP] = locks[TP][1 .. ];
completed[TP] = 1;
}
else {
map_delete(completed, TP);
map_delete(locks, TP);
}
map_delete(comments, TP);
map_delete(ret, fd);
map_delete(globals, fd);
} /* close_call_back() */