[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r1310925 - /subversion/trunk/subversion/libsvn_delta/compat.c

From: Hyrum K Wright <hyrum.wright_at_wandisco.com>
Date: Mon, 9 Apr 2012 13:06:29 -0500

On Sat, Apr 7, 2012 at 7:35 PM, Greg Stein <gstein_at_gmail.com> wrote:
> Hyrum,
>
> This is a start to fix the URL issue. I'm away for a while, so feel
> free to patch up the two map_to_* functions with the right magic.

That's just like you: break everything and then go on vacation. ;)

> There is a separate issue about the editor roots, in order to properly
> support copy sources (also see r1310929). We probably need to adjust
> the root that we're using for the Ev2 drive.

Adjust, or at least standardize.

-Hyrum

> On Sat, Apr 7, 2012 at 20:13,  <gstein_at_apache.org> wrote:
>> Author: gstein
>> Date: Sun Apr  8 00:13:26 2012
>> New Revision: 1310925
>>
>> URL: http://svn.apache.org/viewvc?rev=1310925&view=rev
>> Log:
>> Ev2 shims:
>>
>> First pass at the work necessary to deal with copyfrom_path values
>> that can be URLs. When we call svn_editor_copy(), we can only pass
>> relpath values.
>>
>> This commit will map all incoming paths in the delta editor callbacks
>> into relpath values.
>>
>> Note: strictly speaking, the copy source may not be within a working
>> copy, so it generally means an editor drive should be based on
>> repos_root so that all sources can be referenced. Thus, we map the
>> copyfrom paths a little bit different.
>>  (future commit to update svn_editor.h docco with this point)
>>
>> Note: I'm not entirely sure that normal paths in an Ev1 drive are ever
>> URLs. This mapping may only apply to copyfrom sources.
>>
>> * subversion/libsvn_delta/compat.c:
>>  (map_to_relpath, map_to_repos_relpath): new helpers to deal with
>>    potential URLs, and turn them into relpaths.
>>  (ev2_delete_entry): map the incoming PATH to a relpath
>>  (ev2_add_directory): map the incoming PATH and COPYFROM_PATH to
>>    relpaths. introduce a pseudo-scratch_pool and use it. reorder
>>    copyfrom handling to make CHANGE be the definitive values.
>>  (ev2_open_directory): map the incoming PATH to a relpath. introduce
>>    a pseudo-scratch_pool and use it.
>>  (ev2_absent_directory): map the incoming PATH to a relpath
>>  (ev2_add_file): map the incoming PATH and COPYFROM_PATH to relpaths.
>>    introduce a pseudo-scratch_pool and use it. reorder copyfrom
>>    handling to make CHANGE be the definitive values.
>>  (ev2_open_file): map the incoming PATH to a relpath. introduce a
>>    pseudo-scratch_pool and use it.
>>  (ev2_absent_file): map the incoming PATH to a relpath
>>
>> Modified:
>>    subversion/trunk/subversion/libsvn_delta/compat.c
>>
>> Modified: subversion/trunk/subversion/libsvn_delta/compat.c
>> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_delta/compat.c?rev=1310925&r1=1310924&r2=1310925&view=diff
>> ==============================================================================
>> --- subversion/trunk/subversion/libsvn_delta/compat.c (original)
>> +++ subversion/trunk/subversion/libsvn_delta/compat.c Sun Apr  8 00:13:26 2012
>> @@ -593,6 +593,43 @@ run_ev2_actions(struct ev2_edit_baton *e
>>   return SVN_NO_ERROR;
>>  }
>>
>> +
>> +static const char *
>> +map_to_relpath(struct ev2_edit_baton *eb,
>> +               const char *path_or_url,
>> +               apr_pool_t *result_pool)
>> +{
>> +  if (svn_relpath_is_canonical(path_or_url))
>> +    return apr_pstrdup(result_pool, path_or_url);
>> +
>> +#ifdef SVN_DEBUG
>> +  SVN_DBG(("path='%s'\n", path_or_url));
>> +#endif
>> +
>> +  /* ### do something here  */
>> +
>> +  return path_or_url;
>> +}
>> +
>> +
>> +static const char *
>> +map_to_repos_relpath(struct ev2_edit_baton *eb,
>> +                     const char *path_or_url,
>> +                     apr_pool_t *result_pool)
>> +{
>> +  if (svn_relpath_is_canonical(path_or_url))
>> +    return apr_pstrdup(result_pool, path_or_url);
>> +
>> +#ifdef SVN_DEBUG
>> +  SVN_DBG(("repos_path='%s'\n", path_or_url));
>> +#endif
>> +
>> +  /* ### do something here  */
>> +
>> +  return path_or_url;
>> +}
>> +
>> +
>>  static svn_error_t *
>>  ev2_set_target_revision(void *edit_baton,
>>                         svn_revnum_t target_revision,
>> @@ -636,14 +673,15 @@ ev2_delete_entry(const char *path,
>>  {
>>   struct ev2_dir_baton *pb = parent_baton;
>>   svn_revnum_t *revnum = apr_palloc(pb->eb->edit_pool, sizeof(*revnum));
>> -  struct change_node *change = locate_change(pb->eb, path);
>> +  const char *relpath = map_to_relpath(pb->eb, path, scratch_pool);
>> +  struct change_node *change = locate_change(pb->eb, relpath);
>>
>>   if (SVN_IS_VALID_REVNUM(revision))
>>     *revnum = revision;
>>   else
>>     *revnum = pb->base_revision;
>>
>> -  SVN_ERR(add_action(pb->eb, path, ACTION_DELETE, revnum));
>> +  SVN_ERR(add_action(pb->eb, relpath, ACTION_DELETE, revnum));
>>
>>   /* ### note: cannot switch to CHANGES just yet. the action loop needs
>>      ### to see a delete action, and set NEED_DELETE. that is used for
>> @@ -670,15 +708,18 @@ ev2_add_directory(const char *path,
>>                   apr_pool_t *result_pool,
>>                   void **child_baton)
>>  {
>> +  /* ### fix this?  */
>> +  apr_pool_t *scratch_pool = result_pool;
>>   struct ev2_dir_baton *pb = parent_baton;
>>   struct ev2_dir_baton *cb = apr_pcalloc(result_pool, sizeof(*cb));
>> -  struct change_node *change = locate_change(pb->eb, path);
>> +  const char *relpath = map_to_relpath(pb->eb, path, scratch_pool);
>> +  struct change_node *change = locate_change(pb->eb, relpath);
>>
>>   /* ### assert that RESTRUCTURE is NONE or DELETE?  */
>>   change->action = RESTRUCTURE_ADD;
>>
>>   cb->eb = pb->eb;
>> -  cb->path = apr_pstrdup(result_pool, path);
>> +  cb->path = apr_pstrdup(result_pool, relpath);
>>   cb->base_revision = pb->base_revision;
>>   *child_baton = cb;
>>
>> @@ -688,11 +729,11 @@ ev2_add_directory(const char *path,
>>       svn_kind_t *kind = apr_palloc(pb->eb->edit_pool, sizeof(*kind));
>>
>>       *kind = svn_kind_dir;
>> -      SVN_ERR(add_action(pb->eb, path, ACTION_ADD, kind));
>> +      SVN_ERR(add_action(pb->eb, relpath, ACTION_ADD, kind));
>>
>>       if (pb->copyfrom_path)
>>         {
>> -          const char *name = svn_relpath_basename(path, result_pool);
>> +          const char *name = svn_relpath_basename(relpath, scratch_pool);
>>           cb->copyfrom_path = apr_pstrcat(result_pool, pb->copyfrom_path,
>>                                           "/", name, NULL);
>>           cb->copyfrom_rev = pb->copyfrom_rev;
>> @@ -703,15 +744,16 @@ ev2_add_directory(const char *path,
>>       /* A copy */
>>       struct copy_args *args = apr_palloc(pb->eb->edit_pool, sizeof(*args));
>>
>> -      args->copyfrom_path = apr_pstrdup(pb->eb->edit_pool, copyfrom_path);
>> -      args->copyfrom_rev = copyfrom_revision;
>> -      SVN_ERR(add_action(pb->eb, path, ACTION_COPY, args));
>> +      change->copyfrom_path = map_to_repos_relpath(pb->eb, copyfrom_path,
>> +                                                   pb->eb->edit_pool);
>> +      change->copyfrom_rev = copyfrom_revision;
>>
>> -      cb->copyfrom_path = args->copyfrom_path;
>> -      cb->copyfrom_rev = args->copyfrom_rev;
>> +      args->copyfrom_path = change->copyfrom_path;
>> +      args->copyfrom_rev = change->copyfrom_rev;
>> +      SVN_ERR(add_action(pb->eb, relpath, ACTION_COPY, args));
>>
>> -      change->copyfrom_path = apr_pstrdup(pb->eb->edit_pool, copyfrom_path);
>> -      change->copyfrom_rev = copyfrom_revision;
>> +      cb->copyfrom_path = change->copyfrom_path;
>> +      cb->copyfrom_rev = change->copyfrom_rev;
>>     }
>>
>>   return SVN_NO_ERROR;
>> @@ -724,17 +766,20 @@ ev2_open_directory(const char *path,
>>                    apr_pool_t *result_pool,
>>                    void **child_baton)
>>  {
>> +  /* ### fix this?  */
>> +  apr_pool_t *scratch_pool = result_pool;
>>   struct ev2_dir_baton *pb = parent_baton;
>>   struct ev2_dir_baton *db = apr_pcalloc(result_pool, sizeof(*db));
>> +  const char *relpath = map_to_relpath(pb->eb, path, scratch_pool);
>>
>>   db->eb = pb->eb;
>> -  db->path = apr_pstrdup(result_pool, path);
>> +  db->path = apr_pstrdup(result_pool, relpath);
>>   db->base_revision = base_revision;
>>
>>   if (pb->copyfrom_path)
>>     {
>>       /* We are inside a copy. */
>> -      const char *name = svn_relpath_basename(path, result_pool);
>> +      const char *name = svn_relpath_basename(relpath, scratch_pool);
>>
>>       db->copyfrom_path = apr_pstrcat(result_pool, pb->copyfrom_path,
>>                                       "/", name, NULL);
>> @@ -773,9 +818,10 @@ ev2_absent_directory(const char *path,
>>  {
>>   struct ev2_dir_baton *pb = parent_baton;
>>   svn_kind_t *kind = apr_palloc(pb->eb->edit_pool, sizeof(*kind));
>> +  const char *relpath = map_to_relpath(pb->eb, path, scratch_pool);
>>
>>   *kind = svn_kind_dir;
>> -  SVN_ERR(add_action(pb->eb, path, ACTION_ADD_ABSENT, kind));
>> +  SVN_ERR(add_action(pb->eb, relpath, ACTION_ADD_ABSENT, kind));
>>
>>   return SVN_NO_ERROR;
>>  }
>> @@ -788,15 +834,18 @@ ev2_add_file(const char *path,
>>              apr_pool_t *result_pool,
>>              void **file_baton)
>>  {
>> +  /* ### fix this?  */
>> +  apr_pool_t *scratch_pool = result_pool;
>>   struct ev2_file_baton *fb = apr_pcalloc(result_pool, sizeof(*fb));
>>   struct ev2_dir_baton *pb = parent_baton;
>> -  struct change_node *change = locate_change(pb->eb, path);
>> +  const char *relpath = map_to_relpath(pb->eb, path, scratch_pool);
>> +  struct change_node *change = locate_change(pb->eb, relpath);
>>
>>   /* ### assert that RESTRUCTURE is NONE or DELETE?  */
>>   change->action = RESTRUCTURE_ADD;
>>
>>   fb->eb = pb->eb;
>> -  fb->path = apr_pstrdup(result_pool, path);
>> +  fb->path = apr_pstrdup(result_pool, relpath);
>>   fb->base_revision = pb->base_revision;
>>   *file_baton = fb;
>>
>> @@ -809,24 +858,26 @@ ev2_add_file(const char *path,
>>       fb->delta_base = NULL;
>>
>>       *kind = svn_kind_file;
>> -      SVN_ERR(add_action(pb->eb, path, ACTION_ADD, kind));
>> +      SVN_ERR(add_action(pb->eb, relpath, ACTION_ADD, kind));
>>     }
>>   else
>>     {
>>       /* A copy */
>>       struct copy_args *args = apr_palloc(pb->eb->edit_pool, sizeof(*args));
>>
>> +      change->copyfrom_path = map_to_repos_relpath(fb->eb, copyfrom_path,
>> +                                                   fb->eb->edit_pool);
>> +      change->copyfrom_rev = copyfrom_revision;
>> +
>>       SVN_ERR(fb->eb->fetch_base_func(&fb->delta_base,
>>                                       fb->eb->fetch_base_baton,
>> -                                      copyfrom_path, copyfrom_revision,
>> -                                      result_pool, result_pool));
>> -
>> -      args->copyfrom_path = apr_pstrdup(pb->eb->edit_pool, copyfrom_path);
>> -      args->copyfrom_rev = copyfrom_revision;
>> -      SVN_ERR(add_action(pb->eb, path, ACTION_COPY, args));
>> -
>> -      change->copyfrom_path = apr_pstrdup(fb->eb->edit_pool, copyfrom_path);
>> -      change->copyfrom_rev = copyfrom_revision;
>> +                                      change->copyfrom_path,
>> +                                      change->copyfrom_rev,
>> +                                      result_pool, scratch_pool));
>> +
>> +      args->copyfrom_path = change->copyfrom_path;
>> +      args->copyfrom_rev = change->copyfrom_rev;
>> +      SVN_ERR(add_action(pb->eb, relpath, ACTION_COPY, args));
>>     }
>>
>>   return SVN_NO_ERROR;
>> @@ -839,32 +890,35 @@ ev2_open_file(const char *path,
>>               apr_pool_t *result_pool,
>>               void **file_baton)
>>  {
>> +  /* ### fix this?  */
>> +  apr_pool_t *scratch_pool = result_pool;
>>   struct ev2_file_baton *fb = apr_pcalloc(result_pool, sizeof(*fb));
>>   struct ev2_dir_baton *pb = parent_baton;
>> +  const char *relpath = map_to_relpath(pb->eb, path, scratch_pool);
>>
>>   fb->eb = pb->eb;
>> -  fb->path = apr_pstrdup(result_pool, path);
>> +  fb->path = apr_pstrdup(result_pool, relpath);
>>   fb->base_revision = base_revision;
>>
>>   if (pb->copyfrom_path)
>>     {
>>       /* We're in a copied directory, so the delta base is going to be
>>          based up on the copy source. */
>> -      const char *name = svn_relpath_basename(path, result_pool);
>> +      const char *name = svn_relpath_basename(relpath, scratch_pool);
>>       const char *copyfrom_path = apr_pstrcat(result_pool, pb->copyfrom_path,
>>                                               "/", name, NULL);
>>
>>       SVN_ERR(fb->eb->fetch_base_func(&fb->delta_base,
>>                                       fb->eb->fetch_base_baton,
>>                                       copyfrom_path, pb->copyfrom_rev,
>> -                                      result_pool, result_pool));
>> +                                      result_pool, scratch_pool));
>>     }
>>   else
>>     {
>>       SVN_ERR(fb->eb->fetch_base_func(&fb->delta_base,
>>                                       fb->eb->fetch_base_baton,
>> -                                      path, base_revision,
>> -                                      result_pool, result_pool));
>> +                                      relpath, base_revision,
>> +                                      result_pool, scratch_pool));
>>     }
>>
>>   *file_baton = fb;
>> @@ -977,9 +1031,10 @@ ev2_absent_file(const char *path,
>>  {
>>   struct ev2_dir_baton *pb = parent_baton;
>>   svn_kind_t *kind = apr_palloc(pb->eb->edit_pool, sizeof(*kind));
>> +  const char *relpath = map_to_relpath(pb->eb, path, scratch_pool);
>>
>>   *kind = svn_kind_file;
>> -  SVN_ERR(add_action(pb->eb, path, ACTION_ADD_ABSENT, kind));
>> +  SVN_ERR(add_action(pb->eb, relpath, ACTION_ADD_ABSENT, kind));
>>
>>   return SVN_NO_ERROR;
>>  }
>>
>>

-- 
uberSVN: Apache Subversion Made Easy
http://www.uberSVN.com/
Received on 2012-04-09 20:07:04 CEST

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.