From: Jeff Smith <whydoubt@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, peff@peff.net, Jeff Smith <whydoubt@gmail.com>
Subject: [PATCH 24/29] blame: move core structures to header
Date: Wed, 24 May 2017 00:15:32 -0500 [thread overview]
Message-ID: <20170524051537.29978-25-whydoubt@gmail.com> (raw)
In-Reply-To: <20170524051537.29978-1-whydoubt@gmail.com>
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 <whydoubt@gmail.com>
---
blame.h | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
builtin/blame.c | 134 +---------------------------------------------------
2 files changed, 144 insertions(+), 133 deletions(-)
create mode 100644 blame.h
diff --git a/blame.h b/blame.h
new file mode 100644
index 0000000..c064d92
--- /dev/null
+++ b/blame.h
@@ -0,0 +1,143 @@
+#ifndef BLAME_H
+#define BLAME_H
+
+#include "cache.h"
+#include "commit.h"
+#include "xdiff-interface.h"
+#include "revision.h"
+#include "prio-queue.h"
+
+/*
+ * One blob in a commit that is being suspected
+ */
+struct blame_origin {
+ int refcnt;
+ /* Record preceding blame record for this blob */
+ struct blame_origin *previous;
+ /* origins are put in a list linked via `next' hanging off the
+ * corresponding commit's util field in order to make finding
+ * them fast. The presence in this chain does not count
+ * towards the origin's reference count. It is tempting to
+ * let it count as long as the commit is pending examination,
+ * but even under circumstances where the commit will be
+ * present multiple times in the priority queue of unexamined
+ * commits, processing the first instance will not leave any
+ * work requiring the origin data for the second instance. An
+ * interspersed commit changing that would have to be
+ * preexisting with a different ancestry and with the same
+ * commit date in order to wedge itself between two instances
+ * of the same commit in the priority queue _and_ produce
+ * blame entries relevant for it. While we don't want to let
+ * us get tripped up by this case, it certainly does not seem
+ * worth optimizing for.
+ */
+ struct blame_origin *next;
+ struct commit *commit;
+ /* `suspects' contains blame entries that may be attributed to
+ * this origin's commit or to parent commits. When a commit
+ * is being processed, all suspects will be moved, either by
+ * assigning them to an origin in a different commit, or by
+ * shipping them to the scoreboard's ent list because they
+ * cannot be attributed to a different commit.
+ */
+ struct blame_entry *suspects;
+ mmfile_t file;
+ struct object_id blob_oid;
+ unsigned mode;
+ /* guilty gets set when shipping any suspects to the final
+ * blame list instead of other commits
+ */
+ char guilty;
+ char path[FLEX_ARRAY];
+};
+
+/*
+ * Each group of lines is described by a blame_entry; it can be split
+ * as we pass blame to the parents. They are arranged in linked lists
+ * kept as `suspects' of some unprocessed origin, or entered (when the
+ * blame origin has been finalized) into the scoreboard structure.
+ * While the scoreboard structure is only sorted at the end of
+ * processing (according to final image line number), the lists
+ * attached to an origin are sorted by the target line number.
+ */
+struct blame_entry {
+ struct blame_entry *next;
+
+ /* the first line of this group in the final image;
+ * internally all line numbers are 0 based.
+ */
+ int lno;
+
+ /* how many lines this group has */
+ int num_lines;
+
+ /* the commit that introduced this group into the final image */
+ struct blame_origin *suspect;
+
+ /* the line number of the first line of this group in the
+ * suspect's file; internally all line numbers are 0 based.
+ */
+ int s_lno;
+
+ /* how significant this entry is -- cached to avoid
+ * scanning the lines over and over.
+ */
+ unsigned score;
+};
+
+/*
+ * The current state of the blame assignment.
+ */
+struct blame_scoreboard {
+ /* the final commit (i.e. where we started digging from) */
+ struct commit *final;
+ /* Priority queue for commits with unassigned blame records */
+ struct prio_queue commits;
+ struct rev_info *revs;
+ const char *path;
+
+ /*
+ * The contents in the final image.
+ * Used by many functions to obtain contents of the nth line,
+ * indexed with scoreboard.lineno[blame_entry.lno].
+ */
+ const char *final_buf;
+ unsigned long final_buf_size;
+
+ /* linked list of blames */
+ struct blame_entry *ent;
+
+ /* look-up a line in the final buffer */
+ int num_lines;
+ int *lineno;
+
+ /* stats */
+ int num_read_blob;
+ int num_get_patch;
+ int num_commits;
+
+ /*
+ * blame for a blame_entry with score lower than these thresholds
+ * is not passed to the parent using move/copy logic.
+ */
+ unsigned move_score;
+ unsigned copy_score;
+
+ /* use this file's contents as the final image */
+ const char *contents_from;
+
+ /* flags */
+ int reverse;
+ int show_root;
+ int xdl_opts;
+ int no_whole_file_rename;
+ int debug;
+
+ /* callbacks */
+ void(*on_sanity_fail)(struct blame_scoreboard *, int);
+ void(*found_guilty_entry)(struct blame_entry *, void *);
+
+ void *found_guilty_entry_data;
+};
+
+#endif /* BLAME_H */
diff --git a/builtin/blame.c b/builtin/blame.c
index 29771b7..07b1a76 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -28,6 +28,7 @@
#include "line-log.h"
#include "dir.h"
#include "progress.h"
+#include "blame.h"
static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
@@ -75,50 +76,6 @@ static unsigned blame_copy_score;
#define METAINFO_SHOWN (1u<<12)
#define MORE_THAN_ONE_PATH (1u<<13)
-/*
- * One blob in a commit that is being suspected
- */
-struct blame_origin {
- int refcnt;
- /* Record preceding blame record for this blob */
- struct blame_origin *previous;
- /* origins are put in a list linked via `next' hanging off the
- * corresponding commit's util field in order to make finding
- * them fast. The presence in this chain does not count
- * towards the origin's reference count. It is tempting to
- * let it count as long as the commit is pending examination,
- * but even under circumstances where the commit will be
- * present multiple times in the priority queue of unexamined
- * commits, processing the first instance will not leave any
- * work requiring the origin data for the second instance. An
- * interspersed commit changing that would have to be
- * preexisting with a different ancestry and with the same
- * commit date in order to wedge itself between two instances
- * of the same commit in the priority queue _and_ produce
- * blame entries relevant for it. While we don't want to let
- * us get tripped up by this case, it certainly does not seem
- * worth optimizing for.
- */
- struct blame_origin *next;
- struct commit *commit;
- /* `suspects' contains blame entries that may be attributed to
- * this origin's commit or to parent commits. When a commit
- * is being processed, all suspects will be moved, either by
- * assigning them to an origin in a different commit, or by
- * shipping them to the scoreboard's ent list because they
- * cannot be attributed to a different commit.
- */
- struct blame_entry *suspects;
- mmfile_t file;
- struct object_id blob_oid;
- unsigned mode;
- /* guilty gets set when shipping any suspects to the final
- * blame list instead of other commits
- */
- char guilty;
- char path[FLEX_ARRAY];
-};
-
struct progress_info {
struct progress *progress;
int blamed_lines;
@@ -209,40 +166,6 @@ static void drop_origin_blob(struct blame_origin *o)
}
/*
- * Each group of lines is described by a blame_entry; it can be split
- * as we pass blame to the parents. They are arranged in linked lists
- * kept as `suspects' of some unprocessed origin, or entered (when the
- * blame origin has been finalized) into the scoreboard structure.
- * While the scoreboard structure is only sorted at the end of
- * processing (according to final image line number), the lists
- * attached to an origin are sorted by the target line number.
- */
-struct blame_entry {
- struct blame_entry *next;
-
- /* the first line of this group in the final image;
- * internally all line numbers are 0 based.
- */
- int lno;
-
- /* how many lines this group has */
- int num_lines;
-
- /* the commit that introduced this group into the final image */
- struct blame_origin *suspect;
-
- /* the line number of the first line of this group in the
- * suspect's file; internally all line numbers are 0 based.
- */
- int s_lno;
-
- /* how significant this entry is -- cached to avoid
- * scanning the lines over and over.
- */
- unsigned score;
-};
-
-/*
* Any merge of blames happens on lists of blames that arrived via
* different parents in a single suspect. In this case, we want to
* sort according to the suspect line numbers as opposed to the final
@@ -335,61 +258,6 @@ static int compare_commits_by_reverse_commit_date(const void *a,
return -compare_commits_by_commit_date(a, b, c);
}
-/*
- * The current state of the blame assignment.
- */
-struct blame_scoreboard {
- /* the final commit (i.e. where we started digging from) */
- struct commit *final;
- /* Priority queue for commits with unassigned blame records */
- struct prio_queue commits;
- struct rev_info *revs;
- const char *path;
-
- /*
- * The contents in the final image.
- * Used by many functions to obtain contents of the nth line,
- * indexed with scoreboard.lineno[blame_entry.lno].
- */
- const char *final_buf;
- unsigned long final_buf_size;
-
- /* linked list of blames */
- struct blame_entry *ent;
-
- /* look-up a line in the final buffer */
- int num_lines;
- int *lineno;
-
- /* stats */
- int num_read_blob;
- int num_get_patch;
- int num_commits;
-
- /*
- * blame for a blame_entry with score lower than these thresholds
- * is not passed to the parent using move/copy logic.
- */
- unsigned move_score;
- unsigned copy_score;
-
- /* use this file's contents as the final image */
- const char *contents_from;
-
- /* flags */
- int reverse;
- int show_root;
- int xdl_opts;
- int no_whole_file_rename;
- int debug;
-
- /* callbacks */
- void(*on_sanity_fail)(struct blame_scoreboard *, int);
- void(*found_guilty_entry)(struct blame_entry *, void *);
-
- void *found_guilty_entry_data;
-};
-
static void blame_sort_final(struct blame_scoreboard *sb)
{
sb->ent = llist_mergesort(sb->ent, get_next_blame, set_next_blame,
--
2.9.3
next prev parent reply other threads:[~2017-05-24 5:17 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-24 5:15 [PATCH 00/29] Add blame to libgit Jeff Smith
2017-05-24 5:15 ` [PATCH 01/29] blame: remove unneeded dependency on blob.h Jeff Smith
2017-05-24 5:15 ` [PATCH 02/29] blame: move textconv_object with related functions Jeff Smith
2017-05-24 5:15 ` [PATCH 03/29] blame: remove unused parameters Jeff Smith
2017-05-24 5:15 ` [PATCH 04/29] blame: rename origin structure to blame_origin Jeff Smith
2017-05-24 5:15 ` [PATCH 05/29] blame: rename scoreboard structure to blame_scoreboard Jeff Smith
2017-05-24 5:15 ` [PATCH 06/29] blame: rename origin-related functions Jeff Smith
2017-05-24 5:15 ` [PATCH 07/29] blame: rename coalesce function Jeff Smith
2017-05-24 5:15 ` [PATCH 08/29] blame: rename ent_score function Jeff Smith
2017-05-24 5:15 ` [PATCH 09/29] blame: rename nth_line function Jeff Smith
2017-05-24 5:15 ` [PATCH 10/29] blame: move stat counters to scoreboard Jeff Smith
2017-05-24 5:15 ` [PATCH 11/29] blame: move copy/move thresholds " Jeff Smith
2017-05-24 5:15 ` [PATCH 12/29] blame: move contents_from " Jeff Smith
2017-05-24 5:15 ` [PATCH 13/29] blame: move reverse flag " Jeff Smith
2017-05-24 5:15 ` [PATCH 14/29] blame: move show_root " Jeff Smith
2017-05-24 5:15 ` [PATCH 15/29] blame: move xdl_opts flags " Jeff Smith
2017-05-24 5:15 ` [PATCH 16/29] blame: move no_whole_file_rename flag " Jeff Smith
2017-05-24 5:15 ` [PATCH 17/29] blame: make sanity_check use a callback in scoreboard Jeff Smith
2017-05-24 5:15 ` [PATCH 18/29] blame: move progess updates to a scoreboard callback Jeff Smith
2017-05-25 4:16 ` Junio C Hamano
2017-05-24 5:15 ` [PATCH 19/29] blame: wrap blame_sort and compare_blame_final Jeff Smith
2017-05-24 5:15 ` [PATCH 20/29] blame: rework methods that determine 'final' commit Jeff Smith
2017-05-25 4:59 ` Junio C Hamano
2017-05-24 5:15 ` [PATCH 21/29] blame: create scoreboard init function Jeff Smith
2017-05-24 5:15 ` [PATCH 22/29] blame: create scoreboard setup function Jeff Smith
2017-05-25 5:15 ` Junio C Hamano
2017-05-24 5:15 ` [PATCH 23/29] blame: create entry prepend function Jeff Smith
2017-05-25 5:21 ` Junio C Hamano
2017-05-24 5:15 ` Jeff Smith [this message]
2017-05-25 5:25 ` [PATCH 24/29] blame: move core structures to header Junio C Hamano
2017-05-24 5:15 ` [PATCH 25/29] blame: move origin-related methods to libgit Jeff Smith
2017-05-24 5:15 ` [PATCH 26/29] blame: move fake-commit-related " Jeff Smith
2017-05-24 5:15 ` [PATCH 27/29] blame: move scoreboard-related " Jeff Smith
2017-05-24 5:15 ` [PATCH 28/29] blame: move scoreboard setup " Jeff Smith
2017-05-25 5:53 ` Junio C Hamano
2017-05-25 12:56 ` Jeffrey Smith
2017-05-24 5:15 ` [PATCH 29/29] blame: move entry prepend " Jeff Smith
2017-05-24 7:08 ` [PATCH 00/29] Add blame " Junio C Hamano
2017-05-25 5:55 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170524051537.29978-25-whydoubt@gmail.com \
--to=whydoubt@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.