rebase -i: learn to rebase root commit
[gitweb.git] / fast-import.c
index ab6689a64d69bdb741f662df2038ae1daae99837..a6bce661963812691503116e8d61d9ef90f96526 100644 (file)
@@ -43,7 +43,7 @@ Format of STDIN stream:
 
   new_tag ::= 'tag' sp tag_str lf
     'from' sp (ref_str | hexsha1 | sha1exp_str | idnum) lf
-    'tagger' sp name '<' email '>' when lf
+    ('tagger' sp name '<' email '>' when lf)?
     tag_msg;
   tag_msg ::= data;
 
@@ -554,6 +554,10 @@ static void *pool_alloc(size_t len)
        struct mem_pool *p;
        void *r;
 
+       /* round up to a 'uintmax_t' alignment */
+       if (len & (sizeof(uintmax_t) - 1))
+               len += sizeof(uintmax_t) - (len & (sizeof(uintmax_t) - 1));
+
        for (p = mem_pool; p; p = p->next_pool)
                if ((p->end - p->next_free >= len))
                        break;
@@ -572,9 +576,6 @@ static void *pool_alloc(size_t len)
        }
 
        r = p->next_free;
-       /* round out to a 'uintmax_t' alignment */
-       if (len & (sizeof(uintmax_t) - 1))
-               len += sizeof(uintmax_t) - (len & (sizeof(uintmax_t) - 1));
        p->next_free += len;
        return r;
 }
@@ -845,7 +846,7 @@ static int oecmp (const void *a_, const void *b_)
 static char *create_index(void)
 {
        static char tmpfile[PATH_MAX];
-       SHA_CTX ctx;
+       git_SHA_CTX ctx;
        struct sha1file *f;
        struct object_entry **idx, **c, **last, *e;
        struct object_entry_pool *o;
@@ -882,17 +883,17 @@ static char *create_index(void)
        idx_fd = xmkstemp(tmpfile);
        f = sha1fd(idx_fd, tmpfile);
        sha1write(f, array, 256 * sizeof(int));
-       SHA1_Init(&ctx);
+       git_SHA1_Init(&ctx);
        for (c = idx; c != last; c++) {
                uint32_t offset = htonl((*c)->offset);
                sha1write(f, &offset, 4);
                sha1write(f, (*c)->sha1, sizeof((*c)->sha1));
-               SHA1_Update(&ctx, (*c)->sha1, 20);
+               git_SHA1_Update(&ctx, (*c)->sha1, 20);
        }
        sha1write(f, pack_data->sha1, sizeof(pack_data->sha1));
        sha1close(f, NULL, CSUM_FSYNC);
        free(idx);
-       SHA1_Final(pack_data->sha1, &ctx);
+       git_SHA1_Final(pack_data->sha1, &ctx);
        return tmpfile;
 }
 
@@ -982,8 +983,10 @@ static void end_packfile(void)
 
                pack_id++;
        }
-       else
+       else {
+               close(old_p->pack_fd);
                unlink(old_p->pack_name);
+       }
        free(old_p);
 
        /* We can't carry a delta across packfiles. */
@@ -1033,15 +1036,15 @@ static int store_object(
        unsigned char hdr[96];
        unsigned char sha1[20];
        unsigned long hdrlen, deltalen;
-       SHA_CTX c;
+       git_SHA_CTX c;
        z_stream s;
 
        hdrlen = sprintf((char*)hdr,"%s %lu", typename(type),
                (unsigned long)dat->len) + 1;
-       SHA1_Init(&c);
-       SHA1_Update(&c, hdr, hdrlen);
-       SHA1_Update(&c, dat->buf, dat->len);
-       SHA1_Final(sha1, &c);
+       git_SHA1_Init(&c);
+       git_SHA1_Update(&c, hdr, hdrlen);
+       git_SHA1_Update(&c, dat->buf, dat->len);
+       git_SHA1_Final(sha1, &c);
        if (sha1out)
                hashcpy(sha1out, sha1);
 
@@ -1745,9 +1748,12 @@ static int validate_raw_date(const char *src, char *result, int maxlen)
 {
        const char *orig_src = src;
        char *endp, sign;
+       unsigned long date;
+
+       errno = 0;
 
-       strtoul(src, &endp, 10);
-       if (endp == src || *endp != ' ')
+       date = strtoul(src, &endp, 10);
+       if (errno || endp == src || *endp != ' ')
                return -1;
 
        src = endp + 1;
@@ -1755,8 +1761,8 @@ static int validate_raw_date(const char *src, char *result, int maxlen)
                return -1;
        sign = *src;
 
-       strtoul(src + 1, &endp, 10);
-       if (endp == src || *endp || (endp - orig_src) >= maxlen)
+       date = strtoul(src + 1, &endp, 10);
+       if (errno || endp == src || *endp || (endp - orig_src) >= maxlen)
                return -1;
 
        strcpy(result, orig_src);
@@ -2262,23 +2268,27 @@ static void parse_new_tag(void)
        read_next_command();
 
        /* tagger ... */
-       if (prefixcmp(command_buf.buf, "tagger "))
-               die("Expected tagger command, got %s", command_buf.buf);
-       tagger = parse_ident(command_buf.buf + 7);
+       if (!prefixcmp(command_buf.buf, "tagger ")) {
+               tagger = parse_ident(command_buf.buf + 7);
+               read_next_command();
+       } else
+               tagger = NULL;
 
        /* tag payload/message */
-       read_next_command();
        parse_data(&msg);
 
        /* build the tag object */
        strbuf_reset(&new_data);
+
        strbuf_addf(&new_data,
-               "object %s\n"
-               "type %s\n"
-               "tag %s\n"
-               "tagger %s\n"
-               "\n",
-               sha1_to_hex(sha1), commit_type, t->name, tagger);
+                   "object %s\n"
+                   "type %s\n"
+                   "tag %s\n",
+                   sha1_to_hex(sha1), commit_type, t->name);
+       if (tagger)
+               strbuf_addf(&new_data,
+                           "tagger %s\n", tagger);
+       strbuf_addch(&new_data, '\n');
        strbuf_addbuf(&new_data, &msg);
        free(tagger);