mirror of
https://github.com/git-for-windows/git.git
synced 2026-06-27 00:58:30 -05:00
The Git project is not exactly the easiest project to get started in: it's written in C and POSIX shell, with bits of Perl, Rust and other languages sprinkled into it. On top of that, the project has grown somewhat organically over time, making the codebase hard to navigate. These are problems that we're aware of, and there have been and still are efforts to clean up some of the technical debt that is natural to exist an a project that is more than 20 years old. Furthermore, we provide resources to newcomers that help them out like our coding guidelines, code of conduct or "MyFirstContribution.adoc". But there is a rather practical problem: finding your way around in our project's tree is not easy. Doing a directory listing in the top-level directory will present you with more than 550 files, which makes it extremely hard for a newcomer to figure out what files they are even supposed to look at. This makes the onboarding experience somewhat harder than it really needs to be. This isn't only a problem for newcomers though, as I myself struggle to find the files I am looking for because of the sheer number of files. Besides the problem of discoverability it also creates a problem of structure. It is not obvious at all which files are part of "libgit.a" and which files are only linked into our final executables. So while we have this split in our build systems, that split is not evident at all in our tree. Introduce a new "lib/" directory and move all of our sources for "libgit.a" into it to fix these issues. It makes the split we have evident and reduces the number of files in our top-level tree from 550 files to ~80 files. This is still a lot of files, but it's significantly easier to navigate already. Furthermore, we can further iterate after this step and think about introducing a better structure for remaining files, as well. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
74 lines
2.1 KiB
C
74 lines
2.1 KiB
C
#ifndef CHUNK_FORMAT_H
|
|
#define CHUNK_FORMAT_H
|
|
|
|
#include "hash.h"
|
|
|
|
struct hashfile;
|
|
struct chunkfile;
|
|
|
|
#define CHUNK_TOC_ENTRY_SIZE (sizeof(uint32_t) + sizeof(uint64_t))
|
|
|
|
/*
|
|
* Initialize a 'struct chunkfile' for writing _or_ reading a file
|
|
* with the chunk format.
|
|
*
|
|
* If writing a file, supply a non-NULL 'struct hashfile *' that will
|
|
* be used to write.
|
|
*
|
|
* If reading a file, use a NULL 'struct hashfile *' and then call
|
|
* read_table_of_contents(). Supply the memory-mapped data to the
|
|
* pair_chunk() or read_chunk() methods, as appropriate.
|
|
*
|
|
* DO NOT MIX THESE MODES. Use different 'struct chunkfile' instances
|
|
* for reading and writing.
|
|
*/
|
|
struct chunkfile *init_chunkfile(struct hashfile *f);
|
|
void free_chunkfile(struct chunkfile *cf);
|
|
int get_num_chunks(struct chunkfile *cf);
|
|
typedef int (*chunk_write_fn)(struct hashfile *f, void *data);
|
|
void add_chunk(struct chunkfile *cf,
|
|
uint32_t id,
|
|
size_t size,
|
|
chunk_write_fn fn);
|
|
int write_chunkfile(struct chunkfile *cf, void *data);
|
|
|
|
int read_table_of_contents(struct chunkfile *cf,
|
|
const unsigned char *mfile,
|
|
size_t mfile_size,
|
|
uint64_t toc_offset,
|
|
int toc_length,
|
|
unsigned expected_alignment);
|
|
|
|
#define CHUNK_NOT_FOUND (-2)
|
|
|
|
/*
|
|
* Find 'chunk_id' in the given chunkfile and assign the
|
|
* given pointer to the position in the mmap'd file where
|
|
* that chunk begins. Likewise the "size" parameter is filled
|
|
* with the size of the chunk.
|
|
*
|
|
* Returns CHUNK_NOT_FOUND if the chunk does not exist.
|
|
*/
|
|
int pair_chunk(struct chunkfile *cf,
|
|
uint32_t chunk_id,
|
|
const unsigned char **p,
|
|
size_t *size);
|
|
|
|
typedef int (*chunk_read_fn)(const unsigned char *chunk_start,
|
|
size_t chunk_size, void *data);
|
|
/*
|
|
* Find 'chunk_id' in the given chunkfile and call the
|
|
* given chunk_read_fn method with the information for
|
|
* that chunk.
|
|
*
|
|
* Returns CHUNK_NOT_FOUND if the chunk does not exist.
|
|
*/
|
|
int read_chunk(struct chunkfile *cf,
|
|
uint32_t chunk_id,
|
|
chunk_read_fn fn,
|
|
void *data);
|
|
|
|
uint8_t oid_version(const struct git_hash_algo *algop);
|
|
|
|
#endif
|