static int do_compare_entry(const struct cache_entry *ce, const struct traverse_info *info, const struct name_entry *n) { int len, pathlen, ce_len; const char *ce_name; int cmp; /* * If we have not precomputed the traverse path, it is quicker * to avoid doing so. But if we have precomputed it, * it is quicker to use the precomputed version. */ if (!info->traverse_path) return do_compare_entry_piecewise(ce, info, n); cmp = strncmp(ce->name, info->traverse_path, info->pathlen); if (cmp) return cmp; pathlen = info->pathlen; ce_len = ce_namelen(ce); if (ce_len < pathlen) return -1; ce_len -= pathlen; ce_name = ce->name + pathlen; len = tree_entry_len(n); return df_name_compare(ce_name, ce_len, S_IFREG, n->path, len, n->mode); }
/* * Compare the traverse-path to the cache entry without actually * having to generate the textual representation of the traverse * path. * * NOTE! This *only* compares up to the size of the traverse path * itself - the caller needs to do the final check for the cache * entry having more data at the end! */ static int do_compare_entry(const struct cache_entry *ce, const struct traverse_info *info, const struct name_entry *n) { int len, pathlen, ce_len; const char *ce_name; if (info->prev) { int cmp = do_compare_entry(ce, info->prev, &info->name); if (cmp) return cmp; } pathlen = info->pathlen; ce_len = ce_namelen(ce); /* If ce_len < pathlen then we must have previously hit "name == directory" entry */ if (ce_len < pathlen) return -1; ce_len -= pathlen; ce_name = ce->name + pathlen; len = tree_entry_len(n); return df_name_compare(ce_name, ce_len, S_IFREG, n->path, len, n->mode); }
static int entry_compare(struct name_entry *a, struct name_entry *b) { return df_name_compare( a->path, tree_entry_len(a->path, a->sha1), a->mode, b->path, tree_entry_len(b->path, b->sha1), b->mode); }