Go to file
Junio C Hamano a4e9d71edb Fix path-limited "rev-list --bisect" termination condition.
In a path-limited bisection, when the $bad commit is not
changing the limited path, and the number of suspects is 1, the
code miscounted and returned $bad from find_bisection(), which
is not marked with TREECHANGE.  This is of course filtered by
the output routine, resulting in an empty output, in turn
causing git-bisect driver to say "$bad was both good and bad".

Illustration.  Suppose you have these four commits, and only C
changes path P.  You know D is bad and A is good.

	A---B---C*--D

git-bisect driver runs this to find a bisection point:

	$ git rev-list --bisect A..D -- P

which calls find_bisection() with B, C and D.  The set of
commits that is given to this function is the same set of
commits as rev-list without --bisect option and pathspec
returns.  Among them, only C is marked with TREECHANGE.  Let's
call the set of commits given to find_bisection() that are
marked with TREECHANGE (or all of them if no path limiter is in
effect) "the bisect set".  In the above example, the size of the
bisect set is 1 (contains only "C").

For each commit in its input, find_bisection() computes the
number of commits it can reach in the bisect set.  For a commit
in the bisect set, this number includes itself, so the number is
1 or more.  This number is called "depth", and computed by
count_distance() function.

When you have a bisect set of N commits, and a commit has depth
D, how good is your bisection if you returned that commit?  How
good this bisection is can be measured by how many commits are
effectively tested "together" by testing one commit.

Currently you have (N-1) untested commits (the tip of the bisect
set, although it is included in the bisect set, is already known
to be bad).  If the commit with depth D turns out to be bad,
then your next bisect set will have D commits and you will have
(D-1) untested commits left, which means you tested (N-1)-(D-1)
= (N-D) commits with this bisection.  If it turns out to be good, then
your next bisect set will have (N-D) commits, and you will have
(N-D-1) untested commits left, which means you tested
(N-1)-(N-D-1) = D commits with this bisection.

Therefore, the goodness of this bisection is is min(N-D, D), and
find_bisection() function tries to find a commit that maximizes
this, by initializing "closest" variable to 0 and whenever a
commit with the goodness that is larger than the current
"closest" is found, that commit and its goodness are remembered
by updating "closest" variable.  The "the commit with the best
goodness so far" is kept in "best" variable, and is initialized
to a commit that happens to be at the beginning of the list of
commits given to this function (which may or may not be in the
bisect set when path-limit is in use).

However, when N is 1, then the sole tree-changing commit has
depth of 1, and min(N-D, D) evaluates to 0.  This is not larger
than the initial value of "closest", and the "so far the best
one" commit is never replaced in the loop.

When path-limit is not in use, this is not a problem, as any
commit in the input set is tree-changing.  But when path-limit
is in use, and when the starting "bad" commit does not change
the specified path, it is not correct to return it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-03-23 17:20:43 -07:00
Documentation Bisect: implement "git bisect run <cmd>..." to automatically bisect. 2007-03-23 01:54:47 -07:00
arm
compat Add a compat/strtoumax.c for Solaris 8. 2007-02-19 18:20:30 -08:00
contrib contrib/continuous: a continuous integration build manager 2007-03-19 22:21:19 -07:00
git-gui Merge branch 'master' of git://repo.or.cz/git-gui 2007-03-12 23:14:07 -07:00
gitweb gitweb: Don't escape attributes in CGI.pm HTML methods 2007-03-06 19:04:07 -08:00
mozilla-sha1
perl Do not output "GEN " when generating perl.mak 2007-03-14 01:33:49 -07:00
ppc
t Bisect: implement "git bisect run <cmd>..." to automatically bisect. 2007-03-23 01:54:47 -07:00
templates update-hook: abort early if the project description is unset 2007-03-22 03:02:31 -07:00
xdiff xdiff/xutils.c(xdl_hash_record): factor out whitespace handling 2007-03-19 22:17:25 -07:00
.gitignore Merge branch 'jc/fetch' 2007-03-14 01:40:19 -07:00
.mailmap .mailmap maintenance after pulling from git-svn 2007-02-23 03:11:52 -08:00
COPYING
GIT-VERSION-GEN GIT 1.5.1-rc1 2007-03-19 02:56:29 -07:00
INSTALL
Makefile Make gc a builtin. 2007-03-17 00:34:19 -07:00
README
RelNotes GIT 1.5.0.5 2007-03-18 14:43:29 -07:00
alloc.c
archive-tar.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
archive-zip.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
archive.h
base85.c
blob.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
blob.h
builtin-add.c add: Support specifying an excludes file with a configuration variable 2007-03-09 00:06:00 -08:00
builtin-annotate.c
builtin-apply.c git-apply: Do not free the wrong buffer when we convert the data for writeout 2007-03-22 17:32:51 -07:00
builtin-archive.c Merge branch 'maint' 2007-03-03 19:47:46 -08:00
builtin-blame.c blame: cmp_suspect is not "cmp" anymore. 2007-03-20 23:37:51 -07:00
builtin-branch.c git-fetch, git-branch: Support local --track via a special remote '.' 2007-03-16 02:10:12 -07:00
builtin-bundle.c Replace fork_with_pipe in bundle with run_command 2007-03-12 23:40:17 -07:00
builtin-cat-file.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
builtin-check-ref-format.c
builtin-checkout-index.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
builtin-commit-tree.c Cleanup check_valid in commit-tree. 2007-02-27 21:40:18 -08:00
builtin-config.c git-config: document --rename-section, provide --remove-section 2007-03-03 19:59:37 -08:00
builtin-count-objects.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
builtin-describe.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
builtin-diff-files.c Allow git-diff exit with codes similar to diff(1) 2007-03-14 16:21:19 -07:00
builtin-diff-index.c Allow git-diff exit with codes similar to diff(1) 2007-03-14 16:21:19 -07:00
builtin-diff-tree.c Allow git-diff exit with codes similar to diff(1) 2007-03-14 16:21:19 -07:00
builtin-diff.c Allow git-diff exit with codes similar to diff(1) 2007-03-14 16:21:19 -07:00
builtin-fetch--tool.c builtin-fetch--tool: fix reflog notes. 2007-02-28 17:02:18 -08:00
builtin-fmt-merge-msg.c Merge branch 'maint' 2007-02-27 22:15:42 -08:00
builtin-for-each-ref.c General const correctness fixes 2007-03-07 10:47:10 -08:00
builtin-fsck.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
builtin-gc.c Make gc a builtin. 2007-03-17 00:34:19 -07:00
builtin-grep.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
builtin-init-db.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
builtin-log.c Replace remaining instances of strdup with xstrdup. 2007-03-19 18:16:03 -07:00
builtin-ls-files.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
builtin-ls-tree.c prefixcmp(): fix-up leftover strncmp(). 2007-02-20 22:03:15 -08:00
builtin-mailinfo.c restrict the patch filtering 2007-03-12 23:33:41 -07:00
builtin-mailsplit.c
builtin-merge-base.c
builtin-merge-file.c
builtin-mv.c
builtin-name-rev.c Merge branch 'js/name-rev-fix' 2007-02-20 22:24:03 -08:00
builtin-pack-objects.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
builtin-pack-refs.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
builtin-prune-packed.c
builtin-prune.c minor git-prune optimization 2007-03-20 22:17:47 -07:00
builtin-push.c Use RUN_GIT_CMD to run push backends 2007-03-12 23:40:18 -07:00
builtin-read-tree.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
builtin-reflog.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
builtin-rerere.c Merge branch 'maint' 2007-02-25 11:08:47 -08:00
builtin-rev-list.c Fix path-limited "rev-list --bisect" termination condition. 2007-03-23 17:20:43 -07:00
builtin-rev-parse.c prefixcmp(): fix-up leftover strncmp(). 2007-02-20 22:03:15 -08:00
builtin-revert.c Correct new compiler warnings in builtin-revert 2007-03-12 23:40:18 -07:00
builtin-rm.c
builtin-runstatus.c
builtin-shortlog.c shortlog: prompt when reading from terminal by mistake 2007-03-14 01:33:41 -07:00
builtin-show-branch.c General const correctness fixes 2007-03-07 10:47:10 -08:00
builtin-show-ref.c Merge branch 'maint' 2007-02-24 01:42:06 -08:00
builtin-stripspace.c
builtin-symbolic-ref.c
builtin-tar-tree.c prefixcmp(): fix-up mechanical conversion. 2007-02-20 22:03:15 -08:00
builtin-unpack-objects.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
builtin-update-index.c Add core.symlinks to mark filesystems that do not support symbolic links. 2007-03-02 16:58:05 -08:00
builtin-update-ref.c
builtin-upload-archive.c
builtin-verify-pack.c
builtin-write-tree.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
builtin.h Make gc a builtin. 2007-03-17 00:34:19 -07:00
cache-tree.c
cache-tree.h
cache.h index-pack: use hash_sha1_file() 2007-03-20 22:09:57 -07:00
check-builtins.sh
check-racy.c
color.c
color.h
combine-diff.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
commit.c Replace remaining instances of strdup with xstrdup. 2007-03-19 18:16:03 -07:00
commit.h Merge branch 'js/commit-format' 2007-03-02 00:37:12 -08:00
config.c Limit the size of the new delta_base_cache 2007-03-18 22:43:37 -07:00
config.mak.in
configure.ac New autoconf test for iconv 2007-02-18 15:57:36 -08:00
connect.c Use run_command for proxy connections 2007-03-12 23:40:18 -07:00
convert-objects.c General const correctness fixes 2007-03-07 10:47:10 -08:00
convert.c Make AutoCRLF ternary variable. 2007-02-14 11:19:28 -08:00
copy.c
csum-file.c
csum-file.h
ctype.c
daemon.c prefixcmp(): fix-up mechanical conversion. 2007-02-20 22:03:15 -08:00
date.c show_date(): rename the "relative" parameter to "mode" 2007-02-27 17:29:37 -08:00
delta.h
diff-delta.c
diff-lib.c Teach --quiet to diff backends. 2007-03-14 16:21:19 -07:00
diff.c diff --quiet 2007-03-14 16:21:19 -07:00
diff.h diff --quiet 2007-03-14 16:21:19 -07:00
diffcore-break.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
diffcore-delta.c
diffcore-order.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
diffcore-pickaxe.c
diffcore-rename.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
diffcore.h
dir.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
dir.h
dump-cache-tree.c
entry.c Add core.symlinks to mark filesystems that do not support symbolic links. 2007-03-02 16:58:05 -08:00
environment.c Limit the size of the new delta_base_cache 2007-03-18 22:43:37 -07:00
exec_cmd.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
exec_cmd.h
fast-import.c Remove unnecessary casts from fast-import 2007-03-12 15:48:37 -04:00
fetch-pack.c Merge branch 'js/fetch-progress' (early part) 2007-03-04 17:31:21 -08:00
fetch.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
fetch.h
generate-cmdlist.sh
git-add--interactive.perl
git-am.sh builtin-mailinfo.c infrastrcture changes 2007-03-12 23:33:41 -07:00
git-applymbox.sh applymbox: brown paper bag fix. 2007-03-16 21:22:05 -07:00
git-applypatch.sh
git-archimport.perl git-archimport: allow remapping branch names 2007-03-07 10:30:22 -08:00
git-bisect.sh git-bisect.sh: properly dq $GIT_DIR 2007-03-23 13:29:55 -07:00
git-checkout.sh checkout: report where the new HEAD is upon detaching HEAD 2007-03-23 02:48:09 -07:00
git-clean.sh
git-clone.sh make git clone -q suppress the noise with http fetch 2007-03-19 23:46:30 -07:00
git-commit.sh git-commit: add a --interactive option 2007-03-09 00:05:23 -08:00
git-compat-util.h Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
git-cvsexportcommit.perl Merge branch 'maint' 2007-02-28 14:18:57 -08:00
git-cvsimport.perl
git-cvsserver.perl cvsserver: further improve messages on commit and status 2007-03-14 02:09:33 -07:00
git-fetch.sh git-fetch: Fix single_force in append_fetch_head 2007-03-20 01:52:11 -07:00
git-instaweb.sh
git-lost-found.sh
git-ls-remote.sh Add git-bundle: move objects and references by archive 2007-02-22 22:30:33 -08:00
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-ours.sh
git-merge-resolve.sh
git-merge-stupid.sh
git-merge.sh git-merge: Put FETCH_HEAD data in merge commit message 2007-03-22 03:01:43 -07:00
git-mergetool.sh mergetool: print an appropriate warning if merge.tool is unknown 2007-03-18 22:30:10 -04:00
git-p4import.py
git-parse-remote.sh git-fetch, git-branch: Support local --track via a special remote '.' 2007-03-16 02:10:12 -07:00
git-pull.sh
git-quiltimport.sh builtin-mailinfo.c infrastrcture changes 2007-03-12 23:33:41 -07:00
git-rebase.sh git-rebase: make 'rebase HEAD branch' work as expected. 2007-03-22 02:56:53 -07:00
git-relink.perl
git-remote.perl git-remote: support remotes with a dot in the name 2007-02-26 00:24:41 -08:00
git-repack.sh
git-request-pull.sh
git-reset.sh
git-send-email.perl Make git-send-email aware of Cc: lines. 2007-03-18 21:10:03 -07:00
git-sh-setup.sh
git-svn.perl git-svn: add -l/--local command to "git svn rebase" 2007-03-13 21:18:37 -07:00
git-svnimport.perl
git-tag.sh
git-verify-tag.sh
git.c Make gc a builtin. 2007-03-17 00:34:19 -07:00
git.spec.in
gitk [PATCH] prefer "git COMMAND" over "git-COMMAND" in gitk 2007-03-21 22:02:19 +11:00
grep.c
grep.h
hash-object.c index_fd(): pass optional path parameter as hint for blob conversion 2007-02-28 12:00:00 -08:00
help.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
http-fetch.c prefixcmp(): fix-up leftover strncmp(). 2007-02-20 22:03:15 -08:00
http-push.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
http.c
http.h
ident.c
imap-send.c prefixcmp(): fix-up leftover strncmp(). 2007-02-20 22:03:15 -08:00
index-pack.c index-pack: more validation checks and cleanups 2007-03-20 22:09:59 -07:00
interpolate.c General const correctness fixes 2007-03-07 10:47:10 -08:00
interpolate.h General const correctness fixes 2007-03-07 10:47:10 -08:00
list-objects.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
list-objects.h
local-fetch.c [PATCH] local-fetch.c: some error printing cleanup 2007-03-16 21:27:35 -07:00
lockfile.c
log-tree.c format-patch --attach: not folding some long headers. 2007-03-04 17:31:29 -08:00
log-tree.h
merge-file.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
merge-index.c Fix merge-index 2007-03-19 02:48:37 -07:00
merge-recursive.c Handle core.symlinks=false case in merge-recursive. 2007-03-03 18:59:41 -08:00
merge-tree.c Remove "pathlen" from "struct name_entry" 2007-03-21 10:21:56 -07:00
mktag.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
mktree.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
object-refs.c
object.c Don't ever return corrupt objects from "parse_object()" 2007-03-20 22:17:17 -07:00
object.h get rid of lookup_object_type() 2007-02-27 01:34:21 -08:00
pack-check.c [PATCH] clean up pack index handling a bit 2007-03-16 21:27:36 -07:00
pack-redundant.c [PATCH] clean up pack index handling a bit 2007-03-16 21:27:36 -07:00
pack.h [PATCH] clean up pack index handling a bit 2007-03-16 21:27:36 -07:00
pager.c
patch-delta.c
patch-id.c
path-list.c
path-list.h
path.c General const correctness fixes 2007-03-07 10:47:10 -08:00
peek-remote.c prefixcmp(): fix-up mechanical conversion. 2007-02-20 22:03:15 -08:00
pkt-line.c
pkt-line.h
quote.c
quote.h
reachable.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
reachable.h
read-cache.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
receive-pack.c Use run_command within receive-pack to invoke index-pack 2007-03-12 23:40:18 -07:00
reflog-walk.c
reflog-walk.h
refs.c update HEAD reflog when branch pointed to by HEAD is directly modified 2007-03-22 03:02:48 -07:00
refs.h
revision.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
revision.h Merge branch 'jc/boundary' 2007-03-11 23:02:52 -07:00
rsh.c
rsh.h
run-command.c Teach run-command to redirect stdout to /dev/null 2007-03-12 23:40:17 -07:00
run-command.h Teach run-command to redirect stdout to /dev/null 2007-03-12 23:40:17 -07:00
send-pack.c Use run_command within send-pack 2007-03-12 23:40:18 -07:00
server-info.c
setup.c Merge branch 'maint' 2007-03-10 22:07:26 -08:00
sha1_file.c Be more careful about zlib return values 2007-03-20 22:17:32 -07:00
sha1_name.c Re-fix get_sha1_oneline() 2007-03-12 11:30:38 -07:00
shallow.c
shell.c Mechanical conversion to use prefixcmp() 2007-02-20 22:03:15 -08:00
show-index.c
sideband.c
sideband.h
ssh-fetch.c
ssh-pull.c
ssh-push.c
ssh-upload.c
strbuf.c
strbuf.h
tag.c get rid of lookup_object_type() 2007-02-27 01:34:21 -08:00
tag.h
tar.h
test-chmtime.c Add test-chmtime: a utility to change mtime on files 2007-02-25 11:09:56 -08:00
test-date.c
test-delta.c
test-sha1.c
test-sha1.sh
trace.c git-branch, git-checkout: autosetup for remote branch tracking 2007-03-10 23:41:58 -08:00
tree-diff.c tree_entry_interesting(): allow it to say "everything is interesting" 2007-03-22 00:36:00 -07:00
tree-walk.c Switch over tree descriptors to contain a pre-parsed entry 2007-03-21 11:15:26 -07:00
tree-walk.h Switch over tree descriptors to contain a pre-parsed entry 2007-03-21 11:15:26 -07:00
tree.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
tree.h
unpack-file.c convert object type handling from a string to a number 2007-02-27 01:34:21 -08:00
unpack-trees.c Initialize tree descriptors with a helper function rather than by hand. 2007-03-21 10:21:57 -07:00
unpack-trees.h
update-server-info.c
upload-pack.c Merge branch 'js/fetch-progress' (early part) 2007-03-04 17:31:21 -08:00
usage.c
utf8.c Merge branch 'maint' 2007-03-03 19:47:46 -08:00
utf8.h Actually make print_wrapped_text() useful 2007-02-27 17:29:02 -08:00
var.c
write_or_die.c
wt-status.c Merge branch 'master' into js/diff-ni 2007-02-26 01:20:42 -08:00
wt-status.h
xdiff-interface.c Cast 64 bit off_t to 32 bit size_t 2007-03-07 11:15:26 -08:00
xdiff-interface.h

README

////////////////////////////////////////////////////////////////

	GIT - the stupid content tracker

////////////////////////////////////////////////////////////////

"git" can mean anything, depending on your mood.

 - random three-letter combination that is pronounceable, and not
   actually used by any common UNIX command.  The fact that it is a
   mispronunciation of "get" may or may not be relevant.
 - stupid. contemptible and despicable. simple. Take your pick from the
   dictionary of slang.
 - "global information tracker": you're in a good mood, and it actually
   works for you. Angels sing, and a light suddenly fills the room.
 - "goddamn idiotic truckload of sh*t": when it breaks

Git is a fast, scalable, distributed revision control system with an
unusually rich command set that provides both high-level operations
and full access to internals.

Git is an Open Source project covered by the GNU General Public License.
It was originally written by Linus Torvalds with help of a group of
hackers around the net. It is currently maintained by Junio C Hamano.

Please read the file INSTALL for installation instructions.
See Documentation/tutorial.txt to get started, then see
Documentation/everyday.txt for a useful minimum set of commands,
and "man git-commandname" for documentation of each command.
CVS users may also want to read Documentation/cvs-migration.txt.

Many Git online resources are accessible from http://git.or.cz/
including full documentation and Git related tools.

The user discussion and development of Git take place on the Git
mailing list -- everyone is welcome to post bug reports, feature
requests, comments and patches to git@vger.kernel.org. To subscribe
to the list, send an email with just "subscribe git" in the body to
majordomo@vger.kernel.org. The mailing list archives are available at
http://marc.theaimsgroup.com/?l=git and other archival sites.