On 04/03, Derrick Stolee wrote: > The generation number of a commit is defined recursively as follows: > > * If a commit A has no parents, then the generation number of A is one. > * If a commit A has parents, then the generation number of A is one > more than the maximum generation number among the parents of A. > > Add a uint32_t generation field to struct commit so we can pass this Is there any reason to believe this would be too small of a value in the future? Or is a 32 bit unsigned good enough? > information to revision walks. We use two special values to signal > the generation number is invalid: > > GENERATION_NUMBER_UNDEF 0xFFFFFFFF > GENERATION_NUMBER_NONE 0 > > The first (_UNDEF) means the generation number has not been loaded or > computed. The second (_NONE) means the generation number was loaded > from a commit graph file that was stored before generation numbers > were computed. > > Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > --- > alloc.c | 1 + > commit-graph.c | 2 ++ > commit.h | 3 +++ > 3 files changed, 6 insertions(+) > > diff --git a/alloc.c b/alloc.c > index cf4f8b61e1..1a62e85ac3 100644 > --- a/alloc.c > +++ b/alloc.c > @@ -94,6 +94,7 @@ void *alloc_commit_node(void) > c->object.type = OBJ_COMMIT; > c->index = alloc_commit_index(); > c->graph_pos = COMMIT_NOT_FROM_GRAPH; > + c->generation = GENERATION_NUMBER_UNDEF; > return c; > } > > diff --git a/commit-graph.c b/commit-graph.c > index 1fc63d541b..d24b947525 100644 > --- a/commit-graph.c > +++ b/commit-graph.c > @@ -264,6 +264,8 @@ static int fill_commit_in_graph(struct commit *item, struct commit_graph *g, uin > date_low = get_be32(commit_data + g->hash_len + 12); > item->date = (timestamp_t)((date_high << 32) | date_low); > > + item->generation = get_be32(commit_data + g->hash_len + 8) >> 2; > + > pptr = &item->parents; > > edge_value = get_be32(commit_data + g->hash_len); > diff --git a/commit.h b/commit.h > index e57ae4b583..3cadd386f3 100644 > --- a/commit.h > +++ b/commit.h > @@ -10,6 +10,8 @@ > #include "pretty.h" > > #define COMMIT_NOT_FROM_GRAPH 0xFFFFFFFF > +#define GENERATION_NUMBER_UNDEF 0xFFFFFFFF > +#define GENERATION_NUMBER_NONE 0 > > struct commit_list { > struct commit *item; > @@ -24,6 +26,7 @@ struct commit { > struct commit_list *parents; > struct tree *tree; > uint32_t graph_pos; > + uint32_t generation; > }; > > extern int save_commit_buffer; > -- > 2.17.0.rc0 > -- Brandon Williams