Git trees are now always lazily sorted Removed `git_tree_add_entry_unsorted`. Now the `git_tree_add_entry` method doesn't sort the entries array by default; entries are only sorted lazily when required. This is done automatically by the library (the `git_tree_sort_entries` call has been removed). This should improve performance. No point on sorting entries all the time, anyway. Signed-off-by: Vicent Marti <tanoku@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
diff --git a/src/git2/tree.h b/src/git2/tree.h
index 6f79ac4..20c3675 100644
--- a/src/git2/tree.h
+++ b/src/git2/tree.h
@@ -149,36 +149,6 @@ GIT_EXTERN(int) git_tree_entry_2object(git_object **object, git_tree_entry *entr
GIT_EXTERN(int) git_tree_add_entry(git_tree_entry **entry_out, git_tree *tree, const git_oid *id, const char *filename, int attributes);
/**
- * Add a new entry to a tree, returning that new entry.
- * The only difference with this call is that it does not sort
- * tree afterwards, this requirement is left to the caller.
- *
- * This will mark the tree as modified; the new entry will
- * be written back to disk on the next git_object_write()
- *
- * @param entry Entry object which will be created
- * @param tree Tree object to store the entry
- * @iparam id OID for the tree entry
- * @param filename Filename for the tree entry
- * @param attributes UNIX file attributes for the entry
- * @return 0 on success; otherwise error code
- */
-GIT_EXTERN(int) git_tree_add_entry_unsorted(git_tree_entry **entry, git_tree *tree, const git_oid *id, const char *filename, int attributes);
-
-/**
- * Sort the entries in a tree created using git_tree_add_entry2.
- *
- * This does not mark the tree as modified. It is intended to be used
- * after several invocations of git_tree_add_entry2.
- * git_tree_add_entry, on the other hand, sorts after each entry is
- * added.
- *
- * @param tree Tree object whose entries are to be sorted
- * @return 0 on success; otherwise error code
- */
-GIT_EXTERN(int) git_tree_sort_entries(git_tree *tree);
-
-/**
* Remove an entry by its index.
*
* Index must be >= 0 and < than git_tree_entrycount().
diff --git a/src/tree.c b/src/tree.c
index 5cef676..e8cf179 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -174,6 +174,14 @@ int git_tree_entry_2object(git_object **object_out, git_tree_entry *entry)
return git_repository_lookup(object_out, entry->owner->object.repo, &entry->oid, GIT_OBJ_ANY);
}
+static void sort_entries(git_tree *tree)
+{
+ if (tree->sorted == 0) {
+ git_vector_sort(&tree->entries);
+ tree->sorted = 1;
+ }
+}
+
git_tree_entry *git_tree_entry_byname(git_tree *tree, const char *filename)
{
int idx;
@@ -181,7 +189,7 @@ git_tree_entry *git_tree_entry_byname(git_tree *tree, const char *filename)
assert(tree && filename);
if (!tree->sorted)
- git_tree_sort_entries(tree);
+ sort_entries(tree);
idx = git_vector_search(&tree->entries, filename);
if (idx == GIT_ENOTFOUND)
@@ -195,7 +203,7 @@ git_tree_entry *git_tree_entry_byindex(git_tree *tree, int idx)
assert(tree);
if (!tree->sorted)
- git_tree_sort_entries(tree);
+ sort_entries(tree);
return git_vector_get(&tree->entries, (unsigned int)idx);
}
@@ -206,7 +214,7 @@ size_t git_tree_entrycount(git_tree *tree)
return tree->entries.length;
}
-int git_tree_add_entry_unsorted(git_tree_entry **entry_out, git_tree *tree, const git_oid *id, const char *filename, int attributes)
+int git_tree_add_entry(git_tree_entry **entry_out, git_tree *tree, const git_oid *id, const char *filename, int attributes)
{
git_tree_entry *entry;
@@ -233,22 +241,6 @@ int git_tree_add_entry_unsorted(git_tree_entry **entry_out, git_tree *tree, cons
return GIT_SUCCESS;
}
-int git_tree_add_entry(git_tree_entry **entry_out, git_tree *tree, const git_oid *id, const char *filename, int attributes)
-{
- int result = git_tree_add_entry_unsorted(entry_out, tree, id, filename, attributes);
- if (result == GIT_SUCCESS)
- git_tree_sort_entries(tree);
-
- return result;
-}
-
-int git_tree_sort_entries(git_tree *tree)
-{
- git_vector_sort(&tree->entries);
- tree->sorted = 1;
- return GIT_SUCCESS;
-}
-
int git_tree_remove_entry_byindex(git_tree *tree, int idx)
{
git_tree_entry *remove_ptr;
@@ -256,7 +248,7 @@ int git_tree_remove_entry_byindex(git_tree *tree, int idx)
assert(tree);
if (!tree->sorted)
- git_tree_sort_entries(tree);
+ sort_entries(tree);
remove_ptr = git_vector_get(&tree->entries, (unsigned int)idx);
if (remove_ptr == NULL)
@@ -277,7 +269,7 @@ int git_tree_remove_entry_byname(git_tree *tree, const char *filename)
assert(tree && filename);
if (!tree->sorted)
- git_tree_sort_entries(tree);
+ sort_entries(tree);
idx = git_vector_search(&tree->entries, filename);
if (idx == GIT_ENOTFOUND)
@@ -297,7 +289,7 @@ int git_tree__writeback(git_tree *tree, git_odb_source *src)
return GIT_EMISSINGOBJDATA;
if (!tree->sorted)
- git_tree_sort_entries(tree);
+ sort_entries(tree);
for (i = 0; i < tree->entries.length; ++i) {
git_tree_entry *entry;