You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by gs...@apache.org on 2010/05/10 22:07:53 UTC

svn commit: r942886 - in /subversion/trunk/subversion/libsvn_wc: entries.h log.c old-and-busted.c

Author: gstein
Date: Mon May 10 20:07:53 2010
New Revision: 942886

URL: http://svn.apache.org/viewvc?rev=942886&view=rev
Log:
As a consequence of r942851, much of loggy_entry_modify() can go away. 
This also shifts-to/simplifies a bunch code in old-and-busted.

* subversion/libsvn_wc/log.c:
  (svn_wc__loggy_entry_modify): remove a bunch of attribute setup. remove
    a bunch of flags from the assertion, thus disallowing most flags.

* subversion/libsvn_wc/entries.h:
  (SVN_WC__ENTRIES_ATTR_FILE_STR, SVN_WC__ENTRIES_ATTR_DIR_STR,
      SVN_WC__ENTRY_VALUE_ADD, SVN_WC__ENTRY_VALUE_DELETE,
      SVN_WC__ENTRY_VALUE_REPLACE): shifted to old-and-busted as
    ENTRIES_VALUE_* symbols.
  (SVN_WC__ENTRY_ATTR_KIND, SVN_WC__ENTRY_ATTR_CHECKSUM,
      SVN_WC__ENTRY_ATTR_SCHEDULE, SVN_WC__ENTRY_ATTR_COPIED,
      SVN_WC__ENTRY_ATTR_COPYFROM_URL, SVN_WC__ENTRY_ATTR_COPYFROM_REV):
    shifted to old-and-busted as ENTRIES_ATTR_* symbols

* subversion/libsvn_wc/old-and-busted.c:
  (ENTRIES_ATTR_KIND, ENTRIES_ATTR_SCHEDULE, ENTRIES_ATTR_COPIED,
      ENTRIES_ATTR_COPYFROM_URL, ENTRIES_ATTR_COPYFROM_REV,
      ENTRIES_ATTR_CHECKSUM, ENTRIES_VALUE_FILE, ENTRIES_VALUE_DIR,
      ENTRIES_VALUE_ADD, ENTRIES_VALUE_DELETE, ENTRIES_VALUE_REPLACE):
    moved here from entries.h
  (read_entry): track symbol renames
  (do_bool_attr): this function no longer needs to set MODIFY_FLAGS. also
    remove the MODIFY_FLAG param and update docstring
  (extract_string): this function no longer needs to set MODIFY_FLAGS, and
    the NORMALIZE functionality is removed (to extract_string_normalize).
    also rip out the FLAG param.
  (extract_string_normalize): just like the original extract_string, but
    with hard-coded normalizing functionality.
  (svn_wc__atts_to_entry): track a bunch of symbol renames. remove
    MODIFY_FLAGS handling from all do_bool_attr() and extract_string()
    calls. for the four places using MODIFY_FLAGS (conflict file stuff),
    they also normalize them, so switch to extract_string_normalize().

Modified:
    subversion/trunk/subversion/libsvn_wc/entries.h
    subversion/trunk/subversion/libsvn_wc/log.c
    subversion/trunk/subversion/libsvn_wc/old-and-busted.c

Modified: subversion/trunk/subversion/libsvn_wc/entries.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/entries.h?rev=942886&r1=942885&r2=942886&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/entries.h (original)
+++ subversion/trunk/subversion/libsvn_wc/entries.h Mon May 10 20:07:53 2010
@@ -37,12 +37,6 @@
 extern "C" {
 #endif /* __cplusplus */
 
-
-/* String representations for svn_node_kind.  This maybe should be
-   abstracted farther out? */
-#define SVN_WC__ENTRIES_ATTR_FILE_STR   "file"
-#define SVN_WC__ENTRIES_ATTR_DIR_STR    "dir"
-
 
 /* The names of the fields used for storing entries' information.
    Used for the names of the XML attributes in XML entries files
@@ -50,24 +44,13 @@ extern "C" {
    and for error reporting when reading a non-XML entries file.
    ### If you add or remove items here, you probably want to make sure
    to do the same for the SVN_WC__ENTRY_MODIFY_* #defines as well. */
-#define SVN_WC__ENTRY_ATTR_KIND               "kind"
 #define SVN_WC__ENTRY_ATTR_TEXT_TIME          "text-time"
-#define SVN_WC__ENTRY_ATTR_CHECKSUM           "checksum"
-#define SVN_WC__ENTRY_ATTR_SCHEDULE           "schedule"
-#define SVN_WC__ENTRY_ATTR_COPIED             "copied"
-#define SVN_WC__ENTRY_ATTR_COPYFROM_URL       "copyfrom-url"
-#define SVN_WC__ENTRY_ATTR_COPYFROM_REV       "copyfrom-rev"
 #define SVN_WC__ENTRY_ATTR_CONFLICT_OLD       "conflict-old" /* saved old file */
 #define SVN_WC__ENTRY_ATTR_CONFLICT_NEW       "conflict-new" /* saved new file */
 #define SVN_WC__ENTRY_ATTR_CONFLICT_WRK       "conflict-wrk" /* saved wrk file */
 #define SVN_WC__ENTRY_ATTR_PREJFILE           "prop-reject-file"
 #define SVN_WC__ENTRY_ATTR_WORKING_SIZE       "working-size"
 
-/* Attribute values for 'schedule' */
-#define SVN_WC__ENTRY_VALUE_ADD        "add"
-#define SVN_WC__ENTRY_VALUE_DELETE     "delete"
-#define SVN_WC__ENTRY_VALUE_REPLACE    "replace"
-
 
 /* Set *NEW_ENTRY to a new entry, taking attributes from ATTS, whose
    keys and values are both char *.  Allocate the entry and copy

Modified: subversion/trunk/subversion/libsvn_wc/log.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/log.c?rev=942886&r1=942885&r2=942886&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/log.c (original)
+++ subversion/trunk/subversion/libsvn_wc/log.c Mon May 10 20:07:53 2010
@@ -772,17 +772,7 @@ svn_wc__loggy_entry_modify(svn_skel_t **
   SVN_ERR_ASSERT(modify_flags != 0);
 
   /* ### this code has a limited set of modifications. enforce it.  */
-  SVN_ERR_ASSERT((modify_flags & ~(
-                    /* from update_editor.c  */
-                    SVN_WC__ENTRY_MODIFY_SCHEDULE
-                    | SVN_WC__ENTRY_MODIFY_COPYFROM_URL
-                    | SVN_WC__ENTRY_MODIFY_COPYFROM_REV
-                    | SVN_WC__ENTRY_MODIFY_COPIED
-                    | SVN_WC__ENTRY_MODIFY_KIND
-                    | SVN_WC__ENTRY_MODIFY_TEXT_TIME
-                    | SVN_WC__ENTRY_MODIFY_WORKING_SIZE
-                    | SVN_WC__ENTRY_MODIFY_CHECKSUM
-
+  SVN_ERR_ASSERT((modify_flags & ~(0
                     /* from props.c  */
                     | SVN_WC__ENTRY_MODIFY_PREJFILE
 
@@ -795,35 +785,6 @@ svn_wc__loggy_entry_modify(svn_skel_t **
    if (modify_flags & (attr_flag)) \
      apr_hash_set(prop_hash, (attr_name), APR_HASH_KEY_STRING, value)
 
-  /* ### it is always a file  */
-  if (modify_flags & SVN_WC__ENTRY_MODIFY_KIND)
-    SVN_ERR_ASSERT(entry->kind == svn_node_file);
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_KIND,
-                 SVN_WC__ENTRY_ATTR_KIND,
-                 SVN_WC__ENTRIES_ATTR_FILE_STR);
-
-  if (modify_flags & SVN_WC__ENTRY_MODIFY_SCHEDULE)
-    SVN_ERR_ASSERT(entry->schedule == svn_wc_schedule_add);
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_SCHEDULE,
-                 SVN_WC__ENTRY_ATTR_SCHEDULE,
-                 SVN_WC__ENTRY_VALUE_ADD);
-
-  if (modify_flags & SVN_WC__ENTRY_MODIFY_COPIED)
-    SVN_ERR_ASSERT(entry->copied);
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_COPIED,
-                 SVN_WC__ENTRY_ATTR_COPIED,
-                 "true");
-
-  if (modify_flags & SVN_WC__ENTRY_MODIFY_COPYFROM_URL)
-    SVN_ERR_ASSERT(entry->copyfrom_url != NULL);
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_COPYFROM_URL,
-                 SVN_WC__ENTRY_ATTR_COPYFROM_URL,
-                 entry->copyfrom_url);
-
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_COPYFROM_REV,
-                 SVN_WC__ENTRY_ATTR_COPYFROM_REV,
-                 apr_psprintf(result_pool, "%ld", entry->copyfrom_rev));
-
   if (modify_flags & SVN_WC__ENTRY_MODIFY_CONFLICT_OLD)
     SVN_ERR_ASSERT(entry->conflict_old != NULL);
   ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_CONFLICT_OLD,
@@ -846,23 +807,6 @@ svn_wc__loggy_entry_modify(svn_skel_t **
                  SVN_WC__ENTRY_ATTR_PREJFILE,
                  entry->prejfile);
 
-  if (modify_flags & SVN_WC__ENTRY_MODIFY_TEXT_TIME)
-    SVN_ERR_ASSERT(entry->text_time == 0);
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_TEXT_TIME,
-                 SVN_WC__ENTRY_ATTR_TEXT_TIME,
-                 svn_time_to_cstring(entry->text_time, result_pool));
-
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_CHECKSUM,
-                 SVN_WC__ENTRY_ATTR_CHECKSUM,
-                 entry->checksum);
-
-  if (modify_flags & SVN_WC__ENTRY_MODIFY_WORKING_SIZE)
-    SVN_ERR_ASSERT(entry->working_size == SVN_WC_ENTRY_WORKING_SIZE_UNKNOWN);
-  ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_WORKING_SIZE,
-                 SVN_WC__ENTRY_ATTR_WORKING_SIZE,
-                 apr_psprintf(result_pool, "%" APR_OFF_T_FMT,
-                              entry->working_size));
-
 #undef ADD_ENTRY_ATTR
 
   SVN_ERR_ASSERT(apr_hash_count(prop_hash) != 0);

Modified: subversion/trunk/subversion/libsvn_wc/old-and-busted.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/old-and-busted.c?rev=942886&r1=942885&r2=942886&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/old-and-busted.c (original)
+++ subversion/trunk/subversion/libsvn_wc/old-and-busted.c Mon May 10 20:07:53 2010
@@ -67,6 +67,19 @@
 #define ENTRIES_ATTR_CMT_AUTHOR         "last-author"
 #define ENTRIES_ATTR_REVISION           "revision"
 #define ENTRIES_ATTR_URL                "url"
+#define ENTRIES_ATTR_KIND               "kind"
+#define ENTRIES_ATTR_SCHEDULE           "schedule"
+#define ENTRIES_ATTR_COPIED             "copied"
+#define ENTRIES_ATTR_COPYFROM_URL       "copyfrom-url"
+#define ENTRIES_ATTR_COPYFROM_REV       "copyfrom-rev"
+#define ENTRIES_ATTR_CHECKSUM           "checksum"
+
+/* Attribute values used in our old XML entries file.  */
+#define ENTRIES_VALUE_FILE     "file"
+#define ENTRIES_VALUE_DIR      "dir"
+#define ENTRIES_VALUE_ADD      "add"
+#define ENTRIES_VALUE_DELETE   "delete"
+#define ENTRIES_VALUE_REPLACE  "replace"
 
 
 /* */
@@ -459,9 +472,9 @@ read_entry(svn_wc_entry_t **new_entry,
     SVN_ERR(read_val(&kindstr, buf, end));
     if (kindstr)
       {
-        if (strcmp(kindstr, SVN_WC__ENTRIES_ATTR_FILE_STR) == 0)
+        if (strcmp(kindstr, ENTRIES_VALUE_FILE) == 0)
           entry->kind = svn_node_file;
-        else if (strcmp(kindstr, SVN_WC__ENTRIES_ATTR_DIR_STR) == 0)
+        else if (strcmp(kindstr, ENTRIES_VALUE_DIR) == 0)
           entry->kind = svn_node_dir;
         else
           return svn_error_createf
@@ -499,11 +512,11 @@ read_entry(svn_wc_entry_t **new_entry,
     entry->schedule = svn_wc_schedule_normal;
     if (schedulestr)
       {
-        if (strcmp(schedulestr, SVN_WC__ENTRY_VALUE_ADD) == 0)
+        if (strcmp(schedulestr, ENTRIES_VALUE_ADD) == 0)
           entry->schedule = svn_wc_schedule_add;
-        else if (strcmp(schedulestr, SVN_WC__ENTRY_VALUE_DELETE) == 0)
+        else if (strcmp(schedulestr, ENTRIES_VALUE_DELETE) == 0)
           entry->schedule = svn_wc_schedule_delete;
-        else if (strcmp(schedulestr, SVN_WC__ENTRY_VALUE_REPLACE) == 0)
+        else if (strcmp(schedulestr, ENTRIES_VALUE_REPLACE) == 0)
           entry->schedule = svn_wc_schedule_replace;
         else
           return svn_error_createf(
@@ -690,11 +703,10 @@ read_entry(svn_wc_entry_t **new_entry,
 
 
 /* If attribute ATTR_NAME appears in hash ATTS, set *ENTRY_FLAG to its
- * boolean value and add MODIFY_FLAG into *MODIFY_FLAGS, else set *ENTRY_FLAG
- * false.  ENTRY_NAME is the name of the WC-entry. */
+   boolean value, else set *ENTRY_FLAG false.  ENTRY_NAME is the name
+   of the WC-entry. */
 static svn_error_t *
 do_bool_attr(svn_boolean_t *entry_flag,
-             int *modify_flags, int modify_flag,
              apr_hash_t *atts, const char *attr_name,
              const char *entry_name)
 {
@@ -712,9 +724,6 @@ do_bool_attr(svn_boolean_t *entry_flag,
           (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
            _("Entry '%s' has invalid '%s' value"),
            (entry_name ? entry_name : SVN_WC_ENTRY_THIS_DIR), attr_name);
-
-      if (modify_flags)
-        *modify_flags |= modify_flag;
     }
   return SVN_NO_ERROR;
 }
@@ -722,11 +731,8 @@ do_bool_attr(svn_boolean_t *entry_flag,
 
 /* */
 static const char *
-extract_string(int *modify_flags,
-               apr_hash_t *atts,
+extract_string(apr_hash_t *atts,
                const char *att_name,
-               int flag,
-               svn_boolean_t normalize,
                apr_pool_t *result_pool)
 {
   const char *value = apr_hash_get(atts, att_name, APR_HASH_KEY_STRING);
@@ -734,10 +740,27 @@ extract_string(int *modify_flags,
   if (value == NULL)
     return NULL;
 
+  return apr_pstrdup(result_pool, value);
+}
+
+
+/* Like extract_string(), but normalizes empty strings to NULL.  */
+static const char *
+extract_string_normalize(int *modify_flags,
+                         apr_hash_t *atts,
+                         const char *att_name,
+                         int flag,
+                         apr_pool_t *result_pool)
+{
+  const char *value = apr_hash_get(atts, att_name, APR_HASH_KEY_STRING);
+
+  if (value == NULL)
+    return NULL;
+
   if (modify_flags)
     *modify_flags |= flag;
 
-  if (normalize && *value == '\0')
+  if (*value == '\0')
     return NULL;
 
   return apr_pstrdup(result_pool, value);
@@ -785,16 +808,13 @@ svn_wc__atts_to_entry(svn_wc_entry_t **n
   /* Attempt to set up url path (again, see resolve_to_defaults).
 
      ### not used by loggy; no need to set MODIFY_FLAGS  */
-  entry->url = extract_string(NULL, atts,
-                              ENTRIES_ATTR_URL, 0,
-                              FALSE, pool);
+  entry->url = extract_string(atts, ENTRIES_ATTR_URL, pool);
 
   /* Set up repository root.  Make sure it is a prefix of url.
 
      ### not used by loggy; no need to set MODIFY_FLAGS  */
-  entry->repos = extract_string(NULL, atts,
-                                ENTRIES_ATTR_REPOS, 0,
-                                FALSE, pool);
+  entry->repos = extract_string(atts, ENTRIES_ATTR_REPOS, pool);
+
   if (entry->url && entry->repos
       && !svn_uri_is_ancestor(entry->repos, entry->url))
     return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
@@ -803,113 +823,105 @@ svn_wc__atts_to_entry(svn_wc_entry_t **n
                              name ? name : SVN_WC_ENTRY_THIS_DIR);
 
   /* Set up kind. */
+  /* ### not used by loggy; no need to set MODIFY_FLAGS  */
   {
     const char *kindstr
-      = apr_hash_get(atts, SVN_WC__ENTRY_ATTR_KIND, APR_HASH_KEY_STRING);
+      = apr_hash_get(atts, ENTRIES_ATTR_KIND, APR_HASH_KEY_STRING);
 
     entry->kind = svn_node_none;
     if (kindstr)
       {
-        if (strcmp(kindstr, SVN_WC__ENTRIES_ATTR_FILE_STR) == 0)
+        if (strcmp(kindstr, ENTRIES_VALUE_FILE) == 0)
           entry->kind = svn_node_file;
-        else if (strcmp(kindstr, SVN_WC__ENTRIES_ATTR_DIR_STR) == 0)
+        else if (strcmp(kindstr, ENTRIES_VALUE_DIR) == 0)
           entry->kind = svn_node_dir;
         else
           return svn_error_createf
             (SVN_ERR_NODE_UNKNOWN_KIND, NULL,
              _("Entry '%s' has invalid node kind"),
              (name ? name : SVN_WC_ENTRY_THIS_DIR));
-        *modify_flags |= SVN_WC__ENTRY_MODIFY_KIND;
       }
   }
 
   /* Look for a schedule attribute on this entry. */
+  /* ### not used by loggy; no need to set MODIFY_FLAGS  */
   {
     const char *schedulestr
-      = apr_hash_get(atts, SVN_WC__ENTRY_ATTR_SCHEDULE, APR_HASH_KEY_STRING);
+      = apr_hash_get(atts, ENTRIES_ATTR_SCHEDULE, APR_HASH_KEY_STRING);
 
     entry->schedule = svn_wc_schedule_normal;
     if (schedulestr)
       {
-        if (strcmp(schedulestr, SVN_WC__ENTRY_VALUE_ADD) == 0)
+        if (strcmp(schedulestr, ENTRIES_VALUE_ADD) == 0)
           entry->schedule = svn_wc_schedule_add;
-        else if (strcmp(schedulestr, SVN_WC__ENTRY_VALUE_DELETE) == 0)
+        else if (strcmp(schedulestr, ENTRIES_VALUE_DELETE) == 0)
           entry->schedule = svn_wc_schedule_delete;
-        else if (strcmp(schedulestr, SVN_WC__ENTRY_VALUE_REPLACE) == 0)
+        else if (strcmp(schedulestr, ENTRIES_VALUE_REPLACE) == 0)
           entry->schedule = svn_wc_schedule_replace;
         else if (strcmp(schedulestr, "") == 0)
           entry->schedule = svn_wc_schedule_normal;
         else
-          return svn_error_createf
-            (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
-             _("Entry '%s' has invalid '%s' value"),
-             (name ? name : SVN_WC_ENTRY_THIS_DIR),
-             SVN_WC__ENTRY_ATTR_SCHEDULE);
-
-        *modify_flags |= SVN_WC__ENTRY_MODIFY_SCHEDULE;
+          return svn_error_createf(
+                   SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
+                   _("Entry '%s' has invalid 'schedule' value"),
+                   (name ? name : SVN_WC_ENTRY_THIS_DIR));
       }
   }
 
   /* Is this entry in a state of mental torment (conflict)? */
-  entry->prejfile = extract_string(modify_flags, atts,
-                                   SVN_WC__ENTRY_ATTR_PREJFILE,
-                                   SVN_WC__ENTRY_MODIFY_PREJFILE,
-                                   TRUE, pool);
-  entry->conflict_old = extract_string(modify_flags, atts,
-                                       SVN_WC__ENTRY_ATTR_CONFLICT_OLD,
-                                       SVN_WC__ENTRY_MODIFY_CONFLICT_OLD,
-                                       TRUE, pool);
-  entry->conflict_new = extract_string(modify_flags, atts,
-                                       SVN_WC__ENTRY_ATTR_CONFLICT_NEW,
-                                       SVN_WC__ENTRY_MODIFY_CONFLICT_NEW,
-                                       TRUE, pool);
-  entry->conflict_wrk = extract_string(modify_flags, atts,
-                                       SVN_WC__ENTRY_ATTR_CONFLICT_WRK,
-                                       SVN_WC__ENTRY_MODIFY_CONFLICT_WRK,
-                                       TRUE, pool);
+  entry->prejfile = extract_string_normalize(
+                      modify_flags, atts,
+                      SVN_WC__ENTRY_ATTR_PREJFILE,
+                      SVN_WC__ENTRY_MODIFY_PREJFILE,
+                      pool);
+  entry->conflict_old = extract_string_normalize(
+                          modify_flags, atts,
+                          SVN_WC__ENTRY_ATTR_CONFLICT_OLD,
+                          SVN_WC__ENTRY_MODIFY_CONFLICT_OLD,
+                          pool);
+  entry->conflict_new = extract_string_normalize(
+                          modify_flags, atts,
+                          SVN_WC__ENTRY_ATTR_CONFLICT_NEW,
+                          SVN_WC__ENTRY_MODIFY_CONFLICT_NEW,
+                          pool);
+  entry->conflict_wrk = extract_string_normalize(
+                          modify_flags, atts,
+                          SVN_WC__ENTRY_ATTR_CONFLICT_WRK,
+                          SVN_WC__ENTRY_MODIFY_CONFLICT_WRK,
+                          pool);
 
   /* Is this entry copied? */
-  SVN_ERR(do_bool_attr(&entry->copied,
-                       modify_flags, SVN_WC__ENTRY_MODIFY_COPIED,
-                       atts, SVN_WC__ENTRY_ATTR_COPIED, name));
-
-  entry->copyfrom_url = extract_string(modify_flags, atts,
-                                       SVN_WC__ENTRY_ATTR_COPYFROM_URL,
-                                       SVN_WC__ENTRY_MODIFY_COPYFROM_URL,
-                                       FALSE, pool);
+  /* ### not used by loggy; no need to set MODIFY_FLAGS  */
+  SVN_ERR(do_bool_attr(&entry->copied, atts, ENTRIES_ATTR_COPIED, name));
 
+  /* ### not used by loggy; no need to set MODIFY_FLAGS  */
+  entry->copyfrom_url = extract_string(atts, ENTRIES_ATTR_COPYFROM_URL, pool);
+
+  /* ### not used by loggy; no need to set MODIFY_FLAGS  */
   {
     const char *revstr;
 
-    revstr = apr_hash_get(atts, SVN_WC__ENTRY_ATTR_COPYFROM_REV,
+    revstr = apr_hash_get(atts, ENTRIES_ATTR_COPYFROM_REV,
                           APR_HASH_KEY_STRING);
     if (revstr)
-      {
-        entry->copyfrom_rev = SVN_STR_TO_REV(revstr);
-        *modify_flags |= SVN_WC__ENTRY_MODIFY_COPYFROM_REV;
-      }
+      entry->copyfrom_rev = SVN_STR_TO_REV(revstr);
   }
 
   /* Is this entry deleted?
 
      ### not used by loggy; no need to set MODIFY_FLAGS  */
-  SVN_ERR(do_bool_attr(&entry->deleted,
-                       NULL, 0,
-                       atts, ENTRIES_ATTR_DELETED, name));
+  SVN_ERR(do_bool_attr(&entry->deleted, atts, ENTRIES_ATTR_DELETED, name));
 
   /* Is this entry absent?
 
      ### not used by loggy; no need to set MODIFY_FLAGS  */
-  SVN_ERR(do_bool_attr(&entry->absent,
-                       NULL, 0,
-                       atts, ENTRIES_ATTR_ABSENT, name));
+  SVN_ERR(do_bool_attr(&entry->absent, atts, ENTRIES_ATTR_ABSENT, name));
 
   /* Is this entry incomplete?
 
      ### not used by loggy; no need to set MODIFY_FLAGS  */
-  SVN_ERR(do_bool_attr(&entry->incomplete,
-                       NULL, 0,
-                       atts, ENTRIES_ATTR_INCOMPLETE, name));
+  SVN_ERR(do_bool_attr(&entry->incomplete, atts, ENTRIES_ATTR_INCOMPLETE,
+                       name));
 
   /* Attempt to set up timestamps. */
   {
@@ -940,17 +952,13 @@ svn_wc__atts_to_entry(svn_wc_entry_t **n
   }
 
   /* Checksum. */
-  entry->checksum = extract_string(modify_flags, atts,
-                                   SVN_WC__ENTRY_ATTR_CHECKSUM,
-                                   SVN_WC__ENTRY_MODIFY_CHECKSUM,
-                                   FALSE, pool);
+  /* ### not used by loggy; no need to set MODIFY_FLAGS  */
+  entry->checksum = extract_string(atts, ENTRIES_ATTR_CHECKSUM, pool);
 
   /* UUID.
 
      ### not used by loggy; no need to set MODIFY_FLAGS  */
-  entry->uuid = extract_string(NULL, atts,
-                               ENTRIES_ATTR_UUID,
-                               0, FALSE, pool);
+  entry->uuid = extract_string(atts, ENTRIES_ATTR_UUID, pool);
 
   /* Setup last-committed values. */
   {
@@ -973,21 +981,13 @@ svn_wc__atts_to_entry(svn_wc_entry_t **n
     else
       entry->cmt_rev = SVN_INVALID_REVNUM;
 
-    entry->cmt_author = extract_string(NULL, atts,
-                                       ENTRIES_ATTR_CMT_AUTHOR,
-                                       0, FALSE, pool);
+    entry->cmt_author = extract_string(atts, ENTRIES_ATTR_CMT_AUTHOR, pool);
   }
 
   /* ### not used by loggy; no need to set MODIFY_FLAGS  */
-  entry->lock_token = extract_string(NULL, atts,
-                                     ENTRIES_ATTR_LOCK_TOKEN,
-                                     0, FALSE, pool);
-  entry->lock_owner = extract_string(NULL, atts,
-                                     ENTRIES_ATTR_LOCK_OWNER,
-                                     0, FALSE, pool);
-  entry->lock_comment = extract_string(NULL, atts,
-                                       ENTRIES_ATTR_LOCK_COMMENT,
-                                       0, FALSE, pool);
+  entry->lock_token = extract_string(atts, ENTRIES_ATTR_LOCK_TOKEN, pool);
+  entry->lock_owner = extract_string(atts, ENTRIES_ATTR_LOCK_OWNER, pool);
+  entry->lock_comment = extract_string(atts, ENTRIES_ATTR_LOCK_COMMENT, pool);
   {
     const char *cdate_str =
       apr_hash_get(atts, ENTRIES_ATTR_LOCK_CREATION_DATE, APR_HASH_KEY_STRING);