summaryrefslogtreecommitdiff
path: root/mktree.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-05-10 17:28:18 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-05-10 19:41:35 (GMT)
commit633e3556ccbcc7e443f5e9194c4a830181696ef0 (patch)
tree5c5958bb932e8188d39ff3755b5424ebf9e39ba1 /mktree.c
parent6345d7a0d151afc3d2a10ada3ecacf54c3fee2d0 (diff)
downloadgit-633e3556ccbcc7e443f5e9194c4a830181696ef0.zip
git-633e3556ccbcc7e443f5e9194c4a830181696ef0.tar.gz
git-633e3556ccbcc7e443f5e9194c4a830181696ef0.tar.bz2
build-in git-mktree
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'mktree.c')
-rw-r--r--mktree.c131
1 files changed, 0 insertions, 131 deletions
diff --git a/mktree.c b/mktree.c
deleted file mode 100644
index 137a095..0000000
--- a/mktree.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * GIT - the stupid content tracker
- *
- * Copyright (c) Junio C Hamano, 2006
- */
-#include "cache.h"
-#include "quote.h"
-#include "tree.h"
-#include "exec_cmd.h"
-
-static struct treeent {
- unsigned mode;
- unsigned char sha1[20];
- int len;
- char name[FLEX_ARRAY];
-} **entries;
-static int alloc, used;
-
-static void append_to_tree(unsigned mode, unsigned char *sha1, char *path)
-{
- struct treeent *ent;
- int len = strlen(path);
- if (strchr(path, '/'))
- die("path %s contains slash", path);
-
- if (alloc <= used) {
- alloc = alloc_nr(used);
- entries = xrealloc(entries, sizeof(*entries) * alloc);
- }
- ent = entries[used++] = xmalloc(sizeof(**entries) + len + 1);
- ent->mode = mode;
- ent->len = len;
- hashcpy(ent->sha1, sha1);
- memcpy(ent->name, path, len+1);
-}
-
-static int ent_compare(const void *a_, const void *b_)
-{
- struct treeent *a = *(struct treeent **)a_;
- struct treeent *b = *(struct treeent **)b_;
- return base_name_compare(a->name, a->len, a->mode,
- b->name, b->len, b->mode);
-}
-
-static void write_tree(unsigned char *sha1)
-{
- struct strbuf buf;
- size_t size;
- int i;
-
- qsort(entries, used, sizeof(*entries), ent_compare);
- for (size = i = 0; i < used; i++)
- size += 32 + entries[i]->len;
-
- strbuf_init(&buf, size);
- for (i = 0; i < used; i++) {
- struct treeent *ent = entries[i];
- strbuf_addf(&buf, "%o %s%c", ent->mode, ent->name, '\0');
- strbuf_add(&buf, ent->sha1, 20);
- }
-
- write_sha1_file(buf.buf, buf.len, tree_type, sha1);
-}
-
-static const char mktree_usage[] = "git mktree [-z]";
-
-int main(int ac, char **av)
-{
- struct strbuf sb = STRBUF_INIT;
- struct strbuf p_uq = STRBUF_INIT;
- unsigned char sha1[20];
- int line_termination = '\n';
-
- git_extract_argv0_path(av[0]);
-
- setup_git_directory();
-
- while ((1 < ac) && av[1][0] == '-') {
- char *arg = av[1];
- if (!strcmp("-z", arg))
- line_termination = 0;
- else
- usage(mktree_usage);
- ac--;
- av++;
- }
-
- while (strbuf_getline(&sb, stdin, line_termination) != EOF) {
- char *ptr, *ntr;
- unsigned mode;
- enum object_type type;
- char *path;
-
- ptr = sb.buf;
- /* Input is non-recursive ls-tree output format
- * mode SP type SP sha1 TAB name
- */
- mode = strtoul(ptr, &ntr, 8);
- if (ptr == ntr || !ntr || *ntr != ' ')
- die("input format error: %s", sb.buf);
- ptr = ntr + 1; /* type */
- ntr = strchr(ptr, ' ');
- if (!ntr || sb.buf + sb.len <= ntr + 40 ||
- ntr[41] != '\t' ||
- get_sha1_hex(ntr + 1, sha1))
- die("input format error: %s", sb.buf);
- type = sha1_object_info(sha1, NULL);
- if (type < 0)
- die("object %s unavailable", sha1_to_hex(sha1));
- *ntr++ = 0; /* now at the beginning of SHA1 */
- if (type != type_from_string(ptr))
- die("object type %s mismatch (%s)", ptr, typename(type));
-
- path = ntr + 41; /* at the beginning of name */
- if (line_termination && path[0] == '"') {
- strbuf_reset(&p_uq);
- if (unquote_c_style(&p_uq, path, NULL)) {
- die("invalid quoting");
- }
- path = p_uq.buf;
- }
-
- append_to_tree(mode, sha1, path);
- }
- strbuf_release(&p_uq);
- strbuf_release(&sb);
-
- write_tree(sha1);
- puts(sha1_to_hex(sha1));
- exit(0);
-}