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