From: Sam Vilain <sam.vilain@xxxxxxxxxxxxxxx> Add support in git-commit-tree for -r as well as associated documentation. --- Documentation/git-commit-tree.txt | 6 ++++++ commit-tree.c | 26 +++++++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt index 27b3d12..e11ba1f 100644 --- a/Documentation/git-commit-tree.txt +++ b/Documentation/git-commit-tree.txt @@ -20,6 +20,9 @@ A commit object usually has 1 parent (a to 16 parents. More than one parent represents a merge of branches that led to them. +A commit object can have 1 prior commit. This represents the previous +commit that this one replaces (including history). + While a tree represents a particular directory state of a working directory, a commit represents that state in "time", and explains how to get there. @@ -38,6 +41,8 @@ OPTIONS -p <parent commit>:: Each '-p' indicates the id of a parent commit object. +-r <other commit>:: + One '-r' indicates the id of a prior commit object. Commit Information ------------------ @@ -45,6 +50,7 @@ Commit Information A commit encapsulates: - all parent object ids +- a prior object id (optional) - author name, email and date - committer name and email and the commit time. diff --git a/commit-tree.c b/commit-tree.c index 2d86518..6660b01 100644 --- a/commit-tree.c +++ b/commit-tree.c @@ -61,8 +61,9 @@ static void check_valid(unsigned char *s */ #define MAXPARENT (16) static unsigned char parent_sha1[MAXPARENT][20]; +static unsigned char prior_sha1[21] = "\0"; -static const char commit_tree_usage[] = "git-commit-tree <sha1> [-p <sha1>]* < changelog"; +static const char commit_tree_usage[] = "git-commit-tree <sha1> [-p <sha1>]* [-r <sha1>] < changelog"; static int new_parent(int idx) { @@ -99,11 +100,22 @@ int main(int argc, char **argv) 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])) + if (!b) usage(commit_tree_usage); - check_valid(parent_sha1[parents], commit_type); - if (new_parent(parents)) - parents++; + if (!strcmp(a, "-p")) { + if (get_sha1(b, parent_sha1[parents]) < 0) + usage(commit_tree_usage); + check_valid(parent_sha1[parents], commit_type); + if (new_parent(parents)) + parents++; + } + else if (!strcmp(a, "-r")) { + if (strcmp(&prior_sha1, "") || get_sha1(b, &prior_sha1) < 0) + usage(commit_tree_usage); + } + else { + usage(commit_tree_usage); + } } if (!parents) fprintf(stderr, "Committing initial tree %s\n", argv[1]); @@ -118,6 +130,10 @@ int main(int argc, char **argv) */ for (i = 0; i < parents; i++) add_buffer(&buffer, &size, "parent %s\n", sha1_to_hex(parent_sha1[i])); + if (strcmp(&prior_sha1, "")) { + fprintf(stderr, "Setting prior to %s\n", sha1_to_hex(&prior_sha1)); + add_buffer(&buffer, &size, "prior %s\n", sha1_to_hex(&prior_sha1)); + } /* Person/date information */ add_buffer(&buffer, &size, "author %s\n", git_author_info(1)); - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html