The second batch
[git] / diff-lib.c
1 /*
2  * Copyright (C) 2005 Junio C Hamano
3  */
4 #include "cache.h"
5 #include "quote.h"
6 #include "commit.h"
7 #include "diff.h"
8 #include "diffcore.h"
9 #include "revision.h"
10 #include "cache-tree.h"
11 #include "unpack-trees.h"
12 #include "refs.h"
13 #include "submodule.h"
14 #include "dir.h"
15 #include "fsmonitor.h"
16 #include "commit-reach.h"
17
18 /*
19  * diff-files
20  */
21
22 /*
23  * Has the work tree entity been removed?
24  *
25  * Return 1 if it was removed from the work tree, 0 if an entity to be
26  * compared with the cache entry ce still exists (the latter includes
27  * the case where a directory that is not a submodule repository
28  * exists for ce that is a submodule -- it is a submodule that is not
29  * checked out).  Return negative for an error.
30  */
31 static int check_removed(const struct index_state *istate, const struct cache_entry *ce, struct stat *st)
32 {
33         assert(is_fsmonitor_refreshed(istate));
34         if (!(ce->ce_flags & CE_FSMONITOR_VALID) && lstat(ce->name, st) < 0) {
35                 if (!is_missing_file_error(errno))
36                         return -1;
37                 return 1;
38         }
39         if (has_symlink_leading_path(ce->name, ce_namelen(ce)))
40                 return 1;
41         if (S_ISDIR(st->st_mode)) {
42                 struct object_id sub;
43
44                 /*
45                  * If ce is already a gitlink, we can have a plain
46                  * directory (i.e. the submodule is not checked out),
47                  * or a checked out submodule.  Either case this is not
48                  * a case where something was removed from the work tree,
49                  * so we will return 0.
50                  *
51                  * Otherwise, if the directory is not a submodule
52                  * repository, that means ce which was a blob turned into
53                  * a directory --- the blob was removed!
54                  */
55                 if (!S_ISGITLINK(ce->ce_mode) &&
56                     resolve_gitlink_ref(ce->name, "HEAD", &sub))
57                         return 1;
58         }
59         return 0;
60 }
61
62 /*
63  * Has a file changed or has a submodule new commits or a dirty work tree?
64  *
65  * Return 1 when changes are detected, 0 otherwise. If the DIRTY_SUBMODULES
66  * option is set, the caller does not only want to know if a submodule is
67  * modified at all but wants to know all the conditions that are met (new
68  * commits, untracked content and/or modified content).
69  */
70 static int match_stat_with_submodule(struct diff_options *diffopt,
71                                      const struct cache_entry *ce,
72                                      struct stat *st, unsigned ce_option,
73                                      unsigned *dirty_submodule)
74 {
75         int changed = ie_match_stat(diffopt->repo->index, ce, st, ce_option);
76         if (S_ISGITLINK(ce->ce_mode)) {
77                 struct diff_flags orig_flags = diffopt->flags;
78                 if (!diffopt->flags.override_submodule_config)
79                         set_diffopt_flags_from_submodule_config(diffopt, ce->name);
80                 if (diffopt->flags.ignore_submodules)
81                         changed = 0;
82                 else if (!diffopt->flags.ignore_dirty_submodules &&
83                          (!changed || diffopt->flags.dirty_submodules))
84                         *dirty_submodule = is_submodule_modified(ce->name,
85                                                                  diffopt->flags.ignore_untracked_in_submodules);
86                 diffopt->flags = orig_flags;
87         }
88         return changed;
89 }
90
91 int run_diff_files(struct rev_info *revs, unsigned int option)
92 {
93         int entries, i;
94         int diff_unmerged_stage = revs->max_count;
95         unsigned ce_option = ((option & DIFF_RACY_IS_MODIFIED)
96                               ? CE_MATCH_RACY_IS_DIRTY : 0);
97         uint64_t start = getnanotime();
98         struct index_state *istate = revs->diffopt.repo->index;
99
100         diff_set_mnemonic_prefix(&revs->diffopt, "i/", "w/");
101
102         refresh_fsmonitor(istate);
103
104         if (diff_unmerged_stage < 0)
105                 diff_unmerged_stage = 2;
106         entries = istate->cache_nr;
107         for (i = 0; i < entries; i++) {
108                 unsigned int oldmode, newmode;
109                 struct cache_entry *ce = istate->cache[i];
110                 int changed;
111                 unsigned dirty_submodule = 0;
112                 const struct object_id *old_oid, *new_oid;
113
114                 if (diff_can_quit_early(&revs->diffopt))
115                         break;
116
117                 if (!ce_path_match(istate, ce, &revs->prune_data, NULL))
118                         continue;
119
120                 if (ce_stage(ce)) {
121                         struct combine_diff_path *dpath;
122                         struct diff_filepair *pair;
123                         unsigned int wt_mode = 0;
124                         int num_compare_stages = 0;
125                         size_t path_len;
126                         struct stat st;
127
128                         path_len = ce_namelen(ce);
129
130                         dpath = xmalloc(combine_diff_path_size(5, path_len));
131                         dpath->path = (char *) &(dpath->parent[5]);
132
133                         dpath->next = NULL;
134                         memcpy(dpath->path, ce->name, path_len);
135                         dpath->path[path_len] = '\0';
136                         oidclr(&dpath->oid);
137                         memset(&(dpath->parent[0]), 0,
138                                sizeof(struct combine_diff_parent)*5);
139
140                         changed = check_removed(istate, ce, &st);
141                         if (!changed)
142                                 wt_mode = ce_mode_from_stat(ce, st.st_mode);
143                         else {
144                                 if (changed < 0) {
145                                         perror(ce->name);
146                                         continue;
147                                 }
148                                 wt_mode = 0;
149                         }
150                         dpath->mode = wt_mode;
151
152                         while (i < entries) {
153                                 struct cache_entry *nce = istate->cache[i];
154                                 int stage;
155
156                                 if (strcmp(ce->name, nce->name))
157                                         break;
158
159                                 /* Stage #2 (ours) is the first parent,
160                                  * stage #3 (theirs) is the second.
161                                  */
162                                 stage = ce_stage(nce);
163                                 if (2 <= stage) {
164                                         int mode = nce->ce_mode;
165                                         num_compare_stages++;
166                                         oidcpy(&dpath->parent[stage - 2].oid,
167                                                &nce->oid);
168                                         dpath->parent[stage-2].mode = ce_mode_from_stat(nce, mode);
169                                         dpath->parent[stage-2].status =
170                                                 DIFF_STATUS_MODIFIED;
171                                 }
172
173                                 /* diff against the proper unmerged stage */
174                                 if (stage == diff_unmerged_stage)
175                                         ce = nce;
176                                 i++;
177                         }
178                         /*
179                          * Compensate for loop update
180                          */
181                         i--;
182
183                         if (revs->combine_merges && num_compare_stages == 2) {
184                                 show_combined_diff(dpath, 2, revs);
185                                 free(dpath);
186                                 continue;
187                         }
188                         FREE_AND_NULL(dpath);
189
190                         /*
191                          * Show the diff for the 'ce' if we found the one
192                          * from the desired stage.
193                          */
194                         pair = diff_unmerge(&revs->diffopt, ce->name);
195                         if (wt_mode)
196                                 pair->two->mode = wt_mode;
197                         if (ce_stage(ce) != diff_unmerged_stage)
198                                 continue;
199                 }
200
201                 if (ce_uptodate(ce) || ce_skip_worktree(ce))
202                         continue;
203
204                 /*
205                  * When CE_VALID is set (via "update-index --assume-unchanged"
206                  * or via adding paths while core.ignorestat is set to true),
207                  * the user has promised that the working tree file for that
208                  * path will not be modified.  When CE_FSMONITOR_VALID is true,
209                  * the fsmonitor knows that the path hasn't been modified since
210                  * we refreshed the cached stat information.  In either case,
211                  * we do not have to stat to see if the path has been removed
212                  * or modified.
213                  */
214                 if (ce->ce_flags & (CE_VALID | CE_FSMONITOR_VALID)) {
215                         changed = 0;
216                         newmode = ce->ce_mode;
217                 } else {
218                         struct stat st;
219
220                         changed = check_removed(istate, ce, &st);
221                         if (changed) {
222                                 if (changed < 0) {
223                                         perror(ce->name);
224                                         continue;
225                                 }
226                                 diff_addremove(&revs->diffopt, '-', ce->ce_mode,
227                                                &ce->oid,
228                                                !is_null_oid(&ce->oid),
229                                                ce->name, 0);
230                                 continue;
231                         } else if (revs->diffopt.ita_invisible_in_index &&
232                                    ce_intent_to_add(ce)) {
233                                 newmode = ce_mode_from_stat(ce, st.st_mode);
234                                 diff_addremove(&revs->diffopt, '+', newmode,
235                                                null_oid(), 0, ce->name, 0);
236                                 continue;
237                         }
238
239                         changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
240                                                             ce_option, &dirty_submodule);
241                         newmode = ce_mode_from_stat(ce, st.st_mode);
242                 }
243
244                 if (!changed && !dirty_submodule) {
245                         ce_mark_uptodate(ce);
246                         mark_fsmonitor_valid(istate, ce);
247                         if (!revs->diffopt.flags.find_copies_harder)
248                                 continue;
249                 }
250                 oldmode = ce->ce_mode;
251                 old_oid = &ce->oid;
252                 new_oid = changed ? null_oid() : &ce->oid;
253                 diff_change(&revs->diffopt, oldmode, newmode,
254                             old_oid, new_oid,
255                             !is_null_oid(old_oid),
256                             !is_null_oid(new_oid),
257                             ce->name, 0, dirty_submodule);
258
259         }
260         diffcore_std(&revs->diffopt);
261         diff_flush(&revs->diffopt);
262         trace_performance_since(start, "diff-files");
263         return 0;
264 }
265
266 /*
267  * diff-index
268  */
269
270 /* A file entry went away or appeared */
271 static void diff_index_show_file(struct rev_info *revs,
272                                  const char *prefix,
273                                  const struct cache_entry *ce,
274                                  const struct object_id *oid, int oid_valid,
275                                  unsigned int mode,
276                                  unsigned dirty_submodule)
277 {
278         diff_addremove(&revs->diffopt, prefix[0], mode,
279                        oid, oid_valid, ce->name, dirty_submodule);
280 }
281
282 static int get_stat_data(const struct index_state *istate,
283                          const struct cache_entry *ce,
284                          const struct object_id **oidp,
285                          unsigned int *modep,
286                          int cached, int match_missing,
287                          unsigned *dirty_submodule, struct diff_options *diffopt)
288 {
289         const struct object_id *oid = &ce->oid;
290         unsigned int mode = ce->ce_mode;
291
292         if (!cached && !ce_uptodate(ce)) {
293                 int changed;
294                 struct stat st;
295                 changed = check_removed(istate, ce, &st);
296                 if (changed < 0)
297                         return -1;
298                 else if (changed) {
299                         if (match_missing) {
300                                 *oidp = oid;
301                                 *modep = mode;
302                                 return 0;
303                         }
304                         return -1;
305                 }
306                 changed = match_stat_with_submodule(diffopt, ce, &st,
307                                                     0, dirty_submodule);
308                 if (changed) {
309                         mode = ce_mode_from_stat(ce, st.st_mode);
310                         oid = null_oid();
311                 }
312         }
313
314         *oidp = oid;
315         *modep = mode;
316         return 0;
317 }
318
319 static void show_new_file(struct rev_info *revs,
320                           const struct cache_entry *new_file,
321                           int cached, int match_missing)
322 {
323         const struct object_id *oid;
324         unsigned int mode;
325         unsigned dirty_submodule = 0;
326         struct index_state *istate = revs->diffopt.repo->index;
327
328         /*
329          * New file in the index: it might actually be different in
330          * the working tree.
331          */
332         if (get_stat_data(istate, new_file, &oid, &mode, cached, match_missing,
333             &dirty_submodule, &revs->diffopt) < 0)
334                 return;
335
336         diff_index_show_file(revs, "+", new_file, oid, !is_null_oid(oid), mode, dirty_submodule);
337 }
338
339 static int show_modified(struct rev_info *revs,
340                          const struct cache_entry *old_entry,
341                          const struct cache_entry *new_entry,
342                          int report_missing,
343                          int cached, int match_missing)
344 {
345         unsigned int mode, oldmode;
346         const struct object_id *oid;
347         unsigned dirty_submodule = 0;
348         struct index_state *istate = revs->diffopt.repo->index;
349
350         if (get_stat_data(istate, new_entry, &oid, &mode, cached, match_missing,
351                           &dirty_submodule, &revs->diffopt) < 0) {
352                 if (report_missing)
353                         diff_index_show_file(revs, "-", old_entry,
354                                              &old_entry->oid, 1, old_entry->ce_mode,
355                                              0);
356                 return -1;
357         }
358
359         if (revs->combine_merges && !cached &&
360             (!oideq(oid, &old_entry->oid) || !oideq(&old_entry->oid, &new_entry->oid))) {
361                 struct combine_diff_path *p;
362                 int pathlen = ce_namelen(new_entry);
363
364                 p = xmalloc(combine_diff_path_size(2, pathlen));
365                 p->path = (char *) &p->parent[2];
366                 p->next = NULL;
367                 memcpy(p->path, new_entry->name, pathlen);
368                 p->path[pathlen] = 0;
369                 p->mode = mode;
370                 oidclr(&p->oid);
371                 memset(p->parent, 0, 2 * sizeof(struct combine_diff_parent));
372                 p->parent[0].status = DIFF_STATUS_MODIFIED;
373                 p->parent[0].mode = new_entry->ce_mode;
374                 oidcpy(&p->parent[0].oid, &new_entry->oid);
375                 p->parent[1].status = DIFF_STATUS_MODIFIED;
376                 p->parent[1].mode = old_entry->ce_mode;
377                 oidcpy(&p->parent[1].oid, &old_entry->oid);
378                 show_combined_diff(p, 2, revs);
379                 free(p);
380                 return 0;
381         }
382
383         oldmode = old_entry->ce_mode;
384         if (mode == oldmode && oideq(oid, &old_entry->oid) && !dirty_submodule &&
385             !revs->diffopt.flags.find_copies_harder)
386                 return 0;
387
388         diff_change(&revs->diffopt, oldmode, mode,
389                     &old_entry->oid, oid, 1, !is_null_oid(oid),
390                     old_entry->name, 0, dirty_submodule);
391         return 0;
392 }
393
394 /*
395  * This gets a mix of an existing index and a tree, one pathname entry
396  * at a time. The index entry may be a single stage-0 one, but it could
397  * also be multiple unmerged entries (in which case idx_pos/idx_nr will
398  * give you the position and number of entries in the index).
399  */
400 static void do_oneway_diff(struct unpack_trees_options *o,
401                            const struct cache_entry *idx,
402                            const struct cache_entry *tree)
403 {
404         struct rev_info *revs = o->unpack_data;
405         int match_missing, cached;
406
407         /*
408          * i-t-a entries do not actually exist in the index (if we're
409          * looking at its content)
410          */
411         if (o->index_only &&
412             revs->diffopt.ita_invisible_in_index &&
413             idx && ce_intent_to_add(idx)) {
414                 idx = NULL;
415                 if (!tree)
416                         return; /* nothing to diff.. */
417         }
418
419         /* if the entry is not checked out, don't examine work tree */
420         cached = o->index_only ||
421                 (idx && ((idx->ce_flags & CE_VALID) || ce_skip_worktree(idx)));
422
423         match_missing = revs->match_missing;
424
425         if (cached && idx && ce_stage(idx)) {
426                 struct diff_filepair *pair;
427                 pair = diff_unmerge(&revs->diffopt, idx->name);
428                 if (tree)
429                         fill_filespec(pair->one, &tree->oid, 1,
430                                       tree->ce_mode);
431                 return;
432         }
433
434         /*
435          * Something added to the tree?
436          */
437         if (!tree) {
438                 show_new_file(revs, idx, cached, match_missing);
439                 return;
440         }
441
442         /*
443          * Something removed from the tree?
444          */
445         if (!idx) {
446                 diff_index_show_file(revs, "-", tree, &tree->oid, 1,
447                                      tree->ce_mode, 0);
448                 return;
449         }
450
451         /* Show difference between old and new */
452         show_modified(revs, tree, idx, 1, cached, match_missing);
453 }
454
455 /*
456  * The unpack_trees() interface is designed for merging, so
457  * the different source entries are designed primarily for
458  * the source trees, with the old index being really mainly
459  * used for being replaced by the result.
460  *
461  * For diffing, the index is more important, and we only have a
462  * single tree.
463  *
464  * We're supposed to advance o->pos to skip what we have already processed.
465  *
466  * This wrapper makes it all more readable, and takes care of all
467  * the fairly complex unpack_trees() semantic requirements, including
468  * the skipping, the path matching, the type conflict cases etc.
469  */
470 static int oneway_diff(const struct cache_entry * const *src,
471                        struct unpack_trees_options *o)
472 {
473         const struct cache_entry *idx = src[0];
474         const struct cache_entry *tree = src[1];
475         struct rev_info *revs = o->unpack_data;
476
477         /*
478          * Unpack-trees generates a DF/conflict entry if
479          * there was a directory in the index and a tree
480          * in the tree. From a diff standpoint, that's a
481          * delete of the tree and a create of the file.
482          */
483         if (tree == o->df_conflict_entry)
484                 tree = NULL;
485
486         if (ce_path_match(revs->diffopt.repo->index,
487                           idx ? idx : tree,
488                           &revs->prune_data, NULL)) {
489                 do_oneway_diff(o, idx, tree);
490                 if (diff_can_quit_early(&revs->diffopt)) {
491                         o->exiting_early = 1;
492                         return -1;
493                 }
494         }
495
496         return 0;
497 }
498
499 static int diff_cache(struct rev_info *revs,
500                       const struct object_id *tree_oid,
501                       const char *tree_name,
502                       int cached)
503 {
504         struct tree *tree;
505         struct tree_desc t;
506         struct unpack_trees_options opts;
507
508         tree = parse_tree_indirect(tree_oid);
509         if (!tree)
510                 return error("bad tree object %s",
511                              tree_name ? tree_name : oid_to_hex(tree_oid));
512         memset(&opts, 0, sizeof(opts));
513         opts.head_idx = 1;
514         opts.index_only = cached;
515         opts.diff_index_cached = (cached &&
516                                   !revs->diffopt.flags.find_copies_harder);
517         opts.merge = 1;
518         opts.fn = oneway_diff;
519         opts.unpack_data = revs;
520         opts.src_index = revs->diffopt.repo->index;
521         opts.dst_index = NULL;
522         opts.pathspec = &revs->diffopt.pathspec;
523         opts.pathspec->recursive = 1;
524
525         init_tree_desc(&t, tree->buffer, tree->size);
526         return unpack_trees(1, &t, &opts);
527 }
528
529 void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb)
530 {
531         int i;
532         struct commit *mb_child[2] = {0};
533         struct commit_list *merge_bases;
534
535         for (i = 0; i < revs->pending.nr; i++) {
536                 struct object *obj = revs->pending.objects[i].item;
537                 if (obj->flags)
538                         die(_("--merge-base does not work with ranges"));
539                 if (obj->type != OBJ_COMMIT)
540                         die(_("--merge-base only works with commits"));
541         }
542
543         /*
544          * This check must go after the for loop above because A...B
545          * ranges produce three pending commits, resulting in a
546          * misleading error message.
547          */
548         if (revs->pending.nr < 1 || revs->pending.nr > 2)
549                 BUG("unexpected revs->pending.nr: %d", revs->pending.nr);
550
551         for (i = 0; i < revs->pending.nr; i++)
552                 mb_child[i] = lookup_commit_reference(the_repository, &revs->pending.objects[i].item->oid);
553         if (revs->pending.nr == 1) {
554                 struct object_id oid;
555
556                 if (get_oid("HEAD", &oid))
557                         die(_("unable to get HEAD"));
558
559                 mb_child[1] = lookup_commit_reference(the_repository, &oid);
560         }
561
562         merge_bases = repo_get_merge_bases(the_repository, mb_child[0], mb_child[1]);
563         if (!merge_bases)
564                 die(_("no merge base found"));
565         if (merge_bases->next)
566                 die(_("multiple merge bases found"));
567
568         oidcpy(mb, &merge_bases->item->object.oid);
569
570         free_commit_list(merge_bases);
571 }
572
573 int run_diff_index(struct rev_info *revs, unsigned int option)
574 {
575         struct object_array_entry *ent;
576         int cached = !!(option & DIFF_INDEX_CACHED);
577         int merge_base = !!(option & DIFF_INDEX_MERGE_BASE);
578         struct object_id oid;
579         const char *name;
580         char merge_base_hex[GIT_MAX_HEXSZ + 1];
581         struct index_state *istate = revs->diffopt.repo->index;
582
583         if (revs->pending.nr != 1)
584                 BUG("run_diff_index must be passed exactly one tree");
585
586         trace_performance_enter();
587         ent = revs->pending.objects;
588
589         refresh_fsmonitor(istate);
590
591         if (merge_base) {
592                 diff_get_merge_base(revs, &oid);
593                 name = oid_to_hex_r(merge_base_hex, &oid);
594         } else {
595                 oidcpy(&oid, &ent->item->oid);
596                 name = ent->name;
597         }
598
599         if (diff_cache(revs, &oid, name, cached))
600                 exit(128);
601
602         diff_set_mnemonic_prefix(&revs->diffopt, "c/", cached ? "i/" : "w/");
603         diffcore_fix_diff_index();
604         diffcore_std(&revs->diffopt);
605         diff_flush(&revs->diffopt);
606         trace_performance_leave("diff-index");
607         return 0;
608 }
609
610 int do_diff_cache(const struct object_id *tree_oid, struct diff_options *opt)
611 {
612         struct rev_info revs;
613
614         repo_init_revisions(opt->repo, &revs, NULL);
615         copy_pathspec(&revs.prune_data, &opt->pathspec);
616         diff_setup_done(&revs.diffopt);
617         revs.diffopt = *opt;
618
619         if (diff_cache(&revs, tree_oid, NULL, 1))
620                 exit(128);
621         clear_pathspec(&revs.prune_data);
622         return 0;
623 }
624
625 int index_differs_from(struct repository *r,
626                        const char *def, const struct diff_flags *flags,
627                        int ita_invisible_in_index)
628 {
629         struct rev_info rev;
630         struct setup_revision_opt opt;
631
632         repo_init_revisions(r, &rev, NULL);
633         memset(&opt, 0, sizeof(opt));
634         opt.def = def;
635         setup_revisions(0, NULL, &rev, &opt);
636         rev.diffopt.flags.quick = 1;
637         rev.diffopt.flags.exit_with_status = 1;
638         if (flags)
639                 diff_flags_or(&rev.diffopt.flags, flags);
640         rev.diffopt.ita_invisible_in_index = ita_invisible_in_index;
641         run_diff_index(&rev, 1);
642         object_array_clear(&rev.pending);
643         return (rev.diffopt.flags.has_changes != 0);
644 }
645
646 static struct strbuf *idiff_prefix_cb(struct diff_options *opt, void *data)
647 {
648         return data;
649 }
650
651 void show_interdiff(const struct object_id *oid1, const struct object_id *oid2,
652                     int indent, struct diff_options *diffopt)
653 {
654         struct diff_options opts;
655         struct strbuf prefix = STRBUF_INIT;
656
657         memcpy(&opts, diffopt, sizeof(opts));
658         opts.output_format = DIFF_FORMAT_PATCH;
659         opts.output_prefix = idiff_prefix_cb;
660         strbuf_addchars(&prefix, ' ', indent);
661         opts.output_prefix_data = &prefix;
662         diff_setup_done(&opts);
663
664         diff_tree_oid(oid1, oid2, "", &opts);
665         diffcore_std(&opts);
666         diff_flush(&opts);
667
668         strbuf_release(&prefix);
669 }