2 * Copyright (C) 2005 Junio C Hamano
4 #include "git-compat-util.h"
12 static void prepare_order(const char *orderfile
)
15 struct strbuf sb
= STRBUF_INIT
;
23 sz
= strbuf_read_file(&sb
, orderfile
, 0);
25 die_errno(_("failed to read orderfile '%s'"), orderfile
);
26 map
= strbuf_detach(&sb
, NULL
);
27 endp
= (char *) map
+ sz
;
29 for (pass
= 0; pass
< 2; pass
++) {
34 for (ep
= cp
; ep
< endp
&& *ep
!= '\n'; ep
++)
36 /* cp to ep has one line */
37 if (*cp
== '\n' || *cp
== '#')
46 order
[cnt
] = xmemdupz(cp
, ep
- cp
);
56 ALLOC_ARRAY(order
, cnt
);
61 static int match_order(const char *path
)
64 static struct strbuf p
= STRBUF_INIT
;
66 for (i
= 0; i
< order_cnt
; i
++) {
68 strbuf_addstr(&p
, path
);
71 if (!wildmatch(order
[i
], p
.buf
, 0))
73 cp
= strrchr(p
.buf
, '/');
82 static int compare_objs_order(const void *a_
, const void *b_
)
84 struct obj_order
const *a
, *b
;
85 a
= (struct obj_order
const *)a_
;
86 b
= (struct obj_order
const *)b_
;
87 if (a
->order
!= b
->order
)
88 return a
->order
- b
->order
;
89 return a
->orig_order
- b
->orig_order
;
92 void order_objects(const char *orderfile
, obj_path_fn_t obj_path
,
93 struct obj_order
*objs
, int nr
)
100 prepare_order(orderfile
);
101 for (i
= 0; i
< nr
; i
++) {
102 objs
[i
].orig_order
= i
;
103 objs
[i
].order
= match_order(obj_path(objs
[i
].obj
));
105 QSORT(objs
, nr
, compare_objs_order
);
108 static const char *pair_pathtwo(void *obj
)
110 struct diff_filepair
*pair
= (struct diff_filepair
*)obj
;
112 return pair
->two
->path
;
115 void diffcore_order(const char *orderfile
)
117 struct diff_queue_struct
*q
= &diff_queued_diff
;
124 ALLOC_ARRAY(o
, q
->nr
);
125 for (i
= 0; i
< q
->nr
; i
++)
126 o
[i
].obj
= q
->queue
[i
];
127 order_objects(orderfile
, pair_pathtwo
, o
, q
->nr
);
128 for (i
= 0; i
< q
->nr
; i
++)
129 q
->queue
[i
] = o
[i
].obj
;