]>
Commit | Line | Data |
---|---|---|
a3407730 | 1 | #include "cache.h" |
fc59e748 DS |
2 | #include "csum-file.h" |
3 | #include "lockfile.h" | |
a3407730 DS |
4 | #include "midx.h" |
5 | ||
fc59e748 DS |
6 | #define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */ |
7 | #define MIDX_VERSION 1 | |
8 | #define MIDX_HASH_VERSION 1 | |
9 | #define MIDX_HEADER_SIZE 12 | |
10 | ||
11 | static char *get_midx_filename(const char *object_dir) | |
12 | { | |
13 | return xstrfmt("%s/pack/multi-pack-index", object_dir); | |
14 | } | |
15 | ||
16 | static size_t write_midx_header(struct hashfile *f, | |
17 | unsigned char num_chunks, | |
18 | uint32_t num_packs) | |
19 | { | |
20 | unsigned char byte_values[4]; | |
21 | ||
22 | hashwrite_be32(f, MIDX_SIGNATURE); | |
23 | byte_values[0] = MIDX_VERSION; | |
24 | byte_values[1] = MIDX_HASH_VERSION; | |
25 | byte_values[2] = num_chunks; | |
26 | byte_values[3] = 0; /* unused */ | |
27 | hashwrite(f, byte_values, sizeof(byte_values)); | |
28 | hashwrite_be32(f, num_packs); | |
29 | ||
30 | return MIDX_HEADER_SIZE; | |
31 | } | |
32 | ||
a3407730 DS |
33 | int write_midx_file(const char *object_dir) |
34 | { | |
fc59e748 DS |
35 | unsigned char num_chunks = 0; |
36 | char *midx_name; | |
37 | struct hashfile *f = NULL; | |
38 | struct lock_file lk; | |
39 | ||
40 | midx_name = get_midx_filename(object_dir); | |
41 | if (safe_create_leading_directories(midx_name)) { | |
42 | UNLEAK(midx_name); | |
43 | die_errno(_("unable to create leading directories of %s"), | |
44 | midx_name); | |
45 | } | |
46 | ||
47 | hold_lock_file_for_update(&lk, midx_name, LOCK_DIE_ON_ERROR); | |
48 | f = hashfd(lk.tempfile->fd, lk.tempfile->filename.buf); | |
49 | FREE_AND_NULL(midx_name); | |
50 | ||
51 | write_midx_header(f, num_chunks, 0); | |
52 | ||
53 | finalize_hashfile(f, NULL, CSUM_FSYNC | CSUM_HASH_IN_STREAM); | |
54 | commit_lock_file(&lk); | |
55 | ||
a3407730 DS |
56 | return 0; |
57 | } |