On 01/02/2019 03:09, [email protected] wrote:
> From: Stefan Xenos <[email protected]>
>
> A change table stores a list of changes, and supports efficient lookup
> from a commit hash to the list of changes that reference that commit
> directly.
>
> It can be used to look up content commits or metacommits at the head
> of a change, but does not support lookup of commits referenced as part
> of the commit history.
>
> Signed-off-by: Stefan Xenos <[email protected]>
> ---
> Makefile | 1 +
> change-table.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++
> change-table.h | 127 +++++++++++++++++++++++++++++++++++
> 3 files changed, 304 insertions(+)
> create mode 100644 change-table.c
> create mode 100644 change-table.h
>
[snip]
> diff --git a/change-table.h b/change-table.h
> new file mode 100644
> index 0000000000..023bca37d1
> --- /dev/null
> +++ b/change-table.h
> @@ -0,0 +1,127 @@
> +#ifndef CHANGE_TABLE_H
> +#define CHANGE_TABLE_H
> +
> +#include "oidmap.h"
> +
> +struct commit;
> +struct ref_filter;
> +
> +/*
> + * This struct holds a list of change refs. The first element is stored
> inline,
> + * to optimize for small lists.
> + */
> +struct change_list {
> + /* Ref name for the first change in the list, or null if none.
> + *
> + * This field is private. Use for_each_change_in to read.
> + */
> + const char* first_refname;
> + /* List of additional change refs. Note that this is empty if the list
> + * contains 0 or 1 elements.
> + *
> + * This field is private. Use for_each_change_in to read.
> + */
> + struct string_list additional_refnames;
> +};
> +
> +/*
> + * Holds information about the head of a single change.
> + */
> +struct change_head {
> + /*
> + * The location pointed to by the head of the change. May be a commit
> or a
> + * metacommit.
> + */
> + struct object_id head;
> + /*
> + * The content commit for the latest commit in the change. Always
> points to a
> + * real commit, never a metacommit.
> + */
> + struct object_id content;
> + /*
> + * Abandoned: indicates that the content commit should be removed from
> the
> + * history.
> + *
> + * Hidden: indicates that the change is an inactive change from the
> + * hiddenmetas namespace. Such changes will be hidden from the user by
> + * default.
> + *
> + * Deleted: indicates that the change has been removed from the
> repository.
> + * That is the ref was deleted since the time this struct was created.
> Such
> + * entries should be ignored.
> + */
> + int abandoned:1,
> + hidden:1,
> + remote:1,
> + deleted:1;
This causes sparse to issue errors about 'dubious one-bit signed
bitfield' for each of these fields (and for each file which #includes
this header file).
The field type should be 'unsigned int', thus:
-- >8 --
diff --git a/change-table.h b/change-table.h
index 85bb19c3bf..1c385e076e 100644
--- a/change-table.h
+++ b/change-table.h
@@ -50,10 +50,10 @@ struct change_head {
* That is the ref was deleted since the time this struct was created.
Such
* entries should be ignored.
*/
- int abandoned:1,
- hidden:1,
- remote:1,
- deleted:1;
+ unsigned int abandoned:1,
+ hidden:1,
+ remote:1,
+ deleted:1;
};
/*
-- >8 --
[Note: this diff was against the v3 series].
ATB,
Ramsay Jones