diffcore-order: export generic ordering interface
diffcore_order() interface only accepts a queue of `struct
diff_filepair`.
In the next patches, we'll want to order `struct combine_diff_path`
by path, so let's first rework diffcore-order to also provide
generic low-level interface for ordering arbitrary objects, provided
they have path accessors.
The new interface is:
- `struct obj_order` for describing objects to ordering routine, and
- order_objects() for actually doing the ordering work.
Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
7146e66f08
commit
1df4320fa2
@@ -57,12 +57,6 @@ static void prepare_order(const char *orderfile)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pair_order {
|
|
||||||
struct diff_filepair *pair;
|
|
||||||
int orig_order;
|
|
||||||
int order;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int match_order(const char *path)
|
static int match_order(const char *path)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -84,35 +78,54 @@ static int match_order(const char *path)
|
|||||||
return order_cnt;
|
return order_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int compare_pair_order(const void *a_, const void *b_)
|
static int compare_objs_order(const void *a_, const void *b_)
|
||||||
{
|
{
|
||||||
struct pair_order const *a, *b;
|
struct obj_order const *a, *b;
|
||||||
a = (struct pair_order const *)a_;
|
a = (struct obj_order const *)a_;
|
||||||
b = (struct pair_order const *)b_;
|
b = (struct obj_order const *)b_;
|
||||||
if (a->order != b->order)
|
if (a->order != b->order)
|
||||||
return a->order - b->order;
|
return a->order - b->order;
|
||||||
return a->orig_order - b->orig_order;
|
return a->orig_order - b->orig_order;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void order_objects(const char *orderfile, obj_path_fn_t obj_path,
|
||||||
|
struct obj_order *objs, int nr)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!nr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
prepare_order(orderfile);
|
||||||
|
for (i = 0; i < nr; i++) {
|
||||||
|
objs[i].orig_order = i;
|
||||||
|
objs[i].order = match_order(obj_path(objs[i].obj));
|
||||||
|
}
|
||||||
|
qsort(objs, nr, sizeof(*objs), compare_objs_order);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *pair_pathtwo(void *obj)
|
||||||
|
{
|
||||||
|
struct diff_filepair *pair = (struct diff_filepair *)obj;
|
||||||
|
|
||||||
|
return pair->two->path;
|
||||||
|
}
|
||||||
|
|
||||||
void diffcore_order(const char *orderfile)
|
void diffcore_order(const char *orderfile)
|
||||||
{
|
{
|
||||||
struct diff_queue_struct *q = &diff_queued_diff;
|
struct diff_queue_struct *q = &diff_queued_diff;
|
||||||
struct pair_order *o;
|
struct obj_order *o;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!q->nr)
|
if (!q->nr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
o = xmalloc(sizeof(*o) * q->nr);
|
o = xmalloc(sizeof(*o) * q->nr);
|
||||||
prepare_order(orderfile);
|
|
||||||
for (i = 0; i < q->nr; i++) {
|
|
||||||
o[i].pair = q->queue[i];
|
|
||||||
o[i].orig_order = i;
|
|
||||||
o[i].order = match_order(o[i].pair->two->path);
|
|
||||||
}
|
|
||||||
qsort(o, q->nr, sizeof(*o), compare_pair_order);
|
|
||||||
for (i = 0; i < q->nr; i++)
|
for (i = 0; i < q->nr; i++)
|
||||||
q->queue[i] = o[i].pair;
|
o[i].obj = q->queue[i];
|
||||||
|
order_objects(orderfile, pair_pathtwo, o, q->nr);
|
||||||
|
for (i = 0; i < q->nr; i++)
|
||||||
|
q->queue[i] = o[i].obj;
|
||||||
free(o);
|
free(o);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
14
diffcore.h
14
diffcore.h
@@ -109,6 +109,20 @@ extern void diffcore_merge_broken(void);
|
|||||||
extern void diffcore_pickaxe(struct diff_options *);
|
extern void diffcore_pickaxe(struct diff_options *);
|
||||||
extern void diffcore_order(const char *orderfile);
|
extern void diffcore_order(const char *orderfile);
|
||||||
|
|
||||||
|
/* low-level interface to diffcore_order */
|
||||||
|
struct obj_order {
|
||||||
|
void *obj; /* setup by caller */
|
||||||
|
|
||||||
|
/* setup/used by order_objects() */
|
||||||
|
int orig_order;
|
||||||
|
int order;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef const char *(*obj_path_fn_t)(void *obj);
|
||||||
|
|
||||||
|
void order_objects(const char *orderfile, obj_path_fn_t obj_path,
|
||||||
|
struct obj_order *objs, int nr);
|
||||||
|
|
||||||
#define DIFF_DEBUG 0
|
#define DIFF_DEBUG 0
|
||||||
#if DIFF_DEBUG
|
#if DIFF_DEBUG
|
||||||
void diff_debug_filespec(struct diff_filespec *, int, const char *);
|
void diff_debug_filespec(struct diff_filespec *, int, const char *);
|
||||||
|
|||||||
Reference in New Issue
Block a user