2 * GIT - The information manager from hell
4 * Copyright (C) Linus Torvalds, 2005
10 static int unpack_tree(unsigned char *sha1
)
16 buffer
= read_object_with_reference(sha1
, "tree", &size
, 0);
19 ret
= read_tree(buffer
, size
, stage
);
24 static char *lockfile_name
;
26 static void remove_lock_file(void)
29 unlink(lockfile_name
);
32 static int path_matches(struct cache_entry
*a
, struct cache_entry
*b
)
34 int len
= ce_namelen(a
);
35 return ce_namelen(b
) == len
&&
36 !memcmp(a
->name
, b
->name
, len
);
39 static int same(struct cache_entry
*a
, struct cache_entry
*b
)
41 return a
->ce_mode
== b
->ce_mode
&&
42 !memcmp(a
->sha1
, b
->sha1
, 20);
47 * This removes all trivial merges that don't change the tree
48 * and collapses them to state 0.
50 * _Any_ other merge is left to user policy. That includes "both
51 * created the same file", and "both removed the same file" - which are
52 * trivial, but the user might still want to _note_ it.
54 static struct cache_entry
*merge_entries(struct cache_entry
*a
,
55 struct cache_entry
*b
,
56 struct cache_entry
*c
)
58 int len
= ce_namelen(a
);
61 * Are they all the same filename? We won't do
64 if (ce_namelen(b
) != len
||
65 ce_namelen(c
) != len
||
66 memcmp(a
->name
, b
->name
, len
) ||
67 memcmp(a
->name
, c
->name
, len
))
71 * Ok, all three entries describe the same
72 * filename, but maybe the contents or file
75 * The trivial cases end up being the ones where two
76 * out of three files are the same:
77 * - both destinations the same, trivially take either
78 * - one of the destination versions hasn't changed,
81 * The "all entries exactly the same" case falls out as
82 * a special case of any of the "two same" cases.
84 * Here "a" is "original", and "b" and "c" are the two
85 * trees we are merging.
96 static void trivially_merge_cache(struct cache_entry
**src
, int nr
)
98 static struct cache_entry null_entry
;
99 struct cache_entry
**dst
= src
;
100 struct cache_entry
*old
= &null_entry
;
103 struct cache_entry
*ce
, *result
;
107 /* We throw away original cache entries except for the stat information */
115 if (nr
> 2 && (result
= merge_entries(ce
, src
[1], src
[2])) != NULL
) {
117 * See if we can re-use the old CE directly?
118 * That way we get the uptodate stat info.
120 if (path_matches(result
, old
) && same(result
, old
))
123 ce
->ce_flags
&= ~htons(CE_STAGEMASK
);
134 static void merge_stat_info(struct cache_entry
**src
, int nr
)
136 static struct cache_entry null_entry
;
137 struct cache_entry
**dst
= src
;
138 struct cache_entry
*old
= &null_entry
;
141 struct cache_entry
*ce
;
145 /* We throw away original cache entries except for the stat information */
153 if (path_matches(ce
, old
) && same(ce
, old
))
155 ce
->ce_flags
&= ~htons(CE_STAGEMASK
);
162 static char *read_tree_usage
= "git-read-tree (<sha> | -m <sha1> [<sha2> <sha3>])";
164 int main(int argc
, char **argv
)
167 unsigned char sha1
[20];
168 static char lockfile
[MAXPATHLEN
+1];
169 const char *indexfile
= get_index_file();
171 snprintf(lockfile
, sizeof(lockfile
), "%s.lock", indexfile
);
173 newfd
= open(lockfile
, O_RDWR
| O_CREAT
| O_EXCL
, 0600);
175 die("unable to create new cachefile");
176 atexit(remove_lock_file
);
177 lockfile_name
= lockfile
;
180 for (i
= 1; i
< argc
; i
++) {
181 const char *arg
= argv
[i
];
183 /* "-m" stands for "merge", meaning we start in stage 1 */
184 if (!strcmp(arg
, "-m")) {
187 die("-m needs to come first");
189 for (i
= 0; i
< active_nr
; i
++) {
190 if (ce_stage(active_cache
[i
]))
191 die("you need to resolve your current index first");
197 if (get_sha1(arg
, sha1
) < 0)
198 usage(read_tree_usage
);
200 usage(read_tree_usage
);
201 if (unpack_tree(sha1
) < 0)
202 die("failed to unpack tree object %s", arg
);
207 case 4: /* Three-way merge */
208 trivially_merge_cache(active_cache
, active_nr
);
210 case 2: /* Just read a tree, merge with old cache contents */
211 merge_stat_info(active_cache
, active_nr
);
214 die("just how do you expect me to merge %d trees?", stage
-1);
217 if (write_cache(newfd
, active_cache
, active_nr
) || rename(lockfile
, indexfile
))
218 die("unable to write new index file");
219 lockfile_name
= NULL
;