Alien-SVN
view release on metacpan or search on metacpan
src/subversion/tools/dev/fsfs-reorg.c view on Meta::CPAN
{
svn_revnum_t revision;
apr_size_t content_cache_size;
apr_size_t window_cache_size;
apr_size_t dir_cache_size;
/* determine cache sizes */
if (memsize < 100)
memsize = 100;
content_cache_size = memsize * 7 / 10 > 4000 ? 4000 : memsize * 7 / 10;
window_cache_size = memsize * 2 / 10 * 1024 * 1024;
dir_cache_size = (memsize / 10) * 16000;
/* read repo format and such */
SVN_ERR(fs_open(fs, path, pool));
/* create data containers and caches */
(*fs)->start_revision = start_revision
- (start_revision % (*fs)->max_files_per_dir);
(*fs)->revisions = apr_array_make(pool,
(*fs)->max_revision + 1 - (*fs)->start_revision,
sizeof(revision_info_t *));
(*fs)->packs = apr_array_make(pool,
((*fs)->min_unpacked_rev - (*fs)->start_revision)
/ (*fs)->max_files_per_dir,
sizeof(revision_pack_t *));
(*fs)->null_base = apr_pcalloc(pool, sizeof(*(*fs)->null_base));
(*fs)->cache = create_content_cache
(apr_allocator_owner_get
(svn_pool_create_allocator(FALSE)),
content_cache_size * 1024 * 1024);
(*fs)->dir_cache = create_dir_cache
(apr_allocator_owner_get
(svn_pool_create_allocator(FALSE)),
dir_cache_size);
(*fs)->window_cache = create_window_cache
(apr_allocator_owner_get
(svn_pool_create_allocator(FALSE)),
10000, window_cache_size);
/* read all packed revs */
for ( revision = start_revision
; revision < (*fs)->min_unpacked_rev
; revision += (*fs)->max_files_per_dir)
SVN_ERR(read_pack_file(*fs, revision, pool));
/* read non-packed revs */
for ( ; revision <= (*fs)->max_revision; ++revision)
SVN_ERR(read_revision_file(*fs, revision, pool));
return SVN_NO_ERROR;
}
/* Return the maximum number of decimal digits required to represent offsets
* in the given PACK file.
*/
static apr_size_t
get_max_offset_len(const revision_pack_t *pack)
{
/* the pack files may grow a few percent.
* Fudge it up to be on safe side.
*/
apr_size_t max_future_size = pack->filesize * 2 + 10000;
apr_size_t result = 0;
while (max_future_size > 0)
{
++result;
max_future_size /= 10;
}
return result;
}
/* Create the fragments container in PACK and add revision header fragments
* to it. Use POOL for allocations.
*/
static svn_error_t *
add_revisions_pack_heads(revision_pack_t *pack,
apr_pool_t *pool)
{
int i;
revision_info_t *info;
apr_size_t offset_len = get_max_offset_len(pack);
fragment_t fragment;
/* allocate fragment arrays */
int fragment_count = 1;
for (i = 0; i < pack->info->nelts; ++i)
{
info = APR_ARRAY_IDX(pack->info, i, revision_info_t*);
fragment_count += info->node_revs->nelts
+ info->representations->nelts
+ 2;
}
pack->target_offset = pack->info->nelts > 1 ? 64 : 0;
pack->fragments = apr_array_make(pool,
fragment_count,
sizeof(fragment_t));
/* put revision headers first */
for (i = 0; i < pack->info->nelts - 1; ++i)
{
info = APR_ARRAY_IDX(pack->info, i, revision_info_t*);
info->target.offset = pack->target_offset;
fragment.data = info;
fragment.kind = header_fragment;
fragment.position = pack->target_offset;
APR_ARRAY_PUSH(pack->fragments, fragment_t) = fragment;
pack->target_offset += 2 * offset_len + 3;
}
info = APR_ARRAY_IDX(pack->info, pack->info->nelts - 1, revision_info_t*);
info->target.offset = pack->target_offset;
( run in 0.417 second using v1.01-cache-2.11-cpan-140bd7fdf52 )