send-email: recognize absolute path on Windows
[gitweb.git] / diffcore-order.c
index a03862c1ce73995065bf838b408e8a6d9396025b..fe7f1f4647a16a5882cc4c1e63738c7faa4bc677 100644 (file)
@@ -4,33 +4,27 @@
 #include "cache.h"
 #include "diff.h"
 #include "diffcore.h"
-#include <fnmatch.h>
 
 static char **order;
 static int order_cnt;
 
 static void prepare_order(const char *orderfile)
 {
-       int fd, cnt, pass;
+       int cnt, pass;
+       struct strbuf sb = STRBUF_INIT;
        void *map;
        char *cp, *endp;
-       struct stat st;
+       ssize_t sz;
 
        if (order)
                return;
 
-       fd = open(orderfile, O_RDONLY);
-       if (fd < 0)
-               return;
-       if (fstat(fd, &st)) {
-               close(fd);
-               return;
-       }
-       map = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
-       close(fd);
-       if (-1 == (int)(long)map)
-               return;
-       endp = map + st.st_size;
+       sz = strbuf_read_file(&sb, orderfile, 0);
+       if (sz < 0)
+               die_errno(_("failed to read orderfile '%s'"), orderfile);
+       map = strbuf_detach(&sb, NULL);
+       endp = (char *) map + sz;
+
        for (pass = 0; pass < 2; pass++) {
                cnt = 0;
                cp = map;
@@ -47,11 +41,8 @@ static void prepare_order(const char *orderfile)
                                if (*ep == '\n') {
                                        *ep = 0;
                                        order[cnt] = cp;
-                               }
-                               else {
-                                       order[cnt] = xmalloc(ep-cp+1);
-                                       memcpy(order[cnt], cp, ep-cp);
-                                       order[cnt][ep-cp] = 0;
+                               } else {
+                                       order[cnt] = xmemdupz(cp, ep - cp);
                                }
                                cnt++;
                        }
@@ -75,15 +66,16 @@ struct pair_order {
 static int match_order(const char *path)
 {
        int i;
-       char p[PATH_MAX];
+       static struct strbuf p = STRBUF_INIT;
 
        for (i = 0; i < order_cnt; i++) {
-               strcpy(p, path);
-               while (p[0]) {
+               strbuf_reset(&p);
+               strbuf_addstr(&p, path);
+               while (p.buf[0]) {
                        char *cp;
-                       if (!fnmatch(order[i], p, 0))
+                       if (!fnmatch(order[i], p.buf, 0))
                                return i;
-                       cp = strrchr(p, '/');
+                       cp = strrchr(p.buf, '/');
                        if (!cp)
                                break;
                        *cp = 0;
@@ -105,9 +97,13 @@ static int compare_pair_order(const void *a_, const void *b_)
 void diffcore_order(const char *orderfile)
 {
        struct diff_queue_struct *q = &diff_queued_diff;
-       struct pair_order *o = xmalloc(sizeof(*o) * q->nr);
+       struct pair_order *o;
        int i;
 
+       if (!q->nr)
+               return;
+
+       o = xmalloc(sizeof(*o) * q->nr);
        prepare_order(orderfile);
        for (i = 0; i < q->nr; i++) {
                o[i].pair = q->queue[i];