Using 1.6 client
================
noorul@noorul:/tmp/wc/repos$ ls a
ls: cannot access a: No such file or directory
noorul@noorul:/tmp/wc/repos$ svn cl testlist a
svn: warning: 'a' is not under version control
noorul@noorul:/tmp/wc/repos$ svn cl a --remove
svn: warning: 'a' is not under version control
noorul@noorul:/tmp/wc/repos$ touch a
noorul@noorul:/tmp/wc/repos$ ls a
a
noorul@noorul:/tmp/wc/repos$ svn cl testlist a
svn: warning: 'a' is not under version control
noorul@noorul:/tmp/wc/repos$ svn cl a --remove
svn: warning: 'a' is not under version control

Using 1.7 client
================
noorul@noorul:/tmp/wc/repos1$ ls a 
ls: cannot access a: No such file or directory
noorul@noorul:/tmp/wc/repos1$ ~/projects/subversion/builds/trunk/bin/svn cl 
testlist a
noorul@noorul:/tmp/wc/repos1$ ~/projects/subversion/builds/trunk/bin/svn cl a 
--remove
noorul@noorul:/tmp/wc/repos1$ touch a
noorul@noorul:/tmp/wc/repos1$ ls a
a
noorul@noorul:/tmp/wc/repos1$ ~/projects/subversion/builds/trunk/bin/svn cl 
testlist a
noorul@noorul:/tmp/wc/repos1$ ~/projects/subversion/builds/trunk/bin/svn cl a 
--remove

The attached patch fixes this regression.

Log
[[[

Fix regression in 'svn cl' add/remove operations on
non-existent/unversioned target.

* subversion/libsvn_wc/adm_ops.c
  (svn_wc_set_changelist2): If the target is unversioned/non-existent
    then return error (SVN_ERR_UNVERSIONED_RESOURCE).

* subversion/tests/cmdline/changelist_tests.py
  (add_remove_non_existent_target, add_remove_unversioned_target):
    New tests.
  (test_list): Run them.

Patch by: Noorul Islam K M <noorul{_AT_}collab.net>
Found by: danielsh
]]]

Index: subversion/tests/cmdline/changelist_tests.py
===================================================================
--- subversion/tests/cmdline/changelist_tests.py        (revision 1145455)
+++ subversion/tests/cmdline/changelist_tests.py        (working copy)
@@ -1132,8 +1132,44 @@
                                      'revert', '-R', sbox.ospath('A'))
   svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('A/mu'))
 
+def add_remove_non_existent_target(sbox):
+  "add and remove non-existent target to changelist"
 
+  sbox.build(read_only = True)
+  wc_dir = sbox.wc_dir
+  bogus_path = os.path.join(wc_dir, 'A', 'bogus')
 
+  expected_err = "svn: warning: W200005: '" + \
+                 re.escape(os.path.abspath(bogus_path)) + \
+                 "' is not under version control"
+
+  svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+                                     'changelist', 'testlist',
+                                     bogus_path)
+
+  svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+                                     'changelist', bogus_path,
+                                      '--remove')
+
+def add_remove_unversioned_target(sbox):
+  "add and remove unversioned target to changelist"
+
+  sbox.build(read_only = True)
+  unversioned = sbox.ospath('unversioned')
+  svntest.main.file_write(unversioned, "dummy contents", 'w+')
+
+  expected_err = "svn: warning: W200005: '" + \
+                 re.escape(os.path.abspath(unversioned)) + \
+                 "' is not under version control"
+
+  svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+                                     'changelist', 'testlist',
+                                     unversioned)
+
+  svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
+                                     'changelist', unversioned,
+                                      '--remove')
+
 ########################################################################
 # Run the tests
 
@@ -1153,6 +1189,8 @@
               move_added_keeps_changelist,
               change_to_dir,
               revert_deleted_in_changelist,
+              add_remove_non_existent_target,
+              add_remove_unversioned_target,
              ]
 
 if __name__ == '__main__':
Index: subversion/libsvn_wc/adm_ops.c
===================================================================
--- subversion/libsvn_wc/adm_ops.c      (revision 1145455)
+++ subversion/libsvn_wc/adm_ops.c      (working copy)
@@ -2200,11 +2200,21 @@
                        void *notify_baton,
                        apr_pool_t *scratch_pool)
 {
+  svn_node_kind_t kind;
+  
   /* Assert that we aren't being asked to set an empty changelist. */
   SVN_ERR_ASSERT(! (new_changelist && new_changelist[0] == '\0'));
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
 
+  SVN_ERR(svn_wc_read_kind(&kind, wc_ctx, local_abspath, FALSE, scratch_pool));
+
+  if (kind == svn_node_none)
+    return svn_error_createf(SVN_ERR_UNVERSIONED_RESOURCE, NULL,
+                             _("'%s' is not under version control"),
+                             svn_dirent_local_style(local_abspath,
+                                                    scratch_pool));
+
   SVN_ERR(svn_wc__db_op_set_changelist(wc_ctx->db, local_abspath,
                                        new_changelist, changelist_filter,
                                        depth, notify_func, notify_baton,

Reply via email to