cvs-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Cvs-cvs] ccvs/src ChangeLog Makefile.in add.c base.c che...


From: Derek Robert Price
Subject: [Cvs-cvs] ccvs/src ChangeLog Makefile.in add.c base.c che...
Date: Sat, 25 Aug 2007 03:18:00 +0000

CVSROOT:        /cvsroot/cvs
Module name:    ccvs
Changes by:     Derek Robert Price <dprice>     07/08/25 03:18:00

Modified files:
        src            : ChangeLog Makefile.in add.c base.c checkin.c 
                         checkout.c client.c commit.c create_adm.c 
                         edit.c fileattr.c filesubr.c import.c lock.c 
                         ls.c mkmodules.c modules.c sanity.sh subr.c 
                         subr.h update.c 

Log message:
        Simplify code using new GNULIB modules.
        * add.c (add_directory), base.c (base_checkout), checkin.c (Checkin),
        checkout.c (emptydir_name, build_dirs_and_chdir), client.c
        (call_in_directory, update_entries), commit.c (checkaddfile),
        create_adm.c (Create_Admin), edit.c (edit_file, edit_fileproc),
        fileattr.c (fileattr_write), import.c (import, process_import_file,
        import_descend_dir), lock.c (lock_name), ls.c (ls_direntproc),
        mkmodules.c (init), modules.c (my_modules), update.c
        (update_dirent_proc): Replace directory access with new functions.
        * file_subr.c (make_directory, make_directories, mkdir_if_needed):
        Remove in favor of...
        * subr.c (mkdir_i, cvs_mkdir_i, cvs_mkdir, cvs_xmkdir,
        mkdir_callback, mkdir_announce_callback, cvs_mkdirs_i, cvs_mkdirs,
        cvs_xmkdirs): ...these new functions.
        * subr.h (cvs_mkdir, cvs_xmkdir, cvs_mkdirs, cvs_xmkdirs): New
        prototypes.
        * sanity.sh (abspath-4, toplevel-12): Compensate for the above.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/ChangeLog?cvsroot=cvs&r1=1.3522&r2=1.3523
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/Makefile.in?cvsroot=cvs&r1=1.188&r2=1.189
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/add.c?cvsroot=cvs&r1=1.130&r2=1.131
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/base.c?cvsroot=cvs&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/checkin.c?cvsroot=cvs&r1=1.59&r2=1.60
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/checkout.c?cvsroot=cvs&r1=1.148&r2=1.149
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/client.c?cvsroot=cvs&r1=1.462&r2=1.463
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/commit.c?cvsroot=cvs&r1=1.271&r2=1.272
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/create_adm.c?cvsroot=cvs&r1=1.53&r2=1.54
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/edit.c?cvsroot=cvs&r1=1.95&r2=1.96
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/fileattr.c?cvsroot=cvs&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/filesubr.c?cvsroot=cvs&r1=1.111&r2=1.112
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/import.c?cvsroot=cvs&r1=1.182&r2=1.183
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/lock.c?cvsroot=cvs&r1=1.121&r2=1.122
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/ls.c?cvsroot=cvs&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/mkmodules.c?cvsroot=cvs&r1=1.101&r2=1.102
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/modules.c?cvsroot=cvs&r1=1.100&r2=1.101
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/sanity.sh?cvsroot=cvs&r1=1.1184&r2=1.1185
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/subr.c?cvsroot=cvs&r1=1.157&r2=1.158
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/subr.h?cvsroot=cvs&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/ccvs/src/update.c?cvsroot=cvs&r1=1.268&r2=1.269

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/ChangeLog,v
retrieving revision 1.3522
retrieving revision 1.3523
diff -u -b -r1.3522 -r1.3523
--- ChangeLog   22 Aug 2007 20:58:14 -0000      1.3522
+++ ChangeLog   25 Aug 2007 03:17:57 -0000      1.3523
@@ -1,3 +1,23 @@
+2007-08-24  Derek Price  <address@hidden>
+
+       Simplify code using new GNULIB modules.
+       * add.c (add_directory), base.c (base_checkout), checkin.c (Checkin),
+       checkout.c (emptydir_name, build_dirs_and_chdir), client.c
+       (call_in_directory, update_entries), commit.c (checkaddfile),
+       create_adm.c (Create_Admin), edit.c (edit_file, edit_fileproc),
+       fileattr.c (fileattr_write), import.c (import, process_import_file,
+       import_descend_dir), lock.c (lock_name), ls.c (ls_direntproc),
+       mkmodules.c (init), modules.c (my_modules), update.c
+       (update_dirent_proc): Replace directory access with new functions.
+       * file_subr.c (make_directory, make_directories, mkdir_if_needed):
+       Remove in favor of...
+       * subr.c (mkdir_i, cvs_mkdir_i, cvs_mkdir, cvs_xmkdir,
+       mkdir_callback, mkdir_announce_callback, cvs_mkdirs_i, cvs_mkdirs,
+       cvs_xmkdirs): ...these new functions.
+       * subr.h (cvs_mkdir, cvs_xmkdir, cvs_mkdirs, cvs_xmkdirs): New
+       prototypes.
+       * sanity.sh (abspath-4, toplevel-12): Compensate for the above.
+
 2007-08-22  Derek Price  <address@hidden>
 
        * server.c (serve_init): Remove unnecessary argument to printf style

Index: Makefile.in
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/Makefile.in,v
retrieving revision 1.188
retrieving revision 1.189
diff -u -b -r1.188 -r1.189
--- Makefile.in 23 Aug 2007 21:39:08 -0000      1.188
+++ Makefile.in 25 Aug 2007 03:17:57 -0000      1.189
@@ -96,8 +96,9 @@
        $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
        $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
        $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
-       $(top_srcdir)/m4/lchown.m4 $(top_srcdir)/m4/lib-ld.m4 \
-       $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+       $(top_srcdir)/m4/lchmod.m4 $(top_srcdir)/m4/lchown.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 \
        $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/longlong.m4 \
        $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
        $(top_srcdir)/m4/malloca.m4 $(top_srcdir)/m4/mbchar.m4 \
@@ -106,15 +107,17 @@
        $(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/md5.m4 \
        $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/memmove.m4 \
        $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
-       $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir-slash.m4 \
+       $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkancesdirs.m4 \
+       $(top_srcdir)/m4/mkdir-p.m4 $(top_srcdir)/m4/mkdir-slash.m4 \
        $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/mktime.m4 \
        $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netinet_in_h.m4 \
        $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/openat.m4 \
        $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/po.m4 \
-       $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quotearg.m4 \
-       $(top_srcdir)/m4/readlink.m4 $(top_srcdir)/m4/regex.m4 \
-       $(top_srcdir)/m4/rename.m4 $(top_srcdir)/m4/rpmatch.m4 \
-       $(top_srcdir)/m4/save-cwd.m4 $(top_srcdir)/m4/setenv.m4 \
+       $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quote.m4 \
+       $(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
+       $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rename.m4 \
+       $(top_srcdir)/m4/rpmatch.m4 $(top_srcdir)/m4/save-cwd.m4 \
+       $(top_srcdir)/m4/savewd.m4 $(top_srcdir)/m4/setenv.m4 \
        $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
        $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
        $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stdbool.m4 \

Index: add.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/add.c,v
retrieving revision 1.130
retrieving revision 1.131
diff -u -b -r1.130 -r1.131
--- add.c       22 Aug 2007 19:56:36 -0000      1.130
+++ add.c       25 Aug 2007 03:17:57 -0000      1.131
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (c) 1992, Brian Berliner and Jeff Polk
@@ -818,7 +819,6 @@
 
     if (!isdir (rcsdir))
     {
-       mode_t omask;
        Node *p;
        List *ulist;
        struct logfile_info *li;
@@ -831,17 +831,8 @@
           directories would be to have to add and commit directories
           like for files.  The code was #if 0'd at least since CVS 1.5.  */
 
-       if (!noexec)
-       {
-           omask = umask (cvsumask);
-           if (CVS_MKDIR (rcsdir, 0777) < 0)
-           {
-               error (0, errno, "cannot mkdir %s", rcsdir);
-               (void) umask (omask);
+       if (!noexec && !cvs_mkdir (rcsdir, NULL, MD_REPO) && errno != EEXIST)
                goto out;
-           }
-           (void) umask (omask);
-       }
 
        /* Now set the default file attributes to the ones we inherited
           from the parent directory.  */

Index: base.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/base.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- base.c      12 Aug 2006 17:16:01 -0000      1.5
+++ base.c      25 Aug 2007 03:17:57 -0000      1.6
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 2005-2007 The Free Software Foundation, Inc.
  *
  * 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
@@ -262,7 +262,7 @@
     if (noexec)
        return 0;
 
-    mkdir_if_needed (CVSADM_BASE);
+    cvs_xmkdir (CVSADM_BASE, NULL, MD_EXIST_OK);
 
     assert (!current_parsed_root->isremote);
 

Index: checkin.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/checkin.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- checkin.c   30 May 2007 23:20:42 -0000      1.59
+++ checkin.c   25 Aug 2007 03:17:57 -0000      1.60
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -121,7 +122,7 @@
            {
                /* Still need to update the base file.  */
                char *basefile;
-               mkdir_if_needed (CVSADM_BASE);
+               cvs_xmkdir (CVSADM_BASE, NULL, MD_EXIST_OK);
                basefile = make_base_file_name (finfo->file, vers->vn_rcs);
                copy_file (finfo->file, basefile);
                free (basefile);

Index: checkout.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/checkout.c,v
retrieving revision 1.148
retrieving revision 1.149
diff -u -b -r1.148 -r1.149
--- checkout.c  30 May 2007 23:20:43 -0000      1.148
+++ checkout.c  25 Aug 2007 03:17:57 -0000      1.149
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -1160,14 +1161,8 @@
 
     repository = Xasprintf ("%s/%s/%s", current_parsed_root->directory,
                            CVSROOTADM, CVSNULLREPOS);
-    if (!isfile (repository))
-    {
-       mode_t omask;
-       omask = umask (cvsumask);
-       if (CVS_MKDIR (repository, 0777) < 0)
-           error (1, errno, "cannot create %s", repository);
-       (void) umask (omask);
-    }
+    if (!isdir (repository))
+       cvs_xmkdir (repository, NULL, MD_REPO);
     return repository;
 }
 
@@ -1209,7 +1204,7 @@
 
        if (*dir)
        {
-           made_dir = !mkdir_if_needed (dir);
+           made_dir = cvs_xmkdir (dir, NULL, MD_EXIST_OK);
            if (made_dir) Subdir_Register (NULL, NULL, dir);
        }
        else

Index: client.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/client.c,v
retrieving revision 1.462
retrieving revision 1.463
diff -u -b -r1.462 -r1.463
--- client.c    19 Jun 2007 03:09:23 -0000      1.462
+++ client.c    25 Aug 2007 03:17:58 -0000      1.463
@@ -1,5 +1,5 @@
 /* 
- * Copyright (C) 2006 The Free Software Foundation, Inc.
+ * Copyright (C) 2007 The Free Software Foundation, Inc.
  *
  * 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
@@ -952,7 +952,7 @@
                error (1, 0, "rename the directory and try again");
            }
 
-           if (mkdir_if_needed (dir))
+           if (!cvs_xmkdir (dir, NULL, MD_EXIST_OK))
            {
                /* It already existed, fine.  Just keep going.  */
            }
@@ -1914,7 +1914,7 @@
            /* A real checkin.  */
            char *basefile = make_base_file_name (filename, vn);
 
-           mkdir_if_needed (CVSADM_BASE);
+           cvs_xmkdir (CVSADM_BASE, NULL, MD_EXIST_OK);
            copy_file (filename, basefile);
 
            if ((n = findnode_fn (sig_cache, short_pathname)))
@@ -2387,7 +2387,7 @@
        bool verify = get_verify_checkouts (true);
 
        if (!*istemp)
-           mkdir_if_needed (CVSADM_BASE);
+           cvs_xmkdir (CVSADM_BASE, NULL, MD_EXIST_OK);
        e = xfopen (basefile, bin ? FOPEN_BINARY_WRITE : "w");
        if (fwrite (buf, sizeof *buf, size, e) != size)
            error (1, errno, "cannot write `%s'", fullbase);

Index: commit.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/commit.c,v
retrieving revision 1.271
retrieving revision 1.272
diff -u -b -r1.271 -r1.272
--- commit.c    30 May 2007 23:20:43 -0000      1.271
+++ commit.c    25 Aug 2007 03:17:58 -0000      1.272
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -2096,23 +2097,16 @@
 
        if (adding_on_branch)
        {
-           mode_t omask;
            rcsname = xmalloc (strlen (repository)
                               + sizeof (CVSATTIC)
                               + strlen (file)
                               + sizeof (RCSEXT)
                               + 3);
-           (void) sprintf (rcsname, "%s/%s", repository, CVSATTIC);
-           omask = umask (cvsumask);
-           if (CVS_MKDIR (rcsname, 0777) != 0 && errno != EEXIST)
-               error (1, errno, "cannot make directory `%s'", rcsname);
-           (void) umask (omask);
-           (void) sprintf (rcsname,
-                           "%s/%s/%s%s",
-                           repository,
-                           CVSATTIC,
-                           file,
-                           RCSEXT);
+           sprintf (rcsname, "%s/%s", repository, CVSATTIC);
+           if (!isdir (rcsname))
+               cvs_xmkdir (rcsname, NULL, MD_REPO);
+           sprintf (rcsname, "%s/%s/%s%s",
+                    repository, CVSATTIC, file, RCSEXT);
        }
        else
            rcsname = Xasprintf ("%s/%s%s", repository, file, RCSEXT);

Index: create_adm.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/create_adm.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- create_adm.c        24 Apr 2006 18:50:26 -0000      1.53
+++ create_adm.c        25 Aug 2007 03:17:58 -0000      1.54
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -44,6 +45,7 @@
     char *cp;
     char *reposcopy;
     char *tmp;
+    bool ud;
 
     TRACE (TRACE_FUNCTION, "Create_Admin (%s, %s, %s, %s, %s, %d, %d, %d)",
           dir, update_dir, repository, tag ? tag : "",
@@ -52,41 +54,22 @@
     if (noexec)
        return 0;
 
-    tmp = Xasprintf ("%s/%s", dir, CVSADM);
+    /* A leading "./" looks bad in error messages.  */
+    ud = strcmp (dir, ".");
+    tmp = Xasprintf ("%s%s%s", ud ? dir : "", ud ? "/" : "", CVSADM);
     if (isfile (tmp))
        error (1, 0, "there is a version in %s already", update_dir);
 
-    if (CVS_MKDIR (tmp, 0777) < 0)
+    if (!cvs_mkdir (tmp, update_dir, warn ? 0 : MD_FATAL))
     {
        free (tmp);
        tmp = NULL;
-
-       /* We want to print out the entire update_dir, since a lot of
-          our code calls this function with dir == "." or dir ==
-          NULL.  I hope that gives enough information in cases like
-          absolute pathnames; printing out xgetcwd() or something would
-          be way too verbose in the common cases.  */
-
-       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 in %s",
-                  CVSADM, update_dir);
            return 1;
        }
-       else
-           error (1, errno, "cannot make directory %s in %s",
-                  CVSADM, update_dir);
-    }
-    else
-    {
+    /* else */
+
        free (tmp);
        tmp = NULL;
-    }
 
     /* record the current cvs root for later use */
 

Index: edit.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/edit.c,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -b -r1.95 -r1.96
--- edit.c      30 May 2007 23:20:43 -0000      1.95
+++ edit.c      25 Aug 2007 03:17:58 -0000      1.96
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 The Free Software Foundation, Inc.
+ * Copyright (C) 2007 The Free Software Foundation, Inc.
  *
  * Implementation for "cvs edit", "cvs watch on", and related commands
  *
@@ -355,7 +355,7 @@
     rev = ((Entnode *) node->data)->version;
 
     xchmod (filename, 1);
-    mkdir_if_needed (CVSADM_BASE);
+    cvs_xmkdir (CVSADM_BASE, NULL, MD_EXIST_OK);
     basefn = make_base_file_name (filename, rev);
 
     if (!isfile (basefn))
@@ -471,7 +471,7 @@
        copy so that if the user removes the working file, then restores it
        with "cvs update" (which clears _editors but does not update
        CVSADM_BASE), then a future "cvs edit" can still win.  */
-    /* Could save a system call by only calling mkdir_if_needed if
+    /* Could save a system call by only calling cvs_xmkdir() if
        trying to create the output file fails.  But copy_file isn't
        set up to facilitate that.  */
 #ifdef SERVER_SUPPORT

Index: fileattr.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/fileattr.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- fileattr.c  24 Apr 2006 18:50:26 -0000      1.37
+++ fileattr.c  25 Aug 2007 03:17:58 -0000      1.38
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 The Free Software Foundation, Inc.
+ * Copyright (C) 2007 The Free Software Foundation, Inc.
  *
  * Implementation for file attribute munging features.
  *
@@ -637,10 +637,9 @@
 
            repname = Xasprintf ("%s/%s", fileattr_stored_repos, CVSREP);
 
-           if (CVS_MKDIR (repname, 0777) < 0 && errno != EEXIST)
+           if (!isdir (repname) && !cvs_mkdir (repname, NULL, MD_REPO))
            {
-               error (0, errno, "cannot make directory %s", repname);
-               (void) umask (omask);
+               umask (omask);
                free (fname);
                free (repname);
                return;

Index: filesubr.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/filesubr.c,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -b -r1.111 -r1.112
--- filesubr.c  12 Aug 2006 17:16:01 -0000      1.111
+++ filesubr.c  25 Aug 2007 03:17:58 -0000      1.112
@@ -294,67 +294,6 @@
 
 
 /*
- * Make a directory and die if it fails
- */
-void
-make_directory (const char *name)
-{
-    struct stat sb;
-
-    if (stat (name, &sb) == 0 && (!S_ISDIR (sb.st_mode)))
-           error (0, 0, "%s already exists but is not a directory", name);
-    if (!noexec && mkdir (name, 0777) < 0)
-       error (1, errno, "cannot make directory %s", name);
-}
-
-/*
- * Make a path to the argument directory, printing a message if something
- * goes wrong.
- */
-void
-make_directories (const char *name)
-{
-    char *cp;
-
-    if (noexec)
-       return;
-
-    if (mkdir (name, 0777) == 0 || errno == EEXIST)
-       return;
-    if (! existence_error (errno))
-    {
-       error (0, errno, "cannot make path to %s", name);
-       return;
-    }
-    if ((cp = strrchr (name, '/')) == NULL)
-       return;
-    *cp = '\0';
-    make_directories (name);
-    *cp++ = '/';
-    if (*cp == '\0')
-       return;
-    (void) mkdir (name, 0777);
-}
-
-/* Create directory NAME if it does not already exist; fatal error for
-   other errors.  Returns 0 if directory was created; 1 if it already
-   existed.  */
-int
-mkdir_if_needed (const char *name)
-{
-    if (mkdir (name, 0777) < 0)
-    {
-       int save_errno = errno;
-       if (save_errno != EEXIST && !isdir (name))
-           error (1, save_errno, "cannot make directory %s", name);
-       return 1;
-    }
-    return 0;
-}
-
-
-
-/*
  * Change the mode of a file, either adding write permissions, or removing
  * all write permissions.  Either change honors the current umask setting.
  *

Index: import.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/import.c,v
retrieving revision 1.182
retrieving revision 1.183
diff -u -b -r1.182 -r1.183
--- import.c    22 Aug 2007 13:55:02 -0000      1.182
+++ import.c    25 Aug 2007 03:17:58 -0000      1.183
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -358,8 +359,7 @@
      * Make all newly created directories writable.  Should really use a more
      * sophisticated security mechanism here.
      */
-    (void) umask (cvsumask);
-    make_directories (repository);
+    cvs_xmkdirs (repository, 0777, NULL, MD_REPO | MD_EXIST_OK);
 
     /* Create the logfile that will be logged upon completion */
     if ((logfp = cvs_temp_file (&tmpfile)) == NULL)
@@ -623,8 +623,8 @@
                /* Attempt to make the Attic directory, in case it
                   does not exist.  */
                (void) sprintf (rcs, "%s/%s", repository, CVSATTIC);
-               if (CVS_MKDIR (rcs, 0777 ) != 0 && errno != EEXIST)
-                   error (1, errno, "cannot make directory `%s'", rcs);
+               if (!isdir (rcs))
+                   cvs_xmkdir (rcs, NULL, MD_REPO | MD_EXIST_OK);
 
                /* Note that the above clobbered the path name, so we
                   recreate it here.  */
@@ -1843,13 +1843,13 @@
            err = 1;
            goto out;
        }
-       if (noexec == 0 && CVS_MKDIR (repository, 0777) < 0)
+       if (!noexec && !cvs_mkdir (repository, NULL, MD_REPO | MD_QUIET))
        {
            ierrno = errno;
            fperrmsg (logfp, 0, ierrno,
-                     "ERROR: cannot mkdir %s -- not added", repository);
+                     "ERROR: cannot mkdir `%s' -- not added", repository);
            error (0, ierrno,
-                  "ERROR: cannot mkdir %s -- not added", repository);
+                  "ERROR: cannot mkdir `%s' -- not added", repository);
            err = 1;
            goto out;
        }

Index: lock.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/lock.c,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -b -r1.121 -r1.122
--- lock.c      20 Mar 2007 16:56:13 -0000      1.121
+++ lock.c      25 Aug 2007 03:17:58 -0000      1.122
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -232,7 +233,7 @@
        else
        {
            if (S_ISDIR (sb.st_mode))
-               goto created;
+               goto exists;
            else
                error (1, 0, "%s is not a directory", retval);
        }
@@ -258,42 +259,9 @@
        new_mode = sb.st_mode;
        save_umask = umask (0000);
        saved_umask = 1;
+       cvs_xmkdirs (retval, new_mode, NULL, 0);
 
-       p = short_repos;
-       while (1)
-       {
-           while (!ISSLASH (*p) && *p != '\0')
-               ++p;
-           if (ISSLASH (*p))
-           {
-               strncpy (q, short_repos, p - short_repos);
-               q[p - short_repos] = '\0';
-               if (!ISSLASH (q[p - short_repos - 1])
-                   && CVS_MKDIR (retval, new_mode) < 0)
-               {
-                   int saved_errno = errno;
-                   if (saved_errno != EEXIST)
-                       error (1, errno, "cannot make directory %s", retval);
-                   else
-                   {
-                       if (stat (retval, &sb) < 0)
-                           error (1, errno, "cannot stat %s", retval);
-                       new_mode = sb.st_mode;
-                   }
-               }
-               ++p;
-           }
-           else
-           {
-               strcpy (q, short_repos);
-               if (CVS_MKDIR (retval, new_mode) < 0
-                   && errno != EEXIST)
-                   error (1, errno, "cannot make directory %s", retval);
-               goto created;
-           }
-       }
-    created:;
-
+exists:
        strcat (retval, "/");
        strcat (retval, name);
 

Index: ls.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/ls.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- ls.c        22 Aug 2007 13:55:02 -0000      1.21
+++ ls.c        25 Aug 2007 03:17:58 -0000      1.22
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 2006 The Free Software Foundation, Inc.
- * Copyright (c) 2004, Derek R. Price & Ximbiot <http://ximbiot.com>
+ * Copyright (C) 2007 The Free Software Foundation, Inc.
+ * Copyright (c) 2004-2007, Derek R. Price & Ximbiot LLC <http://ximbiot.com>
  * Copyright (c) 2001, Tony Hoyle
  * Copyright (c) 1992, Brian Berliner and Jeff Polk
  * Copyright (c) 1989-1992, Brian Berliner
@@ -528,7 +528,7 @@
            if (!created_dir)
                created_dir = xstrdup (update_dir);
 
-           make_directory (dir);
+           cvs_xmkdir (dir, NULL, 0);
            Create_Admin (dir, update_dir, repos, show_tag, show_date,
                          nonbranch, 0, 0);
            Subdir_Register (entries, NULL, dir);

Index: mkmodules.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/mkmodules.c,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -b -r1.101 -r1.102
--- mkmodules.c 22 Aug 2007 20:57:00 -0000      1.101
+++ mkmodules.c 25 Aug 2007 03:17:59 -0000      1.102
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -1235,10 +1236,10 @@
        old cvsinit.sh script did.  Few utilities do that, and a
        non-existent parent directory is as likely to be a typo as something
        which needs to be created.  */
-    mkdir_if_needed (current_parsed_root->directory);
+    cvs_xmkdir (current_parsed_root->directory, NULL, MD_REPO | MD_EXIST_OK);
 
     adm = Xasprintf ("%s/%s", current_parsed_root->directory, CVSROOTADM);
-    mkdir_if_needed (adm);
+    cvs_xmkdir (adm, NULL, MD_REPO | MD_EXIST_OK);
 
     /* This is needed because we pass "fileptr->filename" not "info"
        to add_rcs_file below.  I think this would be easy to change,
@@ -1248,7 +1249,7 @@
        error (1, errno, "cannot change to directory %s", adm);
 
     /* Make Emptydir so it's there if we need it */
-    mkdir_if_needed (CVSNULLREPOS);
+    cvs_xmkdir (CVSNULLREPOS, NULL, MD_REPO | MD_EXIST_OK);
 
     /* 80 is long enough for all the administrative file names, plus
        "/" and so on.  */

Index: modules.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/modules.c,v
retrieving revision 1.100
retrieving revision 1.101
diff -u -b -r1.100 -r1.101
--- modules.c   7 Jun 2006 06:59:14 -0000       1.100
+++ modules.c   25 Aug 2007 03:17:59 -0000      1.101
@@ -1,7 +1,8 @@
 /*
- * Copyright (C) 1986-2006 The Free Software Foundation, Inc.
+ * Copyright (C) 1986-2007 The Free Software Foundation, Inc.
  *
- * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * Portions Copyright (C) 1998-2007 Derek Price,
+ *                                  Ximbiot LLC <http://ximbiot.com>,
  *                                  and others.
  *
  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
@@ -552,7 +553,7 @@
        dir = where ? where : (mwhere ? mwhere : mname);
        /* XXX - think about making null repositories at each dir here
                 instead of just at the bottom */
-       make_directories (dir);
+       cvs_xmkdirs (dir, 0777, NULL, MD_EXIST_OK);
        if (CVS_CHDIR (dir) < 0)
        {
            error (0, errno, "cannot chdir to %s", dir);

Index: sanity.sh
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/sanity.sh,v
retrieving revision 1.1184
retrieving revision 1.1185
diff -u -b -r1.1184 -r1.1185
--- sanity.sh   22 Aug 2007 20:57:00 -0000      1.1184
+++ sanity.sh   25 Aug 2007 03:17:59 -0000      1.1185
@@ -16136,9 +16136,9 @@
          # Now try someplace where we don't have permission.
          mkdir ${TESTDIR}/barf
          chmod -w ${TESTDIR}/barf
-         dotest_fail abspath-4r "${testcvs} co -d ${TESTDIR}/barf/sub mod1" \
-"${SPROG} \[checkout aborted\]: cannot make directory sub: Permission denied" \
-"${SPROG} \[checkout aborted\]: absolute pathnames invalid for server 
(specified .${TESTDIR}/barf/sub.)"
+         dotest_fail abspath-4 "$testcvs co -d $TESTDIR/barf/sub mod1" \
+"$SPROG \[checkout aborted\]: cannot make directory \`sub': Permission denied" 
\
+"$SPROG \[checkout aborted\]: absolute pathnames invalid for server (specified 
\`$TESTDIR/barf/sub')"
          chmod +w ${TESTDIR}/barf
          rmdir ${TESTDIR}/barf
          # Done.  Nothing to clean up.
@@ -16355,13 +16355,13 @@
          fi
          # Now see whether CVS has trouble because it can't create CVS.
          # First string is for local, second is for remote.
-         dotest toplevel-12 "${testcvs} co top-dir" \
-"${SPROG} checkout: warning: cannot make directory CVS in \.: Permission denied
-${SPROG} checkout: Updating top-dir" \
-"${CPROG} checkout: warning: cannot make directory CVS in \.: Permission denied
-${CPROG} checkout: in directory \.:
-${CPROG} checkout: cannot open CVS/Entries for reading: No such file or 
directory
-${SPROG} checkout: Updating top-dir"
+         dotest toplevel-12 "$testcvs co top-dir" \
+"$SPROG checkout: cannot make directory \`CVS': Permission denied
+$SPROG checkout: Updating top-dir" \
+"$SPROG checkout: cannot make directory \`CVS': Permission denied
+$SPROG checkout: in directory \.:
+$SPROG checkout: cannot open CVS/Entries for reading: No such file or directory
+$SPROG checkout: Updating top-dir"
 
          chmod +w ../1
 

Index: subr.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/subr.c,v
retrieving revision 1.157
retrieving revision 1.158
diff -u -b -r1.157 -r1.158
--- subr.c      22 Aug 2007 13:55:02 -0000      1.157
+++ subr.c      25 Aug 2007 03:17:59 -0000      1.158
@@ -30,7 +30,9 @@
 #include "canonicalize.h"
 #include "canon-host.h"
 #include "getline.h"
+#include "mkdir-p.h"
 #include "mreadlink.h"
+#include "savewd.h"
 #include "vasnprintf.h"
 
 /* CVS headers.  */
@@ -2193,3 +2195,189 @@
     return true;
 }
 #endif /* HAVE_CVS_ADMIN_GROUP */
+
+
+
+/* Return true if NAME is created.  If FATAL is true, exit on errors.
+ * Otherwise, return false.
+ */
+static inline bool
+mkdir_i (const char *name, mode_t mode,
+        const char *update_dir, unsigned int flags)
+{
+    bool err = mkdir (name, mode);
+    if (err && !(flags & MD_EXIST_OK && errno == EEXIST)
+       && (flags & MD_FATAL || !(flags & MD_QUIET)))
+    {
+       bool uud = update_dir && strlen (update_dir)
+                  && strcmp (update_dir, ".");
+       error (flags & MD_FATAL, errno, "cannot make directory `%s%s%s'",
+              uud ? update_dir : "", uud ? "/" : "", name);
+    }
+    return !err;
+}
+
+
+
+/* Returns true if NAME was created, false otherwise.
+ *
+ * GLOBALS
+ *   cvsumask  Set umask before creating driectories if FLAGS & MD_REPO.
+ *   noexec    If set, skip directory creation unless FLAGS & MD_FORCE.
+ */
+static inline bool
+cvs_mkdir_i (const char *name, mode_t mode,
+            const char *update_dir, unsigned int flags)
+{
+    mode_t omask;
+    bool retval;
+
+    if (noexec && !(flags & MD_FORCE)) return false;
+
+    /* Use umask(CVSUMASK) rather than CVSUMASK & 0777 since CVSUMASK could be
+     * more permissive than OMASK.
+     */
+    if (flags & MD_REPO)
+       omask = umask (cvsumask);
+
+    retval = mkdir_i (name, mode, update_dir, flags);
+
+    if (flags & MD_REPO)
+       umask (omask);
+
+    return retval;
+}
+
+
+
+/* Create directory NAME.
+ *
+ * GLOBALS
+ *   cvsumask
+ *   noexec    If set, skip directory creation.
+ *
+ * RETURNS
+ *   True if NAME was created, false otherwise.
+ */
+bool
+cvs_mkdir (const char *name, const char *update_dir, unsigned int flags)
+{
+    return cvs_mkdir_i (name, 0777, update_dir, flags);
+}
+
+
+
+/*
+ * Make a directory and die with a message if it fails.
+ *
+ * GLOBALS
+ *   cvsumask
+ *   noexec    If set, skip directory creation.
+ */
+bool
+cvs_xmkdir (const char *name, const char *update_dir, unsigned int flags)
+{
+    return cvs_mkdir_i (name, 0777, update_dir, flags | MD_FATAL);
+}
+
+
+
+/*
+ * Closure struct for mkdir_callback.
+ */
+struct mkdir_callback_closure
+{
+    mode_t mode;
+    unsigned int flags;
+    const char *update_dir;
+};
+
+
+
+/*
+ * Callback for make_dir_parents which honors FLAGS.
+ */
+int
+mkdir_callback (const char *child, const char *dir, void *closure)
+{
+    struct mkdir_callback_closure *mcc = closure;
+    return cvs_mkdir_i (dir, mcc->mode, mcc->update_dir,
+                       mcc->flags | MD_EXIST_OK) ? 0 : -1;
+}
+
+
+
+/*
+ * make_dir_parents() announce callback which does nothing.
+ */
+void
+mkdir_announce_callback (const char *dir, void *closure)
+{
+    return;
+}
+
+
+
+/* Returns true if complete path to NAME was created, false otherwise.
+ *
+ * GLOBALS
+ *   cvsumask  Set umask before creating driectories if FLAGS & MD_REPO.
+ *   noexec    If set, skip directory creation unless FLAGS & MD_FORCE.
+ */
+static inline bool
+cvs_mkdirs_i (const char *name, mode_t mode, const char *update_dir,
+             unsigned int flags)
+{
+    struct mkdir_callback_closure mcc;
+    struct savewd wd;
+    bool retval;
+
+    if (noexec && !(flags & MD_FORCE)) return false;
+    if (isdir (name))
+    {
+       /* Have to set EEXIST explicitly since make_dir_parents will not
+        * do so when MAKE_ANCESTOR is supplied.
+        */
+       if (!(flags & MD_EXIST_OK)) errno = EEXIST;
+       return false;
+    }
+
+    mcc.mode = mode;
+    mcc.flags = flags;
+    mcc.update_dir = NULL;
+
+    savewd_init (&wd);
+    retval = make_dir_parents ((char *)name, &wd, mkdir_callback, &mcc,
+                              mode, mkdir_announce_callback, 0777, -1, -1,
+                              true);
+    if (!retval && !(flags & MD_EXIST_OK && errno == EEXIST)
+       && (flags & MD_FATAL || !(flags & MD_QUIET)))
+    {
+       bool uud = update_dir && strlen (update_dir)
+                  && strcmp (update_dir, ".");
+       error (flags & MD_FATAL, errno, "cannot make directory tree `%s%s%s'",
+              uud ? update_dir : "", uud ? "/" : "", name);
+    }
+    savewd_restore (&wd, 0);
+    savewd_finish (&wd);
+
+    return retval;
+}
+
+
+
+bool
+cvs_mkdirs (const char *name, mode_t mode, const char *update_dir,
+           unsigned int flags)
+{
+    return cvs_mkdirs_i (name, mode, update_dir, flags);
+}
+
+
+
+bool
+cvs_xmkdirs (const char *name, mode_t mode, const char *update_dir,
+            unsigned int flags)
+{
+    return cvs_mkdirs_i (name, mode, update_dir, flags | MD_FATAL);
+}

Index: subr.h
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/subr.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- subr.h      11 Jul 2006 21:48:43 -0000      1.12
+++ subr.h      25 Aug 2007 03:17:59 -0000      1.13
@@ -119,4 +119,15 @@
 #   define is_admin()  true
 # endif
 
+#define MD_QUIET       (1 << 0)        /* Don't spout on nonfatal errors.  */
+#define MD_FATAL       (1 << 1)        /* Die on error.  */
+#define MD_REPO                (1 << 2)        /* Honor CVSUMASK.  */
+#define MD_FORCE       (1 << 3)        /* Ignore NOEXEC.  */
+#define MD_EXIST_OK    (1 << 4)        /* Ok if directory already exists.  */
+bool cvs_mkdir (const char *name, const char *update_dir, unsigned int flags);
+bool cvs_xmkdir (const char *name, const char *update_dir, unsigned int flags);
+bool cvs_mkdirs (const char *name, mode_t mode, const char *update_dir,
+                unsigned int flags);
+bool cvs_xmkdirs (const char *name, mode_t mode, const char *update_dir,
+                 unsigned int flags);
 #endif /* !SUBR_H */

Index: update.c
===================================================================
RCS file: /cvsroot/cvs/ccvs/src/update.c,v
retrieving revision 1.268
retrieving revision 1.269
diff -u -b -r1.268 -r1.269
--- update.c    30 May 2007 23:20:45 -0000      1.268
+++ update.c    25 Aug 2007 03:18:00 -0000      1.269
@@ -945,13 +945,18 @@
                    tag_update_dir = xstrdup (update_dir);
            }
 
-           make_directory (dir);
-           Create_Admin (dir, update_dir, repository, tag, date,
+           cvs_xmkdir (dir, NULL, 0);
+           if (Create_Admin (dir, update_dir, repository, tag, date,
                          /* This is a guess.  We will rewrite it later
                             via WriteTag.  */
                          0,
-                         0,
-                         dotemplate);
+                             0, dotemplate))
+           {
+               error (0, 0,
+                      "Failed to create admin data in `%s'.  Skipping.",
+                      update_dir);
+               return R_SKIP_ALL;
+           }
            rewrite_tag = 1;
            nonbranch = -1;
            warned = 0;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]