Fix push with refspecs containing wildcards
[gitweb.git] / xdiff-interface.c
index f7d6f988298e3906a1a525fed484dc093404e4f9..e407cf11b1d8ba28be64eda7bcb505d9edb4d253 100644 (file)
@@ -1,10 +1,10 @@
 #include "cache.h"
 #include "xdiff-interface.h"
 
-static int parse_num(char **cp_p, unsigned int *num_p)
+static int parse_num(char **cp_p, int *num_p)
 {
        char *cp = *cp_p;
-       unsigned int num = 0;
+       int num = 0;
        int read_some;
 
        while ('0' <= *cp && *cp <= '9')
@@ -17,8 +17,8 @@ static int parse_num(char **cp_p, unsigned int *num_p)
 }
 
 int parse_hunk_header(char *line, int len,
-                     unsigned int *ob, unsigned int *on,
-                     unsigned int *nb, unsigned int *nn)
+                     int *ob, int *on,
+                     int *nb, int *nn)
 {
        char *cp;
        cp = line + 4;
@@ -69,9 +69,9 @@ int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
        for (i = 0; i < nbuf; i++) {
                if (mb[i].ptr[mb[i].size-1] != '\n') {
                        /* Incomplete line */
-                       priv->remainder = realloc(priv->remainder,
-                                                 priv->remainder_size +
-                                                 mb[i].size);
+                       priv->remainder = xrealloc(priv->remainder,
+                                                  priv->remainder_size +
+                                                  mb[i].size);
                        memcpy(priv->remainder + priv->remainder_size,
                               mb[i].ptr, mb[i].size);
                        priv->remainder_size += mb[i].size;
@@ -83,9 +83,9 @@ int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
                        consume_one(priv, mb[i].ptr, mb[i].size);
                        continue;
                }
-               priv->remainder = realloc(priv->remainder,
-                                         priv->remainder_size +
-                                         mb[i].size);
+               priv->remainder = xrealloc(priv->remainder,
+                                          priv->remainder_size +
+                                          mb[i].size);
                memcpy(priv->remainder + priv->remainder_size,
                       mb[i].ptr, mb[i].size);
                consume_one(priv, priv->remainder,
@@ -102,3 +102,30 @@ int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
        }
        return 0;
 }
+
+int read_mmfile(mmfile_t *ptr, const char *filename)
+{
+       struct stat st;
+       FILE *f;
+       size_t sz;
+
+       if (stat(filename, &st))
+               return error("Could not stat %s", filename);
+       if ((f = fopen(filename, "rb")) == NULL)
+               return error("Could not open %s", filename);
+       sz = xsize_t(st.st_size);
+       ptr->ptr = xmalloc(sz);
+       if (fread(ptr->ptr, sz, 1, f) != 1)
+               return error("Could not read %s", filename);
+       fclose(f);
+       ptr->size = sz;
+       return 0;
+}
+
+#define FIRST_FEW_BYTES 8000
+int buffer_is_binary(const char *ptr, unsigned long size)
+{
+       if (FIRST_FEW_BYTES < size)
+               size = FIRST_FEW_BYTES;
+       return !!memchr(ptr, 0, size);
+}