I've drilled a changelist into 'svn patch'.

[[[
0:% $svn st subversion 
0:% $svn patch ../diffs/svn-patch-add_to_cl.diff --add-to-cl cl
A [cl] subversion/tests/libsvn_client/client-test.c
U         subversion/tests/libsvn_client/client-test.c
A [cl] subversion/svn/patch-cmd.c
U         subversion/svn/patch-cmd.c
A [cl] subversion/svn/cl.h
U         subversion/svn/cl.h
A [cl] subversion/svn/main.c
U         subversion/svn/main.c
A [cl] subversion/include/svn_client.h
U         subversion/include/svn_client.h
A [cl] subversion/libsvn_client/patch.c
U         subversion/libsvn_client/patch.c
0:% $svn st --cl cl

--- Changelist 'cl':
M       subversion/include/svn_client.h
M       subversion/tests/libsvn_client/client-test.c
M       subversion/svn/patch-cmd.c
M       subversion/svn/cl.h
M       subversion/svn/main.c
M       subversion/libsvn_client/patch.c
]]]

Comments?  Thoughts?

I haven't tested how it integrates with tree changes (files being
added/removed/moved/copied by 'svn patch') yet.  In fact, I'm not sure what's
the current status of that: does 'svn patch' currently support tree operations
other than adding/removing files?
Index: subversion/tests/libsvn_client/client-test.c
===================================================================
--- subversion/tests/libsvn_client/client-test.c	(revision 978886)
+++ subversion/tests/libsvn_client/client-test.c	(working copy)
@@ -380,7 +380,7 @@ test_patch(const svn_test_opts_t *opts,
   pcb.reject_tempfiles = apr_hash_make(pool);
   pcb.state_pool = pool;
   SVN_ERR(svn_client_patch(patch_file_path, wc_path, FALSE, 0, FALSE,
-                           FALSE, FALSE, patch_collection_func, &pcb,
+                           FALSE, FALSE, NULL, patch_collection_func, &pcb,
                            ctx, pool, pool));
   SVN_ERR(svn_io_file_close(patch_file, pool));
 
Index: subversion/svn/patch-cmd.c
===================================================================
--- subversion/svn/patch-cmd.c	(revision 978886)
+++ subversion/svn/patch-cmd.c	(working copy)
@@ -76,7 +76,8 @@ svn_cl__patch(apr_getopt_t *os,
                            opt_state->dry_run, opt_state->strip_count,
                            opt_state->reverse_diff,
                            opt_state->ignore_whitespace,
-                           TRUE, NULL, NULL, ctx, pool, pool));
+                           TRUE, opt_state->add_to_changelist,
+                           NULL, NULL, ctx, pool, pool));
 
 
   if (! opt_state->quiet)
Index: subversion/svn/cl.h
===================================================================
--- subversion/svn/cl.h	(revision 978886)
+++ subversion/svn/cl.h	(working copy)
@@ -208,6 +208,7 @@ typedef struct svn_cl__opt_state_t
   apr_array_header_t *changelists; /* changelist filters */
   const char *changelist;        /* operate on this changelist
                                     THIS IS TEMPORARY (LAST OF CHANGELISTS) */
+  const char *add_to_changelist; /* add to this changelist */
   svn_boolean_t keep_changelists;/* don't remove changelists after commit */
   svn_boolean_t keep_local;      /* delete path only from repository */
   svn_boolean_t all_revprops;    /* retrieve all revprops */
Index: subversion/svn/main.c
===================================================================
--- subversion/svn/main.c	(revision 978886)
+++ subversion/svn/main.c	(working copy)
@@ -122,6 +122,7 @@ typedef enum {
   opt_show_diff,
   opt_internal_diff,
   opt_use_git_diff_format,
+  opt_add_to_changelist,
 } svn_cl__longopt_t;
 
 /* Option codes and descriptions for the command line client.
@@ -290,6 +291,10 @@ const apr_getopt_option_t svn_cl__options[] =
                     N_("operate only on members of changelist ARG\n"
                        "                             "
                        "[alias: --cl]")},
+  {"add-to-changelist",    opt_add_to_changelist, 1,
+                    N_("add files to changelist ARG\n"
+                       "                             "
+                       "[alias: --add-to-cl]")},
   {"keep-changelists", opt_keep_changelists, 0,
                     N_("don't delete changelists after commit")},
   {"keep-local",    opt_keep_local, 0, N_("keep path in working copy\n"
@@ -390,6 +395,7 @@ const apr_getopt_option_t svn_cl__options[] =
   {"ro",            opt_record_only, 0, NULL},
   {"cd",            opt_config_dir, 1, NULL},
   {"cl",            opt_changelist, 1, NULL},
+  {"add-to-cl",     opt_add_to_changelist, 1, NULL},
   {"kl",            opt_keep_local, 0, NULL},
   {"sr",            opt_show_revs, 1, NULL},
   {"ri",            opt_reintegrate, 0, NULL},
@@ -848,7 +854,10 @@ const svn_opt_subcommand_desc2_t svn_cl__cmd_table
      "  do not agree with.\n"
      ),
     {'q', opt_dry_run, opt_strip_count, opt_reverse_diff,
-     opt_ignore_whitespace} },
+     opt_ignore_whitespace, opt_add_to_changelist},
+    {{opt_add_to_changelist, N_("add patched files to changelist ARG\n"
+                                "                             "
+                                "[alias: --add-to-cl]")}} },
 
   { "propdel", svn_cl__propdel, {"pdel", "pd"}, N_
     ("Remove a property from files, dirs, or revisions.\n"
@@ -1699,6 +1708,9 @@ main(int argc, const char *argv[])
         apr_hash_set(changelists, opt_state.changelist,
                      APR_HASH_KEY_STRING, (void *)1);
         break;
+      case opt_add_to_changelist:
+        opt_state.add_to_changelist = apr_pstrdup(pool, opt_arg);
+        break;
       case opt_keep_changelists:
         opt_state.keep_changelists = TRUE;
         break;
Index: subversion/include/svn_client.h
===================================================================
--- subversion/include/svn_client.h	(revision 978886)
+++ subversion/include/svn_client.h	(working copy)
@@ -5235,6 +5235,9 @@ typedef svn_error_t *(*svn_client_patch_func_t)(
  * If @a patch_func is non-NULL, invoke @a patch_func with @a patch_baton
  * for each patch target processed.
  *
+ * If @a changelist is non-NULL, add each patch target processed to that
+ * changelist.
+ *
  * If @a ctx->notify_func2 is non-NULL, invoke @a ctx->notify_func2 with
  * @a ctx->notify_baton2 as patching progresses.
  *
@@ -5253,6 +5256,7 @@ svn_client_patch(const char *patch_abspath,
                  svn_boolean_t reverse,
                  svn_boolean_t ignore_whitespace,
                  svn_boolean_t remove_tempfiles,
+                 const char *changelist,
                  svn_client_patch_func_t patch_func,
                  void *patch_baton,
                  svn_client_ctx_t *ctx,
Index: subversion/libsvn_client/patch.c
===================================================================
--- subversion/libsvn_client/patch.c	(revision 978886)
+++ subversion/libsvn_client/patch.c	(working copy)
@@ -1463,8 +1463,11 @@ apply_one_patch(patch_target_t **patch_target, svn
                 int strip_count,
                 svn_boolean_t ignore_whitespace,
                 svn_boolean_t remove_tempfiles,
+                const char *changelist,
                 svn_client_patch_func_t patch_func,
                 void *patch_baton,
+                svn_wc_notify_func2_t notify_func2,
+                void *notify_baton2,
                 svn_cancel_func_t cancel_func,
                 void *cancel_baton,
                 apr_pool_t *result_pool, apr_pool_t *scratch_pool)
@@ -1496,6 +1499,14 @@ apply_one_patch(patch_target_t **patch_target, svn
         }
     }
 
+  if (changelist && target->kind_on_disk == svn_node_file)
+    {
+      SVN_ERR(svn_wc_set_changelist2(wc_ctx, target->local_abspath, changelist,
+                                     cancel_func, cancel_baton,
+                                     notify_func2, notify_baton2,
+                                     scratch_pool));
+    }
+
   iterpool = svn_pool_create(scratch_pool);
   /* Match hunks. */
   for (i = 0; i < patch->hunks->nelts; i++)
@@ -2261,6 +2272,9 @@ typedef struct {
 
   /* The client context. */
   svn_client_ctx_t *ctx;
+
+  /* The changelist (if any) to associate the files with. */
+  const char *changelist;
 } apply_patches_baton_t;
 
 /* Callback for use with svn_wc__call_with_write_lock().
@@ -2312,7 +2326,10 @@ apply_patches(void *baton,
                                   btn->ctx->wc_ctx, btn->strip_count,
                                   btn->ignore_whitespace,
                                   btn->remove_tempfiles,
+                                  btn->changelist,
                                   btn->patch_func, btn->patch_baton,
+                                  btn->ctx->notify_func2,
+                                  btn->ctx->notify_baton2,
                                   btn->ctx->cancel_func,
                                   btn->ctx->cancel_baton,
                                   iterpool, iterpool));
@@ -2357,6 +2374,7 @@ svn_client_patch(const char *patch_abspath,
                  svn_boolean_t reverse,
                  svn_boolean_t ignore_whitespace,
                  svn_boolean_t remove_tempfiles,
+                 const char *changelist,
                  svn_client_patch_func_t patch_func,
                  void *patch_baton,
                  svn_client_ctx_t *ctx,
@@ -2379,6 +2397,7 @@ svn_client_patch(const char *patch_abspath,
   baton.remove_tempfiles = remove_tempfiles;
   baton.patch_func = patch_func;
   baton.patch_baton = patch_baton;
+  baton.changelist = changelist;
 
   return svn_error_return(
            svn_wc__call_with_write_lock(apply_patches, &baton,

Reply via email to