wt-status.c: remove implicit dependency on the_index
[gitweb.git] / builtin / log.c
index fa54090b0264030be8a6626b5ddd35f9659185a4..061d4fd864f3fb479e2877e3bbf25928ad1fb9d3 100644 (file)
@@ -31,6 +31,7 @@
 #include "progress.h"
 #include "commit-slab.h"
 #include "repository.h"
+#include "commit-reach.h"
 #include "interdiff.h"
 #include "range-diff.h"
 
@@ -117,7 +118,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,
 
 static void init_log_defaults(void)
 {
-       init_grep_defaults();
+       init_grep_defaults(the_repository);
        init_diff_ui_defaults();
 
        decoration_style = auto_decoration_style();
@@ -469,7 +470,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
        init_log_defaults();
        git_config(git_log_config, NULL);
 
-       init_revisions(&rev, prefix);
+       repo_init_revisions(the_repository, &rev, prefix);
        rev.diff = 1;
        rev.simplify_history = 0;
        memset(&opt, 0, sizeof(opt));
@@ -509,7 +510,8 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c
                                 &oidc, &obj_context))
                die(_("Not a valid object name %s"), obj_name);
        if (!obj_context.path ||
-           !textconv_object(obj_context.path, obj_context.mode, &oidc, 1, &buf, &size)) {
+           !textconv_object(the_repository, obj_context.path,
+                            obj_context.mode, &oidc, 1, &buf, &size)) {
                free(obj_context.path);
                return stream_blob_to_fd(1, oid, NULL, 0);
        }
@@ -586,7 +588,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
        git_config(git_log_config, NULL);
 
        memset(&match_all, 0, sizeof(match_all));
-       init_revisions(&rev, prefix);
+       repo_init_revisions(the_repository, &rev, prefix);
        rev.diff = 1;
        rev.always_show_header = 1;
        rev.no_walk = REVISION_WALK_NO_WALK_SORTED;
@@ -666,7 +668,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)
        init_log_defaults();
        git_config(git_log_config, NULL);
 
-       init_revisions(&rev, prefix);
+       repo_init_revisions(the_repository, &rev, prefix);
        init_reflog_walk(&rev.reflog_info);
        rev.verbose_header = 1;
        memset(&opt, 0, sizeof(opt));
@@ -705,7 +707,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)
        init_log_defaults();
        git_config(git_log_config, NULL);
 
-       init_revisions(&rev, prefix);
+       repo_init_revisions(the_repository, &rev, prefix);
        rev.always_show_header = 1;
        memset(&opt, 0, sizeof(opt));
        opt.def = "HEAD";
@@ -915,10 +917,10 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)
        if ((flags1 & UNINTERESTING) == (flags2 & UNINTERESTING))
                die(_("Not a range."));
 
-       init_patch_ids(ids);
+       init_patch_ids(the_repository, ids);
 
        /* given a range a..b get all patch ids for b..a */
-       init_revisions(&check_rev, rev->prefix);
+       repo_init_revisions(the_repository, &check_rev, rev->prefix);
        check_rev.max_parents = 1;
        o1->flags ^= UNINTERESTING;
        o2->flags ^= UNINTERESTING;
@@ -994,7 +996,7 @@ static char *find_branch_name(struct rev_info *rev)
        tip_oid = &rev->cmdline.rev[positive].item->oid;
        if (dwim_ref(ref, strlen(ref), &branch_oid, &full_ref) &&
            skip_prefix(full_ref, "refs/heads/", &v) &&
-           !oidcmp(tip_oid, &branch_oid))
+           oideq(tip_oid, &branch_oid))
                branch = xstrdup(v);
        free(full_ref);
        return branch;
@@ -1092,7 +1094,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
        }
 
        if (rev->rdiff1) {
-               fprintf_ln(rev->diffopt.file, "%s", _("Range-diff:"));
+               fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title);
                show_range_diff(rev->rdiff1, rev->rdiff2,
                                rev->creation_factor, 1, &rev->diffopt);
        }
@@ -1376,13 +1378,13 @@ static void prepare_bases(struct base_tree_info *bases,
                return;
 
        init_commit_base(&commit_base);
-       diff_setup(&diffopt);
+       repo_diff_setup(the_repository, &diffopt);
        diffopt.flags.recursive = 1;
        diff_setup_done(&diffopt);
 
        oidcpy(&bases->base_commit, &base->object.oid);
 
-       init_revisions(&revs, NULL);
+       repo_init_revisions(the_repository, &revs, NULL);
        revs.max_parents = 1;
        revs.topo_order = 1;
        for (i = 0; i < total; i++) {
@@ -1497,6 +1499,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        const char *rdiff_prev = NULL;
        struct strbuf rdiff1 = STRBUF_INIT;
        struct strbuf rdiff2 = STRBUF_INIT;
+       struct strbuf rdiff_title = STRBUF_INIT;
+       int creation_factor = -1;
 
        const struct option builtin_format_patch_options[] = {
                { OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
@@ -1574,7 +1578,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                             N_("show changes against <rev> in cover letter or single patch"),
                             parse_opt_object_name),
                OPT_STRING(0, "range-diff", &rdiff_prev, N_("refspec"),
-                          N_("show changes against <refspec> in cover letter")),
+                          N_("show changes against <refspec> in cover letter or single patch")),
+               OPT_INTEGER(0, "creation-factor", &creation_factor,
+                           N_("percentage by which creation is weighted")),
                OPT_END()
        };
 
@@ -1583,7 +1589,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        extra_cc.strdup_strings = 1;
        init_log_defaults();
        git_config(git_format_config, NULL);
-       init_revisions(&rev, prefix);
+       repo_init_revisions(the_repository, &rev, prefix);
        rev.commit_format = CMIT_FMT_EMAIL;
        rev.expand_tabs_in_log_default = 0;
        rev.verbose_header = 1;
@@ -1664,14 +1670,14 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                numbered = 0;
 
        if (numbered && keep_subject)
-               die (_("-n and -k are mutually exclusive."));
+               die(_("-n and -k are mutually exclusive"));
        if (keep_subject && subject_prefix)
-               die (_("--subject-prefix/--rfc and -k are mutually exclusive."));
+               die(_("--subject-prefix/--rfc and -k are mutually exclusive"));
        rev.preserve_subject = keep_subject;
 
        argc = setup_revisions(argc, argv, &rev, &s_r_opt);
        if (argc > 1)
-               die (_("unrecognized argument: %s"), argv[1]);
+               die(_("unrecognized argument: %s"), argv[1]);
 
        if (rev.diffopt.output_format & DIFF_FORMAT_NAME)
                die(_("--name-only does not make sense"));
@@ -1759,7 +1765,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                /* Don't say anything if head and upstream are the same. */
                if (rev.pending.nr == 2) {
                        struct object_array_entry *o = rev.pending.objects;
-                       if (oidcmp(&o[0].item->oid, &o[1].item->oid) == 0)
+                       if (oideq(&o[0].item->oid, &o[1].item->oid))
                                goto done;
                }
                get_patch_ids(&rev, &ids);
@@ -1807,15 +1813,23 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                                             _("Interdiff against v%d:"));
        }
 
+       if (creation_factor < 0)
+               creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
+       else if (!rdiff_prev)
+               die(_("--creation-factor requires --range-diff"));
+
        if (rdiff_prev) {
-               if (!cover_letter)
-                       die(_("--range-diff requires --cover-letter"));
+               if (!cover_letter && total != 1)
+                       die(_("--range-diff requires --cover-letter or single patch"));
 
                infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev,
                                        origin, list[0]);
                rev.rdiff1 = rdiff1.buf;
                rev.rdiff2 = rdiff2.buf;
-               rev.creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
+               rev.creation_factor = creation_factor;
+               rev.rdiff_title = diff_title(&rdiff_title, reroll_count,
+                                            _("Range-diff:"),
+                                            _("Range-diff against v%d:"));
        }
 
        if (!signature) {
@@ -1855,8 +1869,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                print_signature(rev.diffopt.file);
                total++;
                start_number--;
-               /* interdiff in cover-letter; omit from patches */
+               /* interdiff/range-diff in cover-letter; omit from patches */
                rev.idiff_oid1 = NULL;
+               rev.rdiff1 = NULL;
        }
        rev.add_signoff = do_signoff;
 
@@ -1943,6 +1958,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        strbuf_release(&idiff_title);
        strbuf_release(&rdiff1);
        strbuf_release(&rdiff2);
+       strbuf_release(&rdiff_title);
        return 0;
 }
 
@@ -2023,7 +2039,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)
                }
        }
 
-       init_revisions(&revs, prefix);
+       repo_init_revisions(the_repository, &revs, prefix);
        revs.max_parents = 1;
 
        if (add_pending_commit(head, &revs, 0))
@@ -2034,7 +2050,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)
        /* Don't say anything if head and upstream are the same. */
        if (revs.pending.nr == 2) {
                struct object_array_entry *o = revs.pending.objects;
-               if (oidcmp(&o[0].item->oid, &o[1].item->oid) == 0)
+               if (oideq(&o[0].item->oid, &o[1].item->oid))
                        return 0;
        }