⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 copy.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
              when the copy is committed.  Attempts to revert any such              "fake" files will fail due to a missing text-base. This              effectively means that the schedule deletes have to remain              schedule delete until the copy is committed, when they become              state deleted and everything works! */              entry->kind = svn_node_file;              flags |= SVN_WC__ENTRY_MODIFY_KIND;            }        }      /* Remove lock stuffs. */      if (entry->lock_token)        {          entry->lock_token = NULL;          entry->lock_owner = NULL;          entry->lock_comment = NULL;          entry->lock_creation_date = 0;          flags |= (SVN_WC__ENTRY_MODIFY_LOCK_TOKEN                    | SVN_WC__ENTRY_MODIFY_LOCK_OWNER                    | SVN_WC__ENTRY_MODIFY_LOCK_COMMENT                    | SVN_WC__ENTRY_MODIFY_LOCK_CREATION_DATE);        }            /* If we meaningfully modified the flags, we must be wanting to         change the entry. */      if (flags != SVN_WC__ENTRY_MODIFY_FORCE)        SVN_ERR(svn_wc__entry_modify(adm_access, key, entry,                                     flags, TRUE, subpool));            /* If a dir, not deleted, and not "this dir", recurse. */      if ((! deleted)          && (kind == svn_node_dir)          && (strcmp(key, SVN_WC_ENTRY_THIS_DIR) != 0))        {          svn_wc_adm_access_t *child_access;          const char *child_path;          child_path = svn_path_join             (svn_wc_adm_access_path(adm_access), key, subpool);          SVN_ERR(svn_wc_adm_retrieve(&child_access, adm_access,                                       child_path, subpool));          SVN_ERR(post_copy_cleanup(child_access, subpool));        }    }  /* Cleanup */  svn_pool_destroy(subpool);  return SVN_NO_ERROR;}/* This function effectively creates and schedules a dir for   addition, but does extra administrative things to allow it to   function as a 'copy'.   ASSUMPTIONS:     - src_path points to a dir under version control     - dst_parent points to a dir under version control, in the same                  working copy.     - dst_basename will be the 'new' name of the copied dir in dst_parent */static svn_error_t *copy_dir_administratively(const char *src_path,                           svn_wc_adm_access_t *src_access,                          svn_wc_adm_access_t *dst_parent,                          const char *dst_basename,                          svn_cancel_func_t cancel_func,                          void *cancel_baton,                          svn_wc_notify_func2_t notify_copied,                          void *notify_baton,                          apr_pool_t *pool){  const svn_wc_entry_t *src_entry;  svn_wc_adm_access_t *adm_access;  /* The 'dst_path' is simply dst_parent/dst_basename */  const char *dst_path = svn_path_join(svn_wc_adm_access_path(dst_parent),                                       dst_basename, pool);  /* Sanity check:  you cannot make a copy of something that's not     in the repository.  See comment at the bottom of this file for an     explanation. */  SVN_ERR(svn_wc_entry(&src_entry, src_path, src_access, FALSE, pool));  if (! src_entry)    return svn_error_createf      (SVN_ERR_ENTRY_NOT_FOUND, NULL,        _("'%s' is not under version control"),       svn_path_local_style(src_path, pool));  if ((src_entry->schedule == svn_wc_schedule_add)      || (! src_entry->url)      || (src_entry->copied))    return svn_error_createf       (SVN_ERR_UNSUPPORTED_FEATURE, NULL,       _("Cannot copy or move '%s': it is not in the repository yet; "         "try committing first"),       svn_path_local_style(src_path, pool));  /* Recursively copy the whole directory over.  This gets us all     text-base, props, base-props, as well as entries, local mods,     schedulings, existences, etc.      ### Should we be copying unversioned items within the directory? */  SVN_ERR(svn_io_copy_dir_recursively(src_path,                                      svn_wc_adm_access_path(dst_parent),                                      dst_basename,                                      TRUE,                                      cancel_func, cancel_baton,                                      pool));  /* If this is part of a move, the copied directory will be locked,     because the source directory was locked.  Running cleanup will remove     the locks, even though this directory has not yet been added to the     parent. */  SVN_ERR(svn_wc_cleanup2(dst_path, NULL, cancel_func, cancel_baton, pool));  /* We've got some post-copy cleanup to do now. */  SVN_ERR(svn_wc_adm_open3(&adm_access, NULL, dst_path, TRUE, -1,                           cancel_func, cancel_baton, pool));  SVN_ERR(post_copy_cleanup(adm_access, pool));  SVN_ERR(svn_wc_adm_close(adm_access));  /* Schedule the directory for addition in both its parent and itself     (this_dir) -- WITH HISTORY.  This function should leave the     existing administrative dir untouched.  */  {    char *copyfrom_url;    svn_revnum_t copyfrom_rev;        SVN_ERR(svn_wc_get_ancestry(&copyfrom_url, &copyfrom_rev,                                src_path, src_access, pool));        SVN_ERR(svn_wc_add2(dst_path, dst_parent,                        copyfrom_url, copyfrom_rev,                        cancel_func, cancel_baton,                        notify_copied, notify_baton, pool));  }   return SVN_NO_ERROR;}/* Public Interface */svn_error_t *svn_wc_copy2(const char *src_path,             svn_wc_adm_access_t *dst_parent,             const char *dst_basename,             svn_cancel_func_t cancel_func,             void *cancel_baton,             svn_wc_notify_func2_t notify_func,             void *notify_baton,             apr_pool_t *pool){  svn_wc_adm_access_t *adm_access;  svn_node_kind_t src_kind;  const char *dst_path;  const svn_wc_entry_t *dst_entry, *src_entry;  SVN_ERR(svn_wc_adm_probe_open3(&adm_access, NULL, src_path, FALSE, -1,                                 cancel_func, cancel_baton, pool));  dst_path =  svn_wc_adm_access_path(dst_parent);  SVN_ERR(svn_wc_entry(&dst_entry, dst_path, dst_parent, FALSE, pool));  if (! dst_entry)    return svn_error_createf      (SVN_ERR_ENTRY_NOT_FOUND, NULL,       _("'%s' is not under version control"),       svn_path_local_style(dst_path, pool));  SVN_ERR(svn_wc_entry(&src_entry, src_path, adm_access, FALSE, pool));  if (! src_entry)    return svn_error_createf      (SVN_ERR_ENTRY_NOT_FOUND, NULL,       _("'%s' is not under version control"),       svn_path_local_style(src_path, pool));  if ((src_entry->repos != NULL && dst_entry->repos != NULL) &&      strcmp(src_entry->repos, dst_entry->repos) != 0)    return svn_error_createf      (SVN_ERR_WC_INVALID_SCHEDULE, NULL,       _("Cannot copy to '%s', as it is not from repository '%s'; "         "it is from '%s'"),       svn_path_local_style(svn_wc_adm_access_path(dst_parent), pool),       src_entry->repos, dst_entry->repos);  if (dst_entry->schedule == svn_wc_schedule_delete)    return svn_error_createf      (SVN_ERR_WC_INVALID_SCHEDULE, NULL,       _("Cannot copy to '%s' as it is scheduled for deletion"),       svn_path_local_style(svn_wc_adm_access_path(dst_parent), pool));  SVN_ERR(svn_io_check_path(src_path, &src_kind, pool));  if (src_kind == svn_node_file)    SVN_ERR(copy_file_administratively(src_path, adm_access,                                       dst_parent, dst_basename,                                       notify_func, notify_baton, pool));  else if (src_kind == svn_node_dir)    SVN_ERR(copy_dir_administratively(src_path, adm_access,                                      dst_parent, dst_basename,                                      cancel_func, cancel_baton,                                      notify_func, notify_baton, pool));  SVN_ERR(svn_wc_adm_close(adm_access));  return SVN_NO_ERROR;}svn_error_t *svn_wc_copy(const char *src_path,            svn_wc_adm_access_t *dst_parent,            const char *dst_basename,            svn_cancel_func_t cancel_func,            void *cancel_baton,            svn_wc_notify_func_t notify_func,            void *notify_baton,            apr_pool_t *pool){  svn_wc__compat_notify_baton_t nb;    nb.func = notify_func;  nb.baton = notify_baton;  return svn_wc_copy2(src_path, dst_parent, dst_basename, cancel_func,                      cancel_baton, svn_wc__compat_call_notify_func,                      &nb, pool);}/*  Rabbinic Commentary  Q:  Why can't we 'svn cp' something that we just copied?      i.e.  'svn cp foo foo2;  svn cp foo2 foo3"  A:  It leads to inconsistencies.      In the example above, foo2 has no associated repository URL,      because it hasn't been committed yet.  But suppose foo3 simply      inherited foo's URL (i.e. foo3 'pointed' to foo as a copy      ancestor by virtue of transitivity.)       For one, this is not what the user would expect.  That's      certainly not what the user typed!  Second, suppose that the      user did a commit between the two 'svn cp' commands.  Now foo3      really *would* point to foo2, but without that commit, it      pointed to foo.  Ugly inconsistency, and the user has no idea      that foo3's ancestor would be different in each case.      And even if somehow we *could* make foo3 point to foo2 before      foo2 existed in the repository... what's to prevent a user from      committing foo3 first?  That would break.*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -