/* Set up a new adm area for PATH, with REPOS_* as the repos info, and INITIAL_REV as the starting revision. The entries file starts out marked as 'incomplete. The adm area starts out locked; remember to unlock it when done. */ static svn_error_t * init_adm(svn_wc__db_t *db, const char *local_abspath, const char *repos_relpath, const char *repos_root_url, const char *repos_uuid, svn_revnum_t initial_rev, svn_depth_t depth, apr_pool_t *pool) { /* First, make an empty administrative area. */ SVN_ERR(svn_io_dir_make_hidden(svn_wc__adm_child(local_abspath, NULL, pool), APR_OS_DEFAULT, pool)); /** Make subdirectories. ***/ /* SVN_WC__ADM_PRISTINE */ SVN_ERR(make_adm_subdir(local_abspath, SVN_WC__ADM_PRISTINE, FALSE, pool)); /* ### want to add another directory? do a format bump to ensure that ### all existing working copies get the new directories. or maybe ### create-on-demand (more expensive) */ /** Init the tmp area. ***/ SVN_ERR(init_adm_tmp_area(local_abspath, pool)); /* Create the SDB. */ SVN_ERR(svn_wc__db_init(db, local_abspath, repos_relpath, repos_root_url, repos_uuid, initial_rev, depth, pool)); /* Stamp ENTRIES and FORMAT files for old clients. */ SVN_ERR(svn_io_file_create(svn_wc__adm_child(local_abspath, SVN_WC__ADM_ENTRIES, pool), SVN_WC__NON_ENTRIES_STRING, pool)); SVN_ERR(svn_io_file_create(svn_wc__adm_child(local_abspath, SVN_WC__ADM_FORMAT, pool), SVN_WC__NON_ENTRIES_STRING, pool)); return SVN_NO_ERROR; }
svn_error_t * svn_wc__make_killme(svn_wc_adm_access_t *adm_access, svn_boolean_t adm_only, apr_pool_t *pool) { const char *path; SVN_ERR(svn_wc__adm_write_check(adm_access, pool)); path = svn_wc__adm_child(svn_wc_adm_access_path(adm_access), SVN_WC__ADM_KILLME, pool); return svn_io_file_create(path, adm_only ? SVN_WC__KILL_ADM_ONLY : "", pool); }
/* This implements the fs_library_vtable_t.open_for_recovery() API. */ static svn_error_t * fs_open_for_recovery(svn_fs_t *fs, const char *path, apr_pool_t *pool, apr_pool_t *common_pool) { /* Recovery for FSFS is currently limited to recreating the 'current' file from the latest revision. */ /* The only thing we have to watch out for is that the 'current' file might not exist. So we'll try to create it here unconditionally, and just ignore any errors that might indicate that it's already present. (We'll need it to exist later anyway as a source for the new file's permissions). */ /* Use a partly-filled fs pointer first to create 'current'. This will fail if 'current' already exists, but we don't care about that. */ fs->path = apr_pstrdup(fs->pool, path); svn_error_clear(svn_io_file_create(svn_fs_fs__path_current(fs, pool), "0 1 1\n", pool)); /* Now open the filesystem properly by calling the vtable method directly. */ return fs_open(fs, path, pool, common_pool); }