builtin-blame.c: move prepare_final() into a separate function.
After parsing the command line, we have a long loop to compute the commit object to start annotating from. Move the logic to a separate function, so that later patches become easier to read. It also makes fill_origin_blob() return void; the check is always done on !file->ptr, and nobody looks at the return value from the function. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
@ -91,7 +91,7 @@ struct origin {
|
|||||||
* Given an origin, prepare mmfile_t structure to be used by the
|
* Given an origin, prepare mmfile_t structure to be used by the
|
||||||
* diff machinery
|
* diff machinery
|
||||||
*/
|
*/
|
||||||
static char *fill_origin_blob(struct origin *o, mmfile_t *file)
|
static void fill_origin_blob(struct origin *o, mmfile_t *file)
|
||||||
{
|
{
|
||||||
if (!o->file.ptr) {
|
if (!o->file.ptr) {
|
||||||
enum object_type type;
|
enum object_type type;
|
||||||
@ -106,7 +106,6 @@ static char *fill_origin_blob(struct origin *o, mmfile_t *file)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
*file = o->file;
|
*file = o->file;
|
||||||
return file->ptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2006,6 +2005,10 @@ static int git_blame_config(const char *var, const char *value)
|
|||||||
return git_default_config(var, value);
|
return git_default_config(var, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepare a dummy commit that represents the work tree (or staged) item.
|
||||||
|
* Note that annotating work tree item never works in the reverse.
|
||||||
|
*/
|
||||||
static struct commit *fake_working_tree_commit(const char *path, const char *contents_from)
|
static struct commit *fake_working_tree_commit(const char *path, const char *contents_from)
|
||||||
{
|
{
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
@ -2122,6 +2125,33 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con
|
|||||||
return commit;
|
return commit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *prepare_final(struct scoreboard *sb, struct rev_info *revs)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const char *final_commit_name = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There must be one and only one positive commit in the
|
||||||
|
* revs->pending array.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < revs->pending.nr; i++) {
|
||||||
|
struct object *obj = revs->pending.objects[i].item;
|
||||||
|
if (obj->flags & UNINTERESTING)
|
||||||
|
continue;
|
||||||
|
while (obj->type == OBJ_TAG)
|
||||||
|
obj = deref_tag(obj, NULL, 0);
|
||||||
|
if (obj->type != OBJ_COMMIT)
|
||||||
|
die("Non commit %s?", revs->pending.objects[i].name);
|
||||||
|
if (sb->final)
|
||||||
|
die("More than one commit to dig from %s and %s?",
|
||||||
|
revs->pending.objects[i].name,
|
||||||
|
final_commit_name);
|
||||||
|
sb->final = (struct commit *) obj;
|
||||||
|
final_commit_name = revs->pending.objects[i].name;
|
||||||
|
}
|
||||||
|
return final_commit_name;
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_blame(int argc, const char **argv, const char *prefix)
|
int cmd_blame(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
@ -2327,27 +2357,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
|
|||||||
setup_revisions(unk, argv, &revs, NULL);
|
setup_revisions(unk, argv, &revs, NULL);
|
||||||
memset(&sb, 0, sizeof(sb));
|
memset(&sb, 0, sizeof(sb));
|
||||||
|
|
||||||
/*
|
final_commit_name = prepare_final(&sb, &revs);
|
||||||
* There must be one and only one positive commit in the
|
|
||||||
* revs->pending array.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < revs.pending.nr; i++) {
|
|
||||||
struct object *obj = revs.pending.objects[i].item;
|
|
||||||
if (obj->flags & UNINTERESTING)
|
|
||||||
continue;
|
|
||||||
while (obj->type == OBJ_TAG)
|
|
||||||
obj = deref_tag(obj, NULL, 0);
|
|
||||||
if (obj->type != OBJ_COMMIT)
|
|
||||||
die("Non commit %s?",
|
|
||||||
revs.pending.objects[i].name);
|
|
||||||
if (sb.final)
|
|
||||||
die("More than one commit to dig from %s and %s?",
|
|
||||||
revs.pending.objects[i].name,
|
|
||||||
final_commit_name);
|
|
||||||
sb.final = (struct commit *) obj;
|
|
||||||
final_commit_name = revs.pending.objects[i].name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sb.final) {
|
if (!sb.final) {
|
||||||
/*
|
/*
|
||||||
* "--not A B -- path" without anything positive;
|
* "--not A B -- path" without anything positive;
|
||||||
|
Reference in New Issue
Block a user