[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [PATCH] make symlinked hook-scripts work again

From: <kfogel_at_newton.ch.collab.net>
Date: 2003-01-24 02:20:53 CET

Josef,

This patch looks good; I'd like to commit it. Can you make a few
minor tweaks first?

  1. You use `0' to mean false in the updated callers. The convention
     is to use the symbolic constant 'FALSE' instead.

  2. The doc string changes for svn_io_check_path() should mention the
     new resolve_symlinks parameter in the same place it mentions
     setting *kind in the link case. (In your patch, these two
     connected facts are separated by some unrelated paragraphs.)

  3. I don't know if the patch applies to the current code base; it
     may need adjustments.

Sorry for the delay in responding. I hope you have time to massage it
and repost.

Thanks in advance,
-Karl

Josef Wolf jw@raven.inka.de writes:
 Hello!
 
 Here comes the patch to the symlink-issue discussed in the thread
 CGI for repository administration. This patch is relative to r4296.
 It passes the make check with no errors and behaves exactly the same
 as unpatched r4296 on the three cases mentioned by Philip.
 
 Log entry:
 
 * subversion/libsvn_subr/io.c
   (svn_io_check_path): Add boolean parameter 'resolve_symlinks' to
   decide whether the target of a symlink or the symlink itself should
   be checked.
 * subversion/include/svn_io.h
   (svn_io_check_path): Add boolean parameter 'resolve_symlinks' to prototype.
 
 * subversion/libsvn_repos/hooks.c
   (svn_repos__hooks_start_commit, svn_repos__hooks_pre_commit,
   svn_repos__hooks_post_commit, svn_repos__hooks_pre_revprop_change,
   svn_repos__hooks_post_revprop_change): changed callers of
   svn_io_check_path to use target of symlink.
 
 The following callers were updated to use the current semantics
 which means to return svn_node_unknown when a symlink is passed:
 
 * subversion/libsvn_client/add.c: (svn_client_add)
 * subversion/libsvn_client/auth.c: (svn_client__default_auth_dir)
 * subversion/libsvn_client/cleanup.c: (svn_client_cleanup)
 * subversion/libsvn_client/commit.c
   (import, svn_client_import, remove_tmpfiles)
 * subversion/libsvn_client/copy.c
   (wc_to_wc_copy, remove_tmpfiles, wc_to_repos_copy, repos_to_wc_copy)
 * subversion/libsvn_client/delete.c: (svn_client__can_delete)
 * subversion/libsvn_client/diff.c
   (merge_file_added, merge_file_deleted, merge_dir_added, merge_dir_deleted,
   do_diff)
 * subversion/libsvn_client/prop_commands.c: (maybe_convert_to_url)
 * subversion/libsvn_client/revert.c: (svn_client_revert)
 * subversion/libsvn_client/update.c: (svn_client_update)
 * subversion/libsvn_subr/config_file.c: (svn_config_ensure)
 * subversion/libsvn_subr/io.c
   (svn_io_copy_dir_recursively, svn_io_detect_mimetype)
 * subversion/libsvn_wc/adm_files.c
   (svn_wc__adm_path_exists, maybe_copy_file, prop_path_internal,
   svn_wc__wcprop_path, svn_wc__open_props, svn_wc__close_props,
   svn_wc__sync_props, check_adm_exists)
 * subversion/libsvn_wc/adm_ops.c:
   (remove_file_if_present, erase_unversioned_from_wc, erase_from_wc,
   svn_wc_add, revert_admin_things, svn_wc_revert, attempt_deletion)
 * subversion/libsvn_wc/copy.c: (copy_file_administratively, svn_wc_copy)
 * subversion/libsvn_wc/entries.c: (svn_wc_entry)
 * subversion/libsvn_wc/lock.c
   (probe, svn_wc_adm_open, svn_wc_locked, svn_wc__adm_is_cleanup_required)
 * subversion/libsvn_wc/log.c:
   (install_committed_file, log_do_modify_entry, log_do_committed,
   svn_wc_cleanup)
 * subversion/libsvn_wc/props.c:
   (svn_wc__load_prop_file, wcprop_list, svn_wc_prop_list, svn_wc_prop_set,
   empty_props_p)
 * subversion/libsvn_wc/questions.c
   (svn_wc_check_wc, svn_wc__timestamps_equal_p, svn_wc_text_modified_p,
   svn_wc_conflicted_p)
 * subversion/libsvn_wc/status.c:
   (assemble_status, get_dir_status, svn_wc_statuses)
 * subversion/libsvn_wc/status_editor.c: (delete_entry)
 * subversion/libsvn_wc/update_editor.c
   (add_directory, add_or_open_file, svn_wc_install_file)
 * subversion/libsvn_wc/util.c: (svn_wc__ensure_directory)
 * subversion/svnlook/main.c: (open_writable_binary_file, do_diff)
 
 
 Index: subversion/include/svn_io.h
 ===================================================================
 --- subversion/include/svn_io.h (revision 4296)
 +++ subversion/include/svn_io.h (working copy)
 @@ -58,13 +58,19 @@
   *
   * If @a path is a directory, @a *kind is set to @c svn_node_dir.
   *
 + * If @a path is a symbolic link, @a *kind is set to @c svn_node_link.
 + *
   * If @a path does not exist in its final component, @a *kind is set to
   * @c svn_node_none.
   *
   * If intermediate directories on the way to @a path don't exist, an
   * error is returned, and @a *kind's value is undefined.
 + *
 + * If @a resolve_symlinks is true, symlinks are resolved and @a *kind
 + * is set according the kind of the object the symlink refers to.
   */
  svn_error_t *svn_io_check_path (const char *path,
 + svn_boolean_t resolve_symlinks,
                                  svn_node_kind_t *kind,
                                  apr_pool_t *pool);
  
 Index: subversion/libsvn_wc/props.c
 ===================================================================
 --- subversion/libsvn_wc/props.c (revision 4296)
 +++ subversion/libsvn_wc/props.c (working copy)
 @@ -231,7 +231,7 @@
  {
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (propfile_path, kind, pool));
 + SVN_ERR (svn_io_check_path (propfile_path, 0, kind, pool));
  
    if (kind == svn_node_file)
      {
 @@ -854,7 +854,7 @@
    *props = apr_hash_make (pool);
  
    /* Check validity of PATH */
 - SVN_ERR( svn_io_check_path (path, kind, pool) );
 + SVN_ERR( svn_io_check_path (path, 0, kind, pool) );
    
  #if 0
    if (kind == svn_node_none)
 @@ -872,7 +872,7 @@
    SVN_ERR( svn_wc__wcprop_path (prop_path, path, 0, pool) );
  
    /* Does the property file exist? */
 - SVN_ERR( svn_io_check_path (prop_path, pkind, pool) );
 + SVN_ERR( svn_io_check_path (prop_path, 0, pkind, pool) );
    
    if (pkind == svn_node_none)
      /* No property file exists. Just go home, with an empty hash. */
 @@ -970,7 +970,7 @@
    SVN_ERR (svn_wc__prop_path (prop_path, path, 0, pool));
  
    /* Does the property file exist? */
 - SVN_ERR (svn_io_check_path (prop_path, pkind, pool));
 + SVN_ERR (svn_io_check_path (prop_path, 0, pkind, pool));
    
    if (pkind == svn_node_none)
      /* No property file exists. Just go home, with an empty hash. */
 @@ -1123,7 +1123,7 @@
    svn_node_kind_t kind;
    enum svn_prop_kind prop_kind = svn_property_kind (NULL, name);
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
  
    if (prop_kind == svn_prop_wc_kind)
      return svn_wc__wcprop_set (name, value, path, pool);
 @@ -1262,7 +1262,7 @@
  {
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (path_to_prop_file, kind, pool));
 + SVN_ERR (svn_io_check_path (path_to_prop_file, 0, kind, pool));
  
    if (kind == svn_node_none)
      *empty_p = TRUE;
 Index: subversion/libsvn_wc/entries.c
 ===================================================================
 --- subversion/libsvn_wc/entries.c (revision 4296)
 +++ subversion/libsvn_wc/entries.c (working copy)
 @@ -612,7 +612,7 @@
  
    *entry = NULL;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
  
    /* ### todo:
       Make an innocent way to discover that a dir/path is or is not
 Index: subversion/libsvn_wc/copy.c
 ===================================================================
 --- subversion/libsvn_wc/copy.c (revision 4296)
 +++ subversion/libsvn_wc/copy.c (working copy)
 @@ -136,7 +136,7 @@
      = svn_path_join (svn_wc_adm_access_path (dst_parent), dst_basename, pool);
  
    /* Sanity check: if dst file exists already, don't allow overwrite. */
 - SVN_ERR (svn_io_check_path (dst_path, dst_kind, pool));
 + SVN_ERR (svn_io_check_path (dst_path, 0, dst_kind, pool));
    if (dst_kind != svn_node_none)
      return svn_error_createf (SVN_ERR_ENTRY_EXISTS, NULL,
                                '%s' already exists and is in the way.,
 @@ -218,12 +218,12 @@
      SVN_ERR (svn_io_copy_file (src_txtb, dst_txtb, TRUE, pool));
  
      /* Copy the props over if they exist. */
 - SVN_ERR (svn_io_check_path (src_wprop, kind, pool));
 + SVN_ERR (svn_io_check_path (src_wprop, 0, kind, pool));
      if (kind == svn_node_file)
        SVN_ERR (svn_io_copy_file (src_wprop, dst_wprop, TRUE, pool));
        
      /* Copy the base-props over if they exist */
 - SVN_ERR (svn_io_check_path (src_bprop, kind, pool));
 + SVN_ERR (svn_io_check_path (src_bprop, 0, kind, pool));
      if (kind == svn_node_file)
        SVN_ERR (svn_io_copy_file (src_bprop, dst_bprop, TRUE, pool));
    }
 @@ -344,7 +344,7 @@
    SVN_ERR (svn_wc_adm_probe_open (adm_access, NULL, src_path, FALSE, TRUE,
                                    pool));
  
 - SVN_ERR (svn_io_check_path (src_path, src_kind, pool));
 + SVN_ERR (svn_io_check_path (src_path, 0, src_kind, pool));
    
    if (src_kind == svn_node_file)
      SVN_ERR (copy_file_administratively (src_path, adm_access,
 Index: subversion/libsvn_wc/util.c
 ===================================================================
 --- subversion/libsvn_wc/util.c (revision 4296)
 +++ subversion/libsvn_wc/util.c (working copy)
 @@ -37,7 +37,7 @@
  svn_wc__ensure_directory (const char *path, apr_pool_t *pool)
  {
    svn_node_kind_t kind;
 - svn_error_t *err = svn_io_check_path (path, kind, pool);
 + svn_error_t *err = svn_io_check_path (path, 0, kind, pool);
  
    if (err)
      return err;
 Index: subversion/libsvn_wc/log.c
 ===================================================================
 --- subversion/libsvn_wc/log.c (revision 4296)
 +++ subversion/libsvn_wc/log.c (working copy)
 @@ -237,7 +237,7 @@
  
    /* Is there a tmp_text_base that needs to be installed? */
    tmp_text_base = svn_wc__text_base_path (filepath, 1, pool);
 - SVN_ERR (svn_io_check_path (tmp_text_base, kind, pool));
 + SVN_ERR (svn_io_check_path (tmp_text_base, 0, kind, pool));
  
    if (kind == svn_node_file)
      SVN_ERR (svn_subst_copy_and_translate (tmp_text_base,
 @@ -523,7 +523,7 @@
        svn_node_kind_t tfile_kind;
        apr_time_t text_time;
  
 - err = svn_io_check_path (tfile, tfile_kind, loggy-pool);
 + err = svn_io_check_path (tfile, 0, tfile_kind, loggy-pool);
        if (err)
          return svn_error_createf
            (SVN_ERR_WC_BAD_ADM_LOG, err,
 @@ -553,7 +553,7 @@
        if (err)
          signal_error (loggy, err);
        
 - err = svn_io_check_path (pfile, pfile_kind, loggy-pool);
 + err = svn_io_check_path (pfile, 0, pfile_kind, loggy-pool);
        if (err)
          return svn_error_createf
            (SVN_ERR_WC_BAD_ADM_LOG, err,
 @@ -833,7 +833,7 @@
  
        /* Make sure our working file copy is present in the temp area. */
        tmpf = svn_wc__text_base_path (wf, 1, pool);
 - if ((err = svn_io_check_path (tmpf, kind, pool)))
 + if ((err = svn_io_check_path (tmpf, 0, kind, pool)))
          return svn_error_createf (SVN_ERR_WC_BAD_ADM_LOG, err,
                                    error checking existence: %s, name);
        if (kind == svn_node_file)
 @@ -893,7 +893,7 @@
      if (entry-schedule == svn_wc_schedule_replace)
        {
          svn_node_kind_t kinder;
 - SVN_ERR (svn_io_check_path (basef, kinder, pool));
 + SVN_ERR (svn_io_check_path (basef, 0, kinder, pool));
          if (kinder == svn_node_file)
            SVN_ERR (svn_io_remove_file (basef, pool));
        }
 @@ -903,7 +903,7 @@
                is_this_dir
                ? svn_wc_adm_access_path (loggy-adm_access) : full_path,
                1, pool));
 - if ((err = svn_io_check_path (tmpf, kind, pool)))
 + if ((err = svn_io_check_path (tmpf, 0, kind, pool)))
        return svn_error_createf (SVN_ERR_WC_BAD_ADM_LOG, err,
                                  error checking existence: %s, name);
      if (kind == svn_node_file)
 @@ -1368,7 +1368,7 @@
          {
            /* Recurse */
            const char *subdir = svn_path_join (path, key, pool);
 - SVN_ERR (svn_io_check_path (subdir, kind, pool));
 + SVN_ERR (svn_io_check_path (subdir, 0, kind, pool));
            if (kind == svn_node_dir)
              SVN_ERR (svn_wc_cleanup (subdir, adm_access, pool));
          }
 @@ -1382,7 +1382,7 @@
    if (cleanup)
      {
        /* Is there a log? If so, run it. */
 - SVN_ERR (svn_io_check_path (log_path, kind, pool));
 + SVN_ERR (svn_io_check_path (log_path, 0, kind, pool));
        if (kind == svn_node_file)
          SVN_ERR (svn_wc__run_log (adm_access, pool));
      }
 Index: subversion/libsvn_wc/adm_ops.c
 ===================================================================
 --- subversion/libsvn_wc/adm_ops.c (revision 4296)
 +++ subversion/libsvn_wc/adm_ops.c (working copy)
 @@ -392,7 +392,7 @@
    svn_node_kind_t kind;
  
    /* Does this file exist? If not, get outta here. */
 - SVN_ERR (svn_io_check_path (file, kind, pool));
 + SVN_ERR (svn_io_check_path (file, 0, kind, pool));
    if (kind == svn_node_none)
      return SVN_NO_ERROR;
  
 @@ -509,7 +509,7 @@
  {
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    switch (kind)
      {
      case svn_node_none:
 @@ -552,7 +552,7 @@
  {
    /* Check that the item exists in the wc. */
    svn_node_kind_t wc_kind;
 - SVN_ERR (svn_io_check_path (path, wc_kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, wc_kind, pool));
    if (wc_kind == svn_node_none)
      return SVN_NO_ERROR;
  
 @@ -777,7 +777,7 @@
    svn_wc_adm_access_t *adm_access;
    
    /* Make sure something's there. */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_none)
      return svn_error_createf (SVN_ERR_WC_PATH_NOT_FOUND, NULL,
                                '%s' not found, path);
 @@ -1101,12 +1101,12 @@
        /* There may be a base props file but no working props file, if
           the mod was that the working file was `R'eplaced by a new
           file with no props. */
 - SVN_ERR (svn_io_check_path (thing, working_props_kind, pool));
 + SVN_ERR (svn_io_check_path (thing, 0, working_props_kind, pool));
  
        /* If there is a pristing property file, copy it out as the
           working property file, else just remove the working property
           file. */
 - SVN_ERR (svn_io_check_path (base_thing, kind, pool));
 + SVN_ERR (svn_io_check_path (base_thing, 0, kind, pool));
        if (kind == svn_node_file)
          {
            if ((working_props_kind == svn_node_file)
 @@ -1143,7 +1143,7 @@
           then we need to restore them. */
        SVN_ERR (svn_wc__prop_path (thing, fullpath, 0, pool));
        SVN_ERR (svn_wc__prop_base_path (base_thing, fullpath, 0, pool));
 - SVN_ERR (svn_io_check_path (base_thing, kind, pool));
 + SVN_ERR (svn_io_check_path (base_thing, 0, kind, pool));
  
        if ((err = svn_io_copy_file (base_thing, thing, FALSE, pool)))
          return revert_error (err, fullpath, restoring props, pool);
 @@ -1155,7 +1155,7 @@
  
    if (entry-kind == svn_node_file)
      {
 - SVN_ERR (svn_io_check_path (fullpath, kind, pool));
 + SVN_ERR (svn_io_check_path (fullpath, 0, kind, pool));
        SVN_ERR (svn_wc_text_modified_p (modified_p, fullpath, adm_access,
                                         pool));
        if ((modified_p) || (kind == svn_node_none))
 @@ -1269,7 +1269,7 @@
    if (entry-kind == svn_node_dir)
      {
        svn_node_kind_t disk_kind;
 - SVN_ERR (svn_io_check_path (path, disk_kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, disk_kind, pool));
        if ((disk_kind != svn_node_dir)
             (entry-schedule != svn_wc_schedule_add))
          {
 @@ -1298,7 +1298,7 @@
  
    /* Safeguard 3: can we deal with the node kind of PATH current in
       the working copy? */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if ((kind != svn_node_none)
         (kind != svn_node_file)
         (kind != svn_node_dir))
 @@ -1713,7 +1713,7 @@
    const char *full_path = svn_path_join (parent_dir, base_name, pool);
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (full_path, kind, pool));
 + SVN_ERR (svn_io_check_path (full_path, 0, kind, pool));
    *was_present = kind != svn_node_none;
    if (! *was_present)
      return SVN_NO_ERROR;
 Index: subversion/libsvn_wc/status.c
 ===================================================================
 --- subversion/libsvn_wc/status.c (revision 4296)
 +++ subversion/libsvn_wc/status.c (working copy)
 @@ -125,7 +125,7 @@
  
    /* Check the path kind for PATH. */
    if (path_kind == svn_node_unknown)
 - SVN_ERR (svn_io_check_path (path, path_kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, path_kind, pool));
    
    if (! entry)
      {
 @@ -598,7 +598,7 @@
            svn_node_kind_t fullpath_kind;
  
            /* Get the entry's kind on disk. */
 - SVN_ERR (svn_io_check_path (fullpath, fullpath_kind, pool));
 + SVN_ERR (svn_io_check_path (fullpath, 0, fullpath_kind, pool));
  
            if (fullpath_kind == svn_node_dir)
              {
 @@ -667,7 +667,7 @@
    const svn_wc_entry_t *entry;
  
    /* Is PATH a directory or file? */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    
    /* Read the appropriate entries file */
    
 Index: subversion/libsvn_wc/adm_files.c
 ===================================================================
 --- subversion/libsvn_wc/adm_files.c (revision 4296)
 +++ subversion/libsvn_wc/adm_files.c (working copy)
 @@ -138,7 +138,7 @@
    path = v_extend_with_adm_name (path, NULL, tmp, pool, ap);
    va_end (ap);
  
 - err = svn_io_check_path (path, kind, pool);
 + err = svn_io_check_path (path, 0, kind, pool);
    if (err)
      svn_error_clear (err);
    if (kind == svn_node_none)
 @@ -214,7 +214,7 @@
    apr_status_t apr_err;
  
    /* First test if SRC exists. */
 - SVN_ERR (svn_io_check_path (src, kind, pool));
 + SVN_ERR (svn_io_check_path (src, 0, kind, pool));
    if (kind == svn_node_none)
      {
        /* SRC doesn't exist, create DST empty. */
 @@ -319,7 +319,7 @@
    int wc_format_version;
    const char *entry_name;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
  
    /* kff todo: some factorization can be done on most callers of
       svn_wc_check_wc()? */
 @@ -392,7 +392,7 @@
    int is_wc;
    const char *entry_name;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
  
    /* kff todo: some factorization can be done on most callers of
       svn_wc_check_wc()? */
 @@ -716,7 +716,7 @@
    int wc_format_version;
  
    /* Check if path is a file or a dir. */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_none)
      {
        /* Something changed, yet we can't find the local working directory
 @@ -801,7 +801,7 @@
    int wc_format_version;
  
    /* Check if path is a file or a dir. */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
  
    /* If file, split the path. */
    if (kind == svn_node_file)
 @@ -870,7 +870,7 @@
    svn_node_kind_t kind;
  
    /* Check if path is a file or a dir. */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
  
    /* If file, split the path. */
    if (kind == svn_node_file)
 @@ -946,7 +946,7 @@
  
    tmp_path = extend_with_adm_name (path, NULL, 0, pool, NULL);
  
 - SVN_ERR (svn_io_check_path (tmp_path, kind, pool));
 + SVN_ERR (svn_io_check_path (tmp_path, 0, kind, pool));
    if (kind != svn_node_none kind != svn_node_dir)
      {
        /* If got an error other than dir non-existence, then
 Index: subversion/libsvn_wc/lock.c
 ===================================================================
 --- subversion/libsvn_wc/lock.c (revision 4296)
 +++ subversion/libsvn_wc/lock.c (working copy)
 @@ -202,7 +202,7 @@
    svn_node_kind_t kind;
    int is_wc;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_dir)
      SVN_ERR (svn_wc_check_wc (path, is_wc, pool));
  
 @@ -283,7 +283,7 @@
        /* Since no physical lock gets created we must check PATH is not a
           file. */
        svn_node_kind_t node_kind;
 - SVN_ERR (svn_io_check_path (path, node_kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, node_kind, pool));
        if (node_kind != svn_node_dir)
          return svn_error_createf (SVN_ERR_WC_INVALID_LOCK, NULL,
                                    lock path is not a directory (%s),
 @@ -329,7 +329,7 @@
  
            /* If this is not physically a directory, it may have been
               deleted say, then ignore it. */
 - SVN_ERR (svn_io_check_path (entry_path, kind, pool));
 + SVN_ERR (svn_io_check_path (entry_path, 0, kind, pool));
            if (kind != svn_node_dir)
              continue;
  
 @@ -561,7 +561,7 @@
    const char *lockfile
      = svn_wc__adm_path (path, 0, pool, SVN_WC__ADM_LOCK, NULL);
                                               
 - SVN_ERR (svn_io_check_path (lockfile, kind, pool));
 + SVN_ERR (svn_io_check_path (lockfile, 0, kind, pool));
    if (kind == svn_node_file)
      *locked = TRUE;
    else if (kind == svn_node_none)
 @@ -600,7 +600,7 @@
                                             FALSE, pool, SVN_WC__ADM_LOG, NULL);
  
    /* The presence of a log file demands cleanup */
 - SVN_ERR (svn_io_check_path (log_path, kind, pool));
 + SVN_ERR (svn_io_check_path (log_path, 0, kind, pool));
    *cleanup = (kind == svn_node_file);
  
    return SVN_NO_ERROR;
 Index: subversion/libsvn_wc/update_editor.c
 ===================================================================
 --- subversion/libsvn_wc/update_editor.c (revision 4296)
 +++ subversion/libsvn_wc/update_editor.c (working copy)
 @@ -637,7 +637,7 @@
  
    /* The directory may exist if this is a checkout, otherwise there should
       be nothing with this name. */
 - SVN_ERR (svn_io_check_path (db-path, kind, db-pool));
 + SVN_ERR (svn_io_check_path (db-path, 0, kind, db-pool));
    if (kind != svn_node_none
         !(pb-edit_baton-is_checkout kind == svn_node_dir))
      return svn_error_createf
 @@ -1029,7 +1029,7 @@
       ### Are editor drives guaranteed not to mention the same name
       ### twice in the same dir baton? Don't know. */
  
 - SVN_ERR (svn_io_check_path (fb-path, kind, subpool));
 + SVN_ERR (svn_io_check_path (fb-path, 0, kind, subpool));
    SVN_ERR (svn_wc_adm_retrieve (adm_access, pb-edit_baton-adm_access,
                                  pb-path, subpool));
    SVN_ERR (svn_wc_entry (entry, fb-path, adm_access, FALSE, subpool));
 @@ -1607,7 +1607,7 @@
          {
            svn_node_kind_t wfile_kind = svn_node_unknown;
            
 - SVN_ERR (svn_io_check_path (file_path, wfile_kind, pool));
 + SVN_ERR (svn_io_check_path (file_path, 0, wfile_kind, pool));
            if (wfile_kind == svn_node_none) /* working file is missing?! */
              {
                /* Just copy the new text-base to the file. */
 Index: subversion/libsvn_wc/status_editor.c
 ===================================================================
 --- subversion/libsvn_wc/status_editor.c (revision 4296)
 +++ subversion/libsvn_wc/status_editor.c (working copy)
 @@ -333,7 +333,7 @@
       versioned in this working copy, it was probably deleted via this
       working copy. No need to report such a thing. */
    /* ### use svn_wc_entry() instead? */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_dir)
      dir_path = full_path;
    else
 Index: subversion/libsvn_wc/questions.c
 ===================================================================
 --- subversion/libsvn_wc/questions.c (revision 4296)
 +++ subversion/libsvn_wc/questions.c (working copy)
 @@ -50,7 +50,7 @@
    svn_error_t *err = SVN_NO_ERROR;
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    
    if (kind == svn_node_none)
      {
 @@ -131,7 +131,7 @@
    const svn_wc_entry_t *entry;
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_dir)
      entryname = SVN_WC_ENTRY_THIS_DIR;
    else
 @@ -321,7 +321,7 @@
    svn_node_kind_t kind;
  
    /* Sanity check: if the path doesn't exist, return FALSE. */
 - SVN_ERR (svn_io_check_path (filename, kind, subpool));
 + SVN_ERR (svn_io_check_path (filename, 0, kind, subpool));
    if (kind != svn_node_file)
      {
        *modified_p = FALSE;
 @@ -345,7 +345,7 @@
       is modified. For example, a file scheduled for addition but not
       yet committed. */
    textbase_filename = svn_wc__text_base_path (filename, 0, subpool);
 - SVN_ERR (svn_io_check_path (textbase_filename, kind, subpool));
 + SVN_ERR (svn_io_check_path (textbase_filename, 0, kind, subpool));
    if (kind != svn_node_file)
      {
        *modified_p = TRUE;
 @@ -391,7 +391,7 @@
    if (entry-conflict_old)
      {
        path = svn_path_join (dir_path, entry-conflict_old, subpool);
 - SVN_ERR (svn_io_check_path (path, kind, subpool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, subpool));
        if (kind == svn_node_file)
          *text_conflicted_p = TRUE;
      }
 @@ -399,7 +399,7 @@
    if ((! *text_conflicted_p) (entry-conflict_new))
      {
        path = svn_path_join (dir_path, entry-conflict_new, subpool);
 - SVN_ERR (svn_io_check_path (path, kind, subpool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, subpool));
        if (kind == svn_node_file)
          *text_conflicted_p = TRUE;
      }
 @@ -407,7 +407,7 @@
    if ((! *text_conflicted_p) (entry-conflict_wrk))
      {
        path = svn_path_join (dir_path, entry-conflict_wrk, subpool);
 - SVN_ERR (svn_io_check_path (path, kind, subpool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, subpool));
        if (kind == svn_node_file)
          *text_conflicted_p = TRUE;
      }
 @@ -416,7 +416,7 @@
    if (entry-prejfile)
      {
        path = svn_path_join (dir_path, entry-prejfile, subpool);
 - SVN_ERR (svn_io_check_path (path, kind, subpool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, subpool));
        if (kind == svn_node_file)
          *prop_conflicted_p = TRUE;
      }
 Index: subversion/libsvn_subr/config_file.c
 ===================================================================
 --- subversion/libsvn_subr/config_file.c (revision 4296)
 +++ subversion/libsvn_subr/config_file.c (working copy)
 @@ -456,7 +456,7 @@
    if (! path)
      return SVN_NO_ERROR;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_none)
      {
        apr_err = apr_dir_make (path, APR_OS_DEFAULT, pool);
 @@ -479,7 +479,7 @@
    if (! path) /* highly unlikely, since a previous call succeeded */
      return SVN_NO_ERROR;
  
 - err = svn_io_check_path (path, kind, pool);
 + err = svn_io_check_path (path, 0, kind, pool);
    if (err)
      return SVN_NO_ERROR;
  
 @@ -621,7 +621,7 @@
    if (! path) /* highly unlikely, since a previous call succeeded */
      return SVN_NO_ERROR;
  
 - err = svn_io_check_path (path, kind, pool);
 + err = svn_io_check_path (path, 0, kind, pool);
    if (err)
      return SVN_NO_ERROR;
    
 @@ -723,7 +723,7 @@
    if (! path) /* highly unlikely, since a previous call succeeded */
      return SVN_NO_ERROR;
  
 - err = svn_io_check_path (path, kind, pool);
 + err = svn_io_check_path (path, 0, kind, pool);
    if (err)
      return SVN_NO_ERROR;
    
 Index: subversion/libsvn_subr/io.c
 ===================================================================
 --- subversion/libsvn_subr/io.c (revision 4296)
 +++ subversion/libsvn_subr/io.c (working copy)
 @@ -124,9 +124,11 @@
  
  svn_error_t *
  svn_io_check_path (const char *path,
 + svn_boolean_t resolve_symlinks,
                     svn_node_kind_t *kind,
                     apr_pool_t *pool)
  {
 + apr_int32_t flags;
    apr_finfo_t finfo;
    apr_status_t apr_err;
    const char *path_native;
 @@ -136,9 +138,11 @@
  
    /* Not using svn_io_stat() here because we want to check the
       apr_err return anyway. */
 +
    SVN_ERR (path_from_utf8 (path_native, path, pool));
 - apr_err = apr_stat (finfo, path_native,
 - (APR_FINFO_MIN | APR_FINFO_LINK), pool);
 +
 + flags = resolve_symlinks ? APR_FINFO_MIN : (APR_FINFO_MIN | APR_FINFO_LINK);
 + apr_err = apr_stat (finfo, path_native, flags, pool);
  
    if (apr_err !APR_STATUS_IS_ENOENT(apr_err))
      return svn_error_createf
 @@ -402,19 +406,19 @@
  
    /* Sanity checks: SRC and DST_PARENT are directories, and
       DST_BASENAME doesn't already exist in DST_PARENT. */
 - SVN_ERR (svn_io_check_path (src, kind, subpool));
 + SVN_ERR (svn_io_check_path (src, 0, kind, subpool));
    if (kind != svn_node_dir)
      return svn_error_createf (SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
                                svn_io_copy_dir: '%s' is not a directory.,
                                src);
  
 - SVN_ERR (svn_io_check_path (dst_parent, kind, subpool));
 + SVN_ERR (svn_io_check_path (dst_parent, 0, kind, subpool));
    if (kind != svn_node_dir)
      return svn_error_createf (SVN_ERR_NODE_UNEXPECTED_KIND, NULL,
                                svn_io_copy_dir: '%s' is not a directory.,
                                dst_parent);
  
 - SVN_ERR (svn_io_check_path (dst_path, kind, subpool));
 + SVN_ERR (svn_io_check_path (dst_path, 0, kind, subpool));
    if (kind != svn_node_none)
      return svn_error_createf (SVN_ERR_ENTRY_EXISTS, NULL,
                                svn_io_copy_dir: '%s' already exists.,
 @@ -1726,7 +1730,7 @@
    *mimetype = NULL;
  
    /* See if this file even exists, and make sure it really is a file. */
 - SVN_ERR (svn_io_check_path (file, kind, pool));
 + SVN_ERR (svn_io_check_path (file, 0, kind, pool));
    if (kind != svn_node_file)
      return svn_error_createf (SVN_ERR_BAD_FILENAME, NULL,
                                svn_io_detect_mimetype:
 Index: subversion/svnlook/main.c
 ===================================================================
 --- subversion/svnlook/main.c (revision 4296)
 +++ subversion/svnlook/main.c (working copy)
 @@ -451,7 +451,7 @@
        svn_node_kind_t kind;
        const char *piece = ((const char **) (path_pieces-elts))[i];
        full_path = svn_path_join (full_path, piece, pool);
 - SVN_ERR (svn_io_check_path (full_path, kind, pool));
 + SVN_ERR (svn_io_check_path (full_path, 0, kind, pool));
  
        /* Does this path component exist at all? */
        if (kind == svn_node_none)
 @@ -945,7 +945,7 @@
        SVN_ERR (svn_fs_revision_root (base_root, c-fs, base_rev_id, pool));
        SVN_ERR (print_diff_tree (root, base_root, tree, , ,
                                  c-no_diff_deleted, pool));
 - SVN_ERR (svn_io_check_path (SVNLOOK_TMPDIR, kind, pool));
 + SVN_ERR (svn_io_check_path (SVNLOOK_TMPDIR, 0, kind, pool));
        if (kind == svn_node_dir)
          SVN_ERR (svn_io_remove_dir (SVNLOOK_TMPDIR, pool));
      }
 Index: subversion/libsvn_client/prop_commands.c
 ===================================================================
 --- subversion/libsvn_client/prop_commands.c (revision 4296)
 +++ subversion/libsvn_client/prop_commands.c (working copy)
 @@ -324,7 +324,7 @@
        const char *pdir;
        const svn_wc_entry_t *entry;
        
 - SVN_ERR (svn_io_check_path (target, kind, pool));
 + SVN_ERR (svn_io_check_path (target, 0, kind, pool));
        if (kind == svn_node_file)
          svn_path_split (target, pdir, NULL, pool);
        else
 Index: subversion/libsvn_client/auth.c
 ===================================================================
 --- subversion/libsvn_client/auth.c (revision 4296)
 +++ subversion/libsvn_client/auth.c (working copy)
 @@ -65,7 +65,7 @@
  {
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_dir)
      {
        SVN_ERR (svn_client__dir_if_wc (auth_dir_p, path, pool));
 Index: subversion/libsvn_client/delete.c
 ===================================================================
 --- subversion/libsvn_client/delete.c (revision 4296)
 +++ subversion/libsvn_client/delete.c (working copy)
 @@ -45,7 +45,7 @@
    svn_node_kind_t kind;
    svn_wc_adm_access_t *dir_access;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if (kind == svn_node_dir)
      SVN_ERR (svn_wc_adm_retrieve (dir_access, adm_access, path, pool));
    else
 Index: subversion/libsvn_client/revert.c
 ===================================================================
 --- subversion/libsvn_client/revert.c (revision 4296)
 +++ subversion/libsvn_client/revert.c (working copy)
 @@ -59,7 +59,7 @@
          {
            svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
            if (kind == svn_node_dir)
              {
                /* While we could add the parent to the access baton set, there
 Index: subversion/libsvn_client/diff.c
 ===================================================================
 --- subversion/libsvn_client/diff.c (revision 4296)
 +++ subversion/libsvn_client/diff.c (working copy)
 @@ -402,7 +402,7 @@
    const char *copyfrom_url;
    const char *child;
  
 - SVN_ERR (svn_io_check_path (mine, kind, subpool));
 + SVN_ERR (svn_io_check_path (mine, 0, kind, subpool));
    switch (kind)
      {
      case svn_node_none:
 @@ -467,7 +467,7 @@
    svn_wc_adm_access_t *parent_access;
    const char *parent_path;
  
 - SVN_ERR (svn_io_check_path (mine, kind, subpool));
 + SVN_ERR (svn_io_check_path (mine, 0, kind, subpool));
    switch (kind)
      {
      case svn_node_file:
 @@ -509,7 +509,7 @@
    assert (child != NULL);
    copyfrom_url = svn_path_join (merge_b-url, child, subpool);
  
 - SVN_ERR (svn_io_check_path (path, kind, subpool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, subpool));
    switch (kind)
      {
      case svn_node_none:
 @@ -557,7 +557,7 @@
    svn_wc_adm_access_t *parent_access;
    const char *parent_path;
    
 - SVN_ERR (svn_io_check_path (path, kind, subpool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, subpool));
    switch (kind)
      {
      case svn_node_dir:
 @@ -1060,7 +1060,7 @@
                                    recurse,
                                    diff_editor, diff_edit_baton));
  
 - SVN_ERR (svn_io_check_path (path2, kind, pool));
 + SVN_ERR (svn_io_check_path (path2, 0, kind, pool));
        if (kind == svn_node_dir)
          SVN_ERR (svn_wc_adm_retrieve (dir_access, adm_access, path2, pool));
        else
 Index: subversion/libsvn_client/copy.c
 ===================================================================
 --- subversion/libsvn_client/copy.c (revision 4296)
 +++ subversion/libsvn_client/copy.c (working copy)
 @@ -79,7 +79,7 @@
    svn_wc_adm_access_t *adm_access, *src_access;
  
    /* Verify that SRC_PATH exists. */
 - SVN_ERR (svn_io_check_path (src_path, src_kind, pool));
 + SVN_ERR (svn_io_check_path (src_path, 0, src_kind, pool));
    if (src_kind == svn_node_none)
      return svn_error_createf (SVN_ERR_NODE_UNKNOWN_KIND, NULL,
                                path `%s' does not exist., src_path);
 @@ -89,7 +89,7 @@
       DST_PATH is a dir, then SRC_PATH's basename will become a new
       file or dir within DST_PATH itself. Else if it's a file, just
       error out. */
 - SVN_ERR (svn_io_check_path (dst_path, dst_kind, pool));
 + SVN_ERR (svn_io_check_path (dst_path, 0, dst_kind, pool));
    if (dst_kind == svn_node_none)
      {
        svn_path_split (dst_path, dst_parent, base_name, pool);
 @@ -443,7 +443,7 @@
        svn_node_kind_t kind;
  
        apr_hash_this (hi, key, keylen, );
 - SVN_ERR (svn_io_check_path ((const char *)key, kind, pool));
 + SVN_ERR (svn_io_check_path ((const char *)key, 0, kind, pool));
        if (kind == svn_node_file)
          SVN_ERR (svn_io_remove_file ((const char *)key, pool));
      }
 @@ -589,7 +589,7 @@
      }
  
    /* Crawl the working copy for commit items. */
 - SVN_ERR (svn_io_check_path (base_path, src_kind, pool));
 + SVN_ERR (svn_io_check_path (base_path, 0, src_kind, pool));
    if (src_kind == svn_node_dir)
       SVN_ERR (svn_wc_adm_retrieve (dir_access, adm_access, base_path, pool));
    else
 @@ -751,7 +751,7 @@
     */
  
    /* First, figure out about dst. */
 - SVN_ERR (svn_io_check_path (dst_path, dst_kind, pool));
 + SVN_ERR (svn_io_check_path (dst_path, 0, dst_kind, pool));
    if (dst_kind == svn_node_dir)
      {
        const char *base_name;
 @@ -768,7 +768,7 @@
  
    /* Now that dst_path has possibly been reset, check that there's
       nothing in the way of the upcoming checkout. */
 - SVN_ERR (svn_io_check_path (dst_path, dst_kind, pool));
 + SVN_ERR (svn_io_check_path (dst_path, 0, dst_kind, pool));
    if (dst_kind != svn_node_none)
      return svn_error_createf (SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
                                `%s' is in the way, dst_path);
 Index: subversion/libsvn_client/update.c
 ===================================================================
 --- subversion/libsvn_client/update.c (revision 4296)
 +++ subversion/libsvn_client/update.c (working copy)
 @@ -122,7 +122,7 @@
                                    recurse,
                                    update_editor, update_edit_baton));
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
        SVN_ERR (svn_wc_adm_retrieve (dir_access, adm_access,
                                      (kind == svn_node_dir
                                       ? path
 Index: subversion/libsvn_client/cleanup.c
 ===================================================================
 --- subversion/libsvn_client/cleanup.c (revision 4296)
 +++ subversion/libsvn_client/cleanup.c (working copy)
 @@ -40,7 +40,7 @@
  {
    svn_node_kind_t kind;
  
 - SVN_ERR (svn_io_check_path (dir, kind, pool));
 + SVN_ERR (svn_io_check_path (dir, 0, kind, pool));
    if (kind != svn_node_dir)
      return svn_error_createf (SVN_ERR_WC_NOT_DIRECTORY, NULL,
                                Cannot cleanup '%s' -- not a directory,
 Index: subversion/libsvn_client/commit.c
 ===================================================================
 --- subversion/libsvn_client/commit.c (revision 4296)
 +++ subversion/libsvn_client/commit.c (working copy)
 @@ -353,7 +353,7 @@
                                pool, root_baton));
  
    /* Import a file or a directory tree. */
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
  
    /* Note that there is no need to check whether PATH's basename is
       the same name that we reserve for our admistritave
 @@ -589,7 +589,7 @@
        svn_node_kind_t kind;
        const char *base_dir = path;
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
        if (kind == svn_node_file)
          svn_path_split (path, base_dir, NULL, pool);
        SVN_ERR (get_ra_editor (ra_baton, session, ra_lib, NULL,
 @@ -639,7 +639,7 @@
        svn_node_kind_t kind;
  
        apr_hash_this (hi, key, NULL, );
 - SVN_ERR (svn_io_check_path ((const char *)key, kind, pool));
 + SVN_ERR (svn_io_check_path ((const char *)key, 0, kind, pool));
        if (kind == svn_node_file)
          SVN_ERR (svn_io_remove_file ((const char *)key, pool));
      }
 Index: subversion/libsvn_client/add.c
 ===================================================================
 --- subversion/libsvn_client/add.c (revision 4296)
 +++ subversion/libsvn_client/add.c (working copy)
 @@ -135,7 +135,7 @@
  
    SVN_ERR (svn_wc_adm_open (adm_access, NULL, parent_path, TRUE, TRUE, pool));
  
 - SVN_ERR (svn_io_check_path (path, kind, pool));
 + SVN_ERR (svn_io_check_path (path, 0, kind, pool));
    if ((kind == svn_node_dir) recursive)
      err = add_dir_recursive (path, adm_access,
                               notify_func, notify_baton, pool);
 Index: subversion/libsvn_repos/hooks.c
 ===================================================================
 --- subversion/libsvn_repos/hooks.c (revision 4296)
 +++ subversion/libsvn_repos/hooks.c (working copy)
 @@ -117,7 +117,7 @@
    svn_node_kind_t kind;
    const char *hook = svn_repos_start_commit_hook (repos, pool);
  
 - if ((! svn_io_check_path (hook, kind, pool))
 + if ((! svn_io_check_path (hook, 1, kind, pool))
         (kind == svn_node_file))
      {
        const char *args[4];
 @@ -144,7 +144,7 @@
    svn_node_kind_t kind;
    const char *hook = svn_repos_pre_commit_hook (repos, pool);
  
 - if ((! svn_io_check_path (hook, kind, pool))
 + if ((! svn_io_check_path (hook, 1, kind, pool))
         (kind == svn_node_file))
      {
        const char *args[4];
 @@ -171,7 +171,7 @@
    svn_node_kind_t kind;
    const char *hook = svn_repos_post_commit_hook (repos, pool);
  
 - if ((! svn_io_check_path (hook, kind, pool))
 + if ((! svn_io_check_path (hook, 1, kind, pool))
         (kind == svn_node_file))
      {
        const char *args[4];
 @@ -202,7 +202,7 @@
    svn_node_kind_t kind;
    const char *hook = svn_repos_pre_revprop_change_hook (repos, pool);
  
 - if ((! svn_io_check_path (hook, kind, pool))
 + if ((! svn_io_check_path (hook, 1, kind, pool))
         (kind == svn_node_file))
      {
        const char *args[6];
 @@ -248,7 +248,7 @@
    svn_node_kind_t kind;
    const char *hook = svn_repos_post_revprop_change_hook (repos, pool);
    
 - if ((! svn_io_check_path (hook, kind, pool))
 + if ((! svn_io_check_path (hook, 1, kind, pool))
         (kind == svn_node_file))
      {
        const char *args[6];
 
 --
 -- Josef Wolf -- jw@raven.inka.de --
 
 ---------------------------------------------------------------------
 To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
 For additional commands, e-mail: dev-help@subversion.tigris.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 14 02:11:13 2006

This is an archived mail posted to the Subversion Dev mailing list.