On 18.03.2018 13:43, Julian Foad wrote:
> Branko Čibej wrote:
>> On 16.03.2018 18:33, Julian Foad wrote:
>>> I implemented an output format compatible with 'svn-viewspec.py' in
>>> r1826990. Then I updated that output format to also support 'switched'
>>> and revisions, in r1826993. This version outputs a header declaring
>>> 'Format: 2', and svn-viewspec.py currently barfs on reading that.
>>> Suggested exercises for the reader (you, plural):
>>> * implement a UI to choose the output format (currently 'svn info
>>> --viewspec' is hard-coded to produce that 'format 2')
> To experiment with the two existing implementations of "recreate WC
> from a viewspec" -- which are direct command-line cmds and
Again, why? Pick one and use it. It's not as if there was some subtle
tradeoff here that needs lots of experimenting with two options in order
to reach a decision. Also: svn-viewspec.py uses command-line cmds so
there's no difference in practice (which leads to my other discussion,
>> 'svn-viewspec.py' is not a supported tool; 'svn info --viewspec'
>> does not exist in 1.10. We don't have any compatibility guarantees to
>> worry about.
>>> * update 'svn-viewspec.py' to implement those 'format 2' extensions
>>> * start implementing the API functions that 'svn-viewspec.py' needs
>> Again, why? 'svn-viewspec.py' uses the standard command-line tools. It
>> follows that all API functions it needs already exist.
> An efficient implementation is not yet possible. New APIs are needed.
> The existing implementation checks out the root, then modifies each
> subdirectory in depth-first order. If the root is depth-infinity, then
> it first checks out everything, then proceeds to delete the unwanted
> bits (and the same applies at any level where depth is reduced).
That is an inefficiency in the implementation of svn-viewspec.py, not a
lack of APIs.
> We need to design and implement the APIs that we will need to make an
> efficient implementation.
I disagree. I've seen no overwhelming argument in favour of requiring
new APIs for this. Your argument is "efficiency" but in terms of what?
The number of client operations? Network data transfer? Or perhaps
efficiency of long-term support for new APIs?
If the issue is data transfer (and local I/O), then the onus is on
svn-viewspec.py to properly analyse the viewspec and construct a minimal
set of client operations to reproduce the working copy structure. If you
invent new APIs to do that instead, you'll have to support them
indefinitely in the client library, and that is, IMO, a less efficient
use of available resources.
> Working with bindings to APIs seems like a good way to do that.
Sure, but not at this point in time. We should only add new APIs as the
existing client(s) need them. On the other hand, svn-viewspec.py is a
good vehicle for developing the necessary methods for efficiently
reproducing working copy topology.
I suggest things should be done in this order:
1. Fix the most glaring problems in svn-viewspec.py (such as use of
system() instead of popen)
2. Improve the algorithm for constructing a working copy from the
viewspec, using only existing command-line client operations
3. Consider what kind of client operations (implying new or improved
APIs) are required to optimise the algorithm further, and implement
those (note: exposing these operations in the command-line client
will give users access to new functionality without having to resort
to using the APIs directly)
4. Once the above is done, we can then decide to either convert
svn-viewspec.py to use the bindings, or to implement 'svn checkout
"Adding new APIs" seems like an obvious way to proceed, but we have
long-standing counter-examples in our code:
* the MTCC API, which was experimental and is now private and used by
exactly one tool, and which, as far as I can remember, no-one has
really requested was made public;
* editor v2 ... unfortunately (by my error in judgement) exposed in
JavaHL but, again, not as a public C API.
Received on 2018-03-18 14:12:56 CET