Re: [PATCH 2/6] commit: add generation number to struct commmit
- From
- Brandon Williams <bmwill@google.com>
- Date
- Apr 3, 2018, 18:05 UTC
- Message-ID
- <20180403180536.GB100220@google.com>
- In-Reply-To
- <20180403165143.80661-3-dstolee@microsoft.com>
On 04/03, Derrick Stolee wrote:
Show 7 quoted lines
> 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?
Show 67 quoted lines
> 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@microsoft.com>
> ---
> 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