summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--diff-tree.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/diff-tree.c b/diff-tree.c
index d3d83bd8df..9d94e0cc58 100644
--- a/diff-tree.c
+++ b/diff-tree.c
@@ -3,6 +3,7 @@
#include "diff.h"
static int silent = 0;
+static int show_root_diff = 0;
static int verbose_header = 0;
static int ignore_merges = 1;
static int recursive = 0;
@@ -294,6 +295,24 @@ static int diff_tree_sha1_top(const unsigned char *old,
return ret;
}
+static int diff_root_tree(const unsigned char *new, const char *base)
+{
+ int retval;
+ void *tree;
+ unsigned long size;
+
+ if (generate_patch)
+ diff_setup(detect_rename, 0, 0, 0, 0);
+ tree = read_object_with_reference(new, "tree", &size, 0);
+ if (!tree)
+ die("unable to read root tree (%s)", sha1_to_hex(new));
+ retval = diff_tree("", 0, tree, size, base);
+ free(tree);
+ if (generate_patch)
+ diff_flush();
+ return retval;
+}
+
static int get_one_line(const char *msg, unsigned long len)
{
int ret = 0;
@@ -372,18 +391,24 @@ static int diff_tree_commit(const unsigned char *commit, const char *name)
if (!buf)
return -1;
- /* More than one parent? */
- if (ignore_merges) {
- if (!memcmp(buf + 46 + 48, "parent ", 7))
- return 0;
- }
-
if (!name) {
static char commit_name[60];
strcpy(commit_name, sha1_to_hex(commit));
name = commit_name;
}
+ /* Root commit? */
+ if (show_root_diff && memcmp(buf + 46, "parent ", 7)) {
+ header = generate_header(name, "root", buf, size);
+ diff_root_tree(commit, "");
+ }
+
+ /* More than one parent? */
+ if (ignore_merges) {
+ if (!memcmp(buf + 46 + 48, "parent ", 7))
+ return 0;
+ }
+
offset = 46;
while (offset + 48 < size && !memcmp(buf + offset, "parent ", 7)) {
unsigned char parent[20];
@@ -485,6 +510,10 @@ int main(int argc, char **argv)
read_stdin = 1;
continue;
}
+ if (!strcmp(arg, "--root")) {
+ show_root_diff = 1;
+ continue;
+ }
usage(diff_tree_usage);
}