Gabriela Gibson wrote on Tue, Jun 04, 2013 at 09:56:57 +0100:
> Hi,
> 
> I hope I've resolved most issues, here are ones I need to ask about:
> 
> 
> Index: subversion/include/svn_client.h
> ===================================================================
> --- subversion/include/svn_client.h (revision 1484305)
> +++ subversion/include/svn_client.h (working copy)
> @@ -2988,8 +2988,8 @@ svn_client_blame(const char *path_or_url,
>   *
>   * @a invoke_diff_cmd is used to call an external diff program but may
>   * not be @c NULL. The command line invocation will override the
> - * invoke-diff-cmd invocation entry(if any) in the Subversion
> - * configuration file.
> + * invoke-diff-cmd invocation entry(if any) in @c ctx->config.
> + * ### "May not be NULL" !? log-cmd.c and deprecated.c pass NULL for it.
> 
> Hmm, what I was trying to communicate was that if a NULL(or "") is passed,
> this is an error that will be caught. I'm not quite sure what to write
> here now.
> 
> The deprecated function is guaranteed to not have an execution path to
> invoke-diff-cmd but the log-cmd.c has been fixed.
> 

Can you explain that, please?

Existing API users call svn_client_diff6().  API compatibility rules
provide that if they run their code against libsvn_client compiled from
yoru branch, it will continue to work as it has.  Does your branch
behave that way?

If yes, your docstring is wrong.  If not, you have a bug.

Am I missing anything?

> ----------  ****  ------------
> 
> --- subversion/libsvn_subr/config_file.c (revision 1484305)
> +++ subversion/libsvn_subr/config_file.c (working copy)
> @@ -1086,6 +1086,9 @@ svn_config_ensure(const char *config_dir, apr_pool
>          "# diff3-has-program-arg = [yes | no]" NL
>          "### Set invoke-diff-cmd to the absolute path of your 'diff'" NL
>          "### program." NL
> + /* ### Document how the setting may contain argv too,
> + not only argv[0] */
>          "### This will override the compile-time default, which is to use" NL
>          "### Subversion's internal diff implementation." NL
>          "# invoke-diff-cmd = \"diff -y --label %l1% %f1% --label %l2% 
> %f2%\""NL
> Index: subversion/libsvn_subr/io.c
> + /* ### Document how the setting may contain argv too,
> + not only argv[0] */
> 
> Not sure what you mean here?
> 

When a program receives a parameter which is executed as a command,
there are three common ways to parse that parameter: (a) as a shell
command to be passed to system(); (b) as the command name (the first
parameter to execv(), either absolute or in PATH; (c) as a list of
strings, a la execv().  I was requesting that you document which how the
argument is used.

(I think in this case the answer is "it is split to words using a
hand-rolled implementating of splitting".  The fact that that answer is
effectively "it is parsed using some locally-rolled parsing rules" is a
separate problem which I commented about below.)

> ----------  ****  ------------
> 
> + /* This reimplements "split a string into argv". Is there an existing
> + svn/apr function that does that can be reused here? (We might gain
> + an "escape spaces" functionality this way.) */
>    tmp = svn_cstring_split(cmd," ",TRUE, subpool);
> 
> I didn't find one, but perhaps I missed it?
> 

It looks like apr_proc_create() is the only way to create processes.

I still think hand-rolling a "split command to words" functionality is
not a good idea.  Not quite sure what to suggests.

> ----------  ****  ------------
> 
> + How does this parse "%%%f1%"? Is "%%f1%%" an error?
> 
> %%%f1% becomes %%f1% and %%f1%% becomes %f1%%, neither is an error.
> 
> However, %f1%% is parsed out as sub%, also, +%f1% ends up as +sub.
> 

I'm not sure I understand.  I expect %%%f1% to become %sub and %f1%% to
be either an error or sub%.  Is that what is implemented?

> What you cannot do is: %%f1% to get %sub, it will render as %f1%.
> 

That's good.

> If this is a show stopper, we could go back to the triple dash model
> and not deal with escaping %'s, or choose another delimiter.

> ----------  ****  ------------
> @@ -3025,6 +3040,7 @@ svn_io_run_external_diff(const char *dir,
>    if (pexitcode == NULL)
>       pexitcode = &exitcode;
> 
>  + /* if invoke_diff_cmd is "", cmd[0] would be NULL? */
>    SVN_ERR(svn_io_run_cmd(dir, cmd[0], cmd, pexitcode, NULL, TRUE,
>                           NULL, outfile, errfile, pool));
> 
> I check for this condition before it reaches there.  Neither "" nor
> NULL value for invoke_diff_cmd is accepted, but an error is raised
> before it reaches svn_io_create_custom_diff_cmd().

Cool.  I must have missed that check.

Reply via email to