summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorJean-Francois Brousseau <jfb@cvs.openbsd.org>2004-12-14 21:23:45 +0000
committerJean-Francois Brousseau <jfb@cvs.openbsd.org>2004-12-14 21:23:45 +0000
commit32bd123bf59f81874960deb7453a357a6357713d (patch)
tree9938cef0b5f2f56022f637201a828374dc9f17d8 /usr.bin
parent894a26430c828f3171e67c5b01a6cbd7599940c5 (diff)
When loading directory entries, create file structures for files which
have been lost but have a valid entry.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/cvs/entries.c12
-rw-r--r--usr.bin/cvs/file.c97
-rw-r--r--usr.bin/cvs/file.h3
3 files changed, 75 insertions, 37 deletions
diff --git a/usr.bin/cvs/entries.c b/usr.bin/cvs/entries.c
index d9526c14734..82315e71610 100644
--- a/usr.bin/cvs/entries.c
+++ b/usr.bin/cvs/entries.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: entries.c,v 1.20 2004/12/07 17:10:56 tedu Exp $ */
+/* $OpenBSD: entries.c,v 1.21 2004/12/14 21:23:44 jfb Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -188,8 +188,11 @@ cvs_ent_add(CVSENTRIES *ef, struct cvs_ent *ent)
return (-1);
}
- if (cvs_ent_get(ef, ent->ce_name) != NULL)
+ if (cvs_ent_get(ef, ent->ce_name) != NULL) {
+ cvs_log(LP_ERR, "attempt to add duplicate entry for `%s'",
+ ent->ce_name);
return (-1);
+ }
TAILQ_INSERT_TAIL(&(ef->cef_ent), ent, ce_list);
@@ -239,11 +242,6 @@ cvs_ent_remove(CVSENTRIES *ef, const char *name)
{
struct cvs_ent *ent;
- if (!(ef->cef_flags & CVS_ENTF_WR)) {
- cvs_log(LP_ERR, "Entries file is opened in read-only mode");
- return (-1);
- }
-
ent = cvs_ent_get(ef, name);
if (ent == NULL)
return (-1);
diff --git a/usr.bin/cvs/file.c b/usr.bin/cvs/file.c
index 3a5fa920fc4..3c4004574ce 100644
--- a/usr.bin/cvs/file.c
+++ b/usr.bin/cvs/file.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: file.c,v 1.43 2004/12/13 19:38:22 jfb Exp $ */
+/* $OpenBSD: file.c,v 1.44 2004/12/14 21:23:44 jfb Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -536,6 +536,7 @@ cvs_file_getdir(CVSFILE *cf, int flags)
CVSFILE *cfp;
struct stat st;
struct cvs_dir *cdp;
+ struct cvs_ent *cvsent;
struct cvs_flist dirs;
ndirs = 0;
@@ -577,6 +578,16 @@ cvs_file_getdir(CVSFILE *cf, int flags)
return (-1);
}
+ /* To load all files, we first get the entries for the directory and
+ * load the information for each of those entries. The handle to
+ * the Entries file kept in the directory data is only temporary and
+ * the files should remove their entry when they use it. After all
+ * files in the directory have been processed, the Entries handle
+ * should only be left with those entries for which no real file
+ * exists. We then build file structures for those files too, as
+ * we will likely receive fresh copies from the server as part of the
+ * response.
+ */
do {
ret = getdirentries(fd, fbuf, sizeof(fbuf), &base);
if (ret == -1) {
@@ -616,6 +627,24 @@ cvs_file_getdir(CVSFILE *cf, int flags)
} while (ret > 0);
if (cdp->cd_ent != NULL) {
+ /* now create file structure for files which have an
+ * entry in the Entries file but no file on disk
+ */
+ while ((cvsent = cvs_ent_next(cdp->cd_ent)) != NULL) {
+ snprintf(pbuf, sizeof(pbuf), "%s/%s", fpath,
+ cvsent->ce_name);
+ cfp = cvs_file_lget(pbuf, flags, cf);
+ if (cfp != NULL) {
+ if (cfp->cf_type == DT_DIR) {
+ TAILQ_INSERT_TAIL(&dirs, cfp, cf_list);
+ ndirs++;
+ } else {
+ TAILQ_INSERT_TAIL(&(cdp->cd_files), cfp,
+ cf_list);
+ cdp->cd_nfiles++;
+ }
+ }
+ }
cvs_ent_close(cdp->cd_ent);
cdp->cd_ent = NULL;
}
@@ -835,48 +864,58 @@ cvs_file_alloc(const char *path, u_int type)
static CVSFILE*
cvs_file_lget(const char *path, int flags, CVSFILE *parent)
{
- int cwd;
+ int ret, cwd;
+ u_int type;
struct stat st;
CVSFILE *cfp;
struct cvs_ent *ent = NULL;
- if (strcmp(path, ".") == 0)
- cwd = 1;
- else
- cwd = 0;
+ type = DT_UNKNOWN;
+ cwd = (strcmp(path, ".") == 0) ? 1 : 0;
- if (stat(path, &st) == -1) {
- cvs_log(LP_ERRNO, "failed to stat %s", path);
- return (NULL);
- }
+ ret = stat(path, &st);
+ if (ret == 0)
+ type = IFTODT(st.st_mode);
- cfp = cvs_file_alloc(path, IFTODT(st.st_mode));
- if (cfp == NULL)
+ if ((cfp = cvs_file_alloc(path, type)) == NULL)
return (NULL);
cfp->cf_parent = parent;
- cfp->cf_mode = st.st_mode & ACCESSPERMS;
- cfp->cf_mtime = st.st_mtime;
- if ((parent != NULL) && (CVS_DIR_ENTRIES(parent) != NULL)) {
+ if ((parent != NULL) && (CVS_DIR_ENTRIES(parent) != NULL))
ent = cvs_ent_get(CVS_DIR_ENTRIES(parent), CVS_FILE_NAME(cfp));
- }
- if (ent == NULL) {
- cfp->cf_cvstat = (cwd == 1) ?
- CVS_FST_UPTODATE : CVS_FST_UNKNOWN;
- } else {
- /* always show directories as up-to-date */
- if (ent->ce_type == CVS_ENT_DIR)
- cfp->cf_cvstat = CVS_FST_UPTODATE;
- else if (rcsnum_cmp(ent->ce_rev, cvs_addedrev, 2) == 0)
- cfp->cf_cvstat = CVS_FST_ADDED;
+ if (ret == 0) {
+ cfp->cf_mode = st.st_mode & ACCESSPERMS;
+ cfp->cf_mtime = st.st_mtime;
+
+ if (ent == NULL)
+ cfp->cf_cvstat = (cwd == 1) ?
+ CVS_FST_UPTODATE : CVS_FST_UNKNOWN;
else {
- /* check last modified time */
- if (ent->ce_mtime >= (time_t)st.st_mtime)
+ /* always show directories as up-to-date */
+ if (ent->ce_type == CVS_ENT_DIR)
cfp->cf_cvstat = CVS_FST_UPTODATE;
- else
- cfp->cf_cvstat = CVS_FST_MODIFIED;
+ else if (rcsnum_cmp(ent->ce_rev, cvs_addedrev, 2) == 0)
+ cfp->cf_cvstat = CVS_FST_ADDED;
+ else {
+ /* check last modified time */
+ if (ent->ce_mtime >= (time_t)st.st_mtime)
+ cfp->cf_cvstat = CVS_FST_UPTODATE;
+ else
+ cfp->cf_cvstat = CVS_FST_MODIFIED;
+ }
+
+ cvs_ent_remove(CVS_DIR_ENTRIES(parent),
+ CVS_FILE_NAME(cfp));
}
+ } else {
+ if (ent == NULL) {
+ cvs_log(LP_ERR, "no Entry and no file for `%s'",
+ CVS_FILE_NAME(cfp));
+ cvs_file_free(cfp);
+ return (NULL);
+ } else
+ cfp->cf_cvstat = CVS_FST_LOST;
}
if ((cfp->cf_type == DT_DIR) && (cvs_file_getdir(cfp, flags) < 0)) {
diff --git a/usr.bin/cvs/file.h b/usr.bin/cvs/file.h
index 70a2042e7bd..6472df39a73 100644
--- a/usr.bin/cvs/file.h
+++ b/usr.bin/cvs/file.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: file.h,v 1.11 2004/12/07 17:10:56 tedu Exp $ */
+/* $OpenBSD: file.h,v 1.12 2004/12/14 21:23:44 jfb Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -71,6 +71,7 @@ struct cvs_entries;
#define CVS_FST_REMOVED 4
#define CVS_FST_CONFLICT 5
#define CVS_FST_PATCHED 6
+#define CVS_FST_LOST 7
struct cvs_fname {