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

📄 locks.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
      /* 423 == Locked */      if (sl.code == 423)        {          ctx->error = svn_ra_serf__handle_server_error(request, response,                                                        pool);          return ctx->error->apr_err;        }      headers = serf_bucket_response_get_headers(response);      val = serf_bucket_headers_get(headers, SVN_DAV_LOCK_OWNER_HEADER);      if (val)        {          ctx->lock->owner = apr_pstrdup(ctx->pool, val);        }      val = serf_bucket_headers_get(headers, SVN_DAV_CREATIONDATE_HEADER);      if (val)        {          svn_error_t *err;          err = svn_time_from_cstring(&ctx->lock->creation_date, val,                                      ctx->pool);          if (err)            {              xml_ctx->error = err;              return err->apr_err;            }        }      ctx->read_headers = TRUE;    }  /* Forbidden when a lock doesn't exist. */  if (ctx->status_code == 403)    {      status = svn_ra_serf__handle_discard_body(request, response, NULL, pool);      if (APR_STATUS_IS_EOF(status))        {          ctx->done = TRUE;          ctx->error = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,                                         _("Lock request failed: %d %s"),                                         ctx->status_code, ctx->reason);        }    }  else    {      status = svn_ra_serf__handle_xml_parser(request, response, handler_baton,                                              pool);    }  return status;}#define GET_LOCK "<?xml version=\"1.0\" encoding=\"utf-8\"?><propfind xmlns=\"DAV:\"><prop><lockdiscovery/></prop></propfind>"static serf_bucket_t*create_getlock_body(void *baton,                    serf_bucket_alloc_t *alloc,                    apr_pool_t *pool){  serf_bucket_t *buckets, *tmp;        buckets = serf_bucket_aggregate_create(alloc);  tmp = SERF_BUCKET_SIMPLE_STRING_LEN(GET_LOCK, sizeof(GET_LOCK)-1, alloc);  serf_bucket_aggregate_append(buckets, tmp);  return buckets;}#define LOCK_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?><lockinfo xmlns=\"DAV:\">"#define LOCK_TRAILER "</lockinfo>"static serf_bucket_t*create_lock_body(void *baton,                 serf_bucket_alloc_t *alloc,                 apr_pool_t *pool){  lock_info_t *ctx = baton;  serf_bucket_t *buckets, *tmp;        buckets = serf_bucket_aggregate_create(alloc);        tmp = SERF_BUCKET_SIMPLE_STRING_LEN(LOCK_HEADER, sizeof(LOCK_HEADER)-1,                                      alloc);  serf_bucket_aggregate_append(buckets, tmp);  svn_ra_serf__add_tag_buckets(buckets, "lockscope", "<exclusive/>", alloc);  svn_ra_serf__add_tag_buckets(buckets, "locktype", "<write/>", alloc);  if (ctx->lock->comment)    {      svn_stringbuf_t *xml_esc = NULL;      svn_string_t val;      val.data = ctx->lock->comment;      val.len = strlen(ctx->lock->comment);      svn_xml_escape_cdata_string(&xml_esc, &val, pool);      svn_ra_serf__add_tag_buckets(buckets, "owner", xml_esc->data, alloc);    }  tmp = SERF_BUCKET_SIMPLE_STRING_LEN(LOCK_TRAILER, sizeof(LOCK_TRAILER)-1,                                      alloc);  serf_bucket_aggregate_append(buckets, tmp);  return buckets;}svn_error_t *svn_ra_serf__get_lock(svn_ra_session_t *ra_session,                      svn_lock_t **lock,                      const char *path,                      apr_pool_t *pool){  svn_ra_serf__session_t *session = ra_session->priv;  svn_ra_serf__handler_t *handler;  svn_ra_serf__xml_parser_t *parser_ctx;  lock_info_t *lock_ctx;  const char *req_url;  svn_error_t *err;  req_url = svn_path_url_add_component(session->repos_url.path, path, pool);  lock_ctx = apr_pcalloc(pool, sizeof(*lock_ctx));  lock_ctx->pool = pool;  lock_ctx->path = req_url;  lock_ctx->lock = svn_lock_create(pool);  lock_ctx->lock->path = path;  handler = apr_pcalloc(pool, sizeof(*handler));        handler->method = "PROPFIND";  handler->path = req_url;  handler->body_type = "text/xml";  handler->conn = session->conns[0];  handler->session = session;        parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx));        parser_ctx->pool = pool;  parser_ctx->user_data = lock_ctx;  parser_ctx->start = start_lock;  parser_ctx->end = end_lock;  parser_ctx->cdata = cdata_lock;  parser_ctx->done = &lock_ctx->done;    handler->body_delegate = create_getlock_body;  handler->body_delegate_baton = lock_ctx;  handler->response_handler = handle_lock;  handler->response_baton = parser_ctx;        svn_ra_serf__request_create(handler);  err = svn_ra_serf__context_run_wait(&lock_ctx->done, session, pool);  if (err)    {      /* TODO Shh.  We're telling a white lie for now. */      return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err,                              _("Server does not support locking features"));    }  *lock = lock_ctx->lock;  return SVN_NO_ERROR;}svn_error_t *svn_ra_serf__lock(svn_ra_session_t *ra_session,                  apr_hash_t *path_revs,                  const char *comment,                  svn_boolean_t force,                  svn_ra_lock_callback_t lock_func,                  void *lock_baton,                  apr_pool_t *pool){  svn_ra_serf__session_t *session = ra_session->priv;  apr_hash_index_t *hi;  apr_pool_t *subpool;  apr_pool_create(&subpool, pool);  for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi))    {      svn_ra_serf__handler_t *handler;      svn_ra_serf__xml_parser_t *parser_ctx;      const char *req_url;      lock_info_t *lock_ctx;      const void *key;      void *val;      svn_error_t *error;      apr_pool_clear(subpool);      lock_ctx = apr_pcalloc(subpool, sizeof(*lock_ctx));      apr_hash_this(hi, &key, NULL, &val);      lock_ctx->pool = subpool;      lock_ctx->path = key;      lock_ctx->revision = *((svn_revnum_t*)val);      lock_ctx->lock = svn_lock_create(subpool);      lock_ctx->lock->path = key;      lock_ctx->lock->comment = comment;      lock_ctx->force = force;      req_url = svn_path_url_add_component(session->repos_url.path,                                           lock_ctx->path, subpool);      handler = apr_pcalloc(subpool, sizeof(*handler));            handler->method = "LOCK";      handler->path = req_url;      handler->body_type = "text/xml";      handler->conn = session->conns[0];      handler->session = session;            parser_ctx = apr_pcalloc(subpool, sizeof(*parser_ctx));            parser_ctx->pool = subpool;      parser_ctx->user_data = lock_ctx;      parser_ctx->start = start_lock;      parser_ctx->end = end_lock;      parser_ctx->cdata = cdata_lock;      parser_ctx->done = &lock_ctx->done;           handler->header_delegate = set_lock_headers;      handler->header_delegate_baton = lock_ctx;      handler->body_delegate = create_lock_body;      handler->body_delegate_baton = lock_ctx;      handler->response_handler = handle_lock;      handler->response_baton = parser_ctx;            svn_ra_serf__request_create(handler);      error = svn_ra_serf__context_run_wait(&lock_ctx->done, session, subpool);      SVN_ERR(lock_ctx->error);      SVN_ERR(parser_ctx->error);      if (error)        {          return svn_error_create(SVN_ERR_RA_DAV_REQUEST_FAILED, error,                                  _("Lock request failed"));        }      SVN_ERR(lock_func(lock_baton, lock_ctx->path, TRUE, lock_ctx->lock, NULL,                        subpool));    }  return SVN_NO_ERROR;}struct unlock_context_t {  const char *token;  svn_boolean_t force;};static apr_status_tset_unlock_headers(serf_bucket_t *headers,                   void *baton,                   apr_pool_t *pool){  struct unlock_context_t *ctx = baton;  serf_bucket_headers_set(headers, "Lock-Token", ctx->token);  if (ctx->force)    {      serf_bucket_headers_set(headers, SVN_DAV_OPTIONS_HEADER,                              SVN_DAV_OPTION_LOCK_BREAK);    }  return APR_SUCCESS;}svn_error_t *svn_ra_serf__unlock(svn_ra_session_t *ra_session,                    apr_hash_t *path_tokens,                    svn_boolean_t force,                    svn_ra_lock_callback_t lock_func,                    void *lock_baton,                    apr_pool_t *pool){  svn_ra_serf__session_t *session = ra_session->priv;  apr_hash_index_t *hi;  apr_pool_t *subpool;  apr_pool_create(&subpool, pool);  for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi))    {      svn_ra_serf__handler_t *handler;      svn_ra_serf__simple_request_context_t *ctx;      const char *req_url, *path, *token;      const void *key;      void *val;      struct unlock_context_t unlock_ctx;      apr_pool_clear(subpool);      ctx = apr_pcalloc(subpool, sizeof(*ctx));      apr_hash_this(hi, &key, NULL, &val);      path = key;      token = val;      if (force == TRUE && (!token || token[0] == '\0'))        {          svn_lock_t *lock;          SVN_ERR(svn_ra_serf__get_lock(ra_session, &lock, path, subpool));          token = lock->token;          if (!token)            {              svn_error_t *err;              err = svn_error_createf(SVN_ERR_RA_NOT_LOCKED, NULL,                                      _("'%s' is not locked in the repository"),                                      path);              if (lock_func)                SVN_ERR(lock_func(lock_baton, path, FALSE, NULL, err, subpool));              continue;            }        }      unlock_ctx.force = force;      unlock_ctx.token = apr_pstrcat(subpool, "<", token, ">", NULL);      req_url = svn_path_url_add_component(session->repos_url.path, path,                                           subpool);      handler = apr_pcalloc(subpool, sizeof(*handler));            handler->method = "UNLOCK";      handler->path = req_url;      handler->conn = session->conns[0];      handler->session = session;            handler->header_delegate = set_unlock_headers;      handler->header_delegate_baton = &unlock_ctx;      handler->response_handler = svn_ra_serf__handle_status_only;      handler->response_baton = ctx;            svn_ra_serf__request_create(handler);      SVN_ERR(svn_ra_serf__context_run_wait(&ctx->done, session, subpool));      if (ctx->status != 204)        {           return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,                                    _("Unlock request failed: %d %s"),                                    ctx->status, ctx->reason);        }      if (lock_func)        SVN_ERR(lock_func(lock_baton, path, FALSE, NULL, NULL, subpool));    }  return SVN_NO_ERROR;}

⌨️ 快捷键说明

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