Merge in xdiff cleanup pieces
authorJunio C Hamano <junkio@cox.net>
Tue, 4 Apr 2006 21:43:57 +0000 (14:43 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 4 Apr 2006 21:43:57 +0000 (14:43 -0700)
33 files changed:
Makefile
apply.c
blame.c
blob.c
cat-file.c
combine-diff.c
commit-tree.c
commit.c
convert-objects.c
diff-tree.c
entry.c
git-ls-remote.sh
hash-object.c
http-push.c
http.c
index-pack.c
ls-tree.c
mktag.c
mktree.c
object.c
pack-objects.c
read-tree.c
revision.c
sha1_file.c
tag.c
tar-tree.c
tree-diff.c
tree-walk.c
tree.c
unpack-file.c
unpack-objects.c
update-index.c
write-tree.c

index c79d646..145099a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -510,6 +510,9 @@ git$X git.spec \
 exec_cmd.o: exec_cmd.c
        $(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
 
+http.o: http.c
+       $(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<
+
 git-%$X: %.o $(GITLIBS)
        $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
 
diff --git a/apply.c b/apply.c
index c50b3a6..33b4271 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -9,6 +9,7 @@
 #include <fnmatch.h>
 #include "cache.h"
 #include "quote.h"
+#include "blob.h"
 
 //  --check turns on checking that the working tree matches the
 //    files that are being modified, but doesn't apply the patch
@@ -924,8 +925,7 @@ static int parse_single_patch(char *line, unsigned long size, struct patch *patc
                struct fragment *fragment;
                int len;
 
-               fragment = xmalloc(sizeof(*fragment));
-               memset(fragment, 0, sizeof(*fragment));
+               fragment = xcalloc(1, sizeof(*fragment));
                len = parse_fragment(line, size, patch, fragment);
                if (len <= 0)
                        die("corrupt patch at line %d", linenr);
@@ -1296,7 +1296,7 @@ static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
                         * applies to.
                         */
                        write_sha1_file_prepare(desc->buffer, desc->size,
-                                               "blob", sha1, hdr, &hdrlen);
+                                               blob_type, sha1, hdr, &hdrlen);
                        if (strcmp(sha1_to_hex(sha1), patch->old_sha1_prefix))
                                return error("the patch applies to '%s' (%s), "
                                             "which does not match the "
@@ -1651,15 +1651,14 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
        if (!write_index)
                return;
 
-       ce = xmalloc(ce_size);
-       memset(ce, 0, ce_size);
+       ce = xcalloc(1, ce_size);
        memcpy(ce->name, path, namelen);
        ce->ce_mode = create_ce_mode(mode);
        ce->ce_flags = htons(namelen);
        if (lstat(path, &st) < 0)
                die("unable to stat newly created file %s", path);
        fill_stat_cache_info(ce, &st);
-       if (write_sha1_file(buf, size, "blob", ce->sha1) < 0)
+       if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0)
                die("unable to create backing store for newly created file %s", path);
        if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)
                die("unable to add cache entry for %s", path);
@@ -1808,8 +1807,7 @@ static int apply_patch(int fd, const char *filename)
                struct patch *patch;
                int nr;
 
-               patch = xmalloc(sizeof(*patch));
-               memset(patch, 0, sizeof(*patch));
+               patch = xcalloc(1, sizeof(*patch));
                nr = parse_chunk(buffer + offset, size, patch);
                if (nr < 0)
                        break;
diff --git a/blame.c b/blame.c
index 396defc..98f9992 100644 (file)
--- a/blame.c
+++ b/blame.c
@@ -229,7 +229,7 @@ static void get_blob(struct commit *commit)
 
        info->buf = read_sha1_file(info->sha1, type, &info->size);
 
-       assert(!strcmp(type, "blob"));
+       assert(!strcmp(type, blob_type));
 }
 
 /* For debugging only */
diff --git a/blob.c b/blob.c
index 84ec121..c1fdd86 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -8,8 +8,7 @@ struct blob *lookup_blob(const unsigned char *sha1)
 {
        struct object *obj = lookup_object(sha1);
        if (!obj) {
-               struct blob *ret = xmalloc(sizeof(struct blob));
-               memset(ret, 0, sizeof(struct blob));
+               struct blob *ret = xcalloc(1, sizeof(struct blob));
                created_object(sha1, &ret->object);
                ret->object.type = blob_type;
                return ret;
index 761111e..628f6ca 100644 (file)
@@ -5,6 +5,8 @@
  */
 #include "cache.h"
 #include "exec_cmd.h"
+#include "tag.h"
+#include "tree.h"
 
 static void flush_buffer(const char *buf, unsigned long size)
 {
@@ -136,13 +138,13 @@ int main(int argc, char **argv)
                        die("Not a valid object name %s", argv[2]);
 
                /* custom pretty-print here */
-               if (!strcmp(type, "tree"))
+               if (!strcmp(type, tree_type))
                        return execl_git_cmd("ls-tree", argv[2], NULL);
 
                buf = read_sha1_file(sha1, type, &size);
                if (!buf)
                        die("Cannot read object %s", argv[2]);
-               if (!strcmp(type, "tag"))
+               if (!strcmp(type, tag_type))
                        return pprint_tag(sha1, buf, size);
 
                /* otherwise just spit out the data */
index f17aab3..7693884 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "commit.h"
+#include "blob.h"
 #include "diff.h"
 #include "diffcore.h"
 #include "quote.h"
@@ -104,7 +105,7 @@ static char *grab_blob(const unsigned char *sha1, unsigned long *size)
                return xcalloc(1, 1);
        }
        blob = read_sha1_file(sha1, type, size);
-       if (strcmp(type, "blob"))
+       if (strcmp(type, blob_type))
                die("object '%s' is not a blob!", sha1_to_hex(sha1));
        return blob;
 }
index 16c1787..2d86518 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright (C) Linus Torvalds, 2005
  */
 #include "cache.h"
+#include "commit.h"
+#include "tree.h"
 
 #define BLOCKING (1ul << 14)
 
@@ -93,13 +95,13 @@ int main(int argc, char **argv)
        if (argc < 2 || get_sha1_hex(argv[1], tree_sha1) < 0)
                usage(commit_tree_usage);
 
-       check_valid(tree_sha1, "tree");
+       check_valid(tree_sha1, tree_type);
        for (i = 2; i < argc; i += 2) {
                char *a, *b;
                a = argv[i]; b = argv[i+1];
                if (!b || strcmp(a, "-p") || get_sha1(b, parent_sha1[parents]))
                        usage(commit_tree_usage);
-               check_valid(parent_sha1[parents], "commit");
+               check_valid(parent_sha1[parents], commit_type);
                if (new_parent(parents))
                        parents++;
        }
@@ -125,7 +127,7 @@ int main(int argc, char **argv)
        while (fgets(comment, sizeof(comment), stdin) != NULL)
                add_buffer(&buffer, &size, "%s", comment);
 
-       if (!write_sha1_file(buffer, size, "commit", commit_sha1)) {
+       if (!write_sha1_file(buffer, size, commit_type, commit_sha1)) {
                printf("%s\n", sha1_to_hex(commit_sha1));
                return 0;
        }
index eb42d51..d4976fb 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -73,8 +73,7 @@ struct commit *lookup_commit(const unsigned char *sha1)
 {
        struct object *obj = lookup_object(sha1);
        if (!obj) {
-               struct commit *ret = xmalloc(sizeof(struct commit));
-               memset(ret, 0, sizeof(struct commit));
+               struct commit *ret = xcalloc(1, sizeof(struct commit));
                created_object(sha1, &ret->object);
                ret->object.type = commit_type;
                return ret;
index b49bce2..12aacef 100644 (file)
@@ -2,6 +2,9 @@
 #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */
 #include <time.h>
 #include "cache.h"
+#include "blob.h"
+#include "commit.h"
+#include "tree.h"
 
 struct entry {
        unsigned char old_sha1[20];
@@ -18,8 +21,7 @@ static struct entry * convert_entry(unsigned char *sha1);
 
 static struct entry *insert_new(unsigned char *sha1, int pos)
 {
-       struct entry *new = xmalloc(sizeof(struct entry));
-       memset(new, 0, sizeof(*new));
+       struct entry *new = xcalloc(1, sizeof(struct entry));
        memcpy(new->old_sha1, sha1, 20);
        memmove(convert + pos + 1, convert + pos, (nr_convert - pos) * sizeof(struct entry *));
        convert[pos] = new;
@@ -122,7 +124,7 @@ static int write_subdirectory(void *buffer, unsigned long size, const char *base
                buffer += len;
        }
 
-       write_sha1_file(new, newlen, "tree", result_sha1);
+       write_sha1_file(new, newlen, tree_type, result_sha1);
        free(new);
        return used;
 }
@@ -262,8 +264,8 @@ static void convert_date(void *buffer, unsigned long size, unsigned char *result
        memcpy(new + newlen, buffer, size);
        newlen += size;
 
-       write_sha1_file(new, newlen, "commit", result_sha1);
-       free(new);      
+       write_sha1_file(new, newlen, commit_type, result_sha1);
+       free(new);
 }
 
 static void convert_commit(void *buffer, unsigned long size, unsigned char *result_sha1)
@@ -297,12 +299,12 @@ static struct entry * convert_entry(unsigned char *sha1)
 
        buffer = xmalloc(size);
        memcpy(buffer, data, size);
-       
-       if (!strcmp(type, "blob")) {
-               write_sha1_file(buffer, size, "blob", entry->new_sha1);
-       } else if (!strcmp(type, "tree"))
+
+       if (!strcmp(type, blob_type)) {
+               write_sha1_file(buffer, size, blob_type, entry->new_sha1);
+       } else if (!strcmp(type, tree_type))
                convert_tree(buffer, size, entry->new_sha1);
-       else if (!strcmp(type, "commit"))
+       else if (!strcmp(type, commit_type))
                convert_commit(buffer, size, entry->new_sha1);
        else
                die("unknown object type '%s' in %s", type, sha1_to_hex(sha1));
index f55a35a..d1265d7 100644 (file)
@@ -52,7 +52,7 @@ static int diff_root_tree(const unsigned char *new, const char *base)
        void *tree;
        struct tree_desc empty, real;
 
-       tree = read_object_with_reference(new, "tree", &real.size, NULL);
+       tree = read_object_with_reference(new, tree_type, &real.size, NULL);
        if (!tree)
                die("unable to read root tree (%s)", sha1_to_hex(new));
        real.buf = tree;
diff --git a/entry.c b/entry.c
index 5d9aefd..793724f 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -1,6 +1,7 @@
 #include <sys/types.h>
 #include <dirent.h>
 #include "cache.h"
+#include "blob.h"
 
 static void create_directories(const char *path, struct checkout *state)
 {
@@ -72,7 +73,7 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat
        char type[20];
 
        new = read_sha1_file(ce->sha1, type, &size);
-       if (!new || strcmp(type, "blob")) {
+       if (!new || strcmp(type, blob_type)) {
                if (new)
                        free(new);
                return error("git-checkout-index: unable to read sha1 file of %s (%s)",
index 2c9a588..b6882a9 100755 (executable)
@@ -53,7 +53,7 @@ http://* | https://* )
         if [ -n "$GIT_SSL_NO_VERIFY" ]; then
             curl_extra_args="-k"
         fi
-       curl -nsf $curl_extra_args "$peek_repo/info/refs" ||
+       curl -nsf $curl_extra_args --header "Pragma: no-cache" "$peek_repo/info/refs" ||
                echo "failed    slurping"
        ;;
 
index 6502b5b..43bd93b 100644 (file)
@@ -2,9 +2,10 @@
  * GIT - The information manager from hell
  *
  * Copyright (C) Linus Torvalds, 2005
- * Copyright (C) Junio C Hamano, 2005 
+ * Copyright (C) Junio C Hamano, 2005
  */
 #include "cache.h"
+#include "blob.h"
 
 static void hash_object(const char *path, const char *type, int write_object)
 {
@@ -35,7 +36,7 @@ static const char hash_object_usage[] =
 int main(int argc, char **argv)
 {
        int i;
-       const char *type = "blob";
+       const char *type = blob_type;
        int write_object = 0;
        const char *prefix = NULL;
        int prefix_length = -1;
index ba7d9de..b60fa8d 100644 (file)
@@ -1008,8 +1008,7 @@ static int fetch_indices(void)
        struct active_request_slot *slot;
        struct slot_results results;
 
-       data = xmalloc(4096);
-       memset(data, 0, 4096);
+       data = xcalloc(1, 4096);
        buffer.size = 4096;
        buffer.posn = 0;
        buffer.buffer = data;
@@ -2042,8 +2041,7 @@ static void update_remote_info_refs(struct remote_lock *lock)
        char *if_header;
        struct curl_slist *dav_headers = NULL;
 
-       buffer.buffer = xmalloc(4096);
-       memset(buffer.buffer, 0, 4096);
+       buffer.buffer = xcalloc(1, 4096);
        buffer.size = 4096;
        buffer.posn = 0;
        remote_ls("refs/", (PROCESS_FILES | RECURSIVE),
diff --git a/http.c b/http.c
index 9604e33..0cb42a8 100644 (file)
--- a/http.c
+++ b/http.c
@@ -195,6 +195,8 @@ static CURL* get_curl_handle(void)
        if (getenv("GIT_CURL_VERBOSE"))
                curl_easy_setopt(result, CURLOPT_VERBOSE, 1);
 
+       curl_easy_setopt(result, CURLOPT_USERAGENT, GIT_USER_AGENT);
+
        return result;
 }
 
index babe34b..b39953d 100644 (file)
@@ -2,6 +2,10 @@
 #include "delta.h"
 #include "pack.h"
 #include "csum-file.h"
+#include "blob.h"
+#include "commit.h"
+#include "tag.h"
+#include "tree.h"
 
 static const char index_pack_usage[] =
 "git-index-pack [-o index-file] pack-file";
@@ -224,10 +228,10 @@ static void sha1_object(const void *data, unsigned long size,
        const char *type_str;
 
        switch (type) {
-       case OBJ_COMMIT: type_str = "commit"; break;
-       case OBJ_TREE:   type_str = "tree"; break;
-       case OBJ_BLOB:   type_str = "blob"; break;
-       case OBJ_TAG:    type_str = "tag"; break;
+       case OBJ_COMMIT: type_str = commit_type; break;
+       case OBJ_TREE:   type_str = tree_type; break;
+       case OBJ_BLOB:   type_str = blob_type; break;
+       case OBJ_TAG:    type_str = tag_type; break;
        default:
                die("bad type %d", type);
        }
index 26258c3..e4ef200 100644 (file)
--- a/ls-tree.c
+++ b/ls-tree.c
@@ -56,7 +56,7 @@ static int show_tree(unsigned char *sha1, const char *base, int baselen,
                     const char *pathname, unsigned mode, int stage)
 {
        int retval = 0;
-       const char *type = "blob";
+       const char *type = blob_type;
 
        if (S_ISDIR(mode)) {
                if (show_recursive(base, baselen, pathname)) {
@@ -64,7 +64,7 @@ static int show_tree(unsigned char *sha1, const char *base, int baselen,
                        if (!(ls_options & LS_SHOW_TREES))
                                return retval;
                }
-               type = "tree";
+               type = tree_type;
        }
        else if (ls_options & LS_TREE_ONLY)
                return 0;
diff --git a/mktag.c b/mktag.c
index fc6a9bf..2328878 100644 (file)
--- a/mktag.c
+++ b/mktag.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "tag.h"
 
 /*
  * A signature file has a very simple fixed format: three lines
@@ -126,7 +127,7 @@ int main(int argc, char **argv)
        if (verify_tag(buffer, size) < 0)
                die("invalid tag signature file");
 
-       if (write_sha1_file(buffer, size, "tag", result_sha1) < 0)
+       if (write_sha1_file(buffer, size, tag_type, result_sha1) < 0)
                die("unable to write tag file");
        printf("%s\n", sha1_to_hex(result_sha1));
        return 0;
index f853585..ab63cd9 100644 (file)
--- a/mktree.c
+++ b/mktree.c
@@ -6,6 +6,7 @@
 #include "cache.h"
 #include "strbuf.h"
 #include "quote.h"
+#include "tree.h"
 
 static struct treeent {
        unsigned mode;
@@ -67,7 +68,7 @@ static void write_tree(unsigned char *sha1)
                memcpy(buffer + offset, ent->sha1, 20);
                offset += 20;
        }
-       write_sha1_file(buffer, offset, "tree", sha1);
+       write_sha1_file(buffer, offset, tree_type, sha1);
 }
 
 static const char mktree_usage[] = "mktree [-z]";
index c9ca481..4d46e0d 100644 (file)
--- a/object.c
+++ b/object.c
@@ -85,8 +85,7 @@ struct object_refs *alloc_object_refs(unsigned count)
        struct object_refs *refs;
        size_t size = sizeof(*refs) + count*sizeof(struct object *);
 
-       refs = xmalloc(size);
-       memset(refs, 0, size);
+       refs = xcalloc(1, size);
        refs->count = count;
        return refs;
 }
@@ -178,8 +177,7 @@ struct object *lookup_unknown_object(const unsigned char *sha1)
 {
        struct object *obj = lookup_object(sha1);
        if (!obj) {
-               union any_object *ret = xmalloc(sizeof(*ret));
-               memset(ret, 0, sizeof(*ret));
+               union any_object *ret = xcalloc(1, sizeof(*ret));
                created_object(sha1, &ret->object);
                ret->object.type = NULL;
                return &ret->object;
@@ -196,15 +194,15 @@ struct object *parse_object(const unsigned char *sha1)
                struct object *obj;
                if (check_sha1_signature(sha1, buffer, size, type) < 0)
                        printf("sha1 mismatch %s\n", sha1_to_hex(sha1));
-               if (!strcmp(type, "blob")) {
+               if (!strcmp(type, blob_type)) {
                        struct blob *blob = lookup_blob(sha1);
                        parse_blob_buffer(blob, buffer, size);
                        obj = &blob->object;
-               } else if (!strcmp(type, "tree")) {
+               } else if (!strcmp(type, tree_type)) {
                        struct tree *tree = lookup_tree(sha1);
                        parse_tree_buffer(tree, buffer, size);
                        obj = &tree->object;
-               } else if (!strcmp(type, "commit")) {
+               } else if (!strcmp(type, commit_type)) {
                        struct commit *commit = lookup_commit(sha1);
                        parse_commit_buffer(commit, buffer, size);
                        if (!commit->buffer) {
@@ -212,7 +210,7 @@ struct object *parse_object(const unsigned char *sha1)
                                buffer = NULL;
                        }
                        obj = &commit->object;
-               } else if (!strcmp(type, "tag")) {
+               } else if (!strcmp(type, tag_type)) {
                        struct tag *tag = lookup_tag(sha1);
                        parse_tag_buffer(tag, buffer, size);
                        obj = &tag->object;
index ccfaa5f..9346392 100644 (file)
@@ -1,5 +1,9 @@
 #include "cache.h"
 #include "object.h"
+#include "blob.h"
+#include "commit.h"
+#include "tag.h"
+#include "tree.h"
 #include "delta.h"
 #include "pack.h"
 #include "csum-file.h"
@@ -58,7 +62,7 @@ static int nr_objects = 0, nr_alloc = 0, nr_result = 0;
 static const char *base_name;
 static unsigned char pack_file_sha1[20];
 static int progress = 1;
-static volatile int progress_update = 0;
+static volatile sig_atomic_t progress_update = 0;
 
 /*
  * The object names in objects array are hashed with this hashtable,
@@ -603,7 +607,7 @@ static void add_pbase_tree(struct tree_desc *tree, struct name_path *up)
                if (!add_object_entry(sha1, hash, 1))
                        continue;
 
-               if (!strcmp(type, "tree")) {
+               if (!strcmp(type, tree_type)) {
                        struct tree_desc sub;
                        void *elem;
                        struct name_path me;
@@ -626,7 +630,7 @@ static void add_preferred_base(unsigned char *sha1)
        struct tree_desc tree;
        void *elem;
 
-       elem = read_object_with_reference(sha1, "tree", &tree.size, NULL);
+       elem = read_object_with_reference(sha1, tree_type, &tree.size, NULL);
        tree.buf = elem;
        if (!tree.buf)
                return;
@@ -684,13 +688,13 @@ static void check_object(struct object_entry *entry)
                die("unable to get type of object %s",
                    sha1_to_hex(entry->sha1));
 
-       if (!strcmp(type, "commit")) {
+       if (!strcmp(type, commit_type)) {
                entry->type = OBJ_COMMIT;
-       } else if (!strcmp(type, "tree")) {
+       } else if (!strcmp(type, tree_type)) {
                entry->type = OBJ_TREE;
-       } else if (!strcmp(type, "blob")) {
+       } else if (!strcmp(type, blob_type)) {
                entry->type = OBJ_BLOB;
-       } else if (!strcmp(type, "tag")) {
+       } else if (!strcmp(type, tag_type)) {
                entry->type = OBJ_TAG;
        } else
                die("unable to pack object %s of type %s",
@@ -879,7 +883,6 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de
 
 static void progress_interval(int signum)
 {
-       signal(SIGALRM, progress_interval);
        progress_update = 1;
 }
 
@@ -1025,6 +1028,23 @@ static int reuse_cached_pack(unsigned char *sha1, int pack_to_stdout)
        return 1;
 }
 
+static void setup_progress_signal(void)
+{
+       struct sigaction sa;
+       struct itimerval v;
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_handler = progress_interval;
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = SA_RESTART;
+       sigaction(SIGALRM, &sa, NULL);
+
+       v.it_interval.tv_sec = 1;
+       v.it_interval.tv_usec = 0;
+       v.it_value = v.it_interval;
+       setitimer(ITIMER_REAL, &v, NULL);
+}
+
 int main(int argc, char **argv)
 {
        SHA_CTX ctx;
@@ -1090,18 +1110,24 @@ int main(int argc, char **argv)
        prepare_packed_git();
 
        if (progress) {
-               struct itimerval v;
-               v.it_interval.tv_sec = 1;
-               v.it_interval.tv_usec = 0;
-               v.it_value = v.it_interval;
-               signal(SIGALRM, progress_interval);
-               setitimer(ITIMER_REAL, &v, NULL);
                fprintf(stderr, "Generating pack...\n");
+               setup_progress_signal();
        }
 
-       while (fgets(line, sizeof(line), stdin) != NULL) {
+       for (;;) {
                unsigned char sha1[20];
 
+               if (!fgets(line, sizeof(line), stdin)) {
+                       if (feof(stdin))
+                               break;
+                       if (!ferror(stdin))
+                               die("fgets returned NULL, not EOF, not error!");
+                       if (errno != EINTR)
+                               die("fgets: %s", strerror(errno));
+                       clearerr(stdin);
+                       continue;
+               }
+
                if (line[0] == '-') {
                        if (get_sha1_hex(line+1, sha1))
                                die("expected edge sha1, got garbage:\n %s",
index eaff444..26f4f7e 100644 (file)
@@ -133,11 +133,9 @@ static int unpack_trees_rec(struct tree_entry_list **posns, int len,
                pathlen = strlen(first);
                ce_size = cache_entry_size(baselen + pathlen);
 
-               src = xmalloc(sizeof(struct cache_entry *) * src_size);
-               memset(src, 0, sizeof(struct cache_entry *) * src_size);
+               src = xcalloc(src_size, sizeof(struct cache_entry *));
 
-               subposns = xmalloc(sizeof(struct tree_list_entry *) * len);
-               memset(subposns, 0, sizeof(struct tree_list_entry *) * len);
+               subposns = xcalloc(len, sizeof(struct tree_list_entry *));
 
                if (cache_name && !strcmp(cache_name, first)) {
                        any_files = 1;
@@ -177,8 +175,7 @@ static int unpack_trees_rec(struct tree_entry_list **posns, int len,
                        else
                                ce_stage = 2;
 
-                       ce = xmalloc(ce_size);
-                       memset(ce, 0, ce_size);
+                       ce = xcalloc(1, ce_size);
                        ce->ce_mode = create_ce_mode(posns[i]->mode);
                        ce->ce_flags = create_ce_flags(baselen + pathlen,
                                                       ce_stage);
@@ -273,10 +270,26 @@ static void unlink_entry(char *name)
 
 static void progress_interval(int signum)
 {
-       signal(SIGALRM, progress_interval);
        progress_update = 1;
 }
 
+static void setup_progress_signal(void)
+{
+       struct sigaction sa;
+       struct itimerval v;
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_handler = progress_interval;
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = SA_RESTART;
+       sigaction(SIGALRM, &sa, NULL);
+
+       v.it_interval.tv_sec = 1;
+       v.it_interval.tv_usec = 0;
+       v.it_value = v.it_interval;
+       setitimer(ITIMER_REAL, &v, NULL);
+}
+
 static void check_updates(struct cache_entry **src, int nr)
 {
        static struct checkout state = {
@@ -289,8 +302,6 @@ static void check_updates(struct cache_entry **src, int nr)
        unsigned last_percent = 200, cnt = 0, total = 0;
 
        if (update && verbose_update) {
-               struct itimerval v;
-
                for (total = cnt = 0; cnt < nr; cnt++) {
                        struct cache_entry *ce = src[cnt];
                        if (!ce->ce_mode || ce->ce_flags & mask)
@@ -302,12 +313,8 @@ static void check_updates(struct cache_entry **src, int nr)
                        total = 0;
 
                if (total) {
-                       v.it_interval.tv_sec = 1;
-                       v.it_interval.tv_usec = 0;
-                       v.it_value = v.it_interval;
-                       signal(SIGALRM, progress_interval);
-                       setitimer(ITIMER_REAL, &v, NULL);
                        fprintf(stderr, "Checking files out...\n");
+                       setup_progress_signal();
                        progress_update = 1;
                }
                cnt = 0;
@@ -341,8 +348,8 @@ static void check_updates(struct cache_entry **src, int nr)
                }
        }
        if (total) {
-               fputc('\n', stderr);
                signal(SIGALRM, SIG_IGN);
+               fputc('\n', stderr);
        }
 }
 
index 728b6d1..ce35b5a 100644 (file)
@@ -260,7 +260,7 @@ int rev_same_tree_as_empty(struct tree *t1)
        if (!t1)
                return 0;
 
-       tree = read_object_with_reference(t1->object.sha1, "tree", &real.size, NULL);
+       tree = read_object_with_reference(t1->object.sha1, tree_type, &real.size, NULL);
        if (!tree)
                return 0;
        real.buf = tree;
index 58edec0..ba8c4f7 100644 (file)
@@ -9,6 +9,10 @@
 #include "cache.h"
 #include "delta.h"
 #include "pack.h"
+#include "blob.h"
+#include "commit.h"
+#include "tag.h"
+#include "tree.h"
 
 #ifndef O_NOATIME
 #if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
@@ -894,16 +898,16 @@ void packed_object_info_detail(struct pack_entry *e,
        }
        switch (kind) {
        case OBJ_COMMIT:
-               strcpy(type, "commit");
+               strcpy(type, commit_type);
                break;
        case OBJ_TREE:
-               strcpy(type, "tree");
+               strcpy(type, tree_type);
                break;
        case OBJ_BLOB:
-               strcpy(type, "blob");
+               strcpy(type, blob_type);
                break;
        case OBJ_TAG:
-               strcpy(type, "tag");
+               strcpy(type, tag_type);
                break;
        default:
                die("corrupted pack file %s containing object of kind %d",
@@ -934,16 +938,16 @@ static int packed_object_info(struct pack_entry *entry,
                unuse_packed_git(p);
                return retval;
        case OBJ_COMMIT:
-               strcpy(type, "commit");
+               strcpy(type, commit_type);
                break;
        case OBJ_TREE:
-               strcpy(type, "tree");
+               strcpy(type, tree_type);
                break;
        case OBJ_BLOB:
-               strcpy(type, "blob");
+               strcpy(type, blob_type);
                break;
        case OBJ_TAG:
-               strcpy(type, "tag");
+               strcpy(type, tag_type);
                break;
        default:
                die("corrupted pack file %s containing object of kind %d",
@@ -1071,16 +1075,16 @@ void *unpack_entry_gently(struct pack_entry *entry,
                retval = unpack_delta_entry(pack, size, left, type, sizep, p);
                return retval;
        case OBJ_COMMIT:
-               strcpy(type, "commit");
+               strcpy(type, commit_type);
                break;
        case OBJ_TREE:
-               strcpy(type, "tree");
+               strcpy(type, tree_type);
                break;
        case OBJ_BLOB:
-               strcpy(type, "blob");
+               strcpy(type, blob_type);
                break;
        case OBJ_TAG:
-               strcpy(type, "tag");
+               strcpy(type, tag_type);
                break;
        default:
                return NULL;
@@ -1241,9 +1245,9 @@ void *read_object_with_reference(const unsigned char *sha1,
                        return buffer;
                }
                /* Handle references */
-               else if (!strcmp(type, "commit"))
+               else if (!strcmp(type, commit_type))
                        ref_type = "tree ";
-               else if (!strcmp(type, "tag"))
+               else if (!strcmp(type, tag_type))
                        ref_type = "object ";
                else {
                        free(buffer);
@@ -1625,7 +1629,7 @@ int index_pipe(unsigned char *sha1, int fd, const char *type, int write_object)
                return -1;
        }
        if (!type)
-               type = "blob";
+               type = blob_type;
        if (write_object)
                ret = write_sha1_file(buf, off, type, sha1);
        else {
@@ -1652,7 +1656,7 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, con
                return -1;
 
        if (!type)
-               type = "blob";
+               type = blob_type;
        if (write_object)
                ret = write_sha1_file(buf, size, type, sha1);
        else {
@@ -1690,9 +1694,9 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
                if (!write_object) {
                        unsigned char hdr[50];
                        int hdrlen;
-                       write_sha1_file_prepare(target, st->st_size, "blob",
+                       write_sha1_file_prepare(target, st->st_size, blob_type,
                                                sha1, hdr, &hdrlen);
-               } else if (write_sha1_file(target, st->st_size, "blob", sha1))
+               } else if (write_sha1_file(target, st->st_size, blob_type, sha1))
                        return error("%s: failed to insert into database",
                                     path);
                free(target);
diff --git a/tag.c b/tag.c
index ac0e573..f390ee7 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -19,8 +19,7 @@ struct tag *lookup_tag(const unsigned char *sha1)
 {
         struct object *obj = lookup_object(sha1);
         if (!obj) {
-                struct tag *ret = xmalloc(sizeof(struct tag));
-                memset(ret, 0, sizeof(struct tag));
+                struct tag *ret = xcalloc(1, sizeof(struct tag));
                 created_object(sha1, &ret->object);
                 ret->object.type = tag_type;
                 return ret;
index bd289a9..fc60a90 100644 (file)
@@ -335,7 +335,7 @@ int main(int argc, char **argv)
        } else
                archive_time = time(NULL);
 
-       tree.buf = read_object_with_reference(sha1, "tree", &tree.size,
+       tree.buf = read_object_with_reference(sha1, tree_type, &tree.size,
                                              tree_sha1);
        if (!tree.buf)
                die("not a reference to a tag, commit or tree object: %s",
index 7bb6109..701fbba 100644 (file)
@@ -3,6 +3,7 @@
  */
 #include "cache.h"
 #include "diff.h"
+#include "tree.h"
 
 // What paths are we interested in?
 static int nr_paths = 0;
@@ -148,7 +149,7 @@ static int show_entry(struct diff_options *opt, const char *prefix, struct tree_
                void *tree;
 
                tree = read_sha1_file(sha1, type, &inner.size);
-               if (!tree || strcmp(type, "tree"))
+               if (!tree || strcmp(type, tree_type))
                        die("corrupt tree sha %s", sha1_to_hex(sha1));
 
                inner.buf = tree;
@@ -206,10 +207,10 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
        struct tree_desc t1, t2;
        int retval;
 
-       tree1 = read_object_with_reference(old, "tree", &t1.size, NULL);
+       tree1 = read_object_with_reference(old, tree_type, &t1.size, NULL);
        if (!tree1)
                die("unable to read source tree (%s)", sha1_to_hex(old));
-       tree2 = read_object_with_reference(new, "tree", &t2.size, NULL);
+       tree2 = read_object_with_reference(new, tree_type, &t2.size, NULL);
        if (!tree2)
                die("unable to read destination tree (%s)", sha1_to_hex(new));
        t1.buf = tree1;
index 0735f40..bf8bfdf 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "tree-walk.h"
+#include "tree.h"
 
 void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1)
 {
@@ -7,7 +8,7 @@ void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1)
        void *buf = NULL;
 
        if (sha1) {
-               buf = read_object_with_reference(sha1, "tree", &size, NULL);
+               buf = read_object_with_reference(sha1, tree_type, &size, NULL);
                if (!buf)
                        die("unable to read tree %s", sha1_to_hex(sha1));
        }
diff --git a/tree.c b/tree.c
index 87e0d74..d599fb5 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -18,9 +18,7 @@ static int read_one_entry(unsigned char *sha1, const char *base, int baselen, co
 
        len = strlen(pathname);
        size = cache_entry_size(baselen + len);
-       ce = xmalloc(size);
-
-       memset(ce, 0, size);
+       ce = xcalloc(1, size);
 
        ce->ce_mode = create_ce_mode(mode);
        ce->ce_flags = create_ce_flags(baselen + len, stage);
@@ -130,8 +128,7 @@ struct tree *lookup_tree(const unsigned char *sha1)
 {
        struct object *obj = lookup_object(sha1);
        if (!obj) {
-               struct tree *ret = xmalloc(sizeof(struct tree));
-               memset(ret, 0, sizeof(struct tree));
+               struct tree *ret = xcalloc(1, sizeof(struct tree));
                created_object(sha1, &ret->object);
                ret->object.type = tree_type;
                return ret;
index 3accb97..23a8562 100644 (file)
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "blob.h"
 
 static char *create_temp_file(unsigned char *sha1)
 {
@@ -9,7 +10,7 @@ static char *create_temp_file(unsigned char *sha1)
        int fd;
 
        buf = read_sha1_file(sha1, type, &size);
-       if (!buf || strcmp(type, "blob"))
+       if (!buf || strcmp(type, blob_type))
                die("unable to read blob object %s", sha1_to_hex(sha1));
 
        strcpy(path, ".merge_file_XXXXXX");
index 815a1b3..3b824b0 100644 (file)
@@ -2,6 +2,10 @@
 #include "object.h"
 #include "delta.h"
 #include "pack.h"
+#include "blob.h"
+#include "commit.h"
+#include "tag.h"
+#include "tree.h"
 
 #include <sys/time.h>
 
@@ -148,10 +152,10 @@ static int unpack_non_delta_entry(enum object_type kind, unsigned long size)
        const char *type;
 
        switch (kind) {
-       case OBJ_COMMIT: type = "commit"; break;
-       case OBJ_TREE:   type = "tree"; break;
-       case OBJ_BLOB:   type = "blob"; break;
-       case OBJ_TAG:    type = "tag"; break;
+       case OBJ_COMMIT: type = commit_type; break;
+       case OBJ_TREE:   type = tree_type; break;
+       case OBJ_BLOB:   type = blob_type; break;
+       case OBJ_TAG:    type = tag_type; break;
        default: die("bad type %d", kind);
        }
        if (!dry_run)
index 797245a..1efac27 100644 (file)
@@ -114,8 +114,7 @@ static int add_file_to_cache(const char *path)
 
        namelen = strlen(path);
        size = cache_entry_size(namelen);
-       ce = xmalloc(size);
-       memset(ce, 0, size);
+       ce = xcalloc(1, size);
        memcpy(ce->name, path, namelen);
        ce->ce_flags = htons(namelen);
        fill_stat_cache_info(ce, &st);
@@ -312,8 +311,7 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
 
        len = strlen(path);
        size = cache_entry_size(len);
-       ce = xmalloc(size);
-       memset(ce, 0, size);
+       ce = xcalloc(1, size);
 
        memcpy(ce->sha1, sha1, 20);
        memcpy(ce->name, path, len);
index addb5de..dcad6e6 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) Linus Torvalds, 2005
  */
 #include "cache.h"
+#include "tree.h"
 
 static int missing_ok = 0;
 
@@ -78,7 +79,7 @@ static int write_tree(struct cache_entry **cachep, int maxentries, const char *b
                nr++;
        }
 
-       write_sha1_file(buffer, offset, "tree", returnsha1);
+       write_sha1_file(buffer, offset, tree_type, returnsha1);
        free(buffer);
        return nr;
 }