Merge branch 'jk/name-decoration-alloc'
The API to allocate the structure to keep track of commit decoration was cumbersome to use, inviting lazy code to overallocate memory. * jk/name-decoration-alloc: log-tree: use FLEX_ARRAY in name_decoration log-tree: make name_decoration hash static log-tree: make add_name_decoration a public function
This commit is contained in:
commit
1ebe6a825a
7
bisect.c
7
bisect.c
@ -215,11 +215,12 @@ static struct commit_list *best_bisection_sorted(struct commit_list *list, int n
|
|||||||
}
|
}
|
||||||
qsort(array, cnt, sizeof(*array), compare_commit_dist);
|
qsort(array, cnt, sizeof(*array), compare_commit_dist);
|
||||||
for (p = list, i = 0; i < cnt; i++) {
|
for (p = list, i = 0; i < cnt; i++) {
|
||||||
struct name_decoration *r = xmalloc(sizeof(*r) + 100);
|
char buf[100]; /* enough for dist=%d */
|
||||||
struct object *obj = &(array[i].commit->object);
|
struct object *obj = &(array[i].commit->object);
|
||||||
|
|
||||||
sprintf(r->name, "dist=%d", array[i].distance);
|
snprintf(buf, sizeof(buf), "dist=%d", array[i].distance);
|
||||||
r->next = add_decoration(&name_decoration, obj, r);
|
add_name_decoration(DECORATION_NONE, buf, obj);
|
||||||
|
|
||||||
p->item = array[i].commit;
|
p->item = array[i].commit;
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
16
commit.h
16
commit.h
@ -26,13 +26,25 @@ extern int save_commit_buffer;
|
|||||||
extern const char *commit_type;
|
extern const char *commit_type;
|
||||||
|
|
||||||
/* While we can decorate any object with a name, it's only used for commits.. */
|
/* While we can decorate any object with a name, it's only used for commits.. */
|
||||||
extern struct decoration name_decoration;
|
|
||||||
struct name_decoration {
|
struct name_decoration {
|
||||||
struct name_decoration *next;
|
struct name_decoration *next;
|
||||||
int type;
|
int type;
|
||||||
char name[1];
|
char name[FLEX_ARRAY];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum decoration_type {
|
||||||
|
DECORATION_NONE = 0,
|
||||||
|
DECORATION_REF_LOCAL,
|
||||||
|
DECORATION_REF_REMOTE,
|
||||||
|
DECORATION_REF_TAG,
|
||||||
|
DECORATION_REF_STASH,
|
||||||
|
DECORATION_REF_HEAD,
|
||||||
|
DECORATION_GRAFTED,
|
||||||
|
};
|
||||||
|
|
||||||
|
void add_name_decoration(enum decoration_type type, const char *name, struct object *obj);
|
||||||
|
const struct name_decoration *get_name_decoration(const struct object *obj);
|
||||||
|
|
||||||
struct commit *lookup_commit(const unsigned char *sha1);
|
struct commit *lookup_commit(const unsigned char *sha1);
|
||||||
struct commit *lookup_commit_reference(const unsigned char *sha1);
|
struct commit *lookup_commit_reference(const unsigned char *sha1);
|
||||||
struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
|
struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
|
||||||
|
25
log-tree.c
25
log-tree.c
@ -12,17 +12,7 @@
|
|||||||
#include "sequencer.h"
|
#include "sequencer.h"
|
||||||
#include "line-log.h"
|
#include "line-log.h"
|
||||||
|
|
||||||
struct decoration name_decoration = { "object names" };
|
static struct decoration name_decoration = { "object names" };
|
||||||
|
|
||||||
enum decoration_type {
|
|
||||||
DECORATION_NONE = 0,
|
|
||||||
DECORATION_REF_LOCAL,
|
|
||||||
DECORATION_REF_REMOTE,
|
|
||||||
DECORATION_REF_TAG,
|
|
||||||
DECORATION_REF_STASH,
|
|
||||||
DECORATION_REF_HEAD,
|
|
||||||
DECORATION_GRAFTED,
|
|
||||||
};
|
|
||||||
|
|
||||||
static char decoration_colors[][COLOR_MAXLEN] = {
|
static char decoration_colors[][COLOR_MAXLEN] = {
|
||||||
GIT_COLOR_RESET,
|
GIT_COLOR_RESET,
|
||||||
@ -84,15 +74,20 @@ int parse_decorate_color_config(const char *var, const int ofs, const char *valu
|
|||||||
#define decorate_get_color_opt(o, ix) \
|
#define decorate_get_color_opt(o, ix) \
|
||||||
decorate_get_color((o)->use_color, ix)
|
decorate_get_color((o)->use_color, ix)
|
||||||
|
|
||||||
static void add_name_decoration(enum decoration_type type, const char *name, struct object *obj)
|
void add_name_decoration(enum decoration_type type, const char *name, struct object *obj)
|
||||||
{
|
{
|
||||||
int nlen = strlen(name);
|
int nlen = strlen(name);
|
||||||
struct name_decoration *res = xmalloc(sizeof(struct name_decoration) + nlen);
|
struct name_decoration *res = xmalloc(sizeof(*res) + nlen + 1);
|
||||||
memcpy(res->name, name, nlen + 1);
|
memcpy(res->name, name, nlen + 1);
|
||||||
res->type = type;
|
res->type = type;
|
||||||
res->next = add_decoration(&name_decoration, obj, res);
|
res->next = add_decoration(&name_decoration, obj, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct name_decoration *get_name_decoration(const struct object *obj)
|
||||||
|
{
|
||||||
|
return lookup_decoration(&name_decoration, obj);
|
||||||
|
}
|
||||||
|
|
||||||
static int add_ref_decoration(const char *refname, const unsigned char *sha1, int flags, void *cb_data)
|
static int add_ref_decoration(const char *refname, const unsigned char *sha1, int flags, void *cb_data)
|
||||||
{
|
{
|
||||||
struct object *obj;
|
struct object *obj;
|
||||||
@ -187,13 +182,13 @@ void format_decorations(struct strbuf *sb,
|
|||||||
int use_color)
|
int use_color)
|
||||||
{
|
{
|
||||||
const char *prefix;
|
const char *prefix;
|
||||||
struct name_decoration *decoration;
|
const struct name_decoration *decoration;
|
||||||
const char *color_commit =
|
const char *color_commit =
|
||||||
diff_get_color(use_color, DIFF_COMMIT);
|
diff_get_color(use_color, DIFF_COMMIT);
|
||||||
const char *color_reset =
|
const char *color_reset =
|
||||||
decorate_get_color(use_color, DECORATION_NONE);
|
decorate_get_color(use_color, DECORATION_NONE);
|
||||||
|
|
||||||
decoration = lookup_decoration(&name_decoration, &commit->object);
|
decoration = get_name_decoration(&commit->object);
|
||||||
if (!decoration)
|
if (!decoration)
|
||||||
return;
|
return;
|
||||||
prefix = " (";
|
prefix = " (";
|
||||||
|
@ -473,7 +473,7 @@ static int rev_compare_tree(struct rev_info *revs,
|
|||||||
* If we are simplifying by decoration, then the commit
|
* If we are simplifying by decoration, then the commit
|
||||||
* is worth showing if it has a tag pointing at it.
|
* is worth showing if it has a tag pointing at it.
|
||||||
*/
|
*/
|
||||||
if (lookup_decoration(&name_decoration, &commit->object))
|
if (get_name_decoration(&commit->object))
|
||||||
return REV_TREE_DIFFERENT;
|
return REV_TREE_DIFFERENT;
|
||||||
/*
|
/*
|
||||||
* A commit that is not pointed by a tag is uninteresting
|
* A commit that is not pointed by a tag is uninteresting
|
||||||
|
Loading…
Reference in New Issue
Block a user