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

Re: [PATCH] Fix issue #3686 - executable bit not set during merge

From: Daniel Shahaf <d.s_at_daniel.shahaf.name>
Date: Fri, 11 Feb 2011 23:31:29 +0200

Daniel Becroft wrote on Sat, Feb 12, 2011 at 06:27:31 +1000:
> On Fri, Feb 11, 2011 at 11:26 PM, Daniel Shahaf <d.s_at_daniel.shahaf.name>wrote:
> > Daniel Becroft wrote on Thu, Feb 10, 2011 at 07:21:30 +1000:
> > > @@ -1118,6 +1120,33 @@ merge_binary_file(svn_skel_t **work_items,
> > > + /* Attempt to merge the binary file. At the moment, we can only
> > > + handle the special case: if the LEFT side of the merge is equal
> > > + to WORKING, then we can copy RIGHT directly. */
> >
> > The comment in libsvn_client mentioned two special case, what happened
> > to the other one? Does the existing wc code already handle it? (I'd be
> > surprised)
> >
> > - Alternately, if the 'left' side of the merge doesn't exist in
> > - the repository, and the 'right' side of the merge is
> > - identical to the WC, pretend we did the merge (a no-op).
> >
>
> I've been trying to think of a valid scenario for this to occur, but I can't
> seem to think of one. There's a comment further up:
>

Concocted:
% svn add foo.bin
% svn ci -m r5
% svn rm ^/foo.bin -m r6
% svnmucc -m r7 put foo.bin ^/foo.bin
% svn merge -c7 ^/ ./

> /* Other easy outs: if the merge target isn't under version
> control, or is just missing from disk, fogettaboutit. There's no
> way svn_wc_merge4() can do the merge. */
>
> This should apply to all situations (binary and text files), so I think this
> second "special case" is redundant.
>

Not sure. If the merge-left does not exist, and the local file doesn't
exist either, then the situation is 'compatible' and can be merged...

(that depends on where exactly the local file is missing --- in BASE, in
WORKING, or in ACTUAL)

> > > + SVN_ERR(svn_wc__wq_build_file_install(&work_item,
> > > + db, target_abspath,
> > > + right_abspath,
> > > + FALSE /*
> > use_commit_times */,
> > > + FALSE /* record_fileinfo
> > */,
> >
> > About RECORD_FILEINFO:
> >
> > * Why are you passing FALSE? (I see that other calls do this too, so
> > this is for my education mainly)) A quick scan makes me expect that
> > parameter to control the mtime/size caches for modification detection.
> >
>
> I copied this directly from the call further down, where a file is copied
> depending on which version to use in a conflict. Even if "theirs" is used,
> we still pass in FALSE for record_fileinfo.
>

Because that call is also used for the svn_wc_conflict_choose_postpone,
which installs a non-pristine file.

> The RECORD_FILEINFO flag controls whether the file's information should be
> recorded into the wc.db. It seems that we only pass TRUE to this if we are
> installing a fresh file. It makes sense to pass in FALSE during a merge,
> otherwise the file won't be seen as modified.
>

Doh. +1.

> PS: The two calls in update_editor.c don't pass in NULL, but pass in a value
> based on comparing against NULL.
>
> record_fileinfo = new_contents == NULL;
> record_fileinfo = install_from == NULL;
>

Oops. Added parentheses now. Thanks.

> * In update_editor.c there are two places that pass NULL (not FALSE) for
> > that, and have above them comment that says that "If %s, we want to
> > pass FALSE". What is going on there?
> > (this is to the list, not specifically at Daniel)
> >
> > > + result_pool,
> > scratch_pool));
> > > + *work_items = svn_wc__wq_merge(*work_items, work_item,
> > result_pool);
> >
> > Don't you need to convert the next svn_wc__wq_build_file_install() to
> > use this 'build-then-merge' approach too? Otherwise, won't it overwrite
> > your WORK_ITEMS?
> >
>
> Which svn_wc__wq_build_file_install() call do you mean?
>

The only other call in the same function (merge_binary_file()).

> We return SVN_NO_ERROR immediately after building adding this workqueue
> item, so the other one for the binary file conflict resolution will not get
> called.
>

Ah, right. I missed that. I'll not pursue this point further then.

> > > @@ -1502,6 +1463,9 @@ merge_file_changed(const char *local_dir_abspath,
> > > const svn_wc_conflict_version_t *left;
> > > const svn_wc_conflict_version_t *right;
> > >
> > > + SVN_ERR(svn_wc_text_modified_p2(&has_local_mods,
> > merge_b->ctx->wc_ctx,
> > > + mine_abspath, FALSE, subpool));
> > > +
> >
> > You only need HAS_LOCAL_MODS now when CONTENT_STATE is set. Shouldn't
> > you skip this call when CONTENT_STATE is NULL then? (It may perform
> > stat() or read().)
> >
>
> Agreed, however this was always the case. The only change I made to this
> section was indentation
> due to removing the surrounding if (merge_required) { } clause.

Oh, you're right. I was confused because the 'diff -w' patch showed
these two lines as removed and later re-added; your original patch
shows it correctly.

Sorry for my confusion.

> I didn't want to make other changes that would be clouded.
>

+1

> I can submit a follow-up patch that fixes this as well, if necessary.

That would be great, assuming that the FALSE *really* should be changed
to TRUE. (I haven't investigated that myself.)
Received on 2011-02-11 22:36:23 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.