Hash :
f0e693b1
Author :
Date :
2021-09-07T17:53:49
str: introduce `git_str` for internal, `git_buf` is external libgit2 has two distinct requirements that were previously solved by `git_buf`. We require: 1. A general purpose string class that provides a number of utility APIs for manipulating data (eg, concatenating, truncating, etc). 2. A structure that we can use to return strings to callers that they can take ownership of. By using a single class (`git_buf`) for both of these purposes, we have confused the API to the point that refactorings are difficult and reasoning about correctness is also difficult. Move the utility class `git_buf` to be called `git_str`: this represents its general purpose, as an internal string buffer class. The name also is an homage to Junio Hamano ("gitstr"). The public API remains `git_buf`, and has a much smaller footprint. It is generally only used as an "out" param with strict requirements that follow the documentation. (Exceptions exist for some legacy APIs to avoid breaking callers unnecessarily.) Utility functions exist to convert a user-specified `git_buf` to a `git_str` so that we can call internal functions, then converting it back again.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
/*
* Copyright (C) the libgit2 contributors. All rights reserved.
*
* This file is part of libgit2, distributed under the GNU GPL v2 with
* a Linking Exception. For full terms see the included COPYING file.
*/
#ifndef INCLUDE_midx_h__
#define INCLUDE_midx_h__
#include "common.h"
#include <ctype.h>
#include "git2/sys/midx.h"
#include "map.h"
#include "mwindow.h"
#include "odb.h"
/*
* A multi-pack-index file.
*
* This file contains a merged index for multiple independent .pack files. This
* can help speed up locating objects without requiring a garbage collection
* cycle to create a single .pack file.
*
* Support for this feature was added in git 2.21, and requires the
* `core.multiPackIndex` config option to be set.
*/
typedef struct git_midx_file {
git_map index_map;
/* The table of Packfile Names. */
git_vector packfile_names;
/* The OID Fanout table. */
const uint32_t *oid_fanout;
/* The total number of objects in the index. */
uint32_t num_objects;
/* The OID Lookup table. */
git_oid *oid_lookup;
/* The Object Offsets table. Each entry has two 4-byte fields with the pack index and the offset. */
const unsigned char *object_offsets;
/* The Object Large Offsets table. */
const unsigned char *object_large_offsets;
/* The number of entries in the Object Large Offsets table. Each entry has an 8-byte with an offset */
size_t num_object_large_offsets;
/* The trailer of the file. Contains the SHA1-checksum of the whole file. */
git_oid checksum;
/* something like ".git/objects/pack/multi-pack-index". */
git_str filename;
} git_midx_file;
/*
* An entry in the multi-pack-index file. Similar in purpose to git_pack_entry.
*/
typedef struct git_midx_entry {
/* The index within idx->packfile_names where the packfile name can be found. */
size_t pack_index;
/* The offset within the .pack file where the requested object is found. */
off64_t offset;
/* The SHA-1 hash of the requested object. */
git_oid sha1;
} git_midx_entry;
/*
* A writer for `multi-pack-index` files.
*/
struct git_midx_writer {
/*
* The path of the directory where the .pack/.idx files are stored. The
* `multi-pack-index` file will be written to the same directory.
*/
git_str pack_dir;
/* The list of `git_pack_file`s. */
git_vector packs;
};
int git_midx_open(
git_midx_file **idx_out,
const char *path);
bool git_midx_needs_refresh(
const git_midx_file *idx,
const char *path);
int git_midx_entry_find(
git_midx_entry *e,
git_midx_file *idx,
const git_oid *short_oid,
size_t len);
int git_midx_foreach_entry(
git_midx_file *idx,
git_odb_foreach_cb cb,
void *data);
int git_midx_close(git_midx_file *idx);
void git_midx_free(git_midx_file *idx);
/* This is exposed for use in the fuzzers. */
int git_midx_parse(
git_midx_file *idx,
const unsigned char *data,
size_t size);
#endif