commit - 106807b41a6bef7947cfced77add51eb02ad574f
commit + 65a9bbe94592ac5bec831087f9873db4dde02199
blob - 48da912bbce374d5db01809238ca58fd3b72b305
blob + 72fdee411ab19fe805fb6515f5618f4fb8bac2c0
--- lib/object.c
+++ lib/object.c
}
static struct got_tree_entry *
-find_entry_by_name(struct got_tree_object *tree, const char *name)
+find_entry_by_name(struct got_tree_object *tree, const char *name, size_t len)
{
struct got_tree_entry *te;
SIMPLEQ_FOREACH(te, &tree->entries.head, entry) {
- if (strcmp(te->name, name) == 0)
+ if (strncmp(te->name, name, len) == 0)
return te;
}
return NULL;
struct got_commit_object *commit = NULL;
struct got_tree_object *tree = NULL;
struct got_tree_entry *te = NULL;
- char *seg, *s, *s0 = NULL;
- size_t len = strlen(path);
+ const char *seg, *s;
+ size_t seglen, len = strlen(path);
*id = NULL;
if (err)
goto done;
- s0 = strdup(path);
- if (s0 == NULL) {
- err = got_error_from_errno();
- goto done;
- }
- err = got_canonpath(path, s0, len + 1);
- if (err)
- goto done;
-
- s = s0;
+ s = path;
s++; /* skip leading '/' */
len--;
seg = s;
+ seglen = 0;
while (len > 0) {
struct got_tree_object *next_tree;
if (*s != '/') {
s++;
len--;
+ seglen++;
if (*s)
continue;
}
- /* end of path segment */
- *s = '\0';
-
- te = find_entry_by_name(tree, seg);
+ te = find_entry_by_name(tree, seg, seglen);
if (te == NULL) {
err = got_error(GOT_ERR_NO_OBJ);
goto done;
break;
seg = s + 1;
+ seglen = 0;
s++;
len--;
if (*s) {
} else
err = got_error(GOT_ERR_NO_OBJ);
done:
- free(s0);
if (commit)
got_object_commit_close(commit);
if (tree)
const struct got_error *err = NULL;
struct got_tree_object *tree1 = NULL, *tree2 = NULL;
struct got_tree_entry *te1 = NULL, *te2 = NULL;
- char *seg, *s, *s0 = NULL;
- size_t len = strlen(path);
+ const char *seg, *s;
+ size_t seglen, len = strlen(path);
*changed = 0;
if (path[1] == '\0')
return got_error(GOT_ERR_BAD_PATH);
- s0 = strdup(path);
- if (s0 == NULL) {
- err = got_error_from_errno();
- goto done;
- }
- err = got_canonpath(path, s0, len + 1);
- if (err)
- goto done;
-
tree1 = tree01;
tree2 = tree02;
- s = s0;
+ s = path;
s++; /* skip leading '/' */
len--;
seg = s;
+ seglen = 0;
while (len > 0) {
struct got_tree_object *next_tree1, *next_tree2;
if (*s != '/') {
s++;
len--;
+ seglen++;
if (*s)
continue;
}
- /* end of path segment */
- *s = '\0';
-
- te1 = find_entry_by_name(tree1, seg);
+ te1 = find_entry_by_name(tree1, seg, seglen);
if (te1 == NULL) {
err = got_error(GOT_ERR_NO_OBJ);
goto done;
}
- te2 = find_entry_by_name(tree2, seg);
+ te2 = find_entry_by_name(tree2, seg, seglen);
if (te2 == NULL) {
*changed = 1;
goto done;
seg = s + 1;
s++;
len--;
+ seglen = 0;
if (*s) {
err = got_object_open_as_tree(&next_tree1, repo,
te1->id);
}
}
done:
- free(s0);
if (tree1 && tree1 != tree01)
got_object_tree_close(tree1);
if (tree2 && tree2 != tree02)