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

Re: Merge tracking: MyServer equals Myserver

From: Mark Phippard <markphip_at_gmail.com>
Date: Wed, 11 Mar 2009 08:31:17 -0400

You should look at this issue:

http://subversion.tigris.org/issues/show_bug.cgi?id=3361

Senthil has been working on this. There is a simplistic patch in
current trunk and 1.6. But still more to do. I think the issue is
trying to do it without adding more server calls.

Mark

On Wed, Mar 11, 2009 at 6:35 AM, Stefan Sperling <stsp_at_elego.de> wrote:
> [Cross-posting to dev@ to get comments on patch.
> If you reply, you might want to keep only one of the lists
> in Cc, whichever you think suits your reply better.]
>
> On Wed, Mar 11, 2009 at 01:26:42AM -0500, Ryan Schmidt wrote:
>> On Mar 10, 2009, at 23:44, Mark Eichin wrote:
>>
>> > On Tue, Mar 10, 2009 at 9:46 AM, Harald Hoyer wrote:
>> >
>> >> When checking if merge tracking is to be used, a check is
>> >> contained if the adressed repos are the same. Where can I setup
>> >> that for example "svn://MyServer/myrepo/trunk" and "svn://Myserver/
>> >> myrepo/trunk" are considered a to be the same repo, since the
>> >> (case-insensitve) server names are the same.
>> >
>> > A related problem is that svn://svnserver and
>> > svn://svnserver.my.domain are treated as distinct.  (Given that
>> > repositories have uuids, should the code in question even be *looking*
>> > at the dns name?)
>>
>> Or you could be accessing the same repository via multiple protocols
>> (svn:// and http://). I agree it seems reasonable to use the
>> repository UUID and not care about the URL.
>
> People, you're right:
>
> 1) It was comparing URLs case-sensitively, which is wrong for
>   the protocol and hostname parts.
>
> 2) Checking UUIDs should be enough.
>   In fact, I'd say even looking at the URLs is really, really wrong.
>   It looks like the URL compare was meant to be an optimisation
>   to save a round-trip to the repo. But I'd say this is not safe
>   because who know what the repository of the day at this particular
>   URL is. People do silly things sometimes so we'd better play it safe!
>
> So the patch below (against trunk) should fix this.
> I still have to run the regression tests with this to see
> if it breaks anything (it shouldn't).
>
> Stefan
>
> Index: subversion/libsvn_client/merge.c
> ==================================================================--- subversion/libsvn_client/merge.c  (revision 36480)
> +++ subversion/libsvn_client/merge.c    (working copy)
> @@ -192,7 +192,39 @@ check_scheme_match(svn_wc_adm_access_t *adm_access
>   return SVN_NO_ERROR;
>  }
>
> +/* Determine whether the repository the working copy is based on has
> + * the same UUID as the repository pointed to by RA_SESSION.
> + *
> + * CTX is the client context.
> + *
> + * If non-NULL, ENTRY is used to retrieve the UUID of the repository
> + * the working copy is based on.  Otherwise, fall back to the UUID of
> + * the repository located at URL WC_REPOS_ROOT.
> + *
> + * Do all allocations in pool.
> + */
> +static svn_error_t *
> +is_same_repos(svn_boolean_t *same_repos,
> +              svn_ra_session_t *ra_session,
> +              svn_client_ctx_t *ctx,
> +              const svn_wc_entry_t *entry,
> +              const char *wc_repos_root,
> +              apr_pool_t* pool)
> +{
> +  const char *source_repos_uuid;
> +  const char *wc_repos_uuid;
>
> +  SVN_ERR(svn_ra_get_uuid2(ra_session, &source_repos_uuid, pool));
> +  if (entry)
> +    wc_repos_uuid = entry->uuid;
> +  else
> +    SVN_ERR(svn_client_uuid_from_url(&wc_repos_uuid, wc_repos_root,
> +                                     ctx, pool));
> +  *same_repos = (strcmp(wc_repos_uuid, source_repos_uuid) == 0);
> +
> +  return SVN_NO_ERROR;
> +}
> +
>  /*-----------------------------------------------------------------------*/
>
>  /*** Repos-Diff Editor Callbacks ***/
> @@ -6720,22 +6752,9 @@ merge_cousins_and_supplement_mergeinfo(const char
>   const char *old_url;
>   svn_boolean_t same_repos;
>
> -  if (strcmp(wc_repos_root, source_repos_root) != 0)
> -    {
> -      const char *source_repos_uuid;
> -      const char *wc_repos_uuid;
> +  SVN_ERR(is_same_repos(&same_repos, ra_session, ctx, entry, wc_repos_root,
> +                        pool));
>
> -      SVN_ERR(svn_ra_get_uuid2(ra_session, &source_repos_uuid, pool));
> -      if (entry)
> -        wc_repos_uuid = entry->uuid;
> -      else
> -        SVN_ERR(svn_client_uuid_from_url(&wc_repos_uuid, wc_repos_root,
> -                                         ctx, pool));
> -      same_repos = (strcmp(wc_repos_uuid, source_repos_uuid) == 0);
> -    }
> -  else
> -    same_repos = TRUE;
> -
>   peg_revision.kind = svn_opt_revision_number;
>   SVN_ERR(svn_ra_get_session_url(ra_session, &old_url, pool));
>
> @@ -6913,22 +6932,9 @@ svn_client_merge3(const char *source1,
>   SVN_ERR(svn_ra_get_repos_root2(ra_session1, &source_repos_root, sesspool));
>
>   /* Do our working copy and sources come from the same repository? */
> -  if (strcmp(wc_repos_root, source_repos_root) != 0)
> -    {
> -      const char *source_repos_uuid;
> -      const char *wc_repos_uuid;
> +  SVN_ERR(is_same_repos(&same_repos, ra_session1, ctx, entry, wc_repos_root,
> +                        pool));
>
> -      SVN_ERR(svn_ra_get_uuid2(ra_session1, &source_repos_uuid, pool));
> -      if (entry)
> -        wc_repos_uuid = entry->uuid;
> -      else
> -        SVN_ERR(svn_client_uuid_from_url(&wc_repos_uuid, wc_repos_root,
> -                                         ctx, pool));
> -      same_repos = (strcmp(wc_repos_uuid, source_repos_uuid) == 0);
> -    }
> -  else
> -    same_repos = TRUE;
> -
>   /* Unless we're ignoring ancestry, see if the two sources are related.  */
>   if (! ignore_ancestry)
>     SVN_ERR(svn_client__get_youngest_common_ancestor(&yc_path, &yc_rev,
>
>

-- 
Thanks
Mark Phippard
http://markphip.blogspot.com/
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=1307779
Received on 2009-03-11 13:32:18 CET

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.