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

📄 externals.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
         tandem with the next case -- this case would do nothing,         knowing that the next case either already has, or soon will,         rename the external subdirectory. */      /* First notify that we're about to handle an external. */      if (ib->ctx->notify_func2)        (*ib->ctx->notify_func2)          (ib->ctx->notify_baton2,           svn_wc_create_notify(path, svn_wc_notify_update_external,                                ib->pool), ib->pool);      if (ib->is_export)        /* ### It should be okay to "force" this export.  Externals           only get created in subdirectories of versioned           directories, so an external directory couldn't already           exist before the parent export process unless a versioned           directory above it did, which means the user would have           already had to force these creations to occur. */        SVN_ERR(svn_client_export3(NULL, new_item->url, path,                                   &(new_item->revision),                                   &(new_item->revision),                                   TRUE, FALSE, TRUE, NULL,                                   ib->ctx, ib->pool));      else        SVN_ERR(svn_client__checkout_internal(NULL, new_item->url, path,                                              &(new_item->revision),                                              &(new_item->revision),                                              TRUE, FALSE,                                              ib->timestamp_sleep,                                              ib->ctx, ib->pool));    }  else if (! new_item)    {      /* See comment in above case about fancy rename handling.  Here,         before removing an old subdir, we would see if it wants to         just be renamed to a new one. */       svn_error_t *err, *err2;      svn_wc_adm_access_t *adm_access;      SVN_ERR(svn_wc_adm_open3(&adm_access, NULL, path, TRUE, -1,                               ib->ctx->cancel_func, ib->ctx->cancel_baton,                               ib->pool));      /* We don't use relegate_external() here, because we know that         nothing else in this externals description (at least) is         going to need this directory, and therefore it's better to         leave stuff where the user expects it. */      err = svn_wc_remove_from_revision_control        (adm_access, SVN_WC_ENTRY_THIS_DIR, TRUE, FALSE,         ib->ctx->cancel_func, ib->ctx->cancel_baton, ib->pool);      /* ### Ugly. Unlock only if not going to return an error. Revisit */      if (!err || err->apr_err == SVN_ERR_WC_LEFT_LOCAL_MOD)        if ((err2 = svn_wc_adm_close(adm_access)))          {            if (!err)              err = err2;            else              svn_error_clear(err2);          }      if (err && (err->apr_err != SVN_ERR_WC_LEFT_LOCAL_MOD))        return err;      svn_error_clear(err);      /* ### If there were multiple path components leading down to         that wc, we could try to remove them too. */    }  else if (! compare_external_items(new_item, old_item)           || ib->update_unchanged)    {      /* Either the URL changed, or the exact same item is present in         both hashes, and caller wants to update such unchanged items.         In the latter case, the call below will try to make sure that         the external really is a WC pointing to the correct         URL/revision. */      SVN_ERR(switch_external(path, new_item->url, &(new_item->revision),                              ib->timestamp_sleep, ib->ctx, ib->pool));    }  /* Clear IB->pool -- we only use it for scratchwork (and this will     close any RA sessions still open in this pool). */  svn_pool_clear(ib->pool);  return SVN_NO_ERROR;}/* Closure for handle_externals_change. */struct handle_externals_desc_change_baton{  /* As returned by svn_wc_edited_externals(). */  apr_hash_t *externals_new;  apr_hash_t *externals_old;  /* Passed through to handle_external_item_change_baton. */  svn_client_ctx_t *ctx;  svn_boolean_t update_unchanged;  svn_boolean_t *timestamp_sleep;  svn_boolean_t is_export;  apr_pool_t *pool;};/* This implements the 'svn_hash_diff_func_t' interface.   BATON is of type 'struct handle_externals_desc_change_baton *'.  */static svn_error_t *handle_externals_desc_change(const void *key, apr_ssize_t klen,                             enum svn_hash_diff_key_status status,                             void *baton){  struct handle_externals_desc_change_baton *cb = baton;  struct handle_external_item_change_baton ib;  const char *old_desc_text, *new_desc_text;  apr_array_header_t *old_desc, *new_desc;  apr_hash_t *old_desc_hash, *new_desc_hash;  int i;  svn_wc_external_item_t *item;  if ((old_desc_text = apr_hash_get(cb->externals_old, key, klen)))    SVN_ERR(svn_wc_parse_externals_description2(&old_desc, key,                                                old_desc_text, cb->pool));  else    old_desc = NULL;  if ((new_desc_text = apr_hash_get(cb->externals_new, key, klen)))    SVN_ERR(svn_wc_parse_externals_description2(&new_desc, key,                                                new_desc_text, cb->pool));  else    new_desc = NULL;  old_desc_hash = apr_hash_make(cb->pool);  new_desc_hash = apr_hash_make(cb->pool);  /* Create hashes of our two externals arrays so that we can     efficiently generate a diff for them. */  for (i = 0; old_desc && (i < old_desc->nelts); i++)    {      item = APR_ARRAY_IDX(old_desc, i, svn_wc_external_item_t *);      apr_hash_set(old_desc_hash, item->target_dir,                   APR_HASH_KEY_STRING, item);    }    for (i = 0; new_desc && (i < new_desc->nelts); i++)    {      item = APR_ARRAY_IDX(new_desc, i, svn_wc_external_item_t *);      apr_hash_set(new_desc_hash, item->target_dir,                   APR_HASH_KEY_STRING, item);    }  ib.old_desc          = old_desc_hash;  ib.new_desc          = new_desc_hash;  ib.parent_dir        = (const char *) key;  ib.ctx               = cb->ctx;  ib.update_unchanged  = cb->update_unchanged;  ib.is_export         = cb->is_export;  ib.timestamp_sleep   = cb->timestamp_sleep;  ib.pool              = svn_pool_create(cb->pool);  /* We must use a custom version of svn_hash_diff so that the diff     entries are processed in the order they were originally specified     in the svn:externals properties. */  for (i = 0; old_desc && (i < old_desc->nelts); i++)    {      item = APR_ARRAY_IDX(old_desc, i, svn_wc_external_item_t *);      if (apr_hash_get(new_desc_hash, item->target_dir, APR_HASH_KEY_STRING))        SVN_ERR(handle_external_item_change(item->target_dir,                                            APR_HASH_KEY_STRING,                                            svn_hash_diff_key_both, &ib));      else        SVN_ERR(handle_external_item_change(item->target_dir,                                            APR_HASH_KEY_STRING,                                            svn_hash_diff_key_a, &ib));    }  for (i = 0; new_desc && (i < new_desc->nelts); i++)    {      item = APR_ARRAY_IDX(new_desc, i, svn_wc_external_item_t *);      if (! apr_hash_get(old_desc_hash, item->target_dir, APR_HASH_KEY_STRING))        SVN_ERR(handle_external_item_change(item->target_dir,                                            APR_HASH_KEY_STRING,                                            svn_hash_diff_key_b, &ib));    }    /* Now destroy the subpool we pass to the hash differ.  This will     close any remaining RA sessions used by the hash diff callback. */  svn_pool_destroy(ib.pool);  return SVN_NO_ERROR;}svn_error_t *svn_client__handle_externals(svn_wc_traversal_info_t *traversal_info,                             svn_boolean_t update_unchanged,                             svn_boolean_t *timestamp_sleep,                             svn_client_ctx_t *ctx,                             apr_pool_t *pool){  apr_hash_t *externals_old, *externals_new;  struct handle_externals_desc_change_baton cb;  svn_wc_edited_externals(&externals_old, &externals_new, traversal_info);  cb.externals_new     = externals_new;  cb.externals_old     = externals_old;  cb.ctx               = ctx;  cb.update_unchanged  = update_unchanged;  cb.timestamp_sleep   = timestamp_sleep;  cb.is_export         = FALSE;  cb.pool              = pool;  SVN_ERR(svn_hash_diff(cb.externals_old, cb.externals_new,                        handle_externals_desc_change, &cb, pool));  return SVN_NO_ERROR;}svn_error_t *svn_client__fetch_externals(apr_hash_t *externals,                            svn_boolean_t is_export,                            svn_boolean_t *timestamp_sleep,                            svn_client_ctx_t *ctx,                            apr_pool_t *pool){  struct handle_externals_desc_change_baton cb;  cb.externals_new     = externals;  cb.externals_old     = apr_hash_make(pool);  cb.ctx               = ctx;  cb.update_unchanged  = TRUE;  cb.timestamp_sleep   = timestamp_sleep;  cb.is_export         = is_export;  cb.pool              = pool;  SVN_ERR(svn_hash_diff(cb.externals_old, cb.externals_new,                        handle_externals_desc_change, &cb, pool));  return SVN_NO_ERROR;}svn_error_t *svn_client__do_external_status(svn_wc_traversal_info_t *traversal_info,                               svn_wc_status_func2_t status_func,                               void *status_baton,                               svn_boolean_t get_all,                               svn_boolean_t update,                               svn_boolean_t no_ignore,                               svn_client_ctx_t *ctx,                               apr_pool_t *pool){  apr_hash_t *externals_old, *externals_new;  apr_hash_index_t *hi;  apr_pool_t *subpool = svn_pool_create(pool);  /* Get the values of the svn:externals properties. */  svn_wc_edited_externals(&externals_old, &externals_new, traversal_info);  /* Loop over the hash of new values (we don't care about the old     ones).  This is a mapping of versioned directories to property     values. */  for (hi = apr_hash_first(pool, externals_new);        hi;        hi = apr_hash_next(hi))    {      apr_array_header_t *exts;      const void *key;      void *val;      const char *path;      const char *propval;      apr_pool_t *iterpool;      int i;      /* Clear the subpool. */      svn_pool_clear(subpool);      apr_hash_this(hi, &key, NULL, &val);      path = key;      propval = val;      /* Parse the svn:externals property value.  This results in a         hash mapping subdirectories to externals structures. */      SVN_ERR(svn_wc_parse_externals_description2(&exts, path,                                                   propval, subpool));      /* Make a sub-pool of SUBPOOL. */      iterpool = svn_pool_create(subpool);      /* Loop over the subdir array. */      for (i = 0; exts && (i < exts->nelts); i++)        {          const char *fullpath;          svn_wc_external_item_t *external;          svn_node_kind_t kind;          svn_pool_clear(iterpool);          external = APR_ARRAY_IDX(exts, i, svn_wc_external_item_t *);          fullpath = svn_path_join(path, external->target_dir, iterpool);          /* If the external target directory doesn't exist on disk,             just skip it. */          SVN_ERR(svn_io_check_path(fullpath, &kind, iterpool));          if (kind != svn_node_dir)            continue;          /* Tell the client we're staring an external status set. */          if (ctx->notify_func2)            (ctx->notify_func2)              (ctx->notify_baton2,               svn_wc_create_notify(fullpath, svn_wc_notify_status_external,                                    iterpool), iterpool);          /* And then do the status. */          SVN_ERR(svn_client_status2(NULL, fullpath,                                      &(external->revision),                                     status_func, status_baton,                                      TRUE, get_all, update, no_ignore, FALSE,                                     ctx, iterpool));        }    }     /* Destroy SUBPOOL and (implicitly) ITERPOOL. */  apr_pool_destroy(subpool);  return SVN_NO_ERROR;}

⌨️ 快捷键说明

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