subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From futat...@apache.org
Subject svn commit: r1877712 - in /subversion/trunk/subversion/tests/cmdline: entries-dump.c svntest/main.py
Date Thu, 14 May 2020 01:46:35 GMT
Author: futatuki
Date: Thu May 14 01:46:35 2020
New Revision: 1877712

URL: http://svn.apache.org/viewvc?rev=1877712&view=rev
Log:
Use safe bytes literals when set string values in working copy entries. 

* subversion/tests/cmdline/entries-dump.c
  (print_prefix): New function.
  (str_value):
  - Add argument to specify pool.
  - Print human readable value of "value" as is in comment, then set it
    as str value by using hex escaped bytes literal.
  (entries_dump): Add pool argument to str_value() calls.
  (main):
  - Print "Entry" class definition as prefix before entry_dump() or tree_dump() 
  - Style fix on if statement (using blocks). 
  (): Add include files for assert() and svn_xml_escape_attr_cstring()
* subversion/tests/cmdline/svntest/main.py
  (run_entiresdump, run_entriesdump_tree): Move definition of "Entry" class
  into generated code by entries-dump execution. 

Review By: danielsh

Modified:
    subversion/trunk/subversion/tests/cmdline/entries-dump.c
    subversion/trunk/subversion/tests/cmdline/svntest/main.py

Modified: subversion/trunk/subversion/tests/cmdline/entries-dump.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/entries-dump.c?rev=1877712&r1=1877711&r2=1877712&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/entries-dump.c (original)
+++ subversion/trunk/subversion/tests/cmdline/entries-dump.c Thu May 14 01:46:35 2020
@@ -23,6 +23,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <assert.h>
 
 #include <apr_pools.h>
 #include <apr_general.h>
@@ -34,6 +35,7 @@
 #include "svn_pools.h"
 #include "svn_wc.h"
 #include "svn_dirent_uri.h"
+#include "svn_xml.h"
 
 #include "private/svn_wc_private.h"
 
@@ -41,12 +43,45 @@
 #include "../../libsvn_wc/lock.h"
 
 static void
-str_value(const char *name, const char *value)
+print_prefix(void)
+{
+  puts("class Entry(object):\n"
+       "  \"\"\"An Entry object represents one node's entry in a pre-1.6"
+       " .svn/entries file.\n\n"
+       "Similar to #svn_wc_entry_t, but not all fields are populated.\n\n"
+       "Entry objects are generated by the 'entries-dump'"
+       " test helper tool.\"\"\"\n\n"
+       "  if b'' == '':\n"
+       "    def set_strval(self, name, val):\n"
+       "      self.__setattr__(name, val)\n"
+       "  else:\n"
+       "    def set_strval(self, name, val):\n"
+       "      self.__setattr__(name, val.decode('utf-8', "
+       "'surrogateescape'))\n");
+}
+
+static void
+str_value(const char *name, const char *value, apr_pool_t *pool)
 {
   if (value == NULL)
     printf("e.%s = None\n", name);
   else
-    printf("e.%s = '%s'\n", name, value);
+    {
+      svn_stringbuf_t *escaped_value = NULL;
+      svn_xml_escape_attr_cstring(&escaped_value, value, pool);
+
+      /* Print the human-readable value. */
+      assert(NULL == strchr(escaped_value->data, '\n'));
+      printf("# e.%s = %s\n", name, escaped_value->data);
+
+      /* Print the machine-readable value. */
+      printf("e.set_strval('%s', b'", name);
+      while(*value)
+        {
+          printf("\\x%02x", (unsigned int)(unsigned char)*value++);
+        }      
+      printf("')\n");
+    }
 }
 
 
@@ -130,38 +165,38 @@ entries_dump(const char *dir_path, svn_w
       SVN_ERR_ASSERT(strcmp(key, entry->name) == 0);
 
       printf("e = Entry()\n");
-      str_value("name", entry->name);
+      str_value("name", entry->name, pool);
       int_value("revision", entry->revision);
-      str_value("url", entry->url);
-      str_value("repos", entry->repos);
-      str_value("uuid", entry->uuid);
+      str_value("url", entry->url, pool);
+      str_value("repos", entry->repos, pool);
+      str_value("uuid", entry->uuid, pool);
       int_value("kind", entry->kind);
       int_value("schedule", entry->schedule);
       bool_value("copied", entry->copied);
       bool_value("deleted", entry->deleted);
       bool_value("absent", entry->absent);
       bool_value("incomplete", entry->incomplete);
-      str_value("copyfrom_url", entry->copyfrom_url);
+      str_value("copyfrom_url", entry->copyfrom_url, pool);
       int_value("copyfrom_rev", entry->copyfrom_rev);
-      str_value("conflict_old", entry->conflict_old);
-      str_value("conflict_new", entry->conflict_new);
-      str_value("conflict_wrk", entry->conflict_wrk);
-      str_value("prejfile", entry->prejfile);
+      str_value("conflict_old", entry->conflict_old, pool);
+      str_value("conflict_new", entry->conflict_new, pool);
+      str_value("conflict_wrk", entry->conflict_wrk, pool);
+      str_value("prejfile", entry->prejfile, pool);
       /* skip: text_time */
       /* skip: prop_time */
       /* skip: checksum */
       int_value("cmt_rev", entry->cmt_rev);
       /* skip: cmt_date */
-      str_value("cmt_author", entry->cmt_author);
-      str_value("lock_token", entry->lock_token);
-      str_value("lock_owner", entry->lock_owner);
-      str_value("lock_comment", entry->lock_comment);
+      str_value("cmt_author", entry->cmt_author, pool);
+      str_value("lock_token", entry->lock_token, pool);
+      str_value("lock_owner", entry->lock_owner, pool);
+      str_value("lock_comment", entry->lock_comment, pool);
       /* skip: lock_creation_date */
       /* skip: has_props */
       /* skip: has_prop_mods */
       /* skip: cachable_props */
       /* skip: present_props */
-      str_value("changelist", entry->changelist);
+      str_value("changelist", entry->changelist, pool);
       /* skip: working_size */
       /* skip: keep_local */
       int_value("depth", entry->depth);
@@ -384,15 +419,25 @@ main(int argc, const char *argv[])
     cmd = NULL;
 
   if (!cmd || !strcmp(cmd, "--entries"))
-    err = entries_dump(path, NULL, pool);
+    {
+      print_prefix();
+      err = entries_dump(path, NULL, pool);
+    }
   else if (!strcmp(cmd, "--subdirs"))
-    err = directory_dump(path, pool);
+    {
+      err = directory_dump(path, pool);
+    }
   else if (!strcmp(cmd, "--tree-dump"))
-    err = tree_dump(path, pool);
+    {
+      print_prefix();
+      err = tree_dump(path, pool);
+    }
   else
-    err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
-                            "Invalid command '%s'",
-                            cmd);
+    {
+      err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+                              "Invalid command '%s'",
+                              cmd);
+    }
   if (err)
     {
       svn_handle_error2(err, stderr, FALSE, "entries-dump: ");

Modified: subversion/trunk/subversion/tests/cmdline/svntest/main.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/main.py?rev=1877712&r1=1877711&r2=1877712&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/main.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svntest/main.py Thu May 14 01:46:35 2020
@@ -902,8 +902,6 @@ def run_entriesdump(path):
     ### report on this? or continue to just skip it?
     return None
 
-  class Entry(object):
-    pass
   entries = { }
   exec(''.join(filter_dbg(stdout_lines)))
   return entries
@@ -927,8 +925,6 @@ def run_entriesdump_tree(path):
     ### report on this? or continue to just skip it?
     return None
 
-  class Entry(object):
-    pass
   dirs = { }
   exec(''.join(filter_dbg(stdout_lines)))
   return dirs



Mime
View raw message