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

Re: [PATCH v2 02/13] reftable: define the public API

From
Han-Wen Nienhuys <hanwen@google.com>
Date
Oct 10, 2020, 16:57 UTC
Message-ID
<CAFQ2z_PGyOyjDwPsbwUHZZayNUZYVZteHSWRGKdtLBw4_J26vA@mail.gmail.com>
In-Reply-To
<20201008014124.1410535-1-jonathantanmy@google.com>
Hi Jonathan,

thanks for a detailed look at the API. I'm replying to some queries here, but I won't have time for another 2 weeks to revisit the code.

On Thu, Oct 8, 2020 at 3:41 AM Jonathan Tan <jonathantanmy@google.com> wrote:
> A typical user would just want to do refname->hash, refname->log, or possibly
> hash->refname lookups, so a ref record would be meant for low-level
You are forgetting refname -> symref target and refname -> peeled tag.
Show 5 quoted lines
> users. I can't think of a typical use case, but even if such existed, I
> wouldn't expect this API - in particular, the refname is not written as
> such on disk (it is composed from a prefix and a suffix, if I remember
> correctly), so I would expect a function that one can call to write the
> refname, but not for it to appear in a data structure.

It works with records, because it is more practical for the low level code, but also because it obviates defining many functions for the different types of lookups and seeks.

Show 8 quoted lines
> > +/* returns whether 'ref' represents a deletion */
> > +int reftable_ref_record_is_deletion(const struct reftable_ref_record *ref);
>
> This looks unorthogonal - looking at the spec, the "value type" can
> represent a deletion, one object name (value of the ref), two object
> names (value of the ref + peeled target), or symbolic reference. If
> we're willing to allocate memory for a ref record, I think we can afford
> the extra 4 bytes (maybe 8) and use a tagged union instead.
I guess you want something like
  struct {
     enum TYPE  { REF_DEL, REF_1VAL, REF_2VAL, REF_SYM } record_type;
     char *ref_name;
     uint64_t update_index;
     union  {
          uint_8 *val1;
          struct { uint8_t *val1, *val2; } val2;
          char *sym;
     };
  };
I suspect it makes initialization more verbose, but yes, I could do that.
Show 5 quoted lines
> > +/* returns whether two reftable_ref_records are the same */
> > +int reftable_ref_record_equal(struct reftable_ref_record *a,
> > +                           struct reftable_ref_record *b, int hash_size);
>
> Not sure what this will be used for.
This is useful for testing.
Show 15 quoted lines
> > +/* Set the range of update indices for the records we will add.  When
> > +   writing a table into a stack, the min should be at least
> > +   reftable_stack_next_update_index(), or REFTABLE_API_ERROR is returned.
> > +
> > +   For transactional updates, typically min==max. When converting an existing
> > +   ref database into a single reftable, this would be a range of update-index
> > +   timestamps.
> > + */
> > +void reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,
> > +                             uint64_t max);
>
> This seems to be here because we want to write the file in a single
> pass, and the update index maximum and minimum appear in the header. If
> we were allowed to seek while writing, could the update index maximum
> and minimum be deduced instead?

No. The ref record update_index is delta encoded against the min update_index, so you have to know it upfront.

If I could redesign the format, I'd leave out the max update_index from the header (because it can be determined afterwards.), but it's too late now.

Show 20 quoted lines
>
> > +/* adds a reftable_ref_record. Must be called in ascending
> > +   order. The update_index must be within the limits set by
> > +   reftable_writer_set_limits(), or REFTABLE_API_ERROR is returned.
> > +
> > +   It is an error to write a ref record after a log record.
> > + */
> > +int reftable_writer_add_ref(struct reftable_writer *w,
> > +                         struct reftable_ref_record *ref);
> > +
> > +/* Convenience function to add multiple refs. Will sort the refs by
> > +   name before adding. */
> > +int reftable_writer_add_refs(struct reftable_writer *w,
> > +                          struct reftable_ref_record *refs, int n);
>
> Since refs is an array of objects and not an array of pointers, these
> two functions could be combined - the first is the same as calling the
> second with n=1.
>
> Also, ascending order of what?
Of record keys, ie. refname in case of ref records.
> The user will also need to know where to get the update index from - I
> presume that this will be the maximum update index of any record with
> the given refname + 1.
there is a reftable_stack_next_update_index() for that.
Show 15 quoted lines
> > +/* reads the next reftable_ref_record. Returns < 0 for error, 0 for OK and > 0:
> > +   end of iteration.
> > +*/
> > +int reftable_iterator_next_ref(struct reftable_iterator *it,
> > +                            struct reftable_ref_record *ref);
> > +
> > +/* reads the next reftable_log_record. Returns < 0 for error, 0 for OK and > 0:
> > +   end of iteration.
> > +*/
> > +int reftable_iterator_next_log(struct reftable_iterator *it,
> > +                            struct reftable_log_record *log);
>
> From my recollection, in Git, we typically use foreach functions with a
> callback that is invoked once for each result. I think that's preferable
> to this approach.

The iterator interface has the advantage that it captures reading both individual entries (read_raw_ref) and iteration. It's also a natural structure, because internally the iteration state has to be stored (iterating merged tables stores the iterators in a priority queue.)

Show 16 quoted lines
> [snip]
>
> > +/****************************************************************
> > + Merged tables
> > +
> > + A ref database kept in a sequence of table files. The merged_table presents a
> > + unified view to reading (seeking, iterating) a sequence of immutable tables.
> > + ****************************************************************/
> > +
> > +/* A merged table is implements seeking/iterating over a stack of tables. */
> > +struct reftable_merged_table;
> > +
> > +/* A generic reftable; see below. */
> > +struct reftable_table;
>
> Why would we need to see an individual reftable?

It could be useful diagnostics and troubleshooting. For example, if you are debugging or trying to troubleshoot/fsck a repo, it might be interesting to read a single file from .git/reftable/

Philosophically, since we have to expose the functionality to write a single table, it seems reasonable to read single tables for symmetry as well.

> Could we just represent
> a merged table as a virtual concatenation of blocks (as if all the
> blocks were in the same file)?
No. The format doesn't work like that.
Show 10 quoted lines
> > +/* reftable_new_merged_table creates a new merged table. It takes ownership of
> > +   the stack array.
> > +*/
> > +int reftable_new_merged_table(struct reftable_merged_table **dest,
> > +                           struct reftable_table *stack, int n,
> > +                           uint32_t hash_id);
>
> I presume this would be used for things like compacting a few reftables
> together? In which case, I would expect this function to just take a
> list of filenames.

The merging of tables has nothing to do with the filesystem, and could be done with reftables represented as in memory structure. This is also how the unittests work.

Show 17 quoted lines
> > +/* returns an iterator positioned just before 'name' */
> > +int reftable_merged_table_seek_ref(struct reftable_merged_table *mt,
> > +                                struct reftable_iterator *it,
> > +                                const char *name);
> > +
> > +/* returns an iterator for log entry, at given update_index */
> > +int reftable_merged_table_seek_log_at(struct reftable_merged_table *mt,
> > +                                   struct reftable_iterator *it,
> > +                                   const char *name, uint64_t update_index);
> > +
> > +/* like reftable_merged_table_seek_log_at but look for the newest entry. */
> > +int reftable_merged_table_seek_log(struct reftable_merged_table *mt,
> > +                                struct reftable_iterator *it,
> > +                                const char *name);
>
> Why do iterators need to be precisely positioned if this merged table is
> immutable?

I don't understand the question. How would you read a single ref from a merged table without a seek function?

Show 8 quoted lines
> > +/* convenience function to read a single ref. Returns < 0 for error, 0
> > +   for success, and 1 if ref not found. */
> > +int reftable_table_read_ref(struct reftable_table *tab, const char *name,
> > +                         struct reftable_ref_record *ref);
>
> I presume this returns the most up-to-date record in the (possibly
> merged) table? So we can just read the hash off the record to know what
> this ref points to.
correct.
Show 9 quoted lines
> > +/****************************************************************
> > + Mutable ref database
> > +
> > + The stack presents an interface to a mutable sequence of reftables.
> > + ****************************************************************/
>
> So I would expect ref mutations to be done by opening the existing
> reftables as a merged table, open a reftable writer, write all the
> changes that need to be written, and update the tables.list file...

Roughly, yes, but there are other considerations: you have to check for concurrent updates (by the time you finish reading tables.list, a compaction may have deleted some of the tables referenced, so you have to retry). If there are any failures, the transaction fails and you have to clean up already written tables. If the write succeeds, but the stack becomes unbalanced, you have to do a compaction. If you have to reload data, you want to avoid closing and opening the same file.

If you are curious what the stack does, have a look at stack.c.

Also, this is for separation of logic. The merged table is composed of reftables that have no particular type of storage, but support the read interface. The stack is what ties the merged table to a posix-like file system, and provides mutations.

Show 26 quoted lines
> > +/* holds a transaction to add tables at the top of a stack. */
> > +struct reftable_addition;
> > +
> > +/*
> > +  returns a new transaction to add reftables to the given stack. As a side
> > +  effect, the ref database is locked.
> > +*/
> > +int reftable_stack_new_addition(struct reftable_addition **dest,
> > +                             struct reftable_stack *st);
> > +
> > +/* Adds a reftable to transaction. */
> > +int reftable_addition_add(struct reftable_addition *add,
> > +                       int (*write_table)(struct reftable_writer *wr,
> > +                                          void *arg),
> > +                       void *arg);
> > +
> > +/* Commits the transaction, releasing the lock. */
> > +int reftable_addition_commit(struct reftable_addition *add);
> > +
> > +/* Release all non-committed data from the transaction, and deallocate the
> > +   transaction. Releases the lock if held. */
> > +void reftable_addition_destroy(struct reftable_addition *add);
>
> We do need a transaction to write the new tables.list and then
> atomically update the repository with it, but I don't think we need one
> just to add a reftable to the stack.
see above.
Show 8 quoted lines
> > +/* compacts all reftables into a giant table. Expire reflog entries if config is
> > + * non-NULL */
> > +int reftable_stack_compact_all(struct reftable_stack *st,
> > +                            struct reftable_log_expiry_config *config);
>
> Ah, the stack is used for compacting as well. I don't think compacting
> belongs here though - it should be its own thing that can make use of
> the merged-table reader and the single-table writer.
Why should it be like that, and where should compaction live?
> Some things that I think are missing:
>
>  - foreach all latest record of all refs (in any order) (I see some
Ref records are keyed by name, so the iteration produces each ref only once.
>    functions above that can set the position of the iterator, but I
>    don't think that the iterator skips over irrelevant refs?
What makes you think that?
> So we can't
>    use it for iterating over all refs if we don't care about the history
>    of refs)

I think you might be confusing the refs with reflogs here. The history of a ref is kept in the reflog. This is why functions that want to seek to a log record need an update_index timestamp.

>  - foreach all log entries of one ref (or all refs)

Before reviewing the API header here, I think it might be useful to also look at the commit in the other series that uses the API to implement the git ref backend. It shows how the foreach functions can be implemented using the iterator interface.

> In summary, I would have expected a mechanism to read multiple (possibly
> one) reftable and perform queries on it, a mechanism to write a single
> reftable, and some functions to update tables.list.

I understand your expectation, but I think that expectation glosses over important details of how it actually works.

-- 
Han-Wen Nienhuys - Google Munich
I work 80%. Don't expect answers from me on Fridays.
--
Google Germany GmbH, Erika-Mann-Strasse 33, 80636 Munich
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Paul Manicle, Halimah DeLaine Prado
Previous: Jonathan TanNext: Han-Wen Nienhuys via GitGitGadget
Message 32 of 251 in “reftable library”
  1. 00/13 reftable libraryHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  2. 01/13 reftable: add LICENSEHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  3. 10/13 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  4. 12/13 reftable: rest of libraryHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  5. 09/13 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  6. 13/13 reftable: "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  7. 11/13 reftable: file level testsHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  8. 08/13 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  9. 07/13 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  10. 05/13 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  11. 06/13 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  12. Junio C HamanoSep 20, 2020
  13. Han-Wen NienhuysSep 21, 2020
  14. Jeff KingSep 24, 2020
  15. Jeff KingSep 24, 2020
  16. Junio C HamanoSep 24, 2020
  17. 04/13 reftable: add a barebones unittest frameworkHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  18. 03/13 vcxproj: adjust for the reftable changesJohannes Schindelin via GitGitGadget, Sep 16, 2020
  19. 02/13 reftable: define the public APIHan-Wen Nienhuys via GitGitGadget, Sep 16, 2020
  20. 00/13 reftable libraryHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  21. 01/13 reftable: add LICENSEHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  22. Jonathan NiederOct 2, 2020
  23. 02/13 reftable: define the public APIHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  24. Jonathan NiederOct 2, 2020
  25. Emily ShafferOct 9, 2020
  26. Han-Wen NienhuysOct 10, 2020
  27. Han-Wen NienhuysNov 30, 2020
  28. Han-Wen NienhuysOct 10, 2020
  29. Jonathan NiederOct 12, 2020
  30. Han-Wen NienhuysNov 30, 2020
  31. Jonathan TanOct 8, 2020
  32. Han-Wen NienhuysOct 10, 2020
  33. 04/13 reftable: add a barebones unittest frameworkHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  34. Jonathan NiederOct 2, 2020
  35. Jonathan TanOct 8, 2020
  36. Josh SteadmonOct 8, 2020
  37. 03/13 vcxproj: adjust for the reftable changesJohannes Schindelin via GitGitGadget, Oct 1, 2020
  38. Jonathan NiederOct 2, 2020
  39. Johannes SchindelinOct 2, 2020
  40. 08/13 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  41. 07/13 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  42. 05/13 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  43. Jonathan NiederOct 2, 2020
  44. Han-Wen NienhuysOct 10, 2020
  45. Jonathan NiederOct 12, 2020
  46. Patrick SteinhardtOct 12, 2020
  47. Jonathan NiederOct 12, 2020
  48. Johannes SchindelinOct 13, 2020
  49. Junio C HamanoOct 13, 2020
  50. Johannes SchindelinOct 15, 2020
  51. Junio C HamanoOct 15, 2020
  52. Johannes SchindelinOct 15, 2020
  53. Patrick SteinhardtOct 16, 2020
  54. Johannes SchindelinOct 2, 2020
  55. Junio C HamanoOct 2, 2020
  56. Johannes SchindelinOct 3, 2020
  57. Jonathan TanOct 8, 2020
  58. Han-Wen NienhuysOct 10, 2020
  59. Johannes SchindelinOct 11, 2020
  60. Jonathan NiederOct 12, 2020
  61. Johannes SchindelinOct 12, 2020
  62. Jonathan NiederOct 12, 2020
  63. Johannes SchindelinOct 12, 2020
  64. Junio C HamanoOct 12, 2020
  65. Johannes SchindelinOct 12, 2020
  66. Ævar Arnfjörð BjarmasonOct 23, 2020
  67. Junio C HamanoOct 23, 2020
  68. 11/13 reftable: file level testsHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  69. 10/13 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  70. 09/13 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  71. 06/13 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  72. Junio C HamanoOct 1, 2020
  73. Ramsay JonesOct 1, 2020
  74. 13/13 reftable: "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  75. 12/13 reftable: rest of libraryHan-Wen Nienhuys via GitGitGadget, Oct 1, 2020
  76. Johannes SchindelinOct 2, 2020
  77. Junio C HamanoOct 2, 2020
  78. Johannes SchindelinOct 4, 2020
  79. 00/16 reftable libraryHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  80. 01/16 move sleep_millisec to git-compat-util.hHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  81. 03/16 reftable: add LICENSEHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  82. Ævar Arnfjörð BjarmasonNov 27, 2020
  83. Han-Wen NienhuysNov 30, 2020
  84. Han-Wen NienhuysNov 30, 2020
  85. Felipe ContrerasNov 30, 2020
  86. Han-Wen NienhuysDec 1, 2020
  87. Felipe ContrerasDec 1, 2020
  88. Ævar Arnfjörð BjarmasonDec 1, 2020
  89. Han-Wen NienhuysDec 1, 2020
  90. Felipe ContrerasDec 1, 2020
  91. Felipe ContrerasDec 1, 2020
  92. 04/16 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  93. Felipe ContrerasNov 27, 2020
  94. Ævar Arnfjörð BjarmasonNov 27, 2020
  95. Han-Wen NienhuysNov 30, 2020
  96. 02/16 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  97. Ævar Arnfjörð BjarmasonNov 27, 2020
  98. 06/16 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  99. 05/16 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  100. Felipe ContrerasNov 27, 2020
  101. Ævar Arnfjörð BjarmasonNov 27, 2020
  102. 09/16 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  103. 08/16 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  104. 07/16 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  105. 10/16 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  106. 12/16 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  107. 11/16 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  108. 15/16 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Nov 26, 2020
  109. 13/16 reftable: rest of libraryHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  110. 16/16 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  111. 14/16 Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Nov 26, 2020
  112. Ævar Arnfjörð BjarmasonNov 27, 2020
  113. 00/15 reftable libraryHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  114. 03/15 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  115. 02/15 reftable: add LICENSEHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  116. 01/15 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  117. 14/15 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Dec 9, 2020
  118. 11/15 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  119. 13/15 Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  120. Ævar Arnfjörð BjarmasonJan 21, 2021
  121. Han-Wen NienhuysJan 21, 2021
  122. Han-Wen NienhuysJan 21, 2021
  123. Ævar Arnfjörð BjarmasonJan 26, 2021
  124. Han-Wen NienhuysApr 23, 2021
  125. Ævar Arnfjörð BjarmasonApr 26, 2021
  126. Han-Wen NienhuysApr 26, 2021
  127. Ævar Arnfjörð BjarmasonApr 28, 2021
  128. Han-Wen NienhuysApr 28, 2021
  129. refs: introduce API function to write invalid null refStefan Beller, Feb 22, 2021
  130. Eric SunshineFeb 22, 2021
  131. Eric SunshineFeb 22, 2021
  132. Han-Wen NienhuysFeb 22, 2021
  133. 12/15 reftable: rest of libraryHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  134. 05/15 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  135. 15/15 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  136. 04/15 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  137. 10/15 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  138. 08/15 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  139. 06/15 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  140. 07/15 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  141. 09/15 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Dec 9, 2020
  142. 00/15 reftable libraryHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  143. 03/15 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  144. 02/15 reftable: add LICENSEHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  145. 01/15 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  146. 05/15 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  147. 08/15 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  148. 04/15 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  149. 09/15 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  150. 06/15 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  151. 07/15 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  152. 11/15 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  153. 15/15 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  154. 14/15 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Mar 12, 2021
  155. 13/15 Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  156. Derrick StoleeMar 23, 2021
  157. Ævar Arnfjörð BjarmasonMar 23, 2021
  158. Junio C HamanoMar 23, 2021
  159. Junio C HamanoMar 23, 2021
  160. 10/15 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  161. 12/15 reftable: rest of libraryHan-Wen Nienhuys via GitGitGadget, Mar 12, 2021
  162. 00/20 reftable libraryHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  163. 01/20 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  164. 02/20 reftable: add LICENSEHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  165. Ævar Arnfjörð BjarmasonApr 13, 2021
  166. Han-Wen NienhuysApr 13, 2021
  167. Ævar Arnfjörð BjarmasonApr 13, 2021
  168. 03/20 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  169. 04/20 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  170. Ævar Arnfjörð BjarmasonApr 13, 2021
  171. Han-Wen NienhuysApr 13, 2021
  172. Ævar Arnfjörð BjarmasonApr 13, 2021
  173. Ævar Arnfjörð BjarmasonApr 13, 2021
  174. Han-Wen NienhuysApr 15, 2021
  175. 05/20 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  176. 06/20 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  177. 07/20 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  178. Junio C HamanoApr 12, 2021
  179. Ævar Arnfjörð BjarmasonApr 13, 2021
  180. Han-Wen NienhuysApr 15, 2021
  181. 08/20 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  182. 10/20 reftable: generic interface to tablesHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  183. 09/20 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  184. 11/20 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  185. 12/20 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  186. 13/20 reftable: add a heap-based priority queue for reftable recordsHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  187. 14/20 reftable: add merged table viewHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  188. 17/20 reftable: add dump utilityHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  189. 15/20 reftable: implement refname validationHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  190. 16/20 reftable: implement stack, a mutable database of reftable files.Han-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  191. 18/20 Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  192. Ævar Arnfjörð BjarmasonApr 13, 2021
  193. Han-Wen NienhuysApr 14, 2021
  194. Ævar Arnfjörð BjarmasonApr 16, 2021
  195. Junio C HamanoApr 16, 2021
  196. 19/20 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Apr 12, 2021
  197. 20/20 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Apr 12, 2021
  198. 00/28 reftable libraryHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  199. 01/28 refs: ref_iterator_peel returns boolean, rather than peel_statusHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  200. Junio C HamanoApr 20, 2021
  201. Han-Wen NienhuysApr 21, 2021
  202. Junio C HamanoApr 21, 2021
  203. 03/28 refs/debug: trace into reflog expiry tooHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  204. Junio C HamanoApr 20, 2021
  205. Han-Wen NienhuysApr 22, 2021
  206. 02/28 refs: document reflog_expire_fn's flag argumentHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  207. Junio C HamanoApr 20, 2021
  208. Han-Wen NienhuysApr 27, 2021
  209. 04/28 hash.h: provide constants for the hash IDsHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  210. Junio C HamanoApr 20, 2021
  211. brian m. carlsonApr 21, 2021
  212. Han-Wen NienhuysApr 21, 2021
  213. Han-Wen NienhuysJul 22, 2021
  214. 05/28 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  215. 06/28 reftable: add LICENSEHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  216. Ævar Arnfjörð BjarmasonApr 21, 2021
  217. Han-Wen NienhuysApr 21, 2021
  218. 08/28 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  219. 09/28 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  220. 11/28 Provide zlib's uncompress2 from compat/zlib-compat.cHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  221. 07/28 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  222. 10/28 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  223. Andrzej HuntMay 4, 2021
  224. Han-Wen NienhuysMay 18, 2021
  225. 12/28 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  226. 17/28 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  227. 16/28 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  228. 15/28 reftable: generic interface to tablesHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  229. 14/28 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  230. 13/28 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  231. 21/28 reftable: implement stack, a mutable database of reftable files.Han-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  232. 20/28 reftable: implement refname validationHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  233. 19/28 reftable: add merged table viewHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  234. 18/28 reftable: add a heap-based priority queue for reftable recordsHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  235. 23/28 Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  236. Junio C HamanoApr 20, 2021
  237. Han-Wen NienhuysApr 21, 2021
  238. Junio C HamanoApr 21, 2021
  239. Andrzej HuntMay 4, 2021
  240. Han-Wen NienhuysMay 18, 2021
  241. Han-Wen NienhuysMay 18, 2021
  242. 22/28 reftable: add dump utilityHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  243. 26/28 t1301: document what needs to be done for REFTABLEHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  244. 25/28 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  245. 24/28 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Apr 19, 2021
  246. 28/28 t1404: annotate test cases with REFFILESHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  247. 27/28 t1401,t2011: parameterize HEAD.lock for REFTABLEHan-Wen Nienhuys via GitGitGadget, Apr 19, 2021
  248. Ævar Arnfjörð BjarmasonApr 21, 2021
  249. Han-Wen NienhuysApr 21, 2021
  250. Ævar Arnfjörð BjarmasonApr 21, 2021
  251. Han-Wen NienhuysApr 26, 2021

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.