You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by es...@apache.org on 2013/11/07 14:33:25 UTC

svn commit: r1539634 - /subversion/trunk/contrib/server-side/svncutter/svncutter

Author: esr
Date: Thu Nov  7 13:33:24 2013
New Revision: 1539634

URL: http://svn.apache.org/r1539634
Log:
* contrib/server-side/svncutter/svncutter:
(expunge): Allow ^-anchored patterns in expunge node searches.
(skeleton): skeleton now takes regexp selection pattern a la expunge.

Modified:
    subversion/trunk/contrib/server-side/svncutter/svncutter

Modified: subversion/trunk/contrib/server-side/svncutter/svncutter
URL: http://svn.apache.org/viewvc/subversion/trunk/contrib/server-side/svncutter/svncutter?rev=1539634&r1=1539633&r2=1539634&view=diff
==============================================================================
--- subversion/trunk/contrib/server-side/svncutter/svncutter (original)
+++ subversion/trunk/contrib/server-side/svncutter/svncutter Thu Nov  7 13:33:24 2013
@@ -126,10 +126,12 @@ in the LOGFILE, which should be in the f
 Replacements may be restricted to a specified range.
 """,
     "skeleton": """\
-skeleton: usage: svncutter [-r SELECTION] skeleton
+skeleton: usage: svncutter [-r SELECTION] skeleton PATTERN...
 
-Replace content with unique generated cookies.  Useful
-when you need to examine a particularly complex node structure.
+Replace content with unique generated cookies on all node paths
+matching the specified regular expressions; if no expressions are
+given, match all paths.  Useful when you need to examine a
+particularly complex node structure.
 """,
     "expunge": """\
 expunge: usage: svncutter [-r SELECTION ] expunge PATTERN...
@@ -725,7 +727,7 @@ def setlog(source, logpatch, selection):
         return (propkeys, propdict)
     source.apply_property_hook(selection, loghook)
 
-def skeletonize(source, selection):
+def skeletonize(source, selection, patterns):
     "Skeletonize a portion of the dump file defined by a revision selection."
     def __skeletonize(header, properties, content):
         def get_header(hd, name):
@@ -733,6 +735,18 @@ def skeletonize(source, selection):
             return m and m.group(1)
         def set_length(hd, name, val):
             return re.sub("(?<=%s: )[0-9]+" % name, str(val), hd)
+
+        # first check against the pattern
+        ok = True
+        for pattern in patterns:
+            if header.startswith("Node-path: ") and re.search(pattern, header[11:]):
+                #sys.stderr.write("skeletonize skipping: " + header[11:header.index("\n")] +"\n")
+                ok = False
+                break
+        if not ok:
+            return header + properties + content
+        del ok
+
         if content:
             tell = "Revision is %s, file path is %s.\n\n\n" % \
                       (source.revision, get_header(header, "Node-path"),)
@@ -756,7 +770,8 @@ def expunge(source, selection, patterns)
     "Strip out ops defined by a revision selection and a path regexp."
     def __expunge(header, properties, content):
         for pattern in patterns:
-            if re.search("Node-path: " + pattern, header):
+            if header.startswith("Node-path: ") and re.search(pattern, header[11:]):
+                #sys.stderr.write("expunge skipping: " + header[11:header.index("\n")] +"\n")
                 return ""
         else:
             return header + properties + content
@@ -840,9 +855,9 @@ if __name__ == '__main__':
                 sys.stderr.write("svncutter: setlog requires a log entries file.\n")
             setlog(DumpfileSource(sys.stdin, baton), logpatch, selection)
         elif arguments[0] == "skeleton":
-            skeletonize(DumpfileSource(sys.stdin, baton), selection)
+            skeletonize(DumpfileSource(sys.stdin, baton), selection, arguments[1:])
         elif arguments[0] == "expunge":
-            expunge(DumpfileSource(sys.stdin, baton), selection, arguments)
+            expunge(DumpfileSource(sys.stdin, baton), selection, arguments[1:])
         elif arguments[0] == "renumber":
             renumber(DumpfileSource(sys.stdin, baton))
         elif arguments[0] == "help":