You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by cm...@apache.org on 2013/01/04 03:48:14 UTC

svn commit: r1428703 - in /subversion/branches/issue-3348-dev/subversion/libsvn_wc: wc-queries.sql wc_db.c

Author: cmpilato
Date: Fri Jan  4 02:48:14 2013
New Revision: 1428703

URL: http://svn.apache.org/viewvc?rev=1428703&view=rev
Log:
On the 'issue-3348-dev' branch:  Allow users to add all files not in a
changelist to a new changelist in a single 'svn' invocation:

   $ svn changelist new-list -R . --cl ""

* subversion/libsvn_wc/wc-queries.sql
  (STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES): Indentation tweak.
  (STMT_INSERT_TARGET_WITHOUT_CHANGELIST,
   STMT_INSERT_TARGET_WITHOUT_CHANGELIST_DEPTH_FILES_IMMEDIATES,
   STMT_INSERT_TARGET_WITHOUT_CHANGELIST_DEPTH_INFINITY): New statements.

* subversion/libsvn_wc/wc_db.c
  (populate_targets_tree): When filtering by changelist, handle the
    empty-string changelist specially.

Modified:
    subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc-queries.sql
    subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc_db.c

Modified: subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc-queries.sql?rev=1428703&r1=1428702&r2=1428703&view=diff
==============================================================================
--- subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc-queries.sql Fri Jan  4 02:48:14 2013
@@ -567,7 +567,7 @@ SELECT N.wc_id, N.local_relpath, N.paren
     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
  WHERE N.wc_id = ?1
    AND N.parent_relpath = ?2
-  AND A.changelist = ?3
+   AND A.changelist = ?3
 
 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY
 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
@@ -578,6 +578,36 @@ SELECT N.wc_id, N.local_relpath, N.paren
    AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
    AND A.changelist = ?3
 
+-- STMT_INSERT_TARGET_WITHOUT_CHANGELIST
+INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
+SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
+  FROM nodes_current AS N LEFT OUTER JOIN actual_node AS A
+    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
+ WHERE N.wc_id = ?1
+   AND N.local_relpath = ?2
+   AND kind = MAP_FILE
+   AND A.changelist IS NULL
+
+-- STMT_INSERT_TARGET_WITHOUT_CHANGELIST_DEPTH_FILES_IMMEDIATES
+INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
+SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
+  FROM nodes_current AS N LEFT OUTER JOIN actual_node AS A
+    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
+ WHERE N.wc_id = ?1
+   AND N.parent_relpath = ?2
+   AND kind = MAP_FILE
+   AND A.changelist IS NULL
+
+-- STMT_INSERT_TARGET_WITHOUT_CHANGELIST_DEPTH_INFINITY
+INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
+SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
+  FROM nodes_current AS N LEFT OUTER JOIN actual_node AS A
+    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
+ WHERE N.wc_id = ?1
+   AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
+   AND kind = MAP_FILE
+   AND A.changelist IS NULL
+
 /* Only used by commented dump_targets() in wc_db.c */
 /*-- STMT_SELECT_TARGETS
 SELECT local_relpath, parent_relpath from targets_list*/

Modified: subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc_db.c?rev=1428703&r1=1428702&r2=1428703&view=diff
==============================================================================
--- subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/branches/issue-3348-dev/subversion/libsvn_wc/wc_db.c Fri Jan  4 02:48:14 2013
@@ -5262,6 +5262,7 @@ populate_targets_tree(svn_wc__db_wcroot_
 {
   svn_sqlite__stmt_t *stmt;
   int affected_rows = 0;
+
   SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
                                       STMT_CREATE_TARGETS_LIST));
 
@@ -5273,30 +5274,6 @@ populate_targets_tree(svn_wc__db_wcroot_
       int i;
       int stmt_idx;
 
-      switch (depth)
-        {
-          case svn_depth_empty:
-            stmt_idx = STMT_INSERT_TARGET_WITH_CHANGELIST;
-            break;
-
-          case svn_depth_files:
-            stmt_idx = STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES;
-            break;
-
-          case svn_depth_immediates:
-            stmt_idx = STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES;
-            break;
-
-          case svn_depth_infinity:
-            stmt_idx = STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY;
-            break;
-
-          default:
-            /* We don't know how to handle unknown or exclude. */
-            SVN_ERR_MALFUNCTION();
-            break;
-        }
-
       for (i = 0; i < changelist_filter->nelts; i++)
         {
           int sub_affected;
@@ -5304,21 +5281,85 @@ populate_targets_tree(svn_wc__db_wcroot_
                                                  const char *);
 
           SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                        STMT_INSERT_TARGET_WITH_CHANGELIST));
+                                            STMT_INSERT_TARGET_WITH_CHANGELIST));
           SVN_ERR(svn_sqlite__bindf(stmt, "iss", wcroot->wc_id,
                                     local_relpath, changelist));
           SVN_ERR(svn_sqlite__update(&sub_affected, stmt));
+          affected_rows += sub_affected;
 
           /* If the root is matched by the changelist, we don't have to match
              the children. As that tells us the root is a file */
-          if (!sub_affected && depth > svn_depth_empty)
+          if (sub_affected || depth <= svn_depth_empty)
+            continue;
+
+          /* If the changelist name is not the empty string, use SQL
+             statements which find the nodes in the `actual_node'
+             table that carry this changelist. */
+          if (*changelist != '\0')
             {
+              switch (depth)
+                {
+                case svn_depth_files:
+                  stmt_idx =
+                    STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES;
+                  break;
+                  
+                case svn_depth_immediates:
+                  stmt_idx =
+                    STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES;
+                  break;
+                  
+                case svn_depth_infinity:
+                  stmt_idx =
+                    STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY;
+                  break;
+                  
+                case svn_depth_empty:
+                default:
+                  /* We don't know how to handle unknown or
+                     exclude, and shouldn't hit empty. */
+                  SVN_ERR_MALFUNCTION();
+                  break;
+                }
+              
               SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, stmt_idx));
               SVN_ERR(svn_sqlite__bindf(stmt, "iss", wcroot->wc_id,
                                         local_relpath, changelist));
               SVN_ERR(svn_sqlite__update(&sub_affected, stmt));
             }
+          else
+            {
+              /* Otherwise (if the changelist name *is* empty), we use a
+                 different set of SQL statements which find all file nodes
+                 that *don't* have a changelist assignment. */
 
+              switch (depth)
+                {
+                case svn_depth_files:
+                case svn_depth_immediates:
+                  stmt_idx =
+                    STMT_INSERT_TARGET_WITHOUT_CHANGELIST_DEPTH_FILES_IMMEDIATES;
+                  break;
+                  
+                case svn_depth_infinity:
+                  stmt_idx =
+                    STMT_INSERT_TARGET_WITHOUT_CHANGELIST_DEPTH_INFINITY;
+                  break;
+                  
+                case svn_depth_empty:
+                default:
+                  /* We don't know how to handle unknown or exclude,
+                     and shouldn't hit empty. */
+                  SVN_ERR_MALFUNCTION();
+                  break;
+                }
+                  
+              SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, stmt_idx));
+              SVN_ERR(svn_sqlite__bindf(stmt, "is",
+                                        wcroot->wc_id, local_relpath));
+              SVN_ERR(svn_sqlite__update(&sub_affected, stmt));
+            }
+          
           affected_rows += sub_affected;
         }
     }