git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v4 12/24] read-cache: read index-v5

From
Thomas Gummerer <t.gummerer@gmail.com>
Date
Nov 30, 2013, 10:40 UTC
Message-ID
<87wqjqxjdr.fsf@gmail.com>
In-Reply-To
<CACsJy8C5Px6d5dKOG8mbKYvLPHVFOBhJ8i5_6oRB33zB1Rmvhg@mail.gmail.com>
Duy Nguyen <pclouds@gmail.com> writes:
Show 14 quoted lines
> 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.

Show 69 quoted lines
>>  #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.
Show 6 quoted lines
>> +               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.
Show 16 quoted lines
>> +                       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.
Show 8 quoted lines
>> +       }
>> +
>> +       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.
Show 7 quoted lines
>> +
>> +       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.
Show 23 quoted lines
>> +       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
Previous: Duy NguyenNext: Antoine Pelisse
Message 19 of 41 in “Index-v5”
  1. 00/24 Index-v5Thomas Gummerer, Nov 27, 2013
  2. 01/24 t2104: Don't fail for index versions other than [23]Thomas Gummerer, Nov 27, 2013
  3. 02/24 read-cache: split index file version specific functionalityThomas Gummerer, Nov 27, 2013
  4. 03/24 read-cache: move index v2 specific functions to their own fileThomas Gummerer, Nov 27, 2013
  5. 04/24 read-cache: Re-read index if index file changedThomas Gummerer, Nov 27, 2013
  6. 05/24 add documentation for the index apiThomas Gummerer, Nov 27, 2013
  7. 06/24 read-cache: add index reading apiThomas Gummerer, Nov 27, 2013
  8. 07/24 make sure partially read index is not changedThomas Gummerer, Nov 27, 2013
  9. 08/24 grep.c: use index apiThomas Gummerer, Nov 27, 2013
  10. 09/24 ls-files.c: use index apiThomas Gummerer, Nov 27, 2013
  11. Duy NguyenNov 30, 2013
  12. Thomas GummererNov 30, 2013
  13. Antoine PelisseNov 30, 2013
  14. Thomas GummererNov 30, 2013
  15. 10/24 documentation: add documentation of the index-v5 file formatThomas Gummerer, Nov 27, 2013
  16. 11/24 read-cache: make in-memory format aware of stat_crcThomas Gummerer, Nov 27, 2013
  17. 12/24 read-cache: read index-v5Thomas Gummerer, Nov 27, 2013
  18. Duy NguyenNov 30, 2013
  19. Thomas GummererNov 30, 2013
  20. Antoine PelisseNov 30, 2013
  21. Thomas GummererNov 30, 2013
  22. Antoine PelisseNov 30, 2013
  23. Thomas GummererNov 30, 2013
  24. 13/24 read-cache: read resolve-undo dataThomas Gummerer, Nov 27, 2013
  25. 14/24 read-cache: read cache-tree in index-v5Thomas Gummerer, Nov 27, 2013
  26. 15/24 read-cache: write index-v5Thomas Gummerer, Nov 27, 2013
  27. 16/24 read-cache: write index-v5 cache-tree dataThomas Gummerer, Nov 27, 2013
  28. 17/24 read-cache: write resolve-undo data for index-v5Thomas Gummerer, Nov 27, 2013
  29. 18/24 update-index.c: rewrite index when index-version is givenThomas Gummerer, Nov 27, 2013
  30. 19/24 p0003-index.sh: add perf test for the index formatsThomas Gummerer, Nov 27, 2013
  31. 20/24 introduce GIT_INDEX_VERSION environment variableThomas Gummerer, Nov 27, 2013
  32. Eric SunshineNov 27, 2013
  33. Junio C HamanoNov 27, 2013
  34. Thomas GummererNov 28, 2013
  35. 21/24 test-lib: allow setting the index format versionThomas Gummerer, Nov 27, 2013
  36. 22/24 t1600: add index v5 specific testsThomas Gummerer, Nov 27, 2013
  37. 23/24 POC for partial writingThomas Gummerer, Nov 27, 2013
  38. Duy NguyenNov 30, 2013
  39. Thomas GummererNov 30, 2013
  40. 24/24 perf: add partial writing testThomas Gummerer, Nov 27, 2013
  41. Thomas GummererDec 9, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.