What's the idea?
External means Switched
=======================
Well, not quite! But at the WC layer they have a lot in common. Let's
take advantage of it.
In both cases:
* An 'external' or 'switched' WC node is a file or a directory (tree).
* An 'external' or 'switched' WC node is an immediate child of a
versioned WC directory. [3]
* An 'external' or 'switched' WC node is attached to a repository
location other than the one implied by its WC parent directory.
* In and inside itself, an 'external' or 'switched' file or tree is
indistinguishable from any other WC file or tree. [4]
* Only its relationship to its WC parent directory is 'special'. The
only operations that may see it as different are those that start at
a higher level (outside the node) and recurse or look into it, and
those that start inside the node and walk up the tree towards the WC
root.
* Client operations treat the node as part of its parent WC in some
ways, and treat it as special in other ways, depending on the
command and on user-specified options.
By defining 'External' and 'Switched' in terms of their common ground
and their differences, we can reduce complexity and clarify the issues
that are currently obscure. This could be especially helpful at the
moment for designing their WC representation.
How should we represent external files and external dirs in the WC in a
unified manner? Do we need to explicitly mark them as 'external'? What
differences in behaviour should 'external' nodes and 'switched' nodes
exhibit within the WC?
Differences in WC State
=======================
This table documents the differences in WC state at a high level.
+----------------------+----------------------+----------------------+
| | switched | external |
+----------------------+----------------------+----------------------+
| | | |
| WC path affected | Existing child | Non-existent child |
| | | |
| Target URL | Same repo | Same or other repo |
| | | |
| Pinned to a revision | No [2] | Optional; recorded |
| | | in 'svn:externals' |
| | | |
| Initial depth | Set by "switch" cmd | Infinity |
| | | |
+----------------------+----------------------+----------------------+
### Anything else?
Differences in Client Commands (Current behaviour)
==================================================
The following differences occur when a command encounters an 'external'
or 'switched' node during its operation. This table is to document the
current (1.6.x) behaviour.
### We'll need some test scripts to help gather this data.
+----------------------+----------------------+----------------------+
| | switched | external |
+----------------------+----------------------+----------------------+
| | | |
| recursive descent, | yes | optional |
| in general | | |
| | | |
| status | report & descend | report [& descend] |
| | | |
| propget/list/etc. | ? | ? |
| | | |
| diff | ? | ? |
| | | |
| commit | descend | [descend?] |
| | | |
| update | ? | ? |
| | | |
| switch | Can switch a WC root | No UI exists for an |
| | but it's not then | external outside |
| | recorded as such. | of a WC. |
| | | |
| ... | | |
| | | |
+----------------------+----------------------+----------------------+
We ought to think about the UI and design a set of useful and consistent
behaviours. But that's out of scope here; this document focuses on the
WC layer.
What to Do About It?
====================
The first practical step I can see is to write a test suite utility for
creating a WC with all the possible states in it, and first writing
tests that just expose the current behaviour variations, and then
deciding which of those are intended and which are bugs or awaited
features.
Any other suggestions on how to make some practical use of this idea?
Footnotes
=========
[2] The ability for "svn update -rX" to "pin" that part of the WC at
rX has been requested by users and seems like a reasonable (clean,
moderately useful) feature.
[3] You can "svn switch" a WC root, and the whole WC is then based on
the new location, but it is not normally regarded as being in a
"switched" state. The concept of a node being in a "switched"
state is only meaningful with respect to the expected location as
determined from the node's parent directory in the same WC. (The
"svnversion" command has an option to specify an expected location
so that it can report the status of the whole WC as "switched"
relative to that specified location.)
[4] A possible exception is that "update" should obey the "pinned
revision number" if present. But that need not necessarily be an
exception: we might choose to define that functionality on all WC
nodes but only use it on 'external' nodes.
- Julian
Received on 2010-08-20 19:54:52 CEST