Re: [PATCH 18/22] read-cache: write index-v5
On Sun, Jul 7, 2013 at 4:11 AM, Thomas Gummerer <t.gummerer@gmail.com> wrote:
Show 49 quoted lines
> Write the index version 5 file format to disk. This version doesn't
> write the cache-tree data and resolve-undo data to the file.
>
> The main work is done when filtering out the directories from the
> current in-memory format, where in the same turn also the conflicts
> and the file data is calculated.
>
> Helped-by: Nguyen Thai Ngoc Duy <pclouds@gmail.com>
> Helped-by: Thomas Rast <trast@student.ethz.ch>
> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
> ---
> diff --git a/read-cache-v5.c b/read-cache-v5.c
> index f1ad132..f056f6b 100644
> --- a/read-cache-v5.c
> +++ b/read-cache-v5.c
> +static int write_index_v5(struct index_state *istate, int newfd)
> +{
> + struct cache_version_header hdr;
> + struct cache_header hdr_v5;
> + struct cache_entry **cache = istate->cache;
> + struct directory_entry *de;
> + struct ondisk_directory_entry *ondisk;
> + int entries = istate->cache_nr;
> + int i, removed, non_conflicted, total_dir_len, ondisk_directory_size;
> + int total_file_len, conflict_offset, offset_to_offset;
> + unsigned int ndir;
> + uint32_t crc;
> +
> + if (istate->partially_read)
> + die("BUG: index: cannot write a partially read index");
> +
> + for (i = removed = 0; i < entries; i++) {
> + if (cache[i]->ce_flags & CE_REMOVE)
> + removed++;
> + }
> + hdr.hdr_signature = htonl(CACHE_SIGNATURE);
> + hdr.hdr_version = htonl(istate->version);
> + hdr_v5.hdr_nfile = htonl(entries - removed);
> + hdr_v5.hdr_nextension = htonl(0); /* Currently no extensions are supported */
> +
> + non_conflicted = 0;
> + total_dir_len = 0;
> + total_file_len = 0;
> + de = compile_directory_data(istate, entries, &ndir, &non_conflicted,
> + &total_dir_len, &total_file_len);
> + hdr_v5.hdr_ndir = htonl(ndir);
> +
> + /*
> + * This is needed because the compiler aligns structs to sizes multipeShow 45 quoted lines
> + * of 4
> + */
> + ondisk_directory_size = sizeof(ondisk->flags)
> + + sizeof(ondisk->foffset)
> + + sizeof(ondisk->cr)
> + + sizeof(ondisk->ncr)
> + + sizeof(ondisk->nsubtrees)
> + + sizeof(ondisk->nfiles)
> + + sizeof(ondisk->nentries)
> + + sizeof(ondisk->sha1);
> + hdr_v5.hdr_fblockoffset = htonl(sizeof(hdr) + sizeof(hdr_v5) + 4
> + + (ndir + 1) * 4
> + + total_dir_len
> + + ndir * (ondisk_directory_size + 4)
> + + (non_conflicted + 1) * 4);
> +
> + crc = 0;
> + if (ce_write(&crc, newfd, &hdr, sizeof(hdr)) < 0)
> + return -1;
> + if (ce_write(&crc, newfd, &hdr_v5, sizeof(hdr_v5)) < 0)
> + return -1;
> + crc = htonl(crc);
> + if (ce_write(NULL, newfd, &crc, 4) < 0)
> + return -1;
> +
> + conflict_offset = sizeof(hdr) + sizeof(hdr_v5) + 4
> + + (ndir + 1) * 4
> + + total_dir_len
> + + ndir * (ondisk_directory_size + 4)
> + + (non_conflicted + 1) * 4
> + + total_file_len
> + + non_conflicted * (sizeof(struct ondisk_cache_entry) + 4);
> + if (write_directories(de, newfd, conflict_offset) < 0)
> + return -1;
> + offset_to_offset = sizeof(hdr) + sizeof(hdr_v5) + 4
> + + (ndir + 1) * 4
> + + total_dir_len
> + + ndir * (ondisk_directory_size + 4);
> + if (write_entries(istate, de, entries, newfd, offset_to_offset) < 0)
> + return -1;
> + if (write_conflicts(istate, de, newfd) < 0)
> + return -1;
> + return ce_flush(newfd);
> +}
> +