void cvs_server_directory(char *data) { CVSENTRIES *entlist; char *dir, *repo, *parent, *entry, *dirn, *p; if (current_cvsroot == NULL) fatal("No Root specified for Directory"); dir = cvs_remote_input(); STRIP_SLASH(dir); if (strlen(dir) < strlen(current_cvsroot->cr_dir)) fatal("cvs_server_directory: bad Directory request"); repo = dir + strlen(current_cvsroot->cr_dir); /* * This is somewhat required for checkout, as the * directory request will be: * * Directory . * /path/to/cvs/root */ if (repo[0] == '\0') p = xstrdup("."); else p = xstrdup(repo + 1); cvs_mkpath(p, NULL); if ((dirn = basename(p)) == NULL) fatal("cvs_server_directory: %s", strerror(errno)); if ((parent = dirname(p)) == NULL) fatal("cvs_server_directory: %s", strerror(errno)); if (strcmp(parent, ".")) { entry = xmalloc(CVS_ENT_MAXLINELEN); cvs_ent_line_str(dirn, NULL, NULL, NULL, NULL, 1, 0, entry, CVS_ENT_MAXLINELEN); entlist = cvs_ent_open(parent); cvs_ent_add(entlist, entry); xfree(entry); } if (server_currentdir != NULL) xfree(server_currentdir); server_currentdir = p; xfree(dir); }
void cvs_add_entry(struct cvs_file *cf) { char *entry; CVSENTRIES *entlist; if (cf->file_type == CVS_DIR) { entry = xmalloc(CVS_ENT_MAXLINELEN); cvs_ent_line_str(cf->file_name, NULL, NULL, NULL, NULL, 1, 0, entry, CVS_ENT_MAXLINELEN); entlist = cvs_ent_open(cf->file_wd); cvs_ent_add(entlist, entry); xfree(entry); } else { add_entry(cf); } }
static void add_entry(struct cvs_file *cf) { FILE *fp; char *entry, path[MAXPATHLEN]; char revbuf[CVS_REV_BUFSZ], tbuf[CVS_TIME_BUFSZ]; char sticky[CVS_ENT_MAXLINELEN]; CVSENTRIES *entlist; if (cvs_noexec == 1) return; sticky[0] = '\0'; entry = xmalloc(CVS_ENT_MAXLINELEN); if (cf->file_status == FILE_REMOVED) { rcsnum_tostr(cf->file_ent->ce_rev, revbuf, sizeof(revbuf)); ctime_r(&cf->file_ent->ce_mtime, tbuf); tbuf[strcspn(tbuf, "\n")] = '\0'; if (cf->file_ent->ce_tag != NULL) (void)xsnprintf(sticky, sizeof(sticky), "T%s", cf->file_ent->ce_tag); /* Remove the '-' prefixing the version number. */ cvs_ent_line_str(cf->file_name, revbuf, tbuf, cf->file_ent->ce_opts ? cf->file_ent->ce_opts : "", sticky, 0, 0, entry, CVS_ENT_MAXLINELEN); } else { if (logmsg != NULL) { (void)xsnprintf(path, MAXPATHLEN, "%s/%s/%s%s", cf->file_wd, CVS_PATH_CVSDIR, cf->file_name, CVS_DESCR_FILE_EXT); if ((fp = fopen(path, "w+")) == NULL) fatal("add_entry: fopen `%s': %s", path, strerror(errno)); if (fputs(logmsg, fp) == EOF) { (void)unlink(path); fatal("add_entry: fputs `%s': %s", path, strerror(errno)); } (void)fclose(fp); } if (cvs_directory_tag != NULL) (void)xsnprintf(sticky, sizeof(sticky), "T%s", cvs_directory_tag); tbuf[0] = '\0'; if (!cvs_server_active) (void)xsnprintf(tbuf, sizeof(tbuf), "Initial %s", cf->file_name); cvs_ent_line_str(cf->file_name, "0", tbuf, kflag ? kbuf : "", sticky, 0, 0, entry, CVS_ENT_MAXLINELEN); } if (cvs_server_active) { cvs_server_send_response("Checked-in %s/", cf->file_wd); cvs_server_send_response("%s", cf->file_path); cvs_server_send_response("%s", entry); } else { entlist = cvs_ent_open(cf->file_wd); cvs_ent_add(entlist, entry); } xfree(entry); }
static void add_directory(struct cvs_file *cf) { int added, nb; struct stat st; CVSENTRIES *entlist; char *date, entry[MAXPATHLEN], msg[1024], repo[MAXPATHLEN], *tag, *p; struct file_info_list files_info; struct file_info *fi; struct trigger_list *line_list; cvs_log(LP_TRACE, "add_directory(%s)", cf->file_path); (void)xsnprintf(entry, MAXPATHLEN, "%s%s", cf->file_rpath, RCS_FILE_EXT); added = 1; if (stat(entry, &st) != -1) { cvs_log(LP_NOTICE, "cannot add directory %s: " "a file with that name already exists", cf->file_path); added = 0; } else { /* Let's see if we have any per-directory tags first. */ cvs_parse_tagfile(cf->file_wd, &tag, &date, &nb); (void)xsnprintf(entry, MAXPATHLEN, "%s/%s", cf->file_path, CVS_PATH_CVSDIR); if (cvs_server_active) { if (mkdir(cf->file_rpath, 0755) == -1 && errno != EEXIST) fatal("add_directory: %s: %s", cf->file_rpath, strerror(errno)); } else if (stat(entry, &st) != -1) { if (!S_ISDIR(st.st_mode)) { cvs_log(LP_ERR, "%s exists but is not " "directory", entry); } else { cvs_log(LP_NOTICE, "%s already exists", entry); } added = 0; } else if (cvs_noexec != 1) { if (mkdir(cf->file_rpath, 0755) == -1 && errno != EEXIST) fatal("add_directory: %s: %s", cf->file_rpath, strerror(errno)); cvs_get_repository_name(cf->file_wd, repo, MAXPATHLEN); (void)xsnprintf(entry, MAXPATHLEN, "%s/%s", repo, cf->file_name); cvs_mkadmin(cf->file_path, current_cvsroot->cr_dir, entry, tag, date); p = xmalloc(CVS_ENT_MAXLINELEN); cvs_ent_line_str(cf->file_name, NULL, NULL, NULL, NULL, 1, 0, p, CVS_ENT_MAXLINELEN); entlist = cvs_ent_open(cf->file_wd); cvs_ent_add(entlist, p); xfree(p); } } if (added == 1 && current_cvsroot->cr_method == CVS_METHOD_LOCAL) { (void)xsnprintf(msg, sizeof(msg), "Directory %s added to the repository", cf->file_rpath); if (tag != NULL) { (void)strlcat(msg, "\n--> Using per-directory sticky tag ", sizeof(msg)); (void)strlcat(msg, tag, sizeof(msg)); } if (date != NULL) { (void)strlcat(msg, "\n--> Using per-directory sticky date ", sizeof(msg)); (void)strlcat(msg, date, sizeof(msg)); } cvs_printf("%s\n", msg); if (tag != NULL) xfree(tag); if (date != NULL) xfree(date); cvs_get_repository_name(cf->file_path, repo, MAXPATHLEN); line_list = cvs_trigger_getlines(CVS_PATH_LOGINFO, repo); if (line_list != NULL) { TAILQ_INIT(&files_info); fi = xcalloc(1, sizeof(*fi)); fi->file_path = xstrdup(cf->file_path); TAILQ_INSERT_TAIL(&files_info, fi, flist); cvs_add_loginfo(repo); cvs_trigger_handle(CVS_TRIGGER_LOGINFO, repo, loginfo, line_list, &files_info); cvs_trigger_freeinfo(&files_info); cvs_trigger_freelist(line_list); if (loginfo != NULL) xfree(loginfo); } } cf->file_status = FILE_SKIP; }