diff options
Diffstat (limited to 'contrib/cvs/src/create_adm.c')
-rw-r--r-- | contrib/cvs/src/create_adm.c | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/contrib/cvs/src/create_adm.c b/contrib/cvs/src/create_adm.c index 0ef6e57..c1772b2 100644 --- a/contrib/cvs/src/create_adm.c +++ b/contrib/cvs/src/create_adm.c @@ -3,7 +3,7 @@ * Copyright (c) 1989-1992, Brian Berliner * * You may distribute under the terms of the GNU General Public License as - * specified in the README file that comes with the CVS 1.4 kit. + * specified in the README file that comes with the CVS source distribution. * * Create Administration. * @@ -13,35 +13,41 @@ #include "cvs.h" -/* update_dir includes dir as its last component. */ +/* update_dir includes dir as its last component. -void -Create_Admin (dir, update_dir, repository, tag, date, nonbranch) + Return value is 0 for success, or 1 if we printed a warning message. + Note that many errors are still fatal; particularly for unlikely errors + a fatal error is probably better than a warning which might be missed + or after which CVS might do something non-useful. If WARN is zero, then + don't print warnings; all errors are fatal then. */ + +int +Create_Admin (dir, update_dir, repository, tag, date, nonbranch, warn) char *dir; char *update_dir; char *repository; char *tag; char *date; int nonbranch; + int warn; { FILE *fout; char *cp; + char *reposcopy; char *tmp; #ifdef SERVER_SUPPORT if (trace) { - char *wd = xgetwd (); - fprintf (stderr, "%c-> Create_Admin (%s, %s, %s, %s, %s) in %s\n", + fprintf (stderr, "%c-> Create_Admin (%s, %s, %s, %s, %s, %d, %d)\n", (server_active) ? 'S' : ' ', - dir, update_dir, repository, tag ? tag : "", - date ? date : "", wd); - free (wd); + dir, update_dir, repository, tag ? tag : "", + date ? date : "", nonbranch, warn); } #endif if (noexec) - return; + return 0; tmp = xmalloc (strlen (dir) + 100); if (dir != NULL) @@ -51,7 +57,21 @@ Create_Admin (dir, update_dir, repository, tag, date, nonbranch) if (isfile (tmp)) error (1, 0, "there is a version in %s already", update_dir); - make_directory (tmp); + if (CVS_MKDIR (tmp, 0777) < 0) + { + if (warn) + { + /* The reason that this is a warning, rather than silently + just skipping creating the directory, is that we don't want + CVS's behavior to vary subtly based on factors (like directory + permissions) which are not made clear to the user. With + the warning at least we let them know what is going on. */ + error (0, errno, "warning: cannot make directory %s", tmp); + return 1; + } + else + error (1, errno, "cannot make directory %s", tmp); + } /* record the current cvs root for later use */ @@ -68,8 +88,22 @@ Create_Admin (dir, update_dir, repository, tag, date, nonbranch) else error (1, errno, "cannot open %s/%s", update_dir, CVSADM_REP); } - cp = repository; - strip_trailing_slashes (cp); + reposcopy = xstrdup (repository); + Sanitize_Repository_Name (reposcopy); + + /* The top level of the repository is a special case -- we need to + write it with an extra dot at the end. This trailing `.' stuff + rubs me the wrong way -- on the other hand, I don't want to + spend the time making sure all of the code can handle it if we + don't do it. */ + + if (strcmp (reposcopy, CVSroot_directory) == 0) + { + reposcopy = xrealloc (reposcopy, strlen (reposcopy) + 3); + strcat (reposcopy, "/."); + } + + cp = reposcopy; #ifdef RELATIVE_REPOS /* @@ -81,8 +115,8 @@ Create_Admin (dir, update_dir, repository, tag, date, nonbranch) char *path = xmalloc (strlen (CVSroot_directory) + 10); (void) sprintf (path, "%s/", CVSroot_directory); - if (strncmp (repository, path, strlen (path)) == 0) - cp = repository + strlen (path); + if (strncmp (cp, path, strlen (path)) == 0) + cp += strlen (path); free (path); } #endif @@ -139,5 +173,7 @@ Create_Admin (dir, update_dir, repository, tag, date, nonbranch) } #endif + free (reposcopy); free (tmp); + return 0; } |