]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin-write-tree.c
Make git-write-tree a builtin
[thirdparty/git.git] / builtin-write-tree.c
similarity index 66%
rename from write-tree.c
rename to builtin-write-tree.c
index bd07da6183b25470b00b9a2eedef29b7275760ec..c3aac36024626b31a60baa52f9e596169024b03a 100644 (file)
@@ -3,41 +3,24 @@
  *
  * Copyright (C) Linus Torvalds, 2005
  */
+#include "builtin.h"
 #include "cache.h"
 #include "tree.h"
 #include "cache-tree.h"
 
-static int missing_ok = 0;
-static char *prefix = NULL;
-
 static const char write_tree_usage[] =
 "git-write-tree [--missing-ok] [--prefix=<prefix>/]";
 
-static struct lock_file lock_file;
-
-int main(int argc, char **argv)
+int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)
 {
        int entries, was_valid, newfd;
 
-       setup_git_directory();
+       /* We can't free this memory, it becomes part of a linked list parsed atexit() */
+       struct lock_file *lock_file = xmalloc(sizeof(struct lock_file));
 
-       newfd = hold_lock_file_for_update(&lock_file, get_index_file());
-       entries = read_cache();
-
-       while (1 < argc) {
-               char *arg = argv[1];
-               if (!strcmp(arg, "--missing-ok"))
-                       missing_ok = 1;
-               else if (!strncmp(arg, "--prefix=", 9))
-                       prefix = arg + 9;
-               else
-                       die(write_tree_usage);
-               argc--; argv++;
-       }
-
-       if (argc > 2)
-               die("too many options");
+       newfd = hold_lock_file_for_update(lock_file, get_index_file());
 
+       entries = read_cache();
        if (entries < 0)
                die("git-write-tree: error reading cache");
 
@@ -45,6 +28,7 @@ int main(int argc, char **argv)
                active_cache_tree = cache_tree();
 
        was_valid = cache_tree_fully_valid(active_cache_tree);
+
        if (!was_valid) {
                if (cache_tree_update(active_cache_tree,
                                      active_cache, active_nr,
@@ -52,7 +36,7 @@ int main(int argc, char **argv)
                        die("git-write-tree: error building trees");
                if (0 <= newfd) {
                        if (!write_cache(newfd, active_cache, active_nr))
-                               commit_lock_file(&lock_file);
+                               commit_lock_file(lock_file);
                }
                /* Not being able to write is fine -- we are only interested
                 * in updating the cache-tree part, and if the next caller
@@ -61,12 +45,44 @@ int main(int argc, char **argv)
                 * performance penalty and not a big deal.
                 */
        }
+
        if (prefix) {
                struct cache_tree *subtree =
                        cache_tree_find(active_cache_tree, prefix);
-               printf("%s\n", sha1_to_hex(subtree->sha1));
+               memcpy(sha1, subtree->sha1, 20);
        }
        else
-               printf("%s\n", sha1_to_hex(active_cache_tree->sha1));
+               memcpy(sha1, active_cache_tree->sha1, 20);
+
+       rollback_lock_file(lock_file);
+
        return 0;
 }
+
+int cmd_write_tree(int argc, const char **argv, char **envp)
+{
+       int missing_ok = 0, ret;
+       const char *prefix = NULL;
+       unsigned char sha1[20];
+
+       setup_git_directory();
+
+       while (1 < argc) {
+               const char *arg = argv[1];
+               if (!strcmp(arg, "--missing-ok"))
+                       missing_ok = 1;
+               else if (!strncmp(arg, "--prefix=", 9))
+                       prefix = arg + 9;
+               else
+                       die(write_tree_usage);
+               argc--; argv++;
+       }
+
+       if (argc > 2)
+               die("too many options");
+
+       ret = write_tree(sha1, missing_ok, prefix);
+       printf("%s\n", sha1_to_hex(sha1));
+
+       return ret;
+}