blame.c: remove implicit dependency on the_index

Side note, since we gain access to the right repository, we can stop rely on the_repository in this code as well. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Aug 13, 2018 at 18:14 UTC ecbbc0a53b0393c3b835440b397dedfa9d28ec01
3 files changed +33 -21
blame.c
+31 -21
@@ -90,7 +90,8 @@ static struct blame_origin *get_origin(struct commit *commit, const char *path)
90
91
92
93 -static void verify_working_tree_path(struct commit *work_tree, const char *path)
93 +static void verify_working_tree_path(struct repository *repo,
94 + struct commit *work_tree, const char *path)
95 {
96 struct commit_list *parents;
97 int pos;
@@ -101,15 +102,15 @@ static void verify_working_tree_path(struct commit *work_tree, const char *path)
102 unsigned mode;
103
104 if (!get_tree_entry(commit_oid, path, &blob_oid, &mode) &&
104 - oid_object_info(the_repository, &blob_oid, NULL) == OBJ_BLOB)
105 + oid_object_info(repo, &blob_oid, NULL) == OBJ_BLOB)
106 return;
107 }
108
108 - pos = cache_name_pos(path, strlen(path));
109 + pos = index_name_pos(repo->index, path, strlen(path));
110 if (pos >= 0)
111 ; /* path is in the index */
111 - else if (-1 - pos < active_nr &&
112 - !strcmp(active_cache[-1 - pos]->name, path))
112 + else if (-1 - pos < repo->index->cache_nr &&
113 + !strcmp(repo->index->cache[-1 - pos]->name, path))
114 ; /* path is in the index, unmerged */
115 else
116 die("no such path '%s' in HEAD", path);
@@ -165,7 +166,8 @@ static void set_commit_buffer_from_strbuf(struct commit *c, struct strbuf *sb)
166 * Prepare a dummy commit that represents the work tree (or staged) item.
167 * Note that annotating work tree item never works in the reverse.
168 */
168 -static struct commit *fake_working_tree_commit(struct diff_options *opt,
169 +static struct commit *fake_working_tree_commit(struct repository *repo,
170 + struct diff_options *opt,
171 const char *path,
172 const char *contents_from)
173 {
@@ -181,7 +183,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
183 unsigned mode;
184 struct strbuf msg = STRBUF_INIT;
185
184 - read_cache();
186 + read_index(repo->index);
187 time(&now);
188 commit = alloc_commit_node(the_repository);
189 commit->object.parsed = 1;
@@ -193,7 +195,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
195
196 parent_tail = append_parent(parent_tail, &head_oid);
197 append_merge_parents(parent_tail);
196 - verify_working_tree_path(commit, path);
198 + verify_working_tree_path(repo, commit, path);
199
200 origin = make_origin(commit, path);
201
@@ -251,7 +253,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
253 if (strbuf_read(&buf, 0, 0) < 0)
254 die_errno("failed to read from stdin");
255 }
254 - convert_to_git(&the_index, path, buf.buf, buf.len, &buf, 0);
256 + convert_to_git(repo->index, path, buf.buf, buf.len, &buf, 0);
257 origin->file.ptr = buf.buf;
258 origin->file.size = buf.len;
259 pretend_object_file(buf.buf, buf.len, OBJ_BLOB, &origin->blob_oid);
@@ -262,27 +264,28 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
264 * bits; we are not going to write this index out -- we just
265 * want to run "diff-index --cached".
266 */
265 - discard_cache();
266 - read_cache();
267 + discard_index(repo->index);
268 + read_index(repo->index);
269
270 len = strlen(path);
271 if (!mode) {
270 - int pos = cache_name_pos(path, len);
272 + int pos = index_name_pos(repo->index, path, len);
273 if (0 <= pos)
272 - mode = active_cache[pos]->ce_mode;
274 + mode = repo->index->cache[pos]->ce_mode;
275 else
276 /* Let's not bother reading from HEAD tree */
277 mode = S_IFREG | 0644;
278 }
277 - ce = make_empty_cache_entry(&the_index, len);
279 + ce = make_empty_cache_entry(repo->index, len);
280 oidcpy(&ce->oid, &origin->blob_oid);
281 memcpy(ce->name, path, len);
282 ce->ce_flags = create_ce_flags(0);
283 ce->ce_namelen = len;
284 ce->ce_mode = create_ce_mode(mode);
283 - add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
285 + add_index_entry(repo->index, ce,
286 + ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
287
285 - cache_tree_invalidate_path(&the_index, path);
288 + cache_tree_invalidate_path(repo->index, path);
289
290 return commit;
291 }
@@ -519,13 +522,14 @@ static void queue_blames(struct blame_scoreboard *sb, struct blame_origin *porig
522 *
523 * This also fills origin->mode for corresponding tree path.
524 */
522 -static int fill_blob_sha1_and_mode(struct blame_origin *origin)
525 +static int fill_blob_sha1_and_mode(struct repository *repo,
526 + struct blame_origin *origin)
527 {
528 if (!is_null_oid(&origin->blob_oid))
529 return 0;
530 if (get_tree_entry(&origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode))
531 goto error_out;
528 - if (oid_object_info(the_repository, &origin->blob_oid, NULL) != OBJ_BLOB)
532 + if (oid_object_info(repo, &origin->blob_oid, NULL) != OBJ_BLOB)
533 goto error_out;
534 return 0;
535 error_out:
@@ -1767,7 +1771,9 @@ void init_scoreboard(struct blame_scoreboard *sb)
1771 sb->copy_score = BLAME_DEFAULT_COPY_SCORE;
1772 }
1773
1770 -void setup_scoreboard(struct blame_scoreboard *sb, const char *path, struct blame_origin **orig)
1774 +void setup_scoreboard(struct blame_scoreboard *sb,
1775 + const char *path,
1776 + struct blame_origin **orig)
1777 {
1778 const char *final_commit_name = NULL;
1779 struct blame_origin *o;
@@ -1779,6 +1785,9 @@ void setup_scoreboard(struct blame_scoreboard *sb, const char *path, struct blam
1785 if (sb->reverse && sb->contents_from)
1786 die(_("--contents and --reverse do not blend well."));
1787
1788 + if (!sb->repo)
1789 + BUG("repo is NULL");
1790 +
1791 if (!sb->reverse) {
1792 sb->final = find_single_final(sb->revs, &final_commit_name);
1793 sb->commits.compare = compare_commits_by_commit_date;
@@ -1800,7 +1809,8 @@ void setup_scoreboard(struct blame_scoreboard *sb, const char *path, struct blam
1809 * or "--contents".
1810 */
1811 setup_work_tree();
1803 - sb->final = fake_working_tree_commit(&sb->revs->diffopt,
1812 + sb->final = fake_working_tree_commit(sb->repo,
1813 + &sb->revs->diffopt,
1814 path, sb->contents_from);
1815 add_pending_object(sb->revs, &(sb->final->object), ":");
1816 }
@@ -1845,7 +1855,7 @@ void setup_scoreboard(struct blame_scoreboard *sb, const char *path, struct blam
1855 }
1856 else {
1857 o = get_origin(sb->final, path);
1848 - if (fill_blob_sha1_and_mode(o))
1858 + if (fill_blob_sha1_and_mode(sb->repo, o))
1859 die(_("no such path %s in %s"), path, final_commit_name);
1860
1861 if (sb->revs->diffopt.flags.allow_textconv &&
blame.h
+1
@@ -102,6 +102,7 @@ struct blame_scoreboard {
102 struct commit *final;
103 /* Priority queue for commits with unassigned blame records */
104 struct prio_queue commits;
105 + struct repository *repo;
106 struct rev_info *revs;
107 const char *path;
108
builtin/blame.c
+1
@@ -988,6 +988,7 @@ parse_done:
988 sb.revs = &revs;
989 sb.contents_from = contents_from;
990 sb.reverse = reverse;
991 + sb.repo = the_repository;
992 setup_scoreboard(&sb, path, &o);
993 lno = sb.num_lines;
994