git/blame.h

#ifndef BLAME_H
#define BLAME_H

#include "oidset.h"
#include "xdiff-interface.h"
#include "prio-queue.h"

#define PICKAXE_BLAME_MOVE
#define PICKAXE_BLAME_COPY
#define PICKAXE_BLAME_COPY_HARDER
#define PICKAXE_BLAME_COPY_HARDEST

#define BLAME_DEFAULT_MOVE_SCORE
#define BLAME_DEFAULT_COPY_SCORE

struct fingerprint;

/*
 * One blob in a commit that is being suspected
 */
struct blame_origin {};

/*
 * 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_bloom_data;

/*
 * The current state of the blame assignment.
 */
struct blame_scoreboard {};

/*
 * Origin is refcounted and usually we keep the blob contents to be
 * reused.
 */
static inline struct blame_origin *blame_origin_incref(struct blame_origin *o)
{}
void blame_origin_decref(struct blame_origin *o);

void blame_coalesce(struct blame_scoreboard *sb);
void blame_sort_final(struct blame_scoreboard *sb);
unsigned blame_entry_score(struct blame_scoreboard *sb, struct blame_entry *e);
void assign_blame(struct blame_scoreboard *sb, int opt);
const char *blame_nth_line(struct blame_scoreboard *sb, long lno);

void init_scoreboard(struct blame_scoreboard *sb);
void setup_scoreboard(struct blame_scoreboard *sb,
		      struct blame_origin **orig);
void setup_blame_bloom_data(struct blame_scoreboard *sb);
void cleanup_scoreboard(struct blame_scoreboard *sb);

struct blame_entry *blame_entry_prepend(struct blame_entry *head,
					long start, long end,
					struct blame_origin *o);

struct blame_origin *get_blame_suspects(struct commit *commit);

#endif /* BLAME_H */