bisect: limit the searchspace by pathspecs
It was surprisingly easy to do. git bisect start <pathspec> followed by all the normal "git bisect good/bad" stuff. Almost totally untested, and I guarantee that if your pathnames have spaces in them (or your GIT_DIR has spaces in it) this won't work. I don't know how to fix that, my shell programming isn't good enough. This involves small changes to make "git-rev-list --bisect" work in the presense of a pathspec limiter, and then truly trivial (and that's the broken part) changes to make "git bisect" save away and use the pathspec. I tried one bisection, and a "git bisect visualize", and it all looked correct. But hey, don't be surprised if it has problems. Linus Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
committed by
Junio C Hamano
parent
9ef2b3cbf6
commit
b3cfd939c3
18
rev-list.c
18
rev-list.c
@ -350,7 +350,8 @@ static int count_distance(struct commit_list *entry)
|
||||
|
||||
if (commit->object.flags & (UNINTERESTING | COUNTED))
|
||||
break;
|
||||
nr++;
|
||||
if (!paths || (commit->object.flags & TREECHANGE))
|
||||
nr++;
|
||||
commit->object.flags |= COUNTED;
|
||||
p = commit->parents;
|
||||
entry = p;
|
||||
@ -362,6 +363,7 @@ static int count_distance(struct commit_list *entry)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nr;
|
||||
}
|
||||
|
||||
@ -382,15 +384,20 @@ static struct commit_list *find_bisection(struct commit_list *list)
|
||||
nr = 0;
|
||||
p = list;
|
||||
while (p) {
|
||||
nr++;
|
||||
if (!paths || (p->item->object.flags & TREECHANGE))
|
||||
nr++;
|
||||
p = p->next;
|
||||
}
|
||||
closest = 0;
|
||||
best = list;
|
||||
|
||||
p = list;
|
||||
while (p) {
|
||||
int distance = count_distance(p);
|
||||
for (p = list; p; p = p->next) {
|
||||
int distance;
|
||||
|
||||
if (paths && !(p->item->object.flags & TREECHANGE))
|
||||
continue;
|
||||
|
||||
distance = count_distance(p);
|
||||
clear_distance(list);
|
||||
if (nr - distance < distance)
|
||||
distance = nr - distance;
|
||||
@ -398,7 +405,6 @@ static struct commit_list *find_bisection(struct commit_list *list)
|
||||
best = p;
|
||||
closest = distance;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
if (best)
|
||||
best->next = NULL;
|
||||
|
||||
Reference in New Issue
Block a user