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
31251881Speter   apr_general.h.  It doesn't resolve the include paths
32251881Speter   correctly and blows up without this.
33251881Speter */
34251881Speter#ifndef APR_STRINGIFY
35251881Speter#include <apr_general.h>
36251881Speter#endif
37251881Speter#include <apr_tables.h>
38251881Speter
39251881Speter#include "svn_types.h"
40251881Speter
41251881Speter#ifdef __cplusplus
42251881Speterextern "C" {
43251881Speter#endif /* __cplusplus */
44251881Speter
45251881Speter
46251881Speter/* Symbols that define the version number. */
47251881Speter
48251881Speter/* Version numbers: <major>.<minor>.<micro>
49251881Speter *
50251881Speter * The version numbers in this file follow the rules established by:
51251881Speter *
52251881Speter *   http://apr.apache.org/versioning.html
53251881Speter */
54251881Speter
55251881Speter/** Major version number.
56251881Speter *
57251881Speter * Modify when incompatible changes are made to published interfaces.
58251881Speter */
59251881Speter#define SVN_VER_MAJOR      1
60251881Speter
61251881Speter/** Minor version number.
62251881Speter *
63251881Speter * Modify when new functionality is added or new interfaces are
64251881Speter * defined, but all changes are backward compatible.
65251881Speter */
66251881Speter#define SVN_VER_MINOR      8
67251881Speter
68251881Speter/**
69251881Speter * Patch number.
70251881Speter *
71251881Speter * Modify for every released patch.
72251881Speter *
73251881Speter * @since New in 1.1.
74251881Speter */
75269847Speter#define SVN_VER_PATCH      10
76251881Speter
77251881Speter
78251881Speter/** @deprecated Provided for backward compatibility with the 1.0 API. */
79251881Speter#define SVN_VER_MICRO      SVN_VER_PATCH
80251881Speter
81251881Speter/** @deprecated Provided for backward compatibility with the 1.0 API. */
82251881Speter#define SVN_VER_LIBRARY    SVN_VER_MAJOR
83251881Speter
84251881Speter
85251881Speter/** Version tag: a string describing the version.
86251881Speter *
87251881Speter * This tag remains " (dev build)" in the repository so that we can
88251881Speter * always see from "svn --version" that the software has been built
89251881Speter * from the repository rather than a "blessed" distribution.
90251881Speter *
91251881Speter * When rolling a tarball, we automatically replace this text with " (r1234)"
92251881Speter * (where 1234 is the last revision on the branch prior to the release)
93251881Speter * for final releases; in prereleases, it becomes " (Alpha 1)",
94251881Speter * " (Beta 1)", etc., as appropriate.
95251881Speter *
96251881Speter * Always change this at the same time as SVN_VER_NUMTAG.
97251881Speter */
98269847Speter#define SVN_VER_TAG        " (r1615264)"
99251881Speter
100251881Speter
101251881Speter/** Number tag: a string describing the version.
102251881Speter *
103251881Speter * This tag is used to generate a version number string to identify
104251881Speter * the client and server in HTTP requests, for example. It must not
105251881Speter * contain any spaces. This value remains "-dev" in the repository.
106251881Speter *
107251881Speter * When rolling a tarball, we automatically replace this text with ""
108251881Speter * for final releases; in prereleases, it becomes "-alpha1, "-beta1",
109251881Speter * etc., as appropriate.
110251881Speter *
111251881Speter * Always change this at the same time as SVN_VER_TAG.
112251881Speter */
113251956Speter#define SVN_VER_NUMTAG     ""
114251881Speter
115251881Speter
116251881Speter/** Revision number: The repository revision number of this release.
117251881Speter *
118251881Speter * This constant is used to generate the build number part of the Windows
119251881Speter * file version. Its value remains 0 in the repository.
120251881Speter *
121251881Speter * When rolling a tarball, we automatically replace it with what we
122251881Speter * guess to be the correct revision number.
123251881Speter */
124269847Speter#define SVN_VER_REVISION   1615264
125251881Speter
126251881Speter
127251881Speter/* Version strings composed from the above definitions. */
128251881Speter
129251881Speter/** Version number */
130251881Speter#define SVN_VER_NUM        APR_STRINGIFY(SVN_VER_MAJOR) \
131251881Speter                           "." APR_STRINGIFY(SVN_VER_MINOR) \
132251881Speter                           "." APR_STRINGIFY(SVN_VER_PATCH)
133251881Speter
134251881Speter/** Version number with tag (contains no whitespace) */
135251881Speter#define SVN_VER_NUMBER     SVN_VER_NUM SVN_VER_NUMTAG
136251881Speter
137251881Speter/** Complete version string */
138251881Speter#define SVN_VERSION        SVN_VER_NUMBER SVN_VER_TAG
139251881Speter
140251881Speter
141251881Speter
142251881Speter/* Version queries and compatibility checks */
143251881Speter
144251881Speter/**
145251881Speter * Version information. Each library contains a function called
146251881Speter * svn_<i>libname</i>_version() that returns a pointer to a statically
147251881Speter * allocated object of this type.
148251881Speter *
149251881Speter * @since New in 1.1.
150251881Speter */
151251881Speterstruct svn_version_t
152251881Speter{
153251881Speter  int major;                    /**< Major version number */
154251881Speter  int minor;                    /**< Minor version number */
155251881Speter  int patch;                    /**< Patch number */
156251881Speter
157251881Speter  /**
158251881Speter   * The version tag (#SVN_VER_NUMTAG). Must always point to a
159251881Speter   * statically allocated string.
160251881Speter   */
161251881Speter  const char *tag;
162251881Speter};
163251881Speter
164251881Speter/**
165251881Speter * Define a static svn_version_t object.
166251881Speter *
167251881Speter * @since New in 1.1.
168251881Speter */
169251881Speter#define SVN_VERSION_DEFINE(name) \
170251881Speter  static const svn_version_t name = \
171251881Speter    { \
172251881Speter      SVN_VER_MAJOR, \
173251881Speter      SVN_VER_MINOR, \
174251881Speter      SVN_VER_PATCH, \
175251881Speter      SVN_VER_NUMTAG \
176251881Speter    } \
177251881Speter
178251881Speter/**
179251881Speter * Generate the implementation of a version query function.
180251881Speter *
181251881Speter * @since New in 1.1.
182251881Speter */
183251881Speter#define SVN_VERSION_BODY \
184251881Speter  SVN_VERSION_DEFINE(versioninfo);              \
185251881Speter  return &versioninfo
186251881Speter
187251881Speter/**
188251881Speter * Check library version compatibility. Return #TRUE if the client's
189251881Speter * version, given in @a my_version, is compatible with the library
190251881Speter * version, provided in @a lib_version.
191251881Speter *
192251881Speter * This function checks for version compatibility as per our
193251881Speter * guarantees, but requires an exact match when linking to an
194251881Speter * unreleased library. A development client is always compatible with
195251881Speter * a previous released library.
196251881Speter *
197251881Speter * @since New in 1.1.
198251881Speter */
199251881Spetersvn_boolean_t
200251881Spetersvn_ver_compatible(const svn_version_t *my_version,
201251881Speter                   const svn_version_t *lib_version);
202251881Speter
203251881Speter/**
204251881Speter * Check if @a my_version and @a lib_version encode the same version number.
205251881Speter *
206251881Speter * @since New in 1.2.
207251881Speter */
208251881Spetersvn_boolean_t
209251881Spetersvn_ver_equal(const svn_version_t *my_version,
210251881Speter              const svn_version_t *lib_version);
211251881Speter
212251881Speter
213251881Speter/**
214251881Speter * An entry in the compatibility checklist.
215251881Speter * @see svn_ver_check_list()
216251881Speter *
217251881Speter * @since New in 1.1.
218251881Speter */
219251881Spetertypedef struct svn_version_checklist_t
220251881Speter{
221251881Speter  const char *label;            /**< Entry label */
222251881Speter
223251881Speter  /** Version query function for this entry */
224251881Speter  const svn_version_t *(*version_query)(void);
225251881Speter} svn_version_checklist_t;
226251881Speter
227251881Speter
228251881Speter/**
229251881Speter * Perform a series of version compatibility checks. Checks if @a
230251881Speter * my_version is compatible with each entry in @a checklist. @a
231251881Speter * checklist must end with an entry whose label is @c NULL.
232251881Speter *
233251881Speter * @see svn_ver_compatible()
234251881Speter *
235251881Speter * @since New in 1.1.
236251881Speter */
237251881Spetersvn_error_t *
238251881Spetersvn_ver_check_list(const svn_version_t *my_version,
239251881Speter                   const svn_version_checklist_t *checklist);
240251881Speter
241251881Speter
242251881Speter/**
243251881Speter * Type of function returning library version.
244251881Speter *
245251881Speter * @since New in 1.6.
246251881Speter */
247251881Spetertypedef const svn_version_t *(*svn_version_func_t)(void);
248251881Speter
249251881Speter
250251881Speter/* libsvn_subr doesn't have an svn_subr header, so put the prototype here. */
251251881Speter/**
252251881Speter * Get libsvn_subr version information.
253251881Speter *
254251881Speter * @since New in 1.1.
255251881Speter */
256251881Speterconst svn_version_t *
257251881Spetersvn_subr_version(void);
258251881Speter
259251881Speter
260251881Speter/**
261251881Speter * Extended version information, including info about the running system.
262251881Speter *
263251881Speter * @since New in 1.8.
264251881Speter */
265251881Spetertypedef struct svn_version_extended_t svn_version_extended_t;
266251881Speter
267251881Speter/**
268251881Speter * Return version information for the running program.  If @a verbose
269251881Speter * is #TRUE, collect extra information that may be expensive to
270251881Speter * retrieve (for example, the OS release name, list of shared
271251881Speter * libraries, etc.).  Use @a pool for all allocations.
272251881Speter *
273251881Speter * @since New in 1.8.
274251881Speter */
275251881Speterconst svn_version_extended_t *
276251881Spetersvn_version_extended(svn_boolean_t verbose,
277251881Speter                     apr_pool_t *pool);
278251881Speter
279251881Speter
280251881Speter/**
281251881Speter * Accessor for svn_version_extended_t.
282251881Speter *
283251881Speter * @return The date when the libsvn_subr library was compiled, in the
284251881Speter * format defined by the C standard macro @c __DATE__.
285251881Speter *
286251881Speter * @since New in 1.8.
287251881Speter */
288251881Speterconst char *
289251881Spetersvn_version_ext_build_date(const svn_version_extended_t *ext_info);
290251881Speter
291251881Speter/**
292251881Speter * Accessor for svn_version_extended_t.
293251881Speter *
294251881Speter * @return The time when the libsvn_subr library was compiled, in the
295251881Speter * format defined by the C standard macro @c __TIME__.
296251881Speter *
297251881Speter * @since New in 1.8.
298251881Speter */
299251881Speterconst char *
300251881Spetersvn_version_ext_build_time(const svn_version_extended_t *ext_info);
301251881Speter
302251881Speter/**
303251881Speter * Accessor for svn_version_extended_t.
304251881Speter *
305251881Speter * @return The canonical host triplet (arch-vendor-osname) of the
306251881Speter * system where libsvn_subr was compiled.
307251881Speter *
308251881Speter * @note On Unix-like systems (includng Mac OS X), this string is the
309251881Speter * same as the output of the config.guess script.
310251881Speter *
311251881Speter * @since New in 1.8.
312251881Speter */
313251881Speterconst char *
314251881Spetersvn_version_ext_build_host(const svn_version_extended_t *ext_info);
315251881Speter
316251881Speter/**
317251881Speter * Accessor for svn_version_extended_t.
318251881Speter *
319251881Speter * @return The localized copyright notice.
320251881Speter *
321251881Speter * @since New in 1.8.
322251881Speter */
323251881Speterconst char *
324251881Spetersvn_version_ext_copyright(const svn_version_extended_t *ext_info);
325251881Speter
326251881Speter/**
327251881Speter * Accessor for svn_version_extended_t.
328251881Speter *
329251881Speter * @return The canonical host triplet (arch-vendor-osname) of the
330251881Speter * system where the current process is running.
331251881Speter *
332251881Speter * @note This string may not be the same as the output of config.guess
333251881Speter * on the same system.
334251881Speter *
335251881Speter * @since New in 1.8.
336251881Speter */
337251881Speterconst char *
338251881Spetersvn_version_ext_runtime_host(const svn_version_extended_t *ext_info);
339251881Speter
340251881Speter/**
341251881Speter * Accessor for svn_version_extended_t.
342251881Speter *
343251881Speter * @return The "commercial" release name of the running operating
344251881Speter * system, if available.  Not to be confused with, e.g., the output of
345251881Speter * "uname -v" or "uname -r".  The returned value may be @c NULL.
346251881Speter *
347251881Speter * @since New in 1.8.
348251881Speter */
349251881Speterconst char *
350251881Spetersvn_version_ext_runtime_osname(const svn_version_extended_t *ext_info);
351251881Speter
352251881Speter/**
353251881Speter * Dependent library information.
354251881Speter * Describes the name and versions of known dependencies
355251881Speter * used by libsvn_subr.
356251881Speter *
357251881Speter * @since New in 1.8.
358251881Speter */
359251881Spetertypedef struct svn_version_ext_linked_lib_t
360251881Speter{
361251881Speter  const char *name;             /**< Library name */
362251881Speter  const char *compiled_version; /**< Compile-time version string */
363251881Speter  const char *runtime_version;  /**< Run-time version string (optional) */
364251881Speter} svn_version_ext_linked_lib_t;
365251881Speter
366251881Speter/**
367251881Speter * Accessor for svn_version_extended_t.
368251881Speter *
369251881Speter * @return Array of svn_version_ext_linked_lib_t describing dependent
370251881Speter * libraries.  The returned value may be @c NULL.
371251881Speter *
372251881Speter * @since New in 1.8.
373251881Speter */
374251881Speterconst apr_array_header_t *
375251881Spetersvn_version_ext_linked_libs(const svn_version_extended_t *ext_info);
376251881Speter
377251881Speter
378251881Speter/**
379251881Speter * Loaded shared library information.
380251881Speter * Describes the name and, where available, version of the shared libraries
381251881Speter * loaded by the running program.
382251881Speter *
383251881Speter * @since New in 1.8.
384251881Speter */
385251881Spetertypedef struct svn_version_ext_loaded_lib_t
386251881Speter{
387251881Speter  const char *name;             /**< Library name */
388251881Speter  const char *version;          /**< Library version (optional) */
389251881Speter} svn_version_ext_loaded_lib_t;
390251881Speter
391251881Speter
392251881Speter/**
393251881Speter * Accessor for svn_version_extended_t.
394251881Speter *
395251881Speter * @return Array of svn_version_ext_loaded_lib_t describing loaded
396251881Speter * shared libraries.  The returned value may be @c NULL.
397251881Speter *
398251881Speter * @note On Mac OS X, the loaded frameworks, private frameworks and
399251881Speter * system libraries will not be listed.
400251881Speter *
401251881Speter * @since New in 1.8.
402251881Speter */
403251881Speterconst apr_array_header_t *
404251881Spetersvn_version_ext_loaded_libs(const svn_version_extended_t *ext_info);
405251881Speter
406251881Speter
407251881Speter#ifdef __cplusplus
408251881Speter}
409251881Speter#endif /* __cplusplus */
410251881Speter
411251881Speter#endif /* SVN_VERSION_H */
412