1251881Speter/**
2251881Speter * @copyright
3251881Speter * ====================================================================
4251881Speter *    Licensed to the Apache Software Foundation (ASF) under one
5251881Speter *    or more contributor license agreements.  See the NOTICE file
6251881Speter *    distributed with this work for additional information
7251881Speter *    regarding copyright ownership.  The ASF licenses this file
8251881Speter *    to you under the Apache License, Version 2.0 (the
9251881Speter *    "License"); you may not use this file except in compliance
10251881Speter *    with the License.  You may obtain a copy of the License at
11251881Speter *
12251881Speter *      http://www.apache.org/licenses/LICENSE-2.0
13251881Speter *
14251881Speter *    Unless required by applicable law or agreed to in writing,
15251881Speter *    software distributed under the License is distributed on an
16251881Speter *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17251881Speter *    KIND, either express or implied.  See the License for the
18251881Speter *    specific language governing permissions and limitations
19251881Speter *    under the License.
20251881Speter * ====================================================================
21251881Speter * @endcopyright
22251881Speter *
23251881Speter * @file svn_version.h
24251881Speter * @brief Version information.
25251881Speter */
26251881Speter
27251881Speter#ifndef SVN_VERSION_H
28251881Speter#define SVN_VERSION_H
29251881Speter
30251881Speter/* Hack to prevent the resource compiler from including
31289166Speter   apr and other headers. */
32289166Speter#ifndef SVN_WIN32_RESOURCE_COMPILATION
33251881Speter#include <apr_general.h>
34251881Speter#include <apr_tables.h>
35251881Speter
36251881Speter#include "svn_types.h"
37289166Speter#endif
38251881Speter
39251881Speter#ifdef __cplusplus
40251881Speterextern "C" {
41251881Speter#endif /* __cplusplus */
42251881Speter
43251881Speter
44251881Speter/* Symbols that define the version number. */
45251881Speter
46251881Speter/* Version numbers: <major>.<minor>.<micro>
47251881Speter *
48251881Speter * The version numbers in this file follow the rules established by:
49251881Speter *
50251881Speter *   http://apr.apache.org/versioning.html
51251881Speter */
52251881Speter
53251881Speter/** Major version number.
54251881Speter *
55251881Speter * Modify when incompatible changes are made to published interfaces.
56251881Speter */
57251881Speter#define SVN_VER_MAJOR      1
58251881Speter
59251881Speter/** Minor version number.
60251881Speter *
61251881Speter * Modify when new functionality is added or new interfaces are
62251881Speter * defined, but all changes are backward compatible.
63251881Speter */
64299742Sdim#define SVN_VER_MINOR      9
65251881Speter
66251881Speter/**
67251881Speter * Patch number.
68251881Speter *
69251881Speter * Modify for every released patch.
70251881Speter *
71251881Speter * @since New in 1.1.
72251881Speter */
73309512Speter#define SVN_VER_PATCH      5
74251881Speter
75251881Speter
76251881Speter/** @deprecated Provided for backward compatibility with the 1.0 API. */
77251881Speter#define SVN_VER_MICRO      SVN_VER_PATCH
78251881Speter
79251881Speter/** @deprecated Provided for backward compatibility with the 1.0 API. */
80251881Speter#define SVN_VER_LIBRARY    SVN_VER_MAJOR
81251881Speter
82251881Speter
83251881Speter/** Version tag: a string describing the version.
84251881Speter *
85299742Sdim * This tag remains " (under development)" in the repository so that we can
86251881Speter * always see from "svn --version" that the software has been built
87251881Speter * from the repository rather than a "blessed" distribution.
88251881Speter *
89251881Speter * When rolling a tarball, we automatically replace this text with " (r1234)"
90251881Speter * (where 1234 is the last revision on the branch prior to the release)
91251881Speter * for final releases; in prereleases, it becomes " (Alpha 1)",
92251881Speter * " (Beta 1)", etc., as appropriate.
93251881Speter *
94251881Speter * Always change this at the same time as SVN_VER_NUMTAG.
95251881Speter */
96309512Speter#define SVN_VER_TAG        " (r1770682)"
97251881Speter
98251881Speter
99251881Speter/** Number tag: a string describing the version.
100251881Speter *
101251881Speter * This tag is used to generate a version number string to identify
102251881Speter * the client and server in HTTP requests, for example. It must not
103251881Speter * contain any spaces. This value remains "-dev" in the repository.
104251881Speter *
105251881Speter * When rolling a tarball, we automatically replace this text with ""
106251881Speter * for final releases; in prereleases, it becomes "-alpha1, "-beta1",
107251881Speter * etc., as appropriate.
108251881Speter *
109251881Speter * Always change this at the same time as SVN_VER_TAG.
110251881Speter */
111251956Speter#define SVN_VER_NUMTAG     ""
112251881Speter
113251881Speter
114251881Speter/** Revision number: The repository revision number of this release.
115251881Speter *
116251881Speter * This constant is used to generate the build number part of the Windows
117299742Sdim * file version. Its value remains 0 in the repository except in release
118299742Sdim * tags where it is the revision from which the tag was created.
119251881Speter */
120309512Speter#define SVN_VER_REVISION   1770682
121251881Speter
122251881Speter
123251881Speter/* Version strings composed from the above definitions. */
124251881Speter
125251881Speter/** Version number */
126251881Speter#define SVN_VER_NUM        APR_STRINGIFY(SVN_VER_MAJOR) \
127251881Speter                           "." APR_STRINGIFY(SVN_VER_MINOR) \
128251881Speter                           "." APR_STRINGIFY(SVN_VER_PATCH)
129251881Speter
130251881Speter/** Version number with tag (contains no whitespace) */
131251881Speter#define SVN_VER_NUMBER     SVN_VER_NUM SVN_VER_NUMTAG
132251881Speter
133251881Speter/** Complete version string */
134251881Speter#define SVN_VERSION        SVN_VER_NUMBER SVN_VER_TAG
135251881Speter
136251881Speter
137251881Speter
138251881Speter/* Version queries and compatibility checks */
139251881Speter
140251881Speter/**
141251881Speter * Version information. Each library contains a function called
142251881Speter * svn_<i>libname</i>_version() that returns a pointer to a statically
143251881Speter * allocated object of this type.
144251881Speter *
145251881Speter * @since New in 1.1.
146251881Speter */
147251881Speterstruct svn_version_t
148251881Speter{
149251881Speter  int major;                    /**< Major version number */
150251881Speter  int minor;                    /**< Minor version number */
151251881Speter  int patch;                    /**< Patch number */
152251881Speter
153251881Speter  /**
154251881Speter   * The version tag (#SVN_VER_NUMTAG). Must always point to a
155251881Speter   * statically allocated string.
156251881Speter   */
157251881Speter  const char *tag;
158251881Speter};
159251881Speter
160251881Speter/**
161251881Speter * Define a static svn_version_t object.
162251881Speter *
163251881Speter * @since New in 1.1.
164251881Speter */
165251881Speter#define SVN_VERSION_DEFINE(name) \
166251881Speter  static const svn_version_t name = \
167251881Speter    { \
168251881Speter      SVN_VER_MAJOR, \
169251881Speter      SVN_VER_MINOR, \
170251881Speter      SVN_VER_PATCH, \
171251881Speter      SVN_VER_NUMTAG \
172251881Speter    } \
173251881Speter
174251881Speter/**
175251881Speter * Generate the implementation of a version query function.
176251881Speter *
177251881Speter * @since New in 1.1.
178299742Sdim * @since Since 1.9, embeds a string into the compiled object
179299742Sdim *        file that can be queried with the 'what' utility.
180251881Speter */
181299742Sdim#define SVN_VERSION_BODY            \
182299742Sdim  static struct versioninfo_t       \
183299742Sdim    {                               \
184299742Sdim      const char *const str;        \
185299742Sdim      const svn_version_t num;      \
186299742Sdim    } const versioninfo =           \
187299742Sdim    {                               \
188299742Sdim      "@(#)" SVN_VERSION,           \
189299742Sdim      {                             \
190299742Sdim        SVN_VER_MAJOR,              \
191299742Sdim        SVN_VER_MINOR,              \
192299742Sdim        SVN_VER_PATCH,              \
193299742Sdim        SVN_VER_NUMTAG              \
194299742Sdim      }                             \
195299742Sdim    };                              \
196299742Sdim  return &versioninfo.num
197251881Speter
198251881Speter/**
199251881Speter * Check library version compatibility. Return #TRUE if the client's
200251881Speter * version, given in @a my_version, is compatible with the library
201251881Speter * version, provided in @a lib_version.
202251881Speter *
203251881Speter * This function checks for version compatibility as per our
204251881Speter * guarantees, but requires an exact match when linking to an
205251881Speter * unreleased library. A development client is always compatible with
206251881Speter * a previous released library.
207251881Speter *
208299742Sdim * @note Implements the #svn_ver_check_list2.@a comparator interface.
209299742Sdim *
210251881Speter * @since New in 1.1.
211251881Speter */
212251881Spetersvn_boolean_t
213251881Spetersvn_ver_compatible(const svn_version_t *my_version,
214251881Speter                   const svn_version_t *lib_version);
215251881Speter
216251881Speter/**
217251881Speter * Check if @a my_version and @a lib_version encode the same version number.
218251881Speter *
219299742Sdim * @note Implements the #svn_ver_check_list2.@a comparator interface.
220299742Sdim *
221251881Speter * @since New in 1.2.
222251881Speter */
223251881Spetersvn_boolean_t
224251881Spetersvn_ver_equal(const svn_version_t *my_version,
225251881Speter              const svn_version_t *lib_version);
226251881Speter
227251881Speter
228251881Speter/**
229251881Speter * An entry in the compatibility checklist.
230251881Speter * @see svn_ver_check_list()
231251881Speter *
232251881Speter * @since New in 1.1.
233251881Speter */
234251881Spetertypedef struct svn_version_checklist_t
235251881Speter{
236251881Speter  const char *label;            /**< Entry label */
237251881Speter
238251881Speter  /** Version query function for this entry */
239251881Speter  const svn_version_t *(*version_query)(void);
240251881Speter} svn_version_checklist_t;
241251881Speter
242251881Speter
243251881Speter/**
244251881Speter * Perform a series of version compatibility checks. Checks if @a
245251881Speter * my_version is compatible with each entry in @a checklist. @a
246251881Speter * checklist must end with an entry whose label is @c NULL.
247251881Speter *
248299742Sdim * @a my_version is considered to be compatible with a version in @a checklist
249299742Sdim * if @a comparator returns #TRUE when called with @a my_version as the first
250299742Sdim * parammeter and the @a checklist version as the second parameter.
251251881Speter *
252299742Sdim * @see svn_ver_compatible(), svn_ver_equal()
253299742Sdim *
254299742Sdim * @note Subversion's own code invariably uses svn_ver_equal() as @a comparator,
255299742Sdim * since the cmdline tools sometimes use non-public APIs (such as utility
256299742Sdim * functions that haven't been promoted to svn_cmdline.h).  Third-party code
257299742Sdim * SHOULD use svn_ver_compatible() as @a comparator.
258299742Sdim *
259299742Sdim * @since New in 1.9.
260251881Speter */
261251881Spetersvn_error_t *
262299742Sdimsvn_ver_check_list2(const svn_version_t *my_version,
263299742Sdim                    const svn_version_checklist_t *checklist,
264299742Sdim                    svn_boolean_t (*comparator)(const svn_version_t *,
265299742Sdim                                                const svn_version_t *));
266299742Sdim
267299742Sdim/** Similar to svn_ver_check_list2(), with @a comparator set to
268299742Sdim * #svn_ver_compatible.
269299742Sdim *
270299742Sdim * @deprecated Provided for backward compatibility with 1.8 API.
271299742Sdim */
272299742SdimSVN_DEPRECATED
273299742Sdimsvn_error_t *
274251881Spetersvn_ver_check_list(const svn_version_t *my_version,
275251881Speter                   const svn_version_checklist_t *checklist);
276251881Speter
277251881Speter
278251881Speter/**
279251881Speter * Type of function returning library version.
280251881Speter *
281251881Speter * @since New in 1.6.
282251881Speter */
283251881Spetertypedef const svn_version_t *(*svn_version_func_t)(void);
284251881Speter
285251881Speter
286251881Speter/* libsvn_subr doesn't have an svn_subr header, so put the prototype here. */
287251881Speter/**
288251881Speter * Get libsvn_subr version information.
289251881Speter *
290251881Speter * @since New in 1.1.
291251881Speter */
292251881Speterconst svn_version_t *
293251881Spetersvn_subr_version(void);
294251881Speter
295251881Speter
296251881Speter/**
297251881Speter * Extended version information, including info about the running system.
298251881Speter *
299251881Speter * @since New in 1.8.
300251881Speter */
301251881Spetertypedef struct svn_version_extended_t svn_version_extended_t;
302251881Speter
303251881Speter/**
304251881Speter * Return version information for the running program.  If @a verbose
305251881Speter * is #TRUE, collect extra information that may be expensive to
306251881Speter * retrieve (for example, the OS release name, list of shared
307251881Speter * libraries, etc.).  Use @a pool for all allocations.
308251881Speter *
309299742Sdim * @note This function may allocate significant auxiliary resources
310299742Sdim * (memory and file descriptors) in @a pool.  It is recommended to
311299742Sdim * copy the returned data to suitable longer-lived memory and clear
312299742Sdim * @a pool after calling this function.
313299742Sdim *
314251881Speter * @since New in 1.8.
315251881Speter */
316251881Speterconst svn_version_extended_t *
317251881Spetersvn_version_extended(svn_boolean_t verbose,
318251881Speter                     apr_pool_t *pool);
319251881Speter
320251881Speter
321251881Speter/**
322251881Speter * Accessor for svn_version_extended_t.
323251881Speter *
324251881Speter * @return The date when the libsvn_subr library was compiled, in the
325251881Speter * format defined by the C standard macro @c __DATE__.
326251881Speter *
327251881Speter * @since New in 1.8.
328251881Speter */
329251881Speterconst char *
330251881Spetersvn_version_ext_build_date(const svn_version_extended_t *ext_info);
331251881Speter
332251881Speter/**
333251881Speter * Accessor for svn_version_extended_t.
334251881Speter *
335251881Speter * @return The time when the libsvn_subr library was compiled, in the
336251881Speter * format defined by the C standard macro @c __TIME__.
337251881Speter *
338251881Speter * @since New in 1.8.
339251881Speter */
340251881Speterconst char *
341251881Spetersvn_version_ext_build_time(const svn_version_extended_t *ext_info);
342251881Speter
343251881Speter/**
344251881Speter * Accessor for svn_version_extended_t.
345251881Speter *
346251881Speter * @return The canonical host triplet (arch-vendor-osname) of the
347251881Speter * system where libsvn_subr was compiled.
348251881Speter *
349251881Speter * @note On Unix-like systems (includng Mac OS X), this string is the
350251881Speter * same as the output of the config.guess script.
351251881Speter *
352251881Speter * @since New in 1.8.
353251881Speter */
354251881Speterconst char *
355251881Spetersvn_version_ext_build_host(const svn_version_extended_t *ext_info);
356251881Speter
357251881Speter/**
358251881Speter * Accessor for svn_version_extended_t.
359251881Speter *
360251881Speter * @return The localized copyright notice.
361251881Speter *
362251881Speter * @since New in 1.8.
363251881Speter */
364251881Speterconst char *
365251881Spetersvn_version_ext_copyright(const svn_version_extended_t *ext_info);
366251881Speter
367251881Speter/**
368251881Speter * Accessor for svn_version_extended_t.
369251881Speter *
370251881Speter * @return The canonical host triplet (arch-vendor-osname) of the
371251881Speter * system where the current process is running.
372251881Speter *
373251881Speter * @note This string may not be the same as the output of config.guess
374251881Speter * on the same system.
375251881Speter *
376251881Speter * @since New in 1.8.
377251881Speter */
378251881Speterconst char *
379251881Spetersvn_version_ext_runtime_host(const svn_version_extended_t *ext_info);
380251881Speter
381251881Speter/**
382251881Speter * Accessor for svn_version_extended_t.
383251881Speter *
384251881Speter * @return The "commercial" release name of the running operating
385251881Speter * system, if available.  Not to be confused with, e.g., the output of
386251881Speter * "uname -v" or "uname -r".  The returned value may be @c NULL.
387251881Speter *
388251881Speter * @since New in 1.8.
389251881Speter */
390251881Speterconst char *
391251881Spetersvn_version_ext_runtime_osname(const svn_version_extended_t *ext_info);
392251881Speter
393251881Speter/**
394251881Speter * Dependent library information.
395251881Speter * Describes the name and versions of known dependencies
396251881Speter * used by libsvn_subr.
397251881Speter *
398251881Speter * @since New in 1.8.
399251881Speter */
400251881Spetertypedef struct svn_version_ext_linked_lib_t
401251881Speter{
402251881Speter  const char *name;             /**< Library name */
403251881Speter  const char *compiled_version; /**< Compile-time version string */
404251881Speter  const char *runtime_version;  /**< Run-time version string (optional) */
405251881Speter} svn_version_ext_linked_lib_t;
406251881Speter
407251881Speter/**
408251881Speter * Accessor for svn_version_extended_t.
409251881Speter *
410251881Speter * @return Array of svn_version_ext_linked_lib_t describing dependent
411251881Speter * libraries.  The returned value may be @c NULL.
412251881Speter *
413251881Speter * @since New in 1.8.
414251881Speter */
415251881Speterconst apr_array_header_t *
416251881Spetersvn_version_ext_linked_libs(const svn_version_extended_t *ext_info);
417251881Speter
418251881Speter
419251881Speter/**
420251881Speter * Loaded shared library information.
421251881Speter * Describes the name and, where available, version of the shared libraries
422251881Speter * loaded by the running program.
423251881Speter *
424251881Speter * @since New in 1.8.
425251881Speter */
426251881Spetertypedef struct svn_version_ext_loaded_lib_t
427251881Speter{
428251881Speter  const char *name;             /**< Library name */
429251881Speter  const char *version;          /**< Library version (optional) */
430251881Speter} svn_version_ext_loaded_lib_t;
431251881Speter
432251881Speter
433251881Speter/**
434251881Speter * Accessor for svn_version_extended_t.
435251881Speter *
436251881Speter * @return Array of svn_version_ext_loaded_lib_t describing loaded
437251881Speter * shared libraries.  The returned value may be @c NULL.
438251881Speter *
439251881Speter * @note On Mac OS X, the loaded frameworks, private frameworks and
440251881Speter * system libraries will not be listed.
441251881Speter *
442251881Speter * @since New in 1.8.
443251881Speter */
444251881Speterconst apr_array_header_t *
445251881Spetersvn_version_ext_loaded_libs(const svn_version_extended_t *ext_info);
446251881Speter
447251881Speter
448251881Speter#ifdef __cplusplus
449251881Speter}
450251881Speter#endif /* __cplusplus */
451251881Speter
452251881Speter#endif /* SVN_VERSION_H */
453