Fixes #127 (that was quite an outstanding issue). Rationale: The tree objects on Git are stored and read following a very specific sorting algorithm that places folders before files. That original sort was the sort we were storing on memory, but this sort was being queried with a binary search that used a simple `strcmp` for comparison, so there were many instances where the search was failing. Obviously, the most straightforward way to fix this is changing the binary search CB to use the same comparison method as the sorting CB. The problem with this is that the binary search callback compares a path and an entry, so there is no way to know if the given path is a folder or a standard file. How do we work around this? Instead of splitting the `entry_byname` method in two (one for searching directories and one for searching normal files), we just assume that the path we are searching for is of the same kind as the path it's being compared at the moment. return git_futils_cmp_path( ksearch->filename, ksearch->filename_len, entry->attr & 040000, entry->filename, entry->filename_len, entry->attr & 040000); Since there cannot be a folder and a regular file with the same name on the same tree, the most basic equality check will always fail for all comparsions, until our path is compared with the actual entry we are looking for; in this case, the matching will succeed with the file type of the entry -- whatever it was initially. I hope that makes sense. PS: While I was at it, I switched the cmp methods to use cached values for the length of each filename. That makes searches and sorts retardedly fast -- I was wondering the reason of the performance hiccups on massive trees; it's because of 2*strlen for each comparsion call.
Name |
Last commit
|
Last update |
---|---|---|
.. | ||
ppc | Loading commit data... | |
unix | Loading commit data... | |
win32 | Loading commit data... | |
blob.c | Loading commit data... | |
blob.h | Loading commit data... | |
bswap.h | Loading commit data... | |
buffer.c | Loading commit data... | |
buffer.h | Loading commit data... | |
cache.c | Loading commit data... | |
cache.h | Loading commit data... | |
cc-compat.h | Loading commit data... | |
commit.c | Loading commit data... | |
commit.h | Loading commit data... | |
common.h | Loading commit data... | |
config.c | Loading commit data... | |
config.h | Loading commit data... | |
config_file.c | Loading commit data... | |
delta-apply.c | Loading commit data... | |
delta-apply.h | Loading commit data... | |
dir.h | Loading commit data... | |
errors.c | Loading commit data... | |
filebuf.c | Loading commit data... | |
filebuf.h | Loading commit data... | |
fileops.c | Loading commit data... | |
fileops.h | Loading commit data... | |
hash.c | Loading commit data... | |
hash.h | Loading commit data... | |
hashtable.c | Loading commit data... | |
hashtable.h | Loading commit data... | |
index.c | Loading commit data... | |
index.h | Loading commit data... | |
map.h | Loading commit data... | |
netops.c | Loading commit data... | |
netops.h | Loading commit data... | |
object.c | Loading commit data... | |
odb.c | Loading commit data... | |
odb.h | Loading commit data... | |
odb_loose.c | Loading commit data... | |
odb_pack.c | Loading commit data... | |
oid.c | Loading commit data... | |
path.c | Loading commit data... | |
path.h | Loading commit data... | |
pkt.c | Loading commit data... | |
pkt.h | Loading commit data... | |
posix.c | Loading commit data... | |
posix.h | Loading commit data... | |
pqueue.c | Loading commit data... | |
pqueue.h | Loading commit data... | |
reflog.c | Loading commit data... | |
reflog.h | Loading commit data... | |
refs.c | Loading commit data... | |
refs.h | Loading commit data... | |
refspec.c | Loading commit data... | |
refspec.h | Loading commit data... | |
remote.c | Loading commit data... | |
remote.h | Loading commit data... | |
repository.c | Loading commit data... | |
repository.h | Loading commit data... | |
revwalk.c | Loading commit data... | |
sha1.c | Loading commit data... | |
sha1.h | Loading commit data... | |
sha1_lookup.c | Loading commit data... | |
sha1_lookup.h | Loading commit data... | |
signature.c | Loading commit data... | |
signature.h | Loading commit data... | |
status.c | Loading commit data... | |
tag.c | Loading commit data... | |
tag.h | Loading commit data... | |
thread-utils.c | Loading commit data... | |
thread-utils.h | Loading commit data... | |
transport.c | Loading commit data... | |
transport.h | Loading commit data... | |
transport_git.c | Loading commit data... | |
transport_local.c | Loading commit data... | |
tree.c | Loading commit data... | |
tree.h | Loading commit data... | |
tsort.c | Loading commit data... | |
util.c | Loading commit data... | |
util.h | Loading commit data... | |
vector.c | Loading commit data... | |
vector.h | Loading commit data... |