#include "cvs.h"
int
Create_Admin (const char *dir, const char *update_dir, const char *repository,
const char *tag, const char *date, int nonbranch, int warn,
int dotemplate)
{
FILE *fout;
char *cp;
char *reposcopy;
char *tmp;
TRACE (TRACE_FUNCTION, "Create_Admin (%s, %s, %s, %s, %s, %d, %d, %d)",
dir, update_dir, repository, tag ? tag : "",
date ? date : "", nonbranch, warn, dotemplate);
if (noexec)
return 0;
tmp = Xasprintf ("%s/%s", dir, CVSADM);
if (isfile (tmp))
error (1, 0, "there is a version in %s already", update_dir);
if (CVS_MKDIR (tmp, 0777) < 0)
{
free (tmp);
tmp = NULL;
if (warn)
{
error (0, errno, "warning: cannot make directory %s in %s",
CVSADM, update_dir);
return 1;
}
else
error (1, errno, "cannot make directory %s in %s",
CVSADM, update_dir);
}
else
{
free (tmp);
tmp = NULL;
}
Create_Root (dir, original_parsed_root->original);
if (dir != NULL)
tmp = Xasprintf ("%s/%s", dir, CVSADM_REP);
else
tmp = xstrdup (CVSADM_REP);
fout = CVS_FOPEN (tmp, "w+");
if (fout == NULL)
{
if (update_dir[0] == '\0')
error (1, errno, "cannot open %s", tmp);
else
error (1, errno, "cannot open %s/%s", update_dir, CVSADM_REP);
}
reposcopy = xstrdup (repository);
Sanitize_Repository_Name (reposcopy);
if (strcmp (reposcopy, current_parsed_root->directory) == 0)
{
reposcopy = xrealloc (reposcopy, strlen (reposcopy) + 3);
strcat (reposcopy, "/.");
}
cp = reposcopy;
{
char *path = Xasprintf ("%s/", current_parsed_root->directory);
if (strncmp (cp, path, strlen (path)) == 0)
cp += strlen (path);
free (path);
}
if (fprintf (fout, "%s\n", cp) < 0)
{
if (update_dir[0] == '\0')
error (1, errno, "write to %s failed", tmp);
else
error (1, errno, "write to %s/%s failed", update_dir, CVSADM_REP);
}
if (fclose (fout) == EOF)
{
if (update_dir[0] == '\0')
error (1, errno, "cannot close %s", tmp);
else
error (1, errno, "cannot close %s/%s", update_dir, CVSADM_REP);
}
if (dir != NULL)
(void) sprintf (tmp, "%s/%s", dir, CVSADM_ENT);
else
(void) strcpy (tmp, CVSADM_ENT);
fout = CVS_FOPEN (tmp, "w+");
if (fout == NULL)
{
if (update_dir[0] == '\0')
error (1, errno, "cannot open %s", tmp);
else
error (1, errno, "cannot open %s/%s", update_dir, CVSADM_ENT);
}
if (fclose (fout) == EOF)
{
if (update_dir[0] == '\0')
error (1, errno, "cannot close %s", tmp);
else
error (1, errno, "cannot close %s/%s", update_dir, CVSADM_ENT);
}
WriteTag (dir, tag, date, nonbranch, update_dir, repository);
TRACE (TRACE_FUNCTION, "Create_Admin");
free (reposcopy);
free (tmp);
return 0;
}