This patch series implements a new iteration paradigm for iterating over references using iterators. This approach was proposed earlier as an RFC [1]. The justification for this change is laid out in the RFC [1] and in the commit message for patch 09/13 [2]. Please refer to those, as I won't repeat them here. There are several obvious followup steps that are not included in this patch series (because they don't help with the initial transition to pluggable reference backends). I've written prototypes of several of these: * The iterator interface could be made public and callers could start using it directly. * A filter_ref_iterator could let references be filtered based on a callback function (this would be useful, for example, for for_each_glob_ref()). * A single_ref_iterator could "iterate" over a single reference (e.g., HEAD). * A series_ref_iterator could iterate over multiple iterators, for callers that want to operate on, say, HEAD plus all branches. * The ref_cache could be fed from an iterator, to better decouple caching from reading packed and loose references, and to make it easy to use caching with other reference storage backends. * Per-worktree refs could be overlaid on top of shared references using merge_ref_iterator rather than mixing them up in the same ref_cache. * The dir_iterator could be used in more places; for example, when reading loose references from disk. Table of contents of changes: * The first eight patches are cleanups. * Patch 05/13 fixes a code path that unlinks symrefs directly instead of using the refs API. * Patch 09/13 is the most important part of this series. It introduces not only reference iterators, but also (1) a pattern that other iterator interfaces can follow (along with some useful constants in iterator.h), and (2) a pattern for building OO code with inheritance. * Patch 10/13 actually uses the new reference iteration mechanism. * Patch 11/13 avoids aborting reflog iterations if an unexpected file is found under `$GIT_DIR/logs`. This fixes a bug that could cause objects needed by reflogs to be pruned, breaking the reflogs. * Patch 12/13 adds an iterator interface for iterating over directories (using the same model as patch 09/13). * Patch 13/13 implements for_each_reflog() on top of an iterator interface (essentially the analogue of patch 10/13, but for reflogs). Note that it is not necessary to rebuild for_each_reflog_ent() on top of iterators at this time, because that function deals with only a single reference at a time. Therefore, composability is not important here (for example, it won't have to deal with multiple refs backends at the same time). This patch series applies on top of mh/split-under-lock. It is also available from my GitHub repository [3] as branch "ref-iterators". I haven't yet completely rebased the ref-store changes (virtualization of the refs API) on top of all of these changes, but I will work on that next. Michael [1] http://thread.gmane.org/gmane.comp.version-control.git/290409 [2] http://mid.gmane.org/89634d216544d1102dafd5d18247bff2581d48a8.1464537050.git.mhagger@xxxxxxxxxxxx [3] https://github.com/mhagger/git Michael Haggerty (13): refs: remove unnecessary "extern" keywords do_for_each_ref(): move docstring to the header file refs: use name "prefix" consistently delete_refs(): add a flags argument remote rm: handle symbolic refs correctly get_ref_cache(): only create an instance if there is a submodule entry_resolves_to_object(): rename function from ref_resolves_to_object() ref_resolves_to_object(): new function refs: introduce an iterator interface do_for_each_ref(): reimplement using reference iteration for_each_reflog(): don't abort for bad references dir_iterator: new API for iterating over a directory tree for_each_reflog(): reimplement using iterators Makefile | 2 + builtin/fetch.c | 2 +- builtin/remote.c | 8 +- dir-iterator.c | 180 +++++++++++++++ dir-iterator.h | 86 +++++++ iterator.h | 81 +++++++ refs.c | 20 ++ refs.h | 139 +++++++----- refs/files-backend.c | 630 +++++++++++++++++++++++++++++++-------------------- refs/iterator.c | 376 ++++++++++++++++++++++++++++++ refs/refs-internal.h | 225 +++++++++++++++++- 11 files changed, 1427 insertions(+), 322 deletions(-) create mode 100644 dir-iterator.c create mode 100644 dir-iterator.h create mode 100644 iterator.h create mode 100644 refs/iterator.c -- 2.8.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html