Skip to content

Commit dc076ae

Browse files
whydoubtgitster
authored andcommitted
blame: move core structures to header
The origin, entry, and scoreboard structures are core to the blame interface and need to be exposed for blame functionality. Signed-off-by: Jeff Smith <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent e94f77f commit dc076ae

File tree

2 files changed

+144
-133
lines changed

2 files changed

+144
-133
lines changed

blame.h

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#ifndef BLAME_H
2+
#define BLAME_H
3+
4+
#include "cache.h"
5+
#include "commit.h"
6+
#include "xdiff-interface.h"
7+
#include "revision.h"
8+
#include "prio-queue.h"
9+
10+
/*
11+
* One blob in a commit that is being suspected
12+
*/
13+
struct blame_origin {
14+
int refcnt;
15+
/* Record preceding blame record for this blob */
16+
struct blame_origin *previous;
17+
/* origins are put in a list linked via `next' hanging off the
18+
* corresponding commit's util field in order to make finding
19+
* them fast. The presence in this chain does not count
20+
* towards the origin's reference count. It is tempting to
21+
* let it count as long as the commit is pending examination,
22+
* but even under circumstances where the commit will be
23+
* present multiple times in the priority queue of unexamined
24+
* commits, processing the first instance will not leave any
25+
* work requiring the origin data for the second instance. An
26+
* interspersed commit changing that would have to be
27+
* preexisting with a different ancestry and with the same
28+
* commit date in order to wedge itself between two instances
29+
* of the same commit in the priority queue _and_ produce
30+
* blame entries relevant for it. While we don't want to let
31+
* us get tripped up by this case, it certainly does not seem
32+
* worth optimizing for.
33+
*/
34+
struct blame_origin *next;
35+
struct commit *commit;
36+
/* `suspects' contains blame entries that may be attributed to
37+
* this origin's commit or to parent commits. When a commit
38+
* is being processed, all suspects will be moved, either by
39+
* assigning them to an origin in a different commit, or by
40+
* shipping them to the scoreboard's ent list because they
41+
* cannot be attributed to a different commit.
42+
*/
43+
struct blame_entry *suspects;
44+
mmfile_t file;
45+
struct object_id blob_oid;
46+
unsigned mode;
47+
/* guilty gets set when shipping any suspects to the final
48+
* blame list instead of other commits
49+
*/
50+
char guilty;
51+
char path[FLEX_ARRAY];
52+
};
53+
54+
/*
55+
* Each group of lines is described by a blame_entry; it can be split
56+
* as we pass blame to the parents. They are arranged in linked lists
57+
* kept as `suspects' of some unprocessed origin, or entered (when the
58+
* blame origin has been finalized) into the scoreboard structure.
59+
* While the scoreboard structure is only sorted at the end of
60+
* processing (according to final image line number), the lists
61+
* attached to an origin are sorted by the target line number.
62+
*/
63+
struct blame_entry {
64+
struct blame_entry *next;
65+
66+
/* the first line of this group in the final image;
67+
* internally all line numbers are 0 based.
68+
*/
69+
int lno;
70+
71+
/* how many lines this group has */
72+
int num_lines;
73+
74+
/* the commit that introduced this group into the final image */
75+
struct blame_origin *suspect;
76+
77+
/* the line number of the first line of this group in the
78+
* suspect's file; internally all line numbers are 0 based.
79+
*/
80+
int s_lno;
81+
82+
/* how significant this entry is -- cached to avoid
83+
* scanning the lines over and over.
84+
*/
85+
unsigned score;
86+
};
87+
88+
/*
89+
* The current state of the blame assignment.
90+
*/
91+
struct blame_scoreboard {
92+
/* the final commit (i.e. where we started digging from) */
93+
struct commit *final;
94+
/* Priority queue for commits with unassigned blame records */
95+
struct prio_queue commits;
96+
struct rev_info *revs;
97+
const char *path;
98+
99+
/*
100+
* The contents in the final image.
101+
* Used by many functions to obtain contents of the nth line,
102+
* indexed with scoreboard.lineno[blame_entry.lno].
103+
*/
104+
const char *final_buf;
105+
unsigned long final_buf_size;
106+
107+
/* linked list of blames */
108+
struct blame_entry *ent;
109+
110+
/* look-up a line in the final buffer */
111+
int num_lines;
112+
int *lineno;
113+
114+
/* stats */
115+
int num_read_blob;
116+
int num_get_patch;
117+
int num_commits;
118+
119+
/*
120+
* blame for a blame_entry with score lower than these thresholds
121+
* is not passed to the parent using move/copy logic.
122+
*/
123+
unsigned move_score;
124+
unsigned copy_score;
125+
126+
/* use this file's contents as the final image */
127+
const char *contents_from;
128+
129+
/* flags */
130+
int reverse;
131+
int show_root;
132+
int xdl_opts;
133+
int no_whole_file_rename;
134+
int debug;
135+
136+
/* callbacks */
137+
void(*on_sanity_fail)(struct blame_scoreboard *, int);
138+
void(*found_guilty_entry)(struct blame_entry *, void *);
139+
140+
void *found_guilty_entry_data;
141+
};
142+
143+
#endif /* BLAME_H */

builtin/blame.c

Lines changed: 1 addition & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "line-log.h"
2929
#include "dir.h"
3030
#include "progress.h"
31+
#include "blame.h"
3132

3233
static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
3334

@@ -75,50 +76,6 @@ static unsigned blame_copy_score;
7576
#define METAINFO_SHOWN (1u<<12)
7677
#define MORE_THAN_ONE_PATH (1u<<13)
7778

78-
/*
79-
* One blob in a commit that is being suspected
80-
*/
81-
struct blame_origin {
82-
int refcnt;
83-
/* Record preceding blame record for this blob */
84-
struct blame_origin *previous;
85-
/* origins are put in a list linked via `next' hanging off the
86-
* corresponding commit's util field in order to make finding
87-
* them fast. The presence in this chain does not count
88-
* towards the origin's reference count. It is tempting to
89-
* let it count as long as the commit is pending examination,
90-
* but even under circumstances where the commit will be
91-
* present multiple times in the priority queue of unexamined
92-
* commits, processing the first instance will not leave any
93-
* work requiring the origin data for the second instance. An
94-
* interspersed commit changing that would have to be
95-
* preexisting with a different ancestry and with the same
96-
* commit date in order to wedge itself between two instances
97-
* of the same commit in the priority queue _and_ produce
98-
* blame entries relevant for it. While we don't want to let
99-
* us get tripped up by this case, it certainly does not seem
100-
* worth optimizing for.
101-
*/
102-
struct blame_origin *next;
103-
struct commit *commit;
104-
/* `suspects' contains blame entries that may be attributed to
105-
* this origin's commit or to parent commits. When a commit
106-
* is being processed, all suspects will be moved, either by
107-
* assigning them to an origin in a different commit, or by
108-
* shipping them to the scoreboard's ent list because they
109-
* cannot be attributed to a different commit.
110-
*/
111-
struct blame_entry *suspects;
112-
mmfile_t file;
113-
struct object_id blob_oid;
114-
unsigned mode;
115-
/* guilty gets set when shipping any suspects to the final
116-
* blame list instead of other commits
117-
*/
118-
char guilty;
119-
char path[FLEX_ARRAY];
120-
};
121-
12279
struct progress_info {
12380
struct progress *progress;
12481
int blamed_lines;
@@ -208,40 +165,6 @@ static void drop_origin_blob(struct blame_origin *o)
208165
}
209166
}
210167

211-
/*
212-
* Each group of lines is described by a blame_entry; it can be split
213-
* as we pass blame to the parents. They are arranged in linked lists
214-
* kept as `suspects' of some unprocessed origin, or entered (when the
215-
* blame origin has been finalized) into the scoreboard structure.
216-
* While the scoreboard structure is only sorted at the end of
217-
* processing (according to final image line number), the lists
218-
* attached to an origin are sorted by the target line number.
219-
*/
220-
struct blame_entry {
221-
struct blame_entry *next;
222-
223-
/* the first line of this group in the final image;
224-
* internally all line numbers are 0 based.
225-
*/
226-
int lno;
227-
228-
/* how many lines this group has */
229-
int num_lines;
230-
231-
/* the commit that introduced this group into the final image */
232-
struct blame_origin *suspect;
233-
234-
/* the line number of the first line of this group in the
235-
* suspect's file; internally all line numbers are 0 based.
236-
*/
237-
int s_lno;
238-
239-
/* how significant this entry is -- cached to avoid
240-
* scanning the lines over and over.
241-
*/
242-
unsigned score;
243-
};
244-
245168
/*
246169
* Any merge of blames happens on lists of blames that arrived via
247170
* different parents in a single suspect. In this case, we want to
@@ -335,61 +258,6 @@ static int compare_commits_by_reverse_commit_date(const void *a,
335258
return -compare_commits_by_commit_date(a, b, c);
336259
}
337260

338-
/*
339-
* The current state of the blame assignment.
340-
*/
341-
struct blame_scoreboard {
342-
/* the final commit (i.e. where we started digging from) */
343-
struct commit *final;
344-
/* Priority queue for commits with unassigned blame records */
345-
struct prio_queue commits;
346-
struct rev_info *revs;
347-
const char *path;
348-
349-
/*
350-
* The contents in the final image.
351-
* Used by many functions to obtain contents of the nth line,
352-
* indexed with scoreboard.lineno[blame_entry.lno].
353-
*/
354-
const char *final_buf;
355-
unsigned long final_buf_size;
356-
357-
/* linked list of blames */
358-
struct blame_entry *ent;
359-
360-
/* look-up a line in the final buffer */
361-
int num_lines;
362-
int *lineno;
363-
364-
/* stats */
365-
int num_read_blob;
366-
int num_get_patch;
367-
int num_commits;
368-
369-
/*
370-
* blame for a blame_entry with score lower than these thresholds
371-
* is not passed to the parent using move/copy logic.
372-
*/
373-
unsigned move_score;
374-
unsigned copy_score;
375-
376-
/* use this file's contents as the final image */
377-
const char *contents_from;
378-
379-
/* flags */
380-
int reverse;
381-
int show_root;
382-
int xdl_opts;
383-
int no_whole_file_rename;
384-
int debug;
385-
386-
/* callbacks */
387-
void(*on_sanity_fail)(struct blame_scoreboard *, int);
388-
void(*found_guilty_entry)(struct blame_entry *, void *);
389-
390-
void *found_guilty_entry_data;
391-
};
392-
393261
static void blame_sort_final(struct blame_scoreboard *sb)
394262
{
395263
sb->ent = llist_mergesort(sb->ent, get_next_blame, set_next_blame,

0 commit comments

Comments
 (0)