text: /*
   * version.c:  library version number and utilities
   *
   * ====================================================================
   *    Licensed to the Apache Software Foundation (ASF) under one
   *    or more contributor license agreements.  See the NOTICE file
   *    distributed with this work for additional information
   *    regarding copyright ownership.  The ASF licenses this file
   *    to you under the Apache License, Version 2.0 (the
   *    "License"); you may not use this file except in compliance
   *    with the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *    Unless required by applicable law or agreed to in writing,
   *    software distributed under the License is distributed on an
   *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   *    KIND, either express or implied.  See the License for the
   *    specific language governing permissions and limitations
   *    under the License.
   * ====================================================================
   */
  
  
  
  #include "svn_error.h"
  #include "svn_version.h"
  
  #include "svn_private_config.h"
  
  const svn_version_t *
  svn_subr_version(void)
  {
    SVN_VERSION_BODY;
  }
  
  
  svn_boolean_t svn_ver_compatible(const svn_version_t *my_version,
                                   const svn_version_t *lib_version)
  {
    /* With normal development builds the matching rules are strict, to
       avoid inadvertantly using the wrong libraries.  For backward
       compatibility testing use --disable-full-version-match to
       configure 1.7 and then the libraries that get built can be used
       to replace those in 1.6 or earlier builds.  */
  
  #ifndef SVN_DISABLE_FULL_VERSION_MATCH
    if (lib_version->tag[0] != '\0')
      /* Development library; require exact match. */
      return svn_ver_equal(my_version, lib_version);
    else if (my_version->tag[0] != '\0')
      /* Development client; must be newer than the library
         and have the same major and minor version. */
      return (my_version->major == lib_version->major
              && my_version->minor == lib_version->minor
              && my_version->patch > lib_version->patch);
  #endif
  
    /* General compatibility rules for released versions. */
    return (my_version->major == lib_version->major
            && my_version->minor <= lib_version->minor);
  }
  
  
  svn_boolean_t svn_ver_equal(const svn_version_t *my_version,
                              const svn_version_t *lib_version)
  {
    return (my_version->major == lib_version->major
            && my_version->minor == lib_version->minor
            && my_version->patch == lib_version->patch
            && 0 == strcmp(my_version->tag, lib_version->tag));
  }
  
  
  svn_error_t *
  svn_ver_check_list(const svn_version_t *my_version,
                     const svn_version_checklist_t *checklist)
  {
    svn_error_t *err = SVN_NO_ERROR;
    int i;
  
    for (i = 0; checklist[i].label != NULL; ++i)
      {
        const svn_version_t *lib_version = checklist[i].version_query();
        if (!svn_ver_compatible(my_version, lib_version))
          err = svn_error_createf(SVN_ERR_VERSION_MISMATCH, err,
                                  _("Version mismatch in '%s':"
                                    " found %d.%d.%d%s,"
                                    " expected %d.%d.%d%s"),
                                  checklist[i].label,
                                  lib_version->major, lib_version->minor,
                                  lib_version->patch, lib_version->tag,
                                  my_version->major, my_version->minor,
                                  my_version->patch, my_version->tag);
      }
  
    return err;
  }
  