Fix compiler warning due to missing function prototype.
[svn.git] / subversion / libsvn_ra_svn / protocol
blobd8f81936a2b3a7246a927af9755da3e7d4aa012f
1 This file documents version 2 of the svn protocol.
3 1. Syntactic structure
4 ----------------------
6 The Subversion protocol is specified in terms of the following
7 syntactic elements, specified using ABNF [RFC 2234]:
9   item   = word / number / string / list
10   word   = ALPHA *(ALPHA / DIGIT / "-") space
11   number = 1*DIGIT space
12   string = 1*DIGIT ":" *OCTET space
13          ; digits give the byte count of the *OCTET portion
14   list   = "(" space *item ")" space
15   space  = 1*(SP / LF)
17 Here is an example item showing each of the syntactic elements:
19   ( word 22 6:string ( sublist ) )
21 All items end with mandatory whitespace.  (In the above example, a
22 newline provides the terminating whitespace for the outer list.)  It
23 is possible to parse an item without knowing its type in advance.
25 Lists are not constrained to contain items of the same type.  Lists
26 can be used for tuples, optional tuples, or arrays.  A tuple is a list
27 expected to contain a fixed number of items, generally of differing
28 types.  An optional tuple is a list containing either zero or a fixed
29 number of items (thus "optional" here does not refer to the list's
30 presence or absence, but to the presence or absence of its contents).
31 An array is a list containing zero or more items of the same type.
33 Words are used for enumerated protocol values, while strings are used
34 for text or binary data of interest to the Subversion client or
35 server.  Words are case-sensitive.
37 For convenience, this specification will define prototypes for data
38 items using a syntax like:
40   example: ( literal ( data:string ... ) )
42 A simple word such as "literal", with no colon, denotes a literal
43 word.  A choice of words may be given with "|" separating the choices.
44 "name:type" specifies a parameter with the given type.
46 A type is "word", "number", "string", "list", or the name of another
47 prototype.  Parentheses denote a tuple, unless the parentheses contain
48 ellipses, in which case the parentheses denote an array containing
49 zero or more elements matching the prototype preceding the ellipses.
51 If a tuple has an optional part after the fixed part, a '?' marks
52 places where the tuple is allowed to end.  The following tuple could
53 contain one, three, or four or more items:
55   example: ( fixed:string ? opt1:number opt2:string ? opt3:number )
57 Brackets denote an optional tuple; they are equivalent to parentheses
58 and a leading '?'.  For example, this:
60   example: ( literal (? rev:number ) ( data:string ... ) )
62 can be written more compactly like this:
64   example: ( literal [ rev:number ] ( data:string ... ) )
66 For extensibility, implementations must treat a list as matching a
67 prototype's tuple even if the list contains extra elements.  The extra
68 elements must be ignored.
70 In some cases, a prototype may need to match two different kinds of
71 data items.  This case will be written using "|" to separate the
72 alternatives; for example:
74   example: ( first-kind rev:number )
75          | second-kind
77 The "command response" prototype is used in several contexts of this
78 specification to indicate the success or failure of an operation.  It
79 is defined as follows:
81   command-response: ( success params:list )
82                   | ( failure ( err:error ... ) )
83   error: ( apr-err:number message:string file:string line:number )
85 The interpretation of parameters in a successful command response is
86 context-dependent.
88 URLs and repository paths are represented as strings.  They should be in
89 canonical form when sent over the protocol.  However, as a matter of input
90 validation, an implementation should always canonicalize received paths if it
91 needs them in canonicalized form.
93 2. Connection establishment and protocol setup
94 ----------------------------------------------
96 By default, the client connects to the server on port 3690.
98 Upon receiving a connection, the server sends a greeting, using a
99 command response whose parameters match the prototype:
101   greeting: ( minver:number maxver:number mechs:list ( cap:word ... ) )
103 minver and maxver give the minimum and maximum Subversion protocol
104 versions supported by the server.  mechs is present for historical
105 reasons, and is ignored by the client.  The cap values give a list of
106 server capabilities (see section 2.1).
108 If the client does not support a protocol version within the specified
109 range, it closes the connection.  Otherwise, the client responds to
110 the greeting with an item matching the prototype:
112   response: ( version:number ( cap:word ... ) url:string
113               ? ra-client:string ( ? client:string ) )
115 version gives the protocol version selected by the client.  The cap
116 values give a list of client capabilities (see section 2.1).  url
117 gives the URL the client is accessing.  ra-client is a string
118 identifying the RA implementation, e.g. "SVN/1.6.0" or "SVNKit 1.1.4".
119 client is the string returned by svn_ra_callbacks2_t.get_client_string;
120 that callback may not be implemented, so this is optional.
122 Upon receiving the client's response to the greeting, the server sends
123 an authentication request, which is a command response whose arguments
124 match the prototype:
126   auth-request: ( ( mech:word ... ) realm:string )
128 The mech values give a list of SASL mechanisms supported by the
129 server.  The realm string is similar to an HTTP authentication realm
130 as defined in [RFC 2617]; it allows the server to indicate which of
131 several protection spaces the server wishes to authenticate in.  If
132 the mechanism list is empty, then no authentication is required and no
133 further action takes place as part of the authentication challenge;
134 otherwise, the client responds with a tuple matching the prototype:
136   auth-response: ( mech:word [ token:string ] )
138 mech specifies the SASL mechanism and token, if present, gives the
139 "initial response" of the authentication exchange.  The client may
140 specify an empty mechanism to decline authentication; otherwise, upon
141 receiving the client's auth-response, the server sends a series of
142 challenges, each a tuple matching the prototype:
144   challenge: ( step ( token:string ) )
145            | ( failure ( message:string ) )
146            | ( success [ token:string ] )
148 If the first word of the challenge is "step", then the token is
149 interpreted by the authentication mechanism, and the response token
150 transmitted to the server as a string.  The server then proceeds with
151 another challenge.  If the client wishes to abort the authentication
152 exchange, it may do so by closing the connection.
154 If the first word of the challenge is "success", the authentication is
155 successful.  If a token is provided, it should be interpreted by the
156 authentication mechanism, but there is no response.
158 If the first word of the challenge is "failure", the authentication
159 exchange is unsuccessful.  The client may then give up, or make
160 another auth-response and restart the authentication process.
162 RFC 2222 requires that a protocol profile define a service name for
163 the sake of the GSSAPI mechanism.  The service name for this protocol
164 is "svn".
166 After a successful authentication exchange, the server sends a command
167 response whose parameters match the prototype:
169   repos-info: ( uuid:string repos-url:string ( cap:word ... ) )
171 uuid gives the universal unique identifier of the repository,
172 repos-url gives the URL of the repository's root directory, and the
173 cap values list the repository capabilities (that is, capabilities
174 that require both server and repository support before the server can
175 claim them as capabilities, e.g., SVN_RA_SVN_CAP_MERGEINFO).
177 The client can now begin sending commands from the main command set.
179 2.1 Capabilities
181 The following capabilities are currently defined (S indicates a server
182 capability and C indicates a client capability):
184 [CS] edit-pipeline     Every released version of Subversion since 1.0
185                        announces the edit-pipeline capability; starting
186                        in Subversion 1.5, both client and server
187                        *require* the other side to announce edit-pipeline.
188 [CS] svndiff1          If both the client and server support svndiff version
189                        1, this will be used as the on-the-wire format for 
190                        svndiff instead of svndiff version 0.
191 [CS] absent-entries    If the remote end announces support for this capability,
192                        it will accept the absent-dir and absent-file editor
193                        commands.
194 [S]  commit-revprops   If the server presents this capability, it supports the 
195                        rev-props parameter of the commit command.
196                        See section 3.1.1.
197 [S]  mergeinfo         If the server presents this capability, it supports the 
198                        get-mergeinfo command.  See section 3.1.1.
199 [S]  depth             If the server presents this capability, it understands
200                        requested operational depth (see section 3.1.1) and
201                        per-path ambient depth (see section 3.1.3).
203 3. Commands
204 -----------
206 Commands match the prototypes:
208   command: ( command-name:word params:list )
210 The interpretation of command parameters is different from command to
211 command.
213 Initially, the client initiates commands from the main command set,
214 and the server responds.  Some commands in the main command set can
215 temporarily change the set of commands which may be issued, or change
216 the flow of control so that the server issues commands and the client
217 responds.
219 Here are some miscellaneous prototypes used by the command sets:
221   proplist:  ( ( name:string value:string ) ... )
222   propdelta: ( ( name:string [ value:string ] ) ... )
223   node-kind: none|file|dir|unknown
224   bool:      true|false
225   lockdesc:  ( path:string token:string owner:string [ comment:string ]
226                created:string [ expires:string ] )
228 3.1. Command Sets
230 There are three command sets: the main command set, the editor command
231 set, and the report command set.  Initially, the protocol begins in
232 the main command set with the client sending commands; some commands
233 can change the command set and possibly the direction of control.
235 3.1.1. Main Command Set
237 The main command set corresponds to the svn_ra interfaces.  After each
238 main command is issued by the client, the server sends an auth-request
239 as described in section 2.  (If no new authentication is required, the
240 auth-request contains an empty mechanism list, and the server proceeds
241 immediately to sending the command response.)  Some commands include a
242 second place for auth-request point as noted below.
244   reparent
245     params:   ( url:string )
246     response: ( )
248   get-latest-rev
249     params:   ( )
250     response: ( rev:number )
252   get-dated-rev
253     params:   ( date:string )
254     response: ( rev:number )
256   change-rev-prop
257     params:   ( rev:number name:string ? value:string )
258     response: ( )
259     If value is not specified, the rev-prop is removed.
260     (Originally the value was required; for minimum impact, it was
261      changed to be optional without creating an optional tuple for
262      that one parameter as we normally do.)
264   rev-proplist
265     params:   ( rev:number )
266     response: ( props:proplist )
268   rev-prop
269     params:   ( rev:number name:string )
270     response: ( [ value:string ] )
272   commit
273     params:   ( logmsg:string ? ( ( lock-path:string lock-token:string ) ... )
274                 keep-locks:bool ? rev-props:proplist )
275     response: ( )
276     Upon receiving response, client switches to editor command set.
277     Upon successful completion of edit, server sends auth-request.
278     After auth exchange completes, server sends commit-info.
279     commit-info: ( new-rev:number date:string author:string
280                    ? ( post-commit-err:string ) )
282   get-file
283     params:   ( path:string [ rev:number ] want-props:bool want-contents:bool )
284     response: ( [ checksum:string ] rev:number props:proplist )
285     If want-contents is specified, then after sending response, server
286      sends file contents as a series of strings, terminated by the empty
287      string, followed by a second empty command response to indicate
288      whether an error occurred during the sending of the file.
290   get-dir
291     params:   ( path:string [ rev:number ] want-props:bool want-contents:bool
292                 ? ( field:dirent-field ... ) )
293     response: ( rev:number props:proplist ( entry:dirent ... ) )]
294     dirent:   ( name:string kind:node-kind size:number has-props:bool
295                 created-rev:number [ created-date:string ]
296                 [ last-author:string ] )
297     dirent-field: kind | size | has-props | created-rev | time | last-author
298                   | word
300   check-path
301     params:   ( path:string [ rev:number ] )
302     response: ( kind:node-kind )
303     If path is non-existent, 'svn_node_none' kind is returned.
305   stat
306     params:   ( path:string [ rev:number ] )
307     response: ( ? entry:dirent )
308     dirent:   ( name:string kind:node-kind size:number has-props:bool
309                 created-rev:number [ created-date:string ]
310                 [ last-author:string ] )
311     New in svn 1.2.  If path is non-existent, an empty response is returned.
313   get-mergeinfo
314     params:   ( ( path:string ... ) [ rev:number ] inherit:word 
315                 descendents:bool)
316     response: ( ( ( path:string merge-info:string ) ... ) )
317     New in svn 1.5.  If no paths are specified, an empty response is
318     returned.  If rev is not specified, the youngest revision is used.
320   update
321     params:   ( [ rev:number ] target:string recurse:bool
322                 ? depth:word send_copyfrom_param:bool )
323     Client switches to report command set.
324     Upon finish-report, server sends auth-request.
325     After auth exchange completes, server switches to editor command set.
326     After edit completes, server sends response.
327     response: ( )
329   switch
330     params:   ( [ rev:number ] target:string recurse:bool url:string
331                 ? depth:word)
332     Client switches to report command set.
333     Upon finish-report, server sends auth-request.
334     After auth exchange completes, server switches to editor command set.
335     After edit completes, server sends response.
336     response: ( )
338   status
339     params:   ( target:string recurse:bool ? [ rev:number ] ? depth:word )
340     Client switches to report command set.
341     Upon finish-report, server sends auth-request.
342     After auth exchange completes, server switches to editor command set.
343     After edit completes, server sends response.
344     response: ( )
346   diff
347     params:   ( [ rev:number ] target:string recurse:bool ignore-ancestry:bool
348                 url:string ? text-deltas:bool ? depth:word )
349     Client switches to report command set.
350     Upon finish-report, server sends auth-request.
351     After auth exchange completes, server switches to editor command set.
352     After edit completes, server sends response.
353     response: ( )
355   log
356     params:   ( ( target-path:string ... ) [ start-rev:number ]
357                 [ end-rev:number ] changed-paths:bool strict-node:bool
358                 ? limit:number
359                 ? include-merged-revisions:bool
360                 all-revprops | revprops
361                 ? ( revprop:string ... ) )
362     Before sending response, server sends log entries, ending with "done".
363     If a client does not want to specify a limit, it should send 0 as the
364     limit parameter.  rev-props excludes author, date, and log; they are
365     sent separately for backwards-compatibility.
366     log-entry: ( ( change:changed-path-entry ... ) rev:number
367                  [ author:string ] [ date:string ] [ message:string ]
368                  ? has-children:bool invalid-revnum:bool
369                  revprop-count:number rev-props:proplist )
370              | done
371     changed-path-entry: ( path:string A|D|R|M [ copy-path:string ]
372                           [ copy-rev:number ] )
373     response: ( )
375   get-locations
376     params:   ( path:string peg-rev:number ( rev:number ... ) )
377     Before sending response, server sends location entries, ending with "done".
378     location-entry: ( rev:number abs-path:number ) | done
379     response: ( )
381   get-location-segments
382     params:   ( path:string [ start-rev:number ] [ end-rev:number ] )
383     Before sending response, server sends location entries, ending with "done".
384     location-entry: ( range-start:number range-end:number [ abs-path:string ] ) | done
385     response: ( )
387   get-file-revs
388     params:   ( path:string [ start-rev:number ] [ end-rev:number ]
389                 ? include-merged-revisions:bool )
390     Before sending response, server sends file-rev entries, ending with "done".
391     file-rev: ( path:string rev:number rev-props:proplist
392                 file-props:propdelta ? merged-revision:bool )
393               | done
394     After each file-rev, the file delta is sent as one or more strings,
395     terminated by the empty string.  If there is no delta, server just sends
396     the terminator.
397     response: ( )
399   lock
400     params:    ( path:string [ comment:string ] steal-lock:bool
401                  [ current-rev:number ] )
402     response:  ( lock:lockdesc )
404   lock-many
405     params:    ( [ comment:string ] steal-lock:bool ( ( path:string
406                  [ current-rev:number ] ) ... ) )
407     Before sending response, server sends lock cmd status and descriptions,
408     ending with "done".
409     lock-info: ( success ( lock:lockdesc ) ) | ( failure ( err:error ) )
410                 | done
411     response: ( )
413   unlock
414     params:    ( path:string [ token:string ] break-lock:bool )
415     response:  ( )
417   unlock-many
418     params:    ( break-lock:bool ( ( path:string [ token:string ] ) ... ) )
419     Before sending response, server sends unlocked paths, ending with "done".
420     pre-response: ( success ( path:string ) ) | ( failure ( err:error ) )
421                   | done
422     response:  ( )
424   get-lock
425     params:    ( path:string )
426     response:  ( [ lock:lockdesc ] )
428   get-locks
429     params:    ( path:string )
430     response   ( ( lock:lockdesc ... ) )
432   replay
433     params:    ( revision:number low-water-mark:number send-deltas:bool )
434     After auth exchange completes, server switches to editor command set.
435     After edit completes, server sends response.
436     response   ( )
438   replay-range
439     params:    ( start-rev:number end-rev:number low-water-mark:number 
440                  send-deltas:bool )
441     After auth exchange completes, server sends each revision
442     from start-rev to end-rev, alternating between sending 'revprops' 
443     entries and sending the revision in the editor command set.
444     After all revisions are complete, server sends response.
445     revprops:  ( revprops:word props:proplist )
446       (revprops here is the literal word "revprops".)
447     response   ( )
449 3.1.2. Editor Command Set
451 An edit operation produces only one response, at close-edit or
452 abort-edit time.  However, the consumer may write an error response at
453 any time during the edit in order to terminate the edit operation
454 early; the driver must notice that input is waiting on the connection,
455 read the error, and send an abort-edit operation.  After an error is
456 returned, the consumer must read and discard editing operations until
457 the abort-edit.  In order to prevent TCP deadlock, the consumer must
458 use non-blocking I/O to send an early error response; if writing
459 blocks, the consumer must read and discard edit operations until
460 writing unblocks or it reads an abort-edit.
462   target-rev
463     params:   ( rev:number )
465   open-root
466     params:   ( [ rev:number ] root-token:string )
468   delete-entry
469     params:   ( path:string rev:number dir-token:string )
471   add-dir
472     params:   ( path:string parent-token:string child-token:string
473                 [ copy-path:string copy-rev:number ] )
475   open-dir
476     params:   ( path:string parent-token:string child-token:string rev:number )
478   change-dir-prop
479     params:   ( dir-token:string name:string [ value:string ] )
481   close-dir
482     params:   ( dir-token:string )
484   absent-dir
485     params:   ( path:string parent-token:string )
487   add-file
488     params:   ( path:string dir-token:string file-token:string
489                 [ copy-path:string copy-rev:number ] )
491   open-file
492     params:   ( path:string dir-token:string file-token:string rev:number )
494   apply-textdelta
495     params:   ( file-token:string [ base-checksum:string ] )
497   textdelta-chunk
498     params: ( file-token:string chunk:string )
500   textdelta-end
501     params: ( file-token:string )
503   change-file-prop
504     params:   ( file-token:string name:string [ value:string ] )
506   close-file
507     params:   ( file-token:string [ text-checksum:string ] )
509   absent-file
510     params:   ( path:string parent-token:string )
512   close-edit
513     params:   ( )
514     response: ( )
516   abort-edit
517     params:   ( )
518     response: ( )
520   finish-replay
521     params:   ( )
522     Only delivered from server to client, at the end of a replay.
524 3.1.3. Report Command Set
526 To reduce round-trip delays, report commands do not return responses.
527 Any errors resulting from a report call will be returned to the client
528 by the command which invoked the report (following an abort-edit
529 call).  Errors resulting from an abort-report call are ignored.
531   set-path:
532     params: ( path:string rev:number start-empty:bool
533               ? [ lock-token:string ] ? depth:word )
535   delete-path:
536     params: ( path:string )
538   link-path:
539     params: ( path:string url:string rev:number start-empty:bool 
540               ? [ lock-token:string ] ? depth:word )
542   finish-report:
543     params: ( )
545   abort-report
546     params: ( )
548 4. Extensibility
549 ----------------
551 This protocol may be extended in three ways, in decreasing order of
552 desirability:
554   * Items may be added to any tuple.  An old implementation will
555     ignore the extra items.
557   * Named extensions may be expressed at connection initiation time
558     by the client or server.
560   * The protocol version may be bumped.  Clients and servers can then
561     choose to any range of protocol versions.
563 4.1. Extending existing commands
565 Extending an existing command is normally done by indicating that its
566 tuple is allowed to end where it currently ends, for backwards
567 compatibility, and then tacking on a new, possibly optional, item.
569 For example, diff was extended to include a new mandatory text-deltas
570 parameter like this:
572   /* OLD */ diff:
573     params:   ( [ rev:number ] target:string recurse:bool ignore-ancestry:bool
574                 url:string )
575   /* NEW */ diff:
576     params:   ( [ rev:number ] target:string recurse:bool ignore-ancestry:bool
577                 url:string ? text-deltas:bool )
579 The "?" says that the tuple is allowed to end here, because an old
580 client or server wouldn't know to send the new item.
582 For optional parameters, a slightly different approach must be used.
583 set-path was extended to include lock-tokens like this:
585   /* OLD */ set-path:
586     params: ( path:string rev:number start-empty:bool )
588   /* NEW */ set-path:
589     params: ( path:string rev:number start-empty:bool ? [ lock-token:string ] )
591 The new item appears in brackets because, even in the new protocol,
592 the lock-token is still optional.  However, if there's no lock-token
593 to send, an empty tuple must still be transmitted so that future
594 extensions to this command remain possible.