git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Elijah Newren <newren@gmail.com>
To: Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
	Junio C Hamano <gitster@pobox.com>,
	Derrick Stolee <stolee@gmail.com>,
	Matheus Tavares Bernardino <matheus.bernardino@usp.br>,
	Derrick Stolee <derrickstolee@github.com>
Subject: Re: [PATCH v2 00/25] Sparse Index: API protections
Date: Mon, 5 Apr 2021 12:55:31 -0700	[thread overview]
Message-ID: <CABPp-BGrycN2QDgueVG5+fokNkyd6wXowGw3R+-0U0jTFp9DUg@mail.gmail.com> (raw)
In-Reply-To: <pull.906.v2.git.1617241802.gitgitgadget@gmail.com>

On Wed, Mar 31, 2021 at 6:50 PM Derrick Stolee via GitGitGadget
<gitgitgadget@gmail.com> wrote:
>
> Here is the second patch series submission coming out of the sparse-index
> RFC [1].
>
> [1]
> https://lore.kernel.org/git/pull.847.git.1611596533.gitgitgadget@gmail.com/
>
> This is based on v3 of the format series [2].
>
> [2]
> https://lore.kernel.org/git/pull.883.v3.git.1615912983.gitgitgadget@gmail.com/
>
> The point of this series is to insert protections for the consumers of the
> in-memory index to avoid unintended behavior change when using a sparse
> index versus a full one.
>
> We mark certain regions of code as needing a full index, so we call
> ensure_full_index() to expand a sparse index to a full one, if necessary.
> These protections are inserted file-by-file in every loop over all cache
> entries. Well, "most" loops, because some are going to be handled in the
> very next series so I leave them out.
>
> Many callers use index_name_pos() to find a path by name. In these cases, we
> can check if that position resolves to a sparse directory instance. In those
> cases, we just expand to a full index and run the search again.
>
> The last few patches deal with the name-hash hashtable for doing O(1)
> lookups.
>
> These protections don't do much right now, since the previous series created
> the_repository->settings.command_requires_full_index to guard all index
> reads and writes to ensure the in-memory copy is full for commands that have
> not been tested with the sparse index yet.
>
> However, after this series is complete, we now have a straight-forward plan
> for making commands "sparse aware" one-by-one:
>
>  1. Disable settings.command_requires_full_index to allow an in-memory
>     sparse-index.
>  2. Run versions of that command under a debugger, breaking on
>     ensure_full_index().
>  3. Examine the call stack to determine the context of that expansion, then
>     implement the proper behavior in those locations.
>  4. Add tests to ensure we are checking this logic in the presence of sparse
>     directory entries.
>
> I will admit that mostly it is the writing of the test cases that takes the
> most time in the conversions I've done so far.
>
>
> Updates in v2
> =============
>
>  * Rebased onto v5 of ds/sparse-index
>  * Updated the technical doc to describe how these protections are guards to
>    keep behavior consistent between a sparse-index and a full index. Whether
>    or not that behavior is "correct" can be interrogated later.
>  * Calls to ensure_full_index() are marked with a TODO comment saying these
>    calls should be audited later (with tests).
>  * Fixed an incorrectly squashed commit message.
>  * Dropped the diff-lib.c commit because it was erroneously included in v2.
>  * Dropped the merge-ort.c commit because of conflicts with work in flight
>    and a quick audit that it is not needed.
>  * I reviewed the merge of this topic with mt/add-rm-in-sparse-checkout and
>    found it equivalent to what I would have done.

You addressed most my concerns moving from the RFC to v1, and this
version addresses most of my remaining comments/questions/suggestions.
I only had two minor comments on the last two patches.  This series is
looking pretty good to me.

> Thanks, -Stolee
>
> Derrick Stolee (25):
>   sparse-index: API protection strategy
>   *: remove 'const' qualifier for struct index_state
>   read-cache: expand on query into sparse-directory entry
>   cache: move ensure_full_index() to cache.h
>   add: ensure full index
>   checkout-index: ensure full index
>   checkout: ensure full index
>   commit: ensure full index
>   difftool: ensure full index
>   fsck: ensure full index
>   grep: ensure full index
>   ls-files: ensure full index
>   merge-index: ensure full index
>   rm: ensure full index
>   stash: ensure full index
>   update-index: ensure full index
>   dir: ensure full index
>   entry: ensure full index
>   merge-recursive: ensure full index
>   pathspec: ensure full index
>   read-cache: ensure full index
>   resolve-undo: ensure full index
>   revision: ensure full index
>   sparse-index: expand_to_path()
>   name-hash: use expand_to_path()
>
>  Documentation/technical/sparse-index.txt | 37 +++++++++++-
>  attr.c                                   | 14 ++---
>  attr.h                                   |  4 +-
>  builtin/add.c                            |  2 +
>  builtin/checkout-index.c                 |  2 +
>  builtin/checkout.c                       |  5 ++
>  builtin/commit.c                         |  4 ++
>  builtin/difftool.c                       |  3 +
>  builtin/fsck.c                           |  2 +
>  builtin/grep.c                           |  2 +
>  builtin/ls-files.c                       | 14 +++--
>  builtin/merge-index.c                    |  5 ++
>  builtin/rm.c                             |  2 +
>  builtin/stash.c                          |  2 +
>  builtin/update-index.c                   |  2 +
>  cache.h                                  |  7 ++-
>  convert.c                                | 26 ++++-----
>  convert.h                                | 20 +++----
>  dir.c                                    | 14 +++--
>  dir.h                                    |  8 +--
>  entry.c                                  |  2 +
>  merge-recursive.c                        |  4 +-
>  name-hash.c                              | 10 ++++
>  pathspec.c                               |  8 ++-
>  pathspec.h                               |  6 +-
>  read-cache.c                             | 35 ++++++++++--
>  resolve-undo.c                           |  4 ++
>  revision.c                               |  2 +
>  sparse-index.c                           | 72 ++++++++++++++++++++++++
>  sparse-index.h                           | 14 ++++-
>  submodule.c                              |  6 +-
>  submodule.h                              |  6 +-
>  32 files changed, 273 insertions(+), 71 deletions(-)
>
>
> base-commit: 66602733cc95d9a53594520cd8b28d3338e258ea
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-906%2Fderrickstolee%2Fsparse-index%2Fprotections-v2
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-906/derrickstolee/sparse-index/protections-v2
> Pull-Request: https://github.com/gitgitgadget/git/pull/906
>
> Range-diff vs v1:
>
>   3:  bbf19f8a2be5 !  1:  7484e085e342 sparse-index: API protection strategy
>      @@ Commit message
>           Looking for non-zero stage:
>           * builtin/add.c:chmod_pathspec()
>           * builtin/merge.c:count_unmerged_entries()
>      +    * merge-ort.c:record_conflicted_index_entries()
>           * read-cache.c:unmerged_index()
>           * rerere.c:check_one_conflict(), find_conflict(), rerere_remaining()
>           * revision.c:prepare_show_merge()
>      @@ Commit message
>           Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
>
>        ## Documentation/technical/sparse-index.txt ##
>      -@@ Documentation/technical/sparse-index.txt: also introduce other features that have been considered for improving the
>      - index, as well.
>      +@@ Documentation/technical/sparse-index.txt: index, as well.
>
>        Next, consumers of the index will be guarded against operating on a
>      --sparse-index by inserting calls to `ensure_full_index()` or
>      + sparse-index by inserting calls to `ensure_full_index()` or
>       -`expand_index_to_path()`. After these guards are in place, we can begin
>       -leaving sparse-directory entries in the in-memory index structure.
>      -+sparse-index by inserting calls to `ensure_full_index()` before iterating
>      -+over all cache entries. If a specific path is requested, then those will
>      ++`expand_index_to_path()`. If a specific path is requested, then those will
>       +be protected from within the `index_file_exists()` and `index_name_pos()`
>      -+API calls: they will call `ensure_full_index()` if necessary.
>      ++API calls: they will call `ensure_full_index()` if necessary. The
>      ++intention here is to preserve existing behavior when interacting with a
>      ++sparse-checkout. We don't want a change to happen by accident, without
>      ++tests. Many of these locations may not need any change before removing the
>      ++guards, but we should not do so without tests to ensure the expected
>      ++behavior happens.
>      ++
>      ++It may be desirable to _change_ the behavior of some commands in the
>      ++presence of a sparse index or more generally in any sparse-checkout
>      ++scenario. In such cases, these should be carefully communicated and
>      ++tested. No such behavior changes are intended during this phase.
>       +
>       +During a scan of the codebase, not every iteration of the cache entries
>       +needs an `ensure_full_index()` check. The basic reasons include:
>      @@ Documentation/technical/sparse-index.txt: also introduce other features that hav
>       +
>       +6. The sparse-index is disabled at this point when using the split-index
>       +   feature, so no effort is made to protect the split-index API.
>      -+
>      -+After these guards are in place, we can begin leaving sparse-directory
>      -+entries in the in-memory index structure.
>
>        Even after inserting these guards, we will keep expanding sparse-indexes
>        for most Git commands using the `command_requires_full_index` repository
>   1:  628e16dd3fc7 =  2:  098b2c9ef352 *: remove 'const' qualifier for struct index_state
>   2:  8e11e8917019 =  3:  737d27e18d64 read-cache: expand on query into sparse-directory entry
>   4:  7e4079c48eb2 =  4:  db5c100f3e2b cache: move ensure_full_index() to cache.h
>   5:  142df1ab8e3e !  5:  4a5fc2eb5a9f add: ensure full index
>      @@ builtin/add.c: static int renormalize_tracked_files(const struct pathspec *paths
>        {
>         int i, retval = 0;
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (i = 0; i < active_nr; i++) {
>                 struct cache_entry *ce = active_cache[i];
>   6:  bfa0164cc3c1 !  6:  11c38f7277c5 checkout-index: ensure full index
>      @@ builtin/checkout-index.c: static void checkout_all(const char *prefix, int prefi
>         int i, errs = 0;
>         struct cache_entry *last_ce = NULL;
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (i = 0; i < active_nr ; i++) {
>                 struct cache_entry *ce = active_cache[i];
>   7:  1bb7b6117e41 !  7:  fd04adbb3f79 checkout: ensure full index
>      @@ builtin/checkout.c: static int checkout_worktree(const struct checkout_opts *opt
>                                NULL);
>
>         enable_delayed_checkout(&state);
>      ++
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (pos = 0; pos < active_nr; pos++) {
>                 struct cache_entry *ce = active_cache[pos];
>      @@ builtin/checkout.c: static int checkout_paths(const struct checkout_opts *opts,
>          * Make sure all pathspecs participated in locating the paths
>          * to be checked out.
>          */
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (pos = 0; pos < active_nr; pos++)
>                 if (opts->overlay_mode)
>   8:  a59e45c4ae8f !  8:  65704f39edc9 commit: ensure full index
>      @@ builtin/commit.c: static int list_paths(struct string_list *list, const char *wi
>                 free(max_prefix);
>         }
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (i = 0; i < active_nr; i++) {
>                 const struct cache_entry *ce = active_cache[i];
>      @@ builtin/commit.c: static int prepare_to_commit(const char *index_file, const cha
>                 if (get_oid(parent, &oid)) {
>                         int i, ita_nr = 0;
>
>      ++                 /* TODO: audit for interaction with sparse-index. */
>       +                 ensure_full_index(&the_index);
>                         for (i = 0; i < active_nr; i++)
>                                 if (ce_intent_to_add(active_cache[i]))
>   9:  83040e7558f3 !  9:  739f3fe9edf2 difftool: ensure full index
>      @@ builtin/difftool.c: static int run_dir_diff(const char *extcmd, int symlinks, co
>                 setenv("GIT_DIFFTOOL_DIRDIFF", "true", 1);
>         rc = run_command_v_opt(helper_argv, flags);
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&wtindex);
>       +
>         /*
>  10:  988f7bd2d736 ! 10:  779a86ad1ec4 fsck: ensure full index
>      @@ builtin/fsck.c: int cmd_fsck(int argc, const char **argv, const char *prefix)
>                 verify_index_checksum = 1;
>                 verify_ce_order = 1;
>                 read_cache();
>      ++         /* TODO: audit for interaction with sparse-index. */
>       +         ensure_full_index(&the_index);
>                 for (i = 0; i < active_nr; i++) {
>                         unsigned int mode;
>  11:  abe189051a0c ! 11:  8c0d377054fa grep: ensure full index
>      @@ builtin/grep.c: static int grep_cache(struct grep_opt *opt,
>         if (repo_read_index(repo) < 0)
>                 die(_("index file corrupt"));
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(repo->index);
>         for (nr = 0; nr < repo->index->cache_nr; nr++) {
>                 const struct cache_entry *ce = repo->index->cache[nr];
>  12:  00c8a7e1d119 ! 12:  beaa1467cabb ls-files: ensure full index
>      @@ builtin/ls-files.c: static void show_files(struct repository *repo, struct dir_s
>
>         if (!(show_cached || show_stage || show_deleted || show_modified))
>                 return;
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(repo->index);
>         for (i = 0; i < repo->index->cache_nr; i++) {
>                 const struct cache_entry *ce = repo->index->cache[i];
>      @@ builtin/ls-files.c: void overlay_tree_on_index(struct index_state *istate,
>                 die("bad tree-ish %s", tree_name);
>
>         /* Hoist the unmerged entries up to stage #3 to make room */
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(istate);
>         for (i = 0; i < istate->cache_nr; i++) {
>                 struct cache_entry *ce = istate->cache[i];
>  13:  1288f02177d2 ! 13:  73684141fcff merge-index: ensure full index
>      @@ builtin/merge-index.c: static void merge_one_path(const char *path)
>        static void merge_all(void)
>        {
>         int i;
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (i = 0; i < active_nr; i++) {
>                 const struct cache_entry *ce = active_cache[i];
>      @@ builtin/merge-index.c: int cmd_merge_index(int argc, const char **argv, const ch
>
>         read_cache();
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>       +
>         i = 1;
>  14:  d6816560b32f ! 14:  6ea81a49c6b5 rm: ensure full index
>      @@ builtin/rm.c: int cmd_rm(int argc, const char **argv, const char *prefix)
>
>         seen = xcalloc(pathspec.nr, 1);
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (i = 0; i < active_nr; i++) {
>                 const struct cache_entry *ce = active_cache[i];
>  15:  92ccd31dd343 ! 15:  49ca5ed05c8d sparse-checkout: ensure full index
>      @@ Metadata
>       Author: Derrick Stolee <dstolee@microsoft.com>
>
>        ## Commit message ##
>      -    sparse-checkout: ensure full index
>      +    stash: ensure full index
>
>      -    When adjusting the sparse-checkout definition, ensure that a sparse
>      -    index is expanded to a full one to avoid unexpected behavior. This is a
>      -    top candidate for later integration with the sparse-index, but requires
>      -    careful testing.
>      +    Before iterating over all cache entries, ensure that a sparse index is
>      +    expanded to a full index to avoid unexpected behavior.
>
>           Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
>
>      @@ builtin/stash.c: static int do_push_stash(const struct pathspec *ps, const char
>                 int i;
>                 char *ps_matched = xcalloc(ps->nr, 1);
>
>      ++         /* TODO: audit for interaction with sparse-index. */
>       +         ensure_full_index(&the_index);
>                 for (i = 0; i < active_nr; i++)
>                         ce_path_match(&the_index, active_cache[i], ps,
>  16:  796449758a08 ! 16:  9c4bb187c15d update-index: ensure full index
>      @@ builtin/update-index.c: static int do_reupdate(int ac, const char **av,
>                  */
>                 has_head = 0;
>         redo:
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(&the_index);
>         for (pos = 0; pos < active_nr; pos++) {
>                 const struct cache_entry *ce = active_cache[pos];
>  17:  45bbed6150a2 <  -:  ------------ diff-lib: ensure full index
>  18:  8ce1f80985a4 ! 17:  fae4c078c3ef dir: ensure full index
>      @@ dir.c: static void connect_wt_gitdir_in_nested(const char *sub_worktree,
>         if (repo_read_index(&subrepo) < 0)
>                 die(_("index file corrupt in repo %s"), subrepo.gitdir);
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(subrepo.index);
>         for (i = 0; i < subrepo.index->cache_nr; i++) {
>                 const struct cache_entry *ce = subrepo.index->cache[i];
>  19:  6e0b452f44c1 ! 18:  2b9180ee77d3 entry: ensure full index
>      @@ entry.c: static void mark_colliding_entries(const struct checkout *state,
>
>         ce->ce_flags |= CE_MATCHED;
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(state->istate);
>         for (i = 0; i < state->istate->cache_nr; i++) {
>                 struct cache_entry *dup = state->istate->cache[i];
>  20:  fb4c7038b746 <  -:  ------------ merge-ort: ensure full index
>  21:  57d59825627f ! 19:  1e3f6085a405 merge-recursive: ensure full index
>      @@ merge-recursive.c: static struct string_list *get_unmerged(struct index_state *i
>
>         unmerged->strdup_strings = 1;
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(istate);
>         for (i = 0; i < istate->cache_nr; i++) {
>                 struct string_list_item *item;
>  22:  f4c470686b27 ! 20:  e62a597a9725 pathspec: ensure full index
>      @@ pathspec.c: void add_pathspec_matches_against_index(const struct pathspec *paths
>                         num_unmatched++;
>         if (!num_unmatched)
>                 return;
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(istate);
>         for (i = 0; i < istate->cache_nr; i++) {
>                 const struct cache_entry *ce = istate->cache[i];
>  23:  81519782d4b2 ! 21:  ebfffdbdd6ad read-cache: ensure full index
>      @@ read-cache.c: int refresh_index(struct index_state *istate, unsigned int flags,
>          */
>         preload_index(istate, pathspec, 0);
>         trace2_region_enter("index", "refresh", NULL);
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(istate);
>         for (i = 0; i < istate->cache_nr; i++) {
>                 struct cache_entry *ce, *new_entry;
>      @@ read-cache.c: int repo_index_has_changes(struct repository *repo,
>                 diff_flush(&opt);
>                 return opt.flags.has_changes != 0;
>         } else {
>      ++         /* TODO: audit for interaction with sparse-index. */
>       +         ensure_full_index(istate);
>                 for (i = 0; sb && i < istate->cache_nr; i++) {
>                         if (i)
>  24:  39e8bea0c1ca ! 22:  495b07a87973 resolve-undo: ensure full index
>      @@ resolve-undo.c: void unmerge_marked_index(struct index_state *istate)
>         if (!istate->resolve_undo)
>                 return;
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(istate);
>         for (i = 0; i < istate->cache_nr; i++) {
>                 const struct cache_entry *ce = istate->cache[i];
>      @@ resolve-undo.c: void unmerge_index(struct index_state *istate, const struct path
>         if (!istate->resolve_undo)
>                 return;
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(istate);
>         for (i = 0; i < istate->cache_nr; i++) {
>                 const struct cache_entry *ce = istate->cache[i];
>  25:  6abb1813ae10 ! 23:  3144114d1a75 revision: ensure full index
>      @@ revision.c: static void do_add_index_objects_to_pending(struct rev_info *revs,
>        {
>         int i;
>
>      ++ /* TODO: audit for interaction with sparse-index. */
>       + ensure_full_index(istate);
>         for (i = 0; i < istate->cache_nr; i++) {
>                 struct cache_entry *ce = istate->cache[i];
>  26:  1690d33c11e0 = 24:  d52c72b4a7b9 sparse-index: expand_to_path()
>  27:  40cfc59f695a = 25:  7e2d3fae9a2a name-hash: use expand_to_path()
>
> --
> gitgitgadget

  parent reply	other threads:[~2021-04-05 19:55 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-16 21:16 [PATCH 00/27] Sparse Index: API protections Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 01/27] *: remove 'const' qualifier for struct index_state Derrick Stolee via GitGitGadget
2021-03-19 21:01   ` Junio C Hamano
2021-03-20  1:45     ` Derrick Stolee
2021-03-20  1:52     ` Junio C Hamano
2021-03-30 16:53       ` Derrick Stolee
2021-03-16 21:16 ` [PATCH 02/27] read-cache: expand on query into sparse-directory entry Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 03/27] sparse-index: API protection strategy Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 04/27] cache: move ensure_full_index() to cache.h Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 05/27] add: ensure full index Derrick Stolee via GitGitGadget
2021-03-17 17:35   ` Elijah Newren
2021-03-17 20:35     ` Matheus Tavares Bernardino
2021-03-17 20:55       ` Derrick Stolee
2021-03-16 21:16 ` [PATCH 06/27] checkout-index: " Derrick Stolee via GitGitGadget
2021-03-17 17:50   ` Elijah Newren
2021-03-17 20:05     ` Derrick Stolee
2021-03-17 21:10       ` Elijah Newren
2021-03-17 21:33         ` Derrick Stolee
2021-03-17 22:36           ` Elijah Newren
2021-03-18  1:17             ` Derrick Stolee
2021-03-16 21:16 ` [PATCH 07/27] checkout: " Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 08/27] commit: " Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 09/27] difftool: " Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 10/27] fsck: " Derrick Stolee via GitGitGadget
2021-03-16 21:16 ` [PATCH 11/27] grep: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 12/27] ls-files: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 13/27] merge-index: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 14/27] rm: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 15/27] sparse-checkout: " Derrick Stolee via GitGitGadget
2021-03-18  5:22   ` Elijah Newren
2021-03-23 13:13     ` Derrick Stolee
2021-03-16 21:17 ` [PATCH 16/27] update-index: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 17/27] diff-lib: " Derrick Stolee via GitGitGadget
2021-03-18  5:24   ` Elijah Newren
2021-03-23 13:15     ` Derrick Stolee
2021-03-16 21:17 ` [PATCH 18/27] dir: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 19/27] entry: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 20/27] merge-ort: " Derrick Stolee via GitGitGadget
2021-03-18  5:31   ` Elijah Newren
2021-03-23 13:26     ` Derrick Stolee
2021-03-16 21:17 ` [PATCH 21/27] merge-recursive: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 22/27] pathspec: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 23/27] read-cache: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 24/27] resolve-undo: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 25/27] revision: " Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 26/27] sparse-index: expand_to_path() Derrick Stolee via GitGitGadget
2021-03-16 21:17 ` [PATCH 27/27] name-hash: use expand_to_path() Derrick Stolee via GitGitGadget
2021-03-17 18:03 ` [PATCH 00/27] Sparse Index: API protections Elijah Newren
2021-03-18  6:32   ` Elijah Newren
2021-04-01  1:49 ` [PATCH v2 00/25] " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 01/25] sparse-index: API protection strategy Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 02/25] *: remove 'const' qualifier for struct index_state Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 03/25] read-cache: expand on query into sparse-directory entry Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 04/25] cache: move ensure_full_index() to cache.h Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 05/25] add: ensure full index Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 06/25] checkout-index: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 07/25] checkout: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 08/25] commit: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 09/25] difftool: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 10/25] fsck: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 11/25] grep: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 12/25] ls-files: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 13/25] merge-index: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 14/25] rm: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 15/25] stash: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 16/25] update-index: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 17/25] dir: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 18/25] entry: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 19/25] merge-recursive: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 20/25] pathspec: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 21/25] read-cache: " Derrick Stolee via GitGitGadget
2021-04-01  1:49   ` [PATCH v2 22/25] resolve-undo: " Derrick Stolee via GitGitGadget
2021-04-01  1:50   ` [PATCH v2 23/25] revision: " Derrick Stolee via GitGitGadget
2021-04-01  1:50   ` [PATCH v2 24/25] sparse-index: expand_to_path() Derrick Stolee via GitGitGadget
2021-04-05 19:32     ` Elijah Newren
2021-04-06 11:46       ` Derrick Stolee
2021-04-01  1:50   ` [PATCH v2 25/25] name-hash: use expand_to_path() Derrick Stolee via GitGitGadget
2021-04-05 19:53     ` Elijah Newren
2021-04-01  7:07   ` [PATCH v2 00/25] Sparse Index: API protections Junio C Hamano
2021-04-01 13:32     ` Derrick Stolee
2021-04-05 19:55   ` Elijah Newren [this message]
2021-04-12 21:07   ` [PATCH v3 00/26] " Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 01/26] sparse-index: API protection strategy Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 02/26] *: remove 'const' qualifier for struct index_state Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 03/26] read-cache: expand on query into sparse-directory entry Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 04/26] cache: move ensure_full_index() to cache.h Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 05/26] add: ensure full index Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 06/26] checkout-index: " Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 07/26] checkout: " Derrick Stolee via GitGitGadget
2021-04-12 21:07     ` [PATCH v3 08/26] commit: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 09/26] difftool: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 10/26] fsck: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 11/26] grep: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 12/26] ls-files: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 13/26] merge-index: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 14/26] rm: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 15/26] stash: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 16/26] update-index: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 17/26] dir: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 18/26] entry: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 19/26] merge-recursive: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 20/26] pathspec: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 21/26] read-cache: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 22/26] resolve-undo: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 23/26] revision: " Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 24/26] name-hash: don't add directories to name_hash Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 25/26] sparse-index: expand_to_path() Derrick Stolee via GitGitGadget
2021-04-12 21:08     ` [PATCH v3 26/26] name-hash: use expand_to_path() Derrick Stolee via GitGitGadget
2021-04-13 16:02     ` [PATCH v3 00/26] Sparse Index: API protections Elijah Newren
2021-04-14 20:44       ` Junio C Hamano
2021-04-15  2:42         ` Derrick Stolee

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CABPp-BGrycN2QDgueVG5+fokNkyd6wXowGw3R+-0U0jTFp9DUg@mail.gmail.com \
    --to=newren@gmail.com \
    --cc=derrickstolee@github.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.com \
    --cc=matheus.bernardino@usp.br \
    --cc=stolee@gmail.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).