From: Thomas Gummerer <t.gummerer@gmail.com>
To: Duy Nguyen <pclouds@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>,
tr@thomasrast.ch, Michael Haggerty <mhagger@alum.mit.edu>,
Robin Rosenberg <robin.rosenberg@dewire.com>,
Eric Sunshine <sunshine@sunshineco.com>,
Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Subject: Re: [PATCH v4 12/24] read-cache: read index-v5
Date: Sat, 30 Nov 2013 11:40:32 +0100 [thread overview]
Message-ID: <87wqjqxjdr.fsf@gmail.com> (raw)
In-Reply-To: <CACsJy8C5Px6d5dKOG8mbKYvLPHVFOBhJ8i5_6oRB33zB1Rmvhg@mail.gmail.com>
Duy Nguyen <pclouds@gmail.com> writes:
> On Wed, Nov 27, 2013 at 7:00 PM, Thomas Gummerer <t.gummerer@gmail.com> wrote:
>> --- a/cache.h
>> +++ b/cache.h
>> @@ -132,11 +141,17 @@ struct cache_entry {
>> char name[FLEX_ARRAY]; /* more */
>> };
>>
>> +#define CE_NAMEMASK (0x0fff)
>
> CE_NAMEMASK is redefined in read-cache-v2.c in "read-cache: move index
> v2 specific functions to their own file". My gcc is smart enough to
> see the two defines are about the same value and does not warn me. But
> we should remove one (likely this one as I see no use of this macro
> outside read-cache-v2.c)
Thanks for catching that, there's no need to have it here. I'll remove
it in the re-roll.
>> #define CE_STAGEMASK (0x3000)
>> #define CE_EXTENDED (0x4000)
>> #define CE_VALID (0x8000)
>> +#define CE_SMUDGED (0x0400) /* index v5 only flag */
>> #define CE_STAGESHIFT 12
>>
>> +#define CONFLICT_CONFLICTED (0x8000)
>> +#define CONFLICT_STAGESHIFT 13
>> +#define CONFLICT_STAGEMASK (0x6000)
>> +
>> /*
>> * Range 0xFFFF0000 in ce_flags is divided into
>> * two parts: in-memory flags and on-disk ones.
>
>> diff --git a/read-cache-v5.c b/read-cache-v5.c
>> new file mode 100644
>> index 0000000..9d8c8f0
>> --- /dev/null
>> +++ b/read-cache-v5.c
>> +static int read_index_v5(struct index_state *istate, void *mmap,
>> + unsigned long mmap_size, struct filter_opts *opts)
>> +{
>> + unsigned int entry_offset, foffsetblock, nr = 0, *extoffsets;
>> + unsigned int dir_offset, dir_table_offset;
>> + int need_root = 0, i;
>> + uint32_t *offset;
>> + struct directory_entry *root_directory, *de, *last_de;
>> + const char **paths = NULL;
>> + struct pathspec adjusted_pathspec;
>> + struct cache_header *hdr;
>> + struct cache_header_v5 *hdr_v5;
>> +
>> + hdr = mmap;
>> + hdr_v5 = ptr_add(mmap, sizeof(*hdr));
>> + istate->cache_alloc = alloc_nr(ntohl(hdr->hdr_entries));
>> + istate->cache = xcalloc(istate->cache_alloc, sizeof(struct cache_entry *));
>> + extoffsets = xcalloc(ntohl(hdr_v5->hdr_nextension), sizeof(int));
>> + for (i = 0; i < ntohl(hdr_v5->hdr_nextension); i++) {
>> + offset = ptr_add(mmap, sizeof(*hdr) + sizeof(*hdr_v5));
>> + extoffsets[i] = htonl(*offset);
>> + }
>> +
>> + /* Skip size of the header + crc sum + size of offsets to extensions + size of offsets */
>> + dir_offset = sizeof(*hdr) + sizeof(*hdr_v5) + ntohl(hdr_v5->hdr_nextension) * 4 + 4
>> + + (ntohl(hdr_v5->hdr_ndir) + 1) * 4;
>> + dir_table_offset = sizeof(*hdr) + sizeof(*hdr_v5) + ntohl(hdr_v5->hdr_nextension) * 4 + 4;
>> + root_directory = read_directories(&dir_offset, &dir_table_offset,
>> + mmap, mmap_size);
>> +
>> + entry_offset = ntohl(hdr_v5->hdr_fblockoffset);
>> + foffsetblock = dir_offset;
>> +
>> + if (opts && opts->pathspec && opts->pathspec->nr) {
>> + paths = xmalloc((opts->pathspec->nr + 1)*sizeof(char *));
>> + paths[opts->pathspec->nr] = NULL;
>
> Put this statement here
>
> GUARD_PATHSPEC(opts->pathspec,
> PATHSPEC_FROMTOP |
> PATHSPEC_MAXDEPTH |
> PATHSPEC_LITERAL |
> PATHSPEC_GLOB |
> PATHSPEC_ICASE);
>
> This says the mentioned magic is safe in this code. New magic may or
> may not be and needs to be checked (soonest by me, I'm going to add
> negative pathspec and I'll need to look into how it should be handled
> in this code block).
Thanks, I'll add the statement in the re-roll.
>> + for (i = 0; i < opts->pathspec->nr; i++) {
>> + char *super = strdup(opts->pathspec->items[i].match);
>> + int len = strlen(super);
>
> You should only check as far as items[i].nowildcard_len, not strlen().
> The rest could be wildcards and stuff and not so reliable.
Ok, will change it in the re-roll.
>> + while (len && super[len - 1] == '/' && super[len - 2] == '/')
>> + super[--len] = '\0'; /* strip all but one trailing slash */
>> + while (len && super[--len] != '/')
>> + ; /* scan backwards to next / */
>> + if (len >= 0)
>> + super[len--] = '\0';
>> + if (len <= 0) {
>> + need_root = 1;
>> + break;
>> + }
>> + paths[i] = super;
>> + }
>
> And maybe put the comment "FIXME: consider merging this code with
> create_simplify() in dir.c" somewhere. It's for me to look for things
> to do when I'm bored ;-)
Heh, thanks, will do.
>> + }
>> +
>> + if (!need_root)
>> + parse_pathspec(&adjusted_pathspec, PATHSPEC_ALL_MAGIC, PATHSPEC_PREFER_CWD, NULL, paths);
>
> I would go with PATHSPEC_PREFER_FULL instead of _CWD as it's safer.
> Looking only at this function without caller context, it's hard to say
> if _CWD is the right choice.
Ok, thanks, will change.
>> +
>> + de = root_directory;
>> + last_de = de;
>
> This statement is redundant. last_de is only used in one code block
> below and it's always re-initialized before entering the loop to skip
> subdirs.
Right, good catch! Will remove it.
>> + while (de) {
>> + if (need_root ||
>> + match_pathspec_depth(&adjusted_pathspec, de->pathname, de->de_pathlen, 0, NULL)) {
>> + if (read_entries(istate, de, entry_offset,
>> + mmap, mmap_size, &nr,
>> + foffsetblock) < 0)
>> + return -1;
>> + } else {
>> + last_de = de;
>> + for (i = 0; i < de->de_nsubtrees; i++) {
>> + de->sub[i]->next = last_de->next;
>> + last_de->next = de->sub[i];
>> + last_de = last_de->next;
>> + }
>> + }
>> + de = de->next;
>> + }
>> + free_directory_tree(root_directory);
>> + istate->cache_nr = nr;
>> + return 0;
>> +}
> --
> Duy
next prev parent reply other threads:[~2013-11-30 10:40 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-27 12:00 [PATCH v4 00/24] Index-v5 Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 01/24] t2104: Don't fail for index versions other than [23] Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 02/24] read-cache: split index file version specific functionality Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 03/24] read-cache: move index v2 specific functions to their own file Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 04/24] read-cache: Re-read index if index file changed Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 05/24] add documentation for the index api Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 06/24] read-cache: add index reading api Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 07/24] make sure partially read index is not changed Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 08/24] grep.c: use index api Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 09/24] ls-files.c: " Thomas Gummerer
2013-11-30 9:17 ` Duy Nguyen
2013-11-30 10:30 ` Thomas Gummerer
2013-11-30 15:39 ` Antoine Pelisse
2013-11-30 20:08 ` Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 10/24] documentation: add documentation of the index-v5 file format Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 11/24] read-cache: make in-memory format aware of stat_crc Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 12/24] read-cache: read index-v5 Thomas Gummerer
2013-11-30 9:17 ` Duy Nguyen
2013-11-30 10:40 ` Thomas Gummerer [this message]
2013-11-30 12:19 ` Antoine Pelisse
2013-11-30 20:10 ` Thomas Gummerer
2013-11-30 15:26 ` Antoine Pelisse
2013-11-30 20:27 ` Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 13/24] read-cache: read resolve-undo data Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 14/24] read-cache: read cache-tree in index-v5 Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 15/24] read-cache: write index-v5 Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 16/24] read-cache: write index-v5 cache-tree data Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 17/24] read-cache: write resolve-undo data for index-v5 Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 18/24] update-index.c: rewrite index when index-version is given Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 19/24] p0003-index.sh: add perf test for the index formats Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 20/24] introduce GIT_INDEX_VERSION environment variable Thomas Gummerer
2013-11-27 21:57 ` Eric Sunshine
2013-11-27 22:08 ` Junio C Hamano
2013-11-28 9:57 ` Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 21/24] test-lib: allow setting the index format version Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 22/24] t1600: add index v5 specific tests Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 23/24] POC for partial writing Thomas Gummerer
2013-11-30 9:58 ` Duy Nguyen
2013-11-30 10:50 ` Thomas Gummerer
2013-11-27 12:00 ` [PATCH v4 24/24] perf: add partial writing test Thomas Gummerer
2013-12-09 10:14 ` [PATCH v4 00/24] Index-v5 Thomas Gummerer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wqjqxjdr.fsf@gmail.com \
--to=t.gummerer@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mhagger@alum.mit.edu \
--cc=pclouds@gmail.com \
--cc=ramsay@ramsay1.demon.co.uk \
--cc=robin.rosenberg@dewire.com \
--cc=sunshine@sunshineco.com \
--cc=tr@thomasrast.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.