static svn_error_t * svn_ra_local__unlock(svn_ra_session_t *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_local__session_baton_t *sess = session->priv; apr_hash_index_t *hi; apr_pool_t *iterpool = svn_pool_create(pool); /* A username is absolutely required to unlock a path. */ SVN_ERR(get_username(session, pool)); for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi)) { const void *key; const char *path; void *val; const char *abs_path, *token; svn_error_t *err, *callback_err = NULL; svn_pool_clear(iterpool); apr_hash_this(hi, &key, NULL, &val); path = key; /* Since we can't store NULL values in a hash, we turn "" to NULL here. */ if (strcmp(val, "") != 0) token = val; else token = NULL; abs_path = svn_path_join(sess->fs_path->data, path, iterpool); /* This wrapper will call pre- and post-unlock hooks. */ err = svn_repos_fs_unlock(sess->repos, abs_path, token, force, iterpool); if (err && !SVN_ERR_IS_UNLOCK_ERROR(err)) return err; if (lock_func) callback_err = lock_func(lock_baton, path, FALSE, NULL, err, iterpool); svn_error_clear(err); if (callback_err) return callback_err; } svn_pool_destroy(iterpool); return SVN_NO_ERROR; }
CString SVNBase::GetErrorString(svn_error_t * Err, int wrap /* = 80 */) { CString msg; CString temp; if (Err != NULL) { char errbuf[256] = { 0 }; svn_error_t * ErrPtr = Err; if (ErrPtr->message) msg = CUnicodeUtils::GetUnicode(ErrPtr->message); else { /* Is this a Subversion-specific error code? */ if ((ErrPtr->apr_err > APR_OS_START_USEERR) && (ErrPtr->apr_err <= APR_OS_START_CANONERR)) msg = svn_strerror (ErrPtr->apr_err, errbuf, _countof (errbuf)); /* Otherwise, this must be an APR error code. */ else { svn_error_t *temp_err = NULL; const char * err_string = NULL; temp_err = svn_utf_cstring_to_utf8(&err_string, apr_strerror (ErrPtr->apr_err, errbuf, _countof (errbuf)-1), ErrPtr->pool); if (temp_err) { svn_error_clear (temp_err); msg = L"Can't recode error string from APR"; } else { msg = CUnicodeUtils::GetUnicode(err_string); } } } msg = CStringUtils::LinesWrap(msg, wrap); while (ErrPtr->child) { ErrPtr = ErrPtr->child; msg += L"\n"; if (ErrPtr->message) temp = CUnicodeUtils::GetUnicode(ErrPtr->message); else { /* Is this a Subversion-specific error code? */ if ((ErrPtr->apr_err > APR_OS_START_USEERR) && (ErrPtr->apr_err <= APR_OS_START_CANONERR)) temp = svn_strerror (ErrPtr->apr_err, errbuf, _countof (errbuf)); /* Otherwise, this must be an APR error code. */ else { svn_error_t *temp_err = NULL; const char * err_string = NULL; temp_err = svn_utf_cstring_to_utf8(&err_string, apr_strerror (ErrPtr->apr_err, errbuf, _countof (errbuf)-1), ErrPtr->pool); if (temp_err) { svn_error_clear (temp_err); temp = L"Can't recode error string from APR"; } else { temp = CUnicodeUtils::GetUnicode(err_string); } } } temp = CStringUtils::LinesWrap(temp, wrap); msg += temp; } temp.Empty(); if (svn_error_find_cause(Err, SVN_ERR_WC_LOCKED) && (Err->apr_err != SVN_ERR_WC_CLEANUP_REQUIRED)) temp.LoadString(IDS_SVNERR_RUNCLEANUP); #ifdef IDS_SVNERR_CHECKPATHORURL // add some hint text for some of the error messages switch (Err->apr_err) { case SVN_ERR_BAD_FILENAME: case SVN_ERR_BAD_URL: // please check the path or URL you've entered. temp.LoadString(IDS_SVNERR_CHECKPATHORURL); break; case SVN_ERR_WC_CLEANUP_REQUIRED: // do a "cleanup" temp.LoadString(IDS_SVNERR_RUNCLEANUP); break; case SVN_ERR_WC_NOT_UP_TO_DATE: case SVN_ERR_FS_TXN_OUT_OF_DATE: // do an update first temp.LoadString(IDS_SVNERR_UPDATEFIRST); break; case SVN_ERR_WC_CORRUPT: case SVN_ERR_WC_CORRUPT_TEXT_BASE: // do a "cleanup". If that doesn't work you need to do a fresh checkout. temp.LoadString(IDS_SVNERR_CLEANUPORFRESHCHECKOUT); break; case SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED: temp.LoadString(IDS_SVNERR_POSTCOMMITHOOKFAILED); break; case SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED: temp.LoadString(IDS_SVNERR_POSTLOCKHOOKFAILED); break; case SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED: temp.LoadString(IDS_SVNERR_POSTUNLOCKHOOKFAILED); break; case SVN_ERR_REPOS_HOOK_FAILURE: temp.LoadString(IDS_SVNERR_HOOKFAILED); break; case SVN_ERR_SQLITE_BUSY: temp.LoadString(IDS_SVNERR_SQLITEBUSY); break; default: break; } if ((Err->apr_err == SVN_ERR_FS_PATH_NOT_LOCKED)|| (Err->apr_err == SVN_ERR_FS_NO_SUCH_LOCK)|| (Err->apr_err == SVN_ERR_RA_NOT_LOCKED)) { // the lock has already been broken from another working copy temp.LoadString(IDS_SVNERR_UNLOCKFAILEDNOLOCK); } else if (SVN_ERR_IS_UNLOCK_ERROR(Err)) { // if you want to break the lock, use the "check for modifications" dialog temp.LoadString(IDS_SVNERR_UNLOCKFAILED); } if (!temp.IsEmpty()) { msg += L"\n" + temp; } #endif return msg; } return L""; }