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;
}
}