On 28. 5. 25 00:11, Timofei Zhakov wrote:

    See? SEE!!?? I *told* you it was a mess. :D

    This stuff should all be in libsvn_subr/cmdline.c. I don't even
    remember any more how this happened. I think that at one point I
    was even considering creating a new library that would contain
    only the features that command-line programs need; basically,
    command line conversion to UTF-8 and the argument parser. But it's
    tied in with libsvn_subr anyway, and that's already linked everywhere.

    I suggest the goal should be to move this out of libsvn_cmdline
    and get rid of the duplicates. Before that, some judicious use of
    svn blame and svn log might give you an idea why it's currently
    done that way. I really don't know, but we should, before we
    change anything.


Hi,

I really liked this idea and I would like to discuss it more.

(I guess this is a reason for re-threading)

Subversion is a very organised project. This is why I like developing it. However, it is true that cmdline code is messy.

I think it would be cool to completely reorganise it and put it into a separate library. Similar to libsvn_diff or libsvn_delta (but I guess these were separate from the early days).

This will be also a reason to review the original problem with svn_client_args_to_target_array(), since there would be a good place to design the single version.

I see it like the following files might go to the new library:

- most of subversion\libsvn_subr\opt.c, except svn_opt_revision_t stuff
- subversion\libsvn_subr\opt.h as a dependency
- subversion\libsvn_subr\cmdline.c entirely
- subversion\libsvn_client\cmdline.c

Unfortunately, we can't do this with utf8 related code, since there are a few usages in our main libraries.

This will be really beneficial for us due to a bunch of reasons:

1. The code would be more modular, which is good.
2. Command line related code would not be loaded in case subversion is consumed as a library.
3. It will be clear which api to use when developing a program.
4. It opens up an opportunity to separate some of those files onto a few more. For example, something like svn_editor.c can be simply factored out and maybe simplify the code.

However, there is one huge problem. Due to backward compatibility policy, libsvn_subr still must export those symbols, even if they are deprecated. The thing is we can't code simple one-line functions that wrap libsvn_cmdline into libsvn_subr, since libsvn_subr should not link with libsvn_cmdline. I don't see any resolutions yet...


Exactly, this is the real issue here. It's also probably the reason for having two "to_target_array" functions: the one in libsvn_client does client-type checks, like finding the repository root. So even if we moved that to a libsvn_cmdline, it would still have to link with libsvn_client (but not the other way around). We'd have to split, for example, the resolution of repos-relative URLs out of that function to avoid linking with libsvn_client, and that opens another can of worms.

All the private functions (like svn_opt__*) can be moved to the new library, but there's another problem: Existing users of our libraries, like, I don't know, such irrelevant things like TortoiseSVN ... would have to load the new library if we decided to move those functions. Or link with its static version.

Anyway, it's a huge amount of work for, as you say, a lot of potential benefit for our tools, but extra issues for integrators of our code. And it's not really urgent.

-- Brane

Reply via email to