Browse Source

git-commit-tree: make it usable from other builtins

Move all functionality (except option parsing) from cmd_commit_tree() to
commit_tree(), so that other builtins can use it without a child
process.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Miklos Vajna 17 years ago committed by Junio C Hamano
parent
commit
7b9c0a69a5
  1. 71
      builtin-commit-tree.c
  2. 4
      builtin.h

71
builtin-commit-tree.c

@ -45,41 +45,19 @@ static const char commit_utf8_warn[] = @@ -45,41 +45,19 @@ static const char commit_utf8_warn[] =
"You may want to amend it after fixing the message, or set the config\n"
"variable i18n.commitencoding to the encoding your project uses.\n";

int cmd_commit_tree(int argc, const char **argv, const char *prefix)
int commit_tree(const char *msg, unsigned char *tree,
struct commit_list *parents, unsigned char *ret)
{
int i;
struct commit_list *parents = NULL;
unsigned char tree_sha1[20];
unsigned char commit_sha1[20];
struct strbuf buffer;
int encoding_is_utf8;
struct strbuf buffer;

git_config(git_default_config, NULL);

if (argc < 2)
usage(commit_tree_usage);
if (get_sha1(argv[1], tree_sha1))
die("Not a valid object name %s", argv[1]);

check_valid(tree_sha1, OBJ_TREE);
for (i = 2; i < argc; i += 2) {
unsigned char sha1[20];
const char *a, *b;
a = argv[i]; b = argv[i+1];
if (!b || strcmp(a, "-p"))
usage(commit_tree_usage);

if (get_sha1(b, sha1))
die("Not a valid object name %s", b);
check_valid(sha1, OBJ_COMMIT);
new_parent(lookup_commit(sha1), &parents);
}
check_valid(tree, OBJ_TREE);

/* Not having i18n.commitencoding is the same as having utf-8 */
encoding_is_utf8 = is_encoding_utf8(git_commit_encoding);

strbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */
strbuf_addf(&buffer, "tree %s\n", sha1_to_hex(tree_sha1));
strbuf_addf(&buffer, "tree %s\n", sha1_to_hex(tree));

/*
* NOTE! This ordering means that the same exact tree merged with a
@ -102,14 +80,47 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix) @@ -102,14 +80,47 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
strbuf_addch(&buffer, '\n');

/* And add the comment */
if (strbuf_read(&buffer, 0, 0) < 0)
die("git-commit-tree: read returned %s", strerror(errno));
strbuf_addstr(&buffer, msg);

/* And check the encoding */
if (encoding_is_utf8 && !is_utf8(buffer.buf))
fprintf(stderr, commit_utf8_warn);

if (!write_sha1_file(buffer.buf, buffer.len, commit_type, commit_sha1)) {
return write_sha1_file(buffer.buf, buffer.len, commit_type, ret);
}

int cmd_commit_tree(int argc, const char **argv, const char *prefix)
{
int i;
struct commit_list *parents = NULL;
unsigned char tree_sha1[20];
unsigned char commit_sha1[20];
struct strbuf buffer = STRBUF_INIT;

git_config(git_default_config, NULL);

if (argc < 2)
usage(commit_tree_usage);
if (get_sha1(argv[1], tree_sha1))
die("Not a valid object name %s", argv[1]);

for (i = 2; i < argc; i += 2) {
unsigned char sha1[20];
const char *a, *b;
a = argv[i]; b = argv[i+1];
if (!b || strcmp(a, "-p"))
usage(commit_tree_usage);

if (get_sha1(b, sha1))
die("Not a valid object name %s", b);
check_valid(sha1, OBJ_COMMIT);
new_parent(lookup_commit(sha1), &parents);
}

if (strbuf_read(&buffer, 0, 0) < 0)
die("git-commit-tree: read returned %s", strerror(errno));

if (!commit_tree(buffer.buf, tree_sha1, parents, commit_sha1)) {
printf("%s\n", sha1_to_hex(commit_sha1));
return 0;
}

4
builtin.h

@ -3,6 +3,8 @@ @@ -3,6 +3,8 @@

#include "git-compat-util.h"
#include "strbuf.h"
#include "cache.h"
#include "commit.h"

extern const char git_version_string[];
extern const char git_usage_string[];
@ -14,6 +16,8 @@ extern void prune_packed_objects(int); @@ -14,6 +16,8 @@ extern void prune_packed_objects(int);
extern int read_line_with_nul(char *buf, int size, FILE *file);
extern int fmt_merge_msg(int merge_summary, struct strbuf *in,
struct strbuf *out);
extern int commit_tree(const char *msg, unsigned char *tree,
struct commit_list *parents, unsigned char *ret);

extern int cmd_add(int argc, const char **argv, const char *prefix);
extern int cmd_annotate(int argc, const char **argv, const char *prefix);

Loading…
Cancel
Save