OSDN Git Service

Fail try to porting
[tortoisegit/TortoiseGitJp.git] / src / TortoiseMerge / svninclude / svn_types.h
1 /**\r
2  * @copyright\r
3  * ====================================================================\r
4  * Copyright (c) 2000-2008 CollabNet.  All rights reserved.\r
5  *\r
6  * This software is licensed as described in the file COPYING, which\r
7  * you should have received as part of this distribution.  The terms\r
8  * are also available at http://subversion.tigris.org/license-1.html.\r
9  * If newer versions of this license are posted there, you may use a\r
10  * newer version instead, at your option.\r
11  *\r
12  * This software consists of voluntary contributions made by many\r
13  * individuals.  For exact contribution history, see the revision\r
14  * history and logs, available at http://subversion.tigris.org/.\r
15  * ====================================================================\r
16  * @endcopyright\r
17  *\r
18  * @file svn_types.h\r
19  * @brief Subversion's data types\r
20  */\r
21 \r
22 #ifndef SVN_TYPES_H\r
23 #define SVN_TYPES_H\r
24 \r
25 /* ### this should go away, but it causes too much breakage right now */\r
26 #include <stdlib.h>\r
27 \r
28 #include <apr.h>        /* for apr_size_t */\r
29 #include <apr_pools.h>\r
30 #include <apr_hash.h>\r
31 #include <apr_tables.h>\r
32 #include <apr_time.h>\r
33 #include <apr_sha1.h>\r
34 #include <apr_errno.h>\r
35 \r
36 #ifdef __cplusplus\r
37 extern "C" {\r
38 #endif /* __cplusplus */\r
39 \r
40 //porting\r
41 typedef int svn_version_t;\r
42 \r
43 \f\r
44 /** Macro used to mark deprecated functions.\r
45  *\r
46  * @since New in 1.6.\r
47  */\r
48 #ifndef SVN_DEPRECATED\r
49 #if !defined(SWIGPERL) && !defined(SWIGPYTHON) && !defined(SWIGRUBY)\r
50 #if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__==3 && __GNUC_MINOR__>=1))\r
51 #define SVN_DEPRECATED __attribute__((deprecated))\r
52 #elif defined(_MSC_VER) && _MSC_VER >= 1300\r
53 #define SVN_DEPRECATED __declspec(deprecated)\r
54 #else\r
55 #define SVN_DEPRECATED\r
56 #endif\r
57 #else\r
58 #define SVN_DEPRECATED\r
59 #endif\r
60 #endif\r
61 \r
62 \r
63 \f\r
64 /** Subversion error object.\r
65  *\r
66  * Defined here, rather than in svn_error.h, to avoid a recursive @#include\r
67  * situation.\r
68  */\r
69 typedef struct svn_error_t\r
70 {\r
71   /** APR error value, possibly SVN_ custom err */\r
72   apr_status_t apr_err;\r
73 \r
74   /** details from producer of error */\r
75   const char *message;\r
76 \r
77   /** ptr to the error we "wrap" */\r
78   struct svn_error_t *child;\r
79 \r
80   /** The pool holding this error and any child errors it wraps */\r
81   //apr_pool_t *pool;\r
82 \r
83   /** Source file where the error originated.  Only used iff @c SVN_DEBUG. */\r
84   const char *file;\r
85 \r
86   /** Source line where the error originated.  Only used iff @c SVN_DEBUG. */\r
87   long line;\r
88 \r
89 } svn_error_t;\r
90 \r
91 \r
92 \f\r
93 /** @defgroup APR_ARRAY_compat_macros APR Array Compatibility Helper Macros\r
94  * These macros are provided by APR itself from version 1.3.\r
95  * Definitions are provided here for when using older versions of APR.\r
96  * @{\r
97  */\r
98 \r
99 /** index into an apr_array_header_t */\r
100 #ifndef APR_ARRAY_IDX\r
101 #define APR_ARRAY_IDX(ary,i,type) (((type *)(ary)->elts)[i])\r
102 #endif\r
103 \r
104 /** easier array-pushing syntax */\r
105 #ifndef APR_ARRAY_PUSH\r
106 #define APR_ARRAY_PUSH(ary,type) (*((type *)apr_array_push(ary)))\r
107 #endif\r
108 \r
109 /** @} */\r
110 \f\r
111 /** The various types of nodes in the Subversion filesystem. */\r
112 typedef enum\r
113 {\r
114   /** absent */\r
115   svn_node_none,\r
116 \r
117   /** regular file */\r
118   svn_node_file,\r
119 \r
120   /** directory */\r
121   svn_node_dir,\r
122 \r
123   /** something's here, but we don't know what */\r
124   svn_node_unknown\r
125 } svn_node_kind_t;\r
126 \r
127 /** About Special Files in Subversion\r
128  *\r
129  * Subversion denotes files that cannot be portably created or\r
130  * modified as "special" files (svn_node_special).  It stores these\r
131  * files in the repository as a plain text file with the svn:special\r
132  * property set.  The file contents contain: a platform-specific type\r
133  * string, a space character, then any information necessary to create\r
134  * the file on a supported platform.  For example, if a symbolic link\r
135  * were being represented, the repository file would have the\r
136  * following contents:\r
137  *\r
138  * "link /path/to/link/target"\r
139  *\r
140  * Where 'link' is the identifier string showing that this special\r
141  * file should be a symbolic link and '/path/to/link/target' is the\r
142  * destination of the symbolic link.\r
143  *\r
144  * Special files are stored in the text-base exactly as they are\r
145  * stored in the repository.  The platform specific files are created\r
146  * in the working copy at EOL/keyword translation time using\r
147  * svn_subst_copy_and_translate2().  If the current platform does not\r
148  * support a specific special file type, the file is copied into the\r
149  * working copy as it is seen in the repository.  Because of this,\r
150  * users of other platforms can still view and modify the special\r
151  * files, even if they do not have their unique properties.\r
152  *\r
153  * New types of special files can be added by:\r
154  *  1. Implementing a platform-dependent routine to create a uniquely\r
155  *     named special file and one to read the special file in\r
156  *     libsvn_subr/io.c.\r
157  *  2. Creating a new textual name similar to\r
158  *     SVN_SUBST__SPECIAL_LINK_STR in libsvn_subr/subst.c.\r
159  *  3. Handling the translation/detranslation case for the new type in\r
160  *     create_special_file and detranslate_special_file, using the\r
161  *     routines from 1.\r
162  */\r
163 \r
164 /** A revision number. */\r
165 typedef long int svn_revnum_t;\r
166 \r
167 /** Valid revision numbers begin at 0 */\r
168 #define SVN_IS_VALID_REVNUM(n) ((n) >= 0)\r
169 \r
170 /** The 'official' invalid revision num */\r
171 #define SVN_INVALID_REVNUM ((svn_revnum_t) -1)\r
172 \r
173 /** Not really invalid...just unimportant -- one day, this can be its\r
174  * own unique value, for now, just make it the same as\r
175  * @c SVN_INVALID_REVNUM.\r
176  */\r
177 #define SVN_IGNORED_REVNUM ((svn_revnum_t) -1)\r
178 \r
179 /** Convert NULL-terminated C string @a str to a revision number. */\r
180 #define SVN_STR_TO_REV(str) ((svn_revnum_t) atol(str))\r
181 \r
182 /**\r
183  * Parse NULL-terminated C string @a str as a revision number and\r
184  * store its value in @a rev.  If @a endptr is non-NULL, then the\r
185  * address of the first non-numeric character in @a str is stored in\r
186  * it.  If there are no digits in @a str, then @a endptr is set (if\r
187  * non-NULL), and the error @c SVN_ERR_REVNUM_PARSE_FAILURE error is\r
188  * returned.  Negative numbers parsed from @a str are considered\r
189  * invalid, and result in the same error.\r
190  *\r
191  * @since New in 1.5.\r
192  */\r
193 svn_error_t *\r
194 svn_revnum_parse(svn_revnum_t *rev,\r
195                  const char *str,\r
196                  const char **endptr);\r
197 \r
198 /** Originally intended to be used in printf()-style functions to format\r
199  * revision numbers.  Deprecated due to incompatibilities with language\r
200  * translation tools (e.g. gettext).\r
201  *\r
202  * New code should use a bare "%ld" format specifier for formatting revision\r
203  * numbers.\r
204  *\r
205  * @deprecated Provided for backward compatibility with the 1.0 API.\r
206  */\r
207 #define SVN_REVNUM_T_FMT "ld"\r
208 \r
209 \r
210 /** The size of a file in the Subversion FS. */\r
211 typedef apr_int64_t svn_filesize_t;\r
212 \r
213 /** The 'official' invalid file size constant. */\r
214 #define SVN_INVALID_FILESIZE ((svn_filesize_t) -1)\r
215 \r
216 /** In printf()-style functions, format file sizes using this. */\r
217 #define SVN_FILESIZE_T_FMT APR_INT64_T_FMT\r
218 \r
219 #ifndef DOXYGEN_SHOULD_SKIP_THIS\r
220 /* Parse a base-10 numeric string into a 64-bit unsigned numeric value. */\r
221 /* NOTE: Private. For use by Subversion's own code only. See issue #1644. */\r
222 /* FIXME: APR should supply a function to do this, such as "apr_atoui64". */\r
223 #define svn__atoui64(X) ((apr_uint64_t) apr_atoi64(X))\r
224 #endif\r
225 \r
226 \r
227 /** YABT:  Yet Another Boolean Type */\r
228 typedef int svn_boolean_t;\r
229 \r
230 #ifndef TRUE\r
231 /** uhh... true */\r
232 #define TRUE 1\r
233 #endif /* TRUE */\r
234 \r
235 #ifndef FALSE\r
236 /** uhh... false */\r
237 #define FALSE 0\r
238 #endif /* FALSE */\r
239 \r
240 \r
241 /** An enum to indicate whether recursion is needed. */\r
242 enum svn_recurse_kind\r
243 {\r
244   svn_nonrecursive = 1,\r
245   svn_recursive\r
246 };\r
247 \r
248 /** The concept of depth for directories.\r
249  *\r
250  * @note This is similar to, but not exactly the same as, the WebDAV\r
251  * and LDAP concepts of depth.\r
252  *\r
253  * @since New in 1.5.\r
254  */\r
255 typedef enum\r
256 {\r
257   /* The order of these depths is important: the higher the number,\r
258      the deeper it descends.  This allows us to compare two depths\r
259      numerically to decide which should govern. */\r
260 \r
261   /* Depth undetermined or ignored.  In some contexts, this means the\r
262      client should choose an appropriate default depth.  The server\r
263      will generally treat it as @c svn_depth_infinity. */\r
264   svn_depth_unknown    = -2,\r
265 \r
266   /* Exclude (i.e., don't descend into) directory D. */\r
267   /* NOTE: In Subversion 1.5, svn_depth_exclude is *not* supported\r
268      anywhere in the client-side (libsvn_wc/libsvn_client/etc) code;\r
269      it is only supported as an argument to set_path functions in the\r
270      ra and repos reporters.  (This will enable future versions of\r
271      Subversion to run updates, etc, against 1.5 servers with proper\r
272      svn_depth_exclude behavior, once we get a chance to implement\r
273      client-side support for svn_depth_exclude.)\r
274   */\r
275   svn_depth_exclude    = -1,\r
276 \r
277   /* Just the named directory D, no entries.  Updates will not pull in\r
278      any files or subdirectories not already present. */\r
279   svn_depth_empty      =  0,\r
280 \r
281   /* D + its file children, but not subdirs.  Updates will pull in any\r
282      files not already present, but not subdirectories. */\r
283   svn_depth_files      =  1,\r
284 \r
285   /* D + immediate children (D and its entries).  Updates will pull in\r
286      any files or subdirectories not already present; those\r
287      subdirectories' this_dir entries will have depth-empty. */\r
288   svn_depth_immediates =  2,\r
289 \r
290   /* D + all descendants (full recursion from D).  Updates will pull\r
291      in any files or subdirectories not already present; those\r
292      subdirectories' this_dir entries will have depth-infinity.\r
293      Equivalent to the pre-1.5 default update behavior. */\r
294   svn_depth_infinity   =  3\r
295 \r
296 } svn_depth_t;\r
297 \r
298 \r
299 /** Return a constant string expressing @a depth as an English word,\r
300  * e.g., "infinity", "immediates", etc.  The string is not localized,\r
301  * as it may be used for client<->server communications.\r
302  *\r
303  * @since New in 1.5.\r
304  */\r
305 const char *\r
306 svn_depth_to_word(svn_depth_t depth);\r
307 \r
308 \r
309 /** Return the appropriate depth for @a depth_str.  @a word is as\r
310  * returned from svn_depth_to_word().  If @a depth_str does not\r
311  * represent a recognized depth, return @c svn_depth_unknown.\r
312  *\r
313  * @since New in 1.5.\r
314  */\r
315 svn_depth_t\r
316 svn_depth_from_word(const char *word);\r
317 \r
318 \r
319 /* Return @c svn_depth_infinity if boolean @a recurse is TRUE, else\r
320  * return @c svn_depth_files.\r
321  *\r
322  * @note New code should never need to use this, it is called only\r
323  * from pre-depth APIs, for compatibility.\r
324  *\r
325  * @since New in 1.5.\r
326  */\r
327 #define SVN_DEPTH_INFINITY_OR_FILES(recurse) \\r
328   ((recurse) ? svn_depth_infinity : svn_depth_files)\r
329 \r
330 \r
331 /* Return @c svn_depth_infinity if boolean @a recurse is TRUE, else\r
332  * return @c svn_depth_immediates.\r
333  *\r
334  * @note New code should never need to use this, it is called only\r
335  * from pre-depth APIs, for compatibility.\r
336  *\r
337  * @since New in 1.5.\r
338  */\r
339 #define SVN_DEPTH_INFINITY_OR_IMMEDIATES(recurse) \\r
340   ((recurse) ? svn_depth_infinity : svn_depth_immediates)\r
341 \r
342 \r
343 /* Return @c svn_depth_infinity if boolean @a recurse is TRUE, else\r
344  * return @c svn_depth_empty.\r
345  *\r
346  * @note New code should never need to use this, it is called only\r
347  * from pre-depth APIs, for compatibility.\r
348  *\r
349  * @since New in 1.5.\r
350  */\r
351 #define SVN_DEPTH_INFINITY_OR_EMPTY(recurse) \\r
352   ((recurse) ? svn_depth_infinity : svn_depth_empty)\r
353 \r
354 \r
355 /* Return a recursion boolean based on @a depth.\r
356  *\r
357  * Although much code has been converted to use depth, some code still\r
358  * takes a recurse boolean.  In most cases, it makes sense to treat\r
359  * unknown or infinite depth as recursive, and any other depth as\r
360  * non-recursive (which in turn usually translates to @c svn_depth_files).\r
361  */\r
362 #define SVN_DEPTH_IS_RECURSIVE(depth)                              \\r
363   (((depth) == svn_depth_infinity || (depth) == svn_depth_unknown) \\r
364    ? TRUE : FALSE)\r
365 \r
366 \r
367 /**\r
368  * It is sometimes convenient to indicate which parts of an @c svn_dirent_t\r
369  * object you are actually interested in, so that calculating and sending\r
370  * the data corresponding to the other fields can be avoided.  These values\r
371  * can be used for that purpose.\r
372  *\r
373  * @defgroup svn_dirent_fields Dirent fields\r
374  * @{\r
375  */\r
376 \r
377 /** An indication that you are interested in the @c kind field */\r
378 #define SVN_DIRENT_KIND        0x00001\r
379 \r
380 /** An indication that you are interested in the @c size field */\r
381 #define SVN_DIRENT_SIZE        0x00002\r
382 \r
383 /** An indication that you are interested in the @c has_props field */\r
384 #define SVN_DIRENT_HAS_PROPS   0x00004\r
385 \r
386 /** An indication that you are interested in the @c created_rev field */\r
387 #define SVN_DIRENT_CREATED_REV 0x00008\r
388 \r
389 /** An indication that you are interested in the @c time field */\r
390 #define SVN_DIRENT_TIME        0x00010\r
391 \r
392 /** An indication that you are interested in the @c last_author field */\r
393 #define SVN_DIRENT_LAST_AUTHOR 0x00020\r
394 \r
395 /** A combination of all the dirent fields */\r
396 #define SVN_DIRENT_ALL ~((apr_uint32_t ) 0)\r
397 \r
398 /** @} */\r
399 \r
400 /** A general subversion directory entry. */\r
401 typedef struct svn_dirent_t\r
402 {\r
403   /** node kind */\r
404   svn_node_kind_t kind;\r
405 \r
406   /** length of file text, or 0 for directories */\r
407   svn_filesize_t size;\r
408 \r
409   /** does the node have props? */\r
410   svn_boolean_t has_props;\r
411 \r
412   /** last rev in which this node changed */\r
413   svn_revnum_t created_rev;\r
414 \r
415   /** time of created_rev (mod-time) */\r
416   //apr_time_t time;\r
417 \r
418   /** author of created_rev */\r
419   const char *last_author;\r
420 \r
421   /* IMPORTANT: If you extend this struct, check svn_dirent_dup(). */\r
422 } svn_dirent_t;\r
423 \r
424 \r
425 /** Return a deep copy of @a dirent, allocated in @a pool.\r
426  *\r
427  * @since New in 1.4.\r
428  */\r
429 svn_dirent_t *\r
430 svn_dirent_dup(const svn_dirent_t *dirent,\r
431                apr_pool_t *pool);\r
432 \r
433 \r
434 /** Keyword substitution.\r
435  *\r
436  * All the keywords Subversion recognizes.\r
437  *\r
438  * Note that there is a better, more general proposal out there, which\r
439  * would take care of both internationalization issues and custom\r
440  * keywords (e.g., $NetBSD$).  See\r
441  *\r
442  * @verbatim\r
443       http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=8921\r
444       =====\r
445       From: "Jonathan M. Manning" <jmanning@alisa-jon.net>\r
446       To: dev@subversion.tigris.org\r
447       Date: Fri, 14 Dec 2001 11:56:54 -0500\r
448       Message-ID: <87970000.1008349014@bdldevel.bl.bdx.com>\r
449       Subject: Re: keywords @endverbatim\r
450  *\r
451  * and Eric Gillespie's support of same:\r
452  *\r
453  * @verbatim\r
454       http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=8757\r
455       =====\r
456       From: "Eric Gillespie, Jr." <epg@pretzelnet.org>\r
457       To: dev@subversion.tigris.org\r
458       Date: Wed, 12 Dec 2001 09:48:42 -0500\r
459       Message-ID: <87k7vsebp1.fsf@vger.pretzelnet.org>\r
460       Subject: Re: Customizable Keywords @endverbatim\r
461  *\r
462  * However, it is considerably more complex than the scheme below.\r
463  * For now we're going with simplicity, hopefully the more general\r
464  * solution can be done post-1.0.\r
465  *\r
466  * @defgroup svn_types_keywords Keyword definitions\r
467  * @{\r
468  */\r
469 \r
470 /** The maximum size of an expanded or un-expanded keyword. */\r
471 #define SVN_KEYWORD_MAX_LEN    255\r
472 \r
473 /** The most recent revision in which this file was changed. */\r
474 #define SVN_KEYWORD_REVISION_LONG    "LastChangedRevision"\r
475 \r
476 /** Short version of LastChangedRevision */\r
477 #define SVN_KEYWORD_REVISION_SHORT   "Rev"\r
478 \r
479 /** Medium version of LastChangedRevision, matching the one CVS uses.\r
480  * @since New in 1.1. */\r
481 #define SVN_KEYWORD_REVISION_MEDIUM  "Revision"\r
482 \r
483 /** The most recent date (repository time) when this file was changed. */\r
484 #define SVN_KEYWORD_DATE_LONG        "LastChangedDate"\r
485 \r
486 /** Short version of LastChangedDate */\r
487 #define SVN_KEYWORD_DATE_SHORT       "Date"\r
488 \r
489 /** Who most recently committed to this file. */\r
490 #define SVN_KEYWORD_AUTHOR_LONG      "LastChangedBy"\r
491 \r
492 /** Short version of LastChangedBy */\r
493 #define SVN_KEYWORD_AUTHOR_SHORT     "Author"\r
494 \r
495 /** The URL for the head revision of this file. */\r
496 #define SVN_KEYWORD_URL_LONG         "HeadURL"\r
497 \r
498 /** Short version of HeadURL */\r
499 #define SVN_KEYWORD_URL_SHORT        "URL"\r
500 \r
501 /** A compressed combination of the other four keywords. */\r
502 #define SVN_KEYWORD_ID               "Id"\r
503 \r
504 /** @} */\r
505 \r
506 \f\r
507 /** All information about a commit.\r
508  *\r
509  * @note Objects of this type should always be created using the\r
510  * svn_create_commit_info() function.\r
511  *\r
512  * @since New in 1.3.\r
513  */\r
514 typedef struct svn_commit_info_t\r
515 {\r
516   /** just-committed revision. */\r
517   svn_revnum_t revision;\r
518 \r
519   /** server-side date of the commit. */\r
520   const char *date;\r
521 \r
522   /** author of the commit. */\r
523   const char *author;\r
524 \r
525   /** error message from post-commit hook, or NULL. */\r
526   const char *post_commit_err;\r
527 \r
528 } svn_commit_info_t;\r
529 \r
530 \f\r
531 /**\r
532  * Allocate an object of type @c svn_commit_info_t in @a pool and\r
533  * return it.\r
534  *\r
535  * The @c revision field of the new struct is set to @c\r
536  * SVN_INVALID_REVNUM.  All other fields are initialized to @c NULL.\r
537  *\r
538  * @note Any object of the type @c svn_commit_info_t should\r
539  * be created using this function.\r
540  * This is to provide for extending the svn_commit_info_t in\r
541  * the future.\r
542  *\r
543  * @since New in 1.3.\r
544  */\r
545 svn_commit_info_t *\r
546 svn_create_commit_info(apr_pool_t *pool);\r
547 \r
548 \f\r
549 /**\r
550  * Return a deep copy @a src_commit_info allocated in @a pool.\r
551  *\r
552  * @since New in 1.4.\r
553  */\r
554 svn_commit_info_t *\r
555 svn_commit_info_dup(const svn_commit_info_t *src_commit_info,\r
556                     apr_pool_t *pool);\r
557 \r
558 \f\r
559 /** A structure to represent a path that changed for a log entry. */\r
560 typedef struct svn_log_changed_path_t\r
561 {\r
562   /** 'A'dd, 'D'elete, 'R'eplace, 'M'odify */\r
563   char action;\r
564 \r
565   /** Source path of copy (if any). */\r
566   const char *copyfrom_path;\r
567 \r
568   /** Source revision of copy (if any). */\r
569   svn_revnum_t copyfrom_rev;\r
570 \r
571 } svn_log_changed_path_t;\r
572 \r
573 \r
574 /**\r
575  * Return a deep copy of @a changed_path, allocated in @a pool.\r
576  *\r
577  * @since New in 1.3.\r
578  */\r
579 svn_log_changed_path_t *\r
580 svn_log_changed_path_dup(const svn_log_changed_path_t *changed_path,\r
581                          apr_pool_t *pool);\r
582 \r
583 /**\r
584  * A structure to represent all the information about a particular log entry.\r
585  *\r
586  * @note To allow for extending the @c svn_log_entry_t structure in future\r
587  * releases, always use svn_log_entry_create() to allocate the structure.\r
588  */\r
589 typedef struct svn_log_entry_t\r
590 {\r
591   /** A hash containing as keys every path committed in @a revision; the\r
592    * values are (@c svn_log_changed_path_t *) stuctures.\r
593    *\r
594    * ### The only reason @a changed_paths is not qualified with `const' is\r
595    * that we usually want to loop over it, and apr_hash_first() doesn't\r
596    * take a const hash, for various reasons.  I'm not sure that those\r
597    * "various reasons" are actually even relevant anymore, and if\r
598    * they're not, it might be nice to change apr_hash_first() so\r
599    * read-only uses of hashes can be protected via the type system.\r
600    */\r
601   //apr_hash_t *changed_paths;\r
602 \r
603   /** The revision of the commit. */\r
604   svn_revnum_t revision;\r
605 \r
606   /** The hash of requested revision properties, which may be NULL if it\r
607    * would contain no revprops. */\r
608 //  apr_hash_t *revprops;\r
609 \r
610   /**\r
611    * Whether or not this message has children.\r
612    *\r
613    * When a log operation requests additional merge information, extra log\r
614    * entries may be returned as a result of this entry.  The new entries, are\r
615    * considered children of the original entry, and will follow it.  When\r
616    * the HAS_CHILDREN flag is set, the receiver should increment its stack\r
617    * depth, and wait until an entry is provided with SVN_INVALID_REVNUM which\r
618    * indicates the end of the children.\r
619    *\r
620    * For log operations which do not request additional merge information, the\r
621    * HAS_CHILDREN flag is always FALSE.\r
622    *\r
623    * For more information see:\r
624    * http://subversion.tigris.org/merge-tracking/design.html#commutative-reporting\r
625    */\r
626   svn_boolean_t has_children;\r
627 } svn_log_entry_t;\r
628 \r
629 /**\r
630  * Returns an @c svn_log_entry_t, allocated in @a pool with all fields\r
631  * initialized to NULL values.\r
632  *\r
633  * @note To allow for extending the @c svn_log_entry_t structure in future\r
634  * releases, this function should always be used to allocate the structure.\r
635  *\r
636  * @since New in 1.5.\r
637  */\r
638 svn_log_entry_t *\r
639 svn_log_entry_create(apr_pool_t *pool);\r
640 \r
641 /** The callback invoked by log message loopers, such as\r
642  * @c svn_ra_plugin_t.get_log() and svn_repos_get_logs().\r
643  *\r
644  * This function is invoked once on each log message, in the order\r
645  * determined by the caller (see above-mentioned functions).\r
646  *\r
647  * @a baton is what you think it is, and @a log_entry contains relevent\r
648  * information for the log message.  Any of @a log_entry->author,\r
649  * @a log_entry->date, or @a log_entry->message may be @c NULL.\r
650  *\r
651  * If @a log_entry->date is neither NULL nor the empty string, it was\r
652  * generated by svn_time_to_cstring() and can be converted to\r
653  * @c apr_time_t with svn_time_from_cstring().\r
654  *\r
655  * If @a log_entry->changed_paths is non-@c NULL, then it contains as keys\r
656  * every path committed in @a log_entry->revision; the values are\r
657  * (@c svn_log_changed_path_t *) structures.\r
658  *\r
659  * If @a log_entry->has_children is @c TRUE, the message will be followed\r
660  * immediately by any number of merged revisions (child messages), which are\r
661  * terminated by an invocation with SVN_INVALID_REVNUM.  This usage may\r
662  * be recursive.\r
663  *\r
664  * Use @a pool for temporary allocation.  If the caller is iterating\r
665  * over log messages, invoking this receiver on each, we recommend the\r
666  * standard pool loop recipe: create a subpool, pass it as @a pool to\r
667  * each call, clear it after each iteration, destroy it after the loop\r
668  * is done.  (For allocation that must last beyond the lifetime of a\r
669  * given receiver call, use a pool in @a baton.)\r
670  *\r
671  * @since New in 1.5.\r
672  */\r
673 \r
674 typedef svn_error_t *(*svn_log_entry_receiver_t)\r
675   (void *baton,\r
676    svn_log_entry_t *log_entry,\r
677    apr_pool_t *pool);\r
678 \r
679 /**\r
680  * Similar to @c svn_log_entry_receiver_t, except this uses separate\r
681  * parameters for each part of the log entry.\r
682  *\r
683  * @deprecated Provided for backward compatibility with the 1.4 API.\r
684  */\r
685 typedef svn_error_t *(*svn_log_message_receiver_t)\r
686   (void *baton,\r
687    apr_hash_t *changed_paths,\r
688    svn_revnum_t revision,\r
689    const char *author,\r
690    const char *date,  /* use svn_time_from_cstring() if need apr_time_t */\r
691    const char *message,\r
692    apr_pool_t *pool);\r
693 \r
694 \f\r
695 /** Callback function type for commits.\r
696  *\r
697  * When a commit succeeds, an instance of this is invoked with the\r
698  * @a commit_info, along with the @a baton closure.\r
699  * @a pool can be used for temporary allocations.\r
700  *\r
701  * @since New in 1.4.\r
702  */\r
703 typedef svn_error_t *(*svn_commit_callback2_t)\r
704   (const svn_commit_info_t *commit_info,\r
705    void *baton,\r
706    apr_pool_t *pool);\r
707 \r
708 /** Same as @c svn_commit_callback2_t, but uses individual\r
709  * data elements instead of the @c svn_commit_info_t structure\r
710  *\r
711  * @deprecated Provided for backward compatibility with the 1.3 API.\r
712  */\r
713 typedef svn_error_t *(*svn_commit_callback_t)\r
714   (svn_revnum_t new_revision,\r
715    const char *date,\r
716    const char *author,\r
717    void *baton);\r
718 \r
719 \f\r
720 /** A buffer size that may be used when processing a stream of data.\r
721  *\r
722  * @note We don't use this constant any longer, since it is considered to be\r
723  * unnecessarily large.\r
724  *\r
725  * @deprecated Provided for backwards compatibility with the 1.3 API.\r
726  */\r
727 #define SVN_STREAM_CHUNK_SIZE 102400\r
728 \r
729 #ifndef DOXYGEN_SHOULD_SKIP_THIS\r
730 /*\r
731  * The maximum amount we (ideally) hold in memory at a time when\r
732  * processing a stream of data.\r
733  *\r
734  * For example, when copying data from one stream to another, do it in\r
735  * blocks of this size.\r
736  *\r
737  * NOTE: This is an internal macro, put here for convenience.\r
738  * No public API may depend on the particular value of this macro.\r
739  */\r
740 #define SVN__STREAM_CHUNK_SIZE 16384\r
741 #endif\r
742 \r
743 /** The maximum amount we can ever hold in memory. */\r
744 /* FIXME: Should this be the same as SVN_STREAM_CHUNK_SIZE? */\r
745 #define SVN_MAX_OBJECT_SIZE (((apr_size_t) -1) / 2)\r
746 \r
747 \r
748 \f\r
749 /* ### Note: despite being about mime-TYPES, these probably don't\r
750  * ### belong in svn_types.h.  However, no other header is more\r
751  * ### appropriate, and didn't feel like creating svn_validate.h for\r
752  * ### so little.\r
753  */\r
754 \r
755 /** Validate @a mime_type.\r
756  *\r
757  * If @a mime_type does not contain a "/", or ends with non-alphanumeric\r
758  * data, return @c SVN_ERR_BAD_MIME_TYPE, else return success.\r
759  *\r
760  * Use @a pool only to find error allocation.\r
761  *\r
762  * Goal: to match both "foo/bar" and "foo/bar; charset=blah", without\r
763  * being too strict about it, but to disallow mime types that have\r
764  * quotes, newlines, or other garbage on the end, such as might be\r
765  * unsafe in an HTTP header.\r
766  */\r
767 svn_error_t *\r
768 svn_mime_type_validate(const char *mime_type,\r
769                        apr_pool_t *pool);\r
770 \r
771 \r
772 /** Return FALSE iff @a mime_type is a textual type.\r
773  *\r
774  * All mime types that start with "text/" are textual, plus some special\r
775  * cases (for example, "image/x-xbitmap").\r
776  */\r
777 svn_boolean_t\r
778 svn_mime_type_is_binary(const char *mime_type);\r
779 \r
780 \r
781 \f\r
782 /** A user defined callback that subversion will call with a user defined\r
783  * baton to see if the current operation should be continued.  If the operation\r
784  * should continue, the function should return @c SVN_NO_ERROR, if not, it\r
785  * should return @c SVN_ERR_CANCELLED.\r
786  */\r
787 typedef svn_error_t *(*svn_cancel_func_t)(void *cancel_baton);\r
788 \r
789 \r
790 \f\r
791 /**\r
792  * A lock object, for client & server to share.\r
793  *\r
794  * A lock represents the exclusive right to add, delete, or modify a\r
795  * path.  A lock is created in a repository, wholly controlled by the\r
796  * repository.  A "lock-token" is the lock's UUID, and can be used to\r
797  * learn more about a lock's fields, and or/make use of the lock.\r
798  * Because a lock is immutable, a client is free to not only cache the\r
799  * lock-token, but the lock's fields too, for convenience.\r
800  *\r
801  * Note that the 'is_dav_comment' field is wholly ignored by every\r
802  * library except for mod_dav_svn.  The field isn't even marshalled\r
803  * over the network to the client.  Assuming lock structures are\r
804  * created with apr_pcalloc(), a default value of 0 is universally safe.\r
805  *\r
806  * @note in the current implementation, only files are lockable.\r
807  *\r
808  * @since New in 1.2.\r
809  */\r
810 typedef struct svn_lock_t\r
811 {\r
812   const char *path;              /**< the path this lock applies to */\r
813   const char *token;             /**< unique URI representing lock */\r
814   const char *owner;             /**< the username which owns the lock */\r
815   const char *comment;           /**< (optional) description of lock  */\r
816   svn_boolean_t is_dav_comment;  /**< was comment made by generic DAV client? */\r
817   apr_time_t creation_date;      /**< when lock was made */\r
818   apr_time_t expiration_date;    /**< (optional) when lock will expire;\r
819                                       If value is 0, lock will never expire. */\r
820 } svn_lock_t;\r
821 \r
822 /**\r
823  * Returns an @c svn_lock_t, allocated in @a pool with all fields initialized\r
824  * to NULL values.\r
825  *\r
826  * @note To allow for extending the @c svn_lock_t structure in the future\r
827  * releases, this function should always be used to allocate the structure.\r
828  *\r
829  * @since New in 1.2.\r
830  */\r
831 svn_lock_t *\r
832 svn_lock_create(apr_pool_t *pool);\r
833 \r
834 /**\r
835  * Return a deep copy of @a lock, allocated in @a pool.\r
836  *\r
837  * @since New in 1.2.\r
838  */\r
839 svn_lock_t *\r
840 svn_lock_dup(const svn_lock_t *lock, apr_pool_t *pool);\r
841 \r
842 /**\r
843  * Return a formatted Universal Unique IDentifier (UUID) string.\r
844  *\r
845  * @since New in 1.4.\r
846  */\r
847 const char *\r
848 svn_uuid_generate(apr_pool_t *pool);\r
849 \r
850 /**\r
851  * Mergeinfo representing a merge of a range of revisions.\r
852  *\r
853  * @since New in 1.5\r
854  */\r
855 typedef struct svn_merge_range_t\r
856 {\r
857   /**\r
858    * If the 'start' field is less than the 'end' field then 'start' is\r
859    * exclusive and 'end' inclusive of the range described.  This is termed\r
860    * a forward merge range.  If 'start' is greater than 'end' then the\r
861    * opposite is true.  This is termed a reverse merge range.  If 'start'\r
862    * equals 'end' the meaning of the range is not defined.\r
863    */\r
864   svn_revnum_t start;\r
865   svn_revnum_t end;\r
866 \r
867   /**\r
868    * Whether this merge range should be inherited by treewise\r
869    * descendants of the path to which the range applies. */\r
870   svn_boolean_t inheritable;\r
871 } svn_merge_range_t;\r
872 \r
873 /**\r
874  * Return a copy of @a range, allocated in @a pool.\r
875  *\r
876  * @since New in 1.5.\r
877  */\r
878 svn_merge_range_t *\r
879 svn_merge_range_dup(svn_merge_range_t *range, apr_pool_t *pool);\r
880 \r
881 /**\r
882  * Returns true if the changeset committed in revision @a rev is one\r
883  * of the changesets in the range @a range.\r
884  *\r
885  * @since New in 1.5.\r
886  */\r
887 svn_boolean_t\r
888 svn_merge_range_contains_rev(svn_merge_range_t *range, svn_revnum_t rev);\r
889 \r
890 \r
891 \f\r
892 /** @defgroup node_location_seg_reporting Node location segment reporting.\r
893  *  @{ */\r
894 \r
895 /**\r
896  * A representation of a segment of a object's version history with an\r
897  * emphasis on the object's location in the repository as of various\r
898  * revisions.\r
899  *\r
900  * @since New in 1.5.\r
901  */\r
902 typedef struct svn_location_segment_t\r
903 {\r
904   /** The beginning (oldest) and ending (youngest) revisions for this\r
905       segment. */\r
906   svn_revnum_t range_start;\r
907   svn_revnum_t range_end;\r
908 \r
909   /** The absolute (sans leading slash) path for this segment.  May be\r
910       NULL to indicate gaps in an object's history.  */\r
911   const char *path;\r
912 \r
913 } svn_location_segment_t;\r
914 \r
915 \r
916 /**\r
917  * A callback invoked by generators of @c svn_location_segment_t\r
918  * objects, used to report information about a versioned object's\r
919  * history in terms of its location in the repository filesystem over\r
920  * time.\r
921  */\r
922 typedef svn_error_t *(*svn_location_segment_receiver_t)\r
923   (svn_location_segment_t *segment,\r
924    void *baton,\r
925    apr_pool_t *pool);\r
926 \r
927 \r
928 /**\r
929  * Return a deep copy of @a segment, allocated in @a pool.\r
930  *\r
931  * @since New in 1.5.\r
932  */\r
933 svn_location_segment_t *\r
934 svn_location_segment_dup(svn_location_segment_t *segment,\r
935                          apr_pool_t *pool);\r
936 /** @} */\r
937 \r
938 \r
939 #ifdef __cplusplus\r
940 }\r
941 #endif /* __cplusplus */\r
942 \r
943 #endif /* SVN_TYPES_H */\r