rugged 0.26.0b3 → 0.26.0b4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/ext/rugged/extconf.rb +10 -7
- data/ext/rugged/rugged.c +4 -6
- data/ext/rugged/rugged_repo.c +1 -1
- data/ext/rugged/rugged_revwalk.c +4 -4
- data/ext/rugged/rugged_tree.c +2 -2
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +13 -6
- data/vendor/libgit2/COPYING +33 -0
- data/vendor/libgit2/include/git2/branch.h +12 -0
- data/vendor/libgit2/include/git2/commit.h +6 -3
- data/vendor/libgit2/include/git2/common.h +11 -0
- data/vendor/libgit2/include/git2/errors.h +2 -0
- data/vendor/libgit2/include/git2/index.h +7 -6
- data/vendor/libgit2/include/git2/repository.h +91 -0
- data/vendor/libgit2/include/git2/stash.h +2 -2
- data/vendor/libgit2/include/git2/types.h +3 -0
- data/vendor/libgit2/include/git2/worktree.h +161 -0
- data/vendor/libgit2/src/attr.c +24 -16
- data/vendor/libgit2/src/attr_file.h +1 -1
- data/vendor/libgit2/src/attrcache.c +11 -10
- data/vendor/libgit2/src/attrcache.h +1 -4
- data/vendor/libgit2/src/blob.c +2 -2
- data/vendor/libgit2/src/branch.c +63 -0
- data/vendor/libgit2/src/buffer.h +2 -1
- data/vendor/libgit2/src/cache.c +21 -25
- data/vendor/libgit2/src/cache.h +1 -1
- data/vendor/libgit2/src/checkout.c +0 -2
- data/vendor/libgit2/src/cherrypick.c +2 -2
- data/vendor/libgit2/src/clone.c +2 -3
- data/vendor/libgit2/src/commit.c +8 -4
- data/vendor/libgit2/src/config_file.c +1 -3
- data/vendor/libgit2/src/describe.c +1 -3
- data/vendor/libgit2/src/diff_driver.c +2 -4
- data/vendor/libgit2/src/fetchhead.c +2 -2
- data/vendor/libgit2/src/fileops.c +1 -3
- data/vendor/libgit2/src/hash.h +5 -3
- data/vendor/libgit2/src/hash/hash_collisiondetect.h +57 -0
- data/vendor/libgit2/src/hash/sha1dc/sha1.c +1149 -0
- data/vendor/libgit2/src/hash/sha1dc/sha1.h +94 -0
- data/vendor/libgit2/src/hash/sha1dc/ubc_check.c +361 -0
- data/vendor/libgit2/src/hash/sha1dc/ubc_check.h +35 -0
- data/vendor/libgit2/src/idxmap.c +133 -0
- data/vendor/libgit2/src/idxmap.h +22 -60
- data/vendor/libgit2/src/ignore.c +7 -1
- data/vendor/libgit2/src/ignore.h +1 -1
- data/vendor/libgit2/src/index.c +11 -14
- data/vendor/libgit2/src/indexer.c +8 -11
- data/vendor/libgit2/src/merge.c +5 -5
- data/vendor/libgit2/src/mwindow.c +1 -3
- data/vendor/libgit2/src/odb.c +3 -3
- data/vendor/libgit2/src/odb.h +3 -0
- data/vendor/libgit2/src/odb_mempack.c +11 -18
- data/vendor/libgit2/src/offmap.c +83 -0
- data/vendor/libgit2/src/offmap.h +14 -34
- data/vendor/libgit2/src/oidmap.c +105 -0
- data/vendor/libgit2/src/oidmap.h +19 -22
- data/vendor/libgit2/src/pack-objects.c +10 -13
- data/vendor/libgit2/src/pack.c +17 -26
- data/vendor/libgit2/src/path.c +45 -24
- data/vendor/libgit2/src/rebase.c +3 -3
- data/vendor/libgit2/src/refdb_fs.c +81 -46
- data/vendor/libgit2/src/refs.c +13 -3
- data/vendor/libgit2/src/remote.c +6 -2
- data/vendor/libgit2/src/repository.c +318 -46
- data/vendor/libgit2/src/repository.h +5 -2
- data/vendor/libgit2/src/revert.c +2 -2
- data/vendor/libgit2/src/revwalk.c +6 -8
- data/vendor/libgit2/src/settings.c +5 -0
- data/vendor/libgit2/src/sortedcache.c +3 -5
- data/vendor/libgit2/src/strmap.c +95 -0
- data/vendor/libgit2/src/strmap.h +17 -37
- data/vendor/libgit2/src/submodule.c +12 -8
- data/vendor/libgit2/src/thread-utils.h +6 -0
- data/vendor/libgit2/src/transaction.c +5 -17
- data/vendor/libgit2/src/transports/local.c +2 -1
- data/vendor/libgit2/src/transports/smart.h +2 -0
- data/vendor/libgit2/src/transports/smart_protocol.c +3 -1
- data/vendor/libgit2/src/tree.c +2 -4
- data/vendor/libgit2/src/unix/posix.h +1 -1
- data/vendor/libgit2/src/worktree.c +432 -0
- data/vendor/libgit2/src/worktree.h +35 -0
- metadata +13 -2
@@ -14,8 +14,6 @@
|
|
14
14
|
#include "strmap.h"
|
15
15
|
#include "pack.h"
|
16
16
|
|
17
|
-
GIT__USE_STRMAP
|
18
|
-
|
19
17
|
#define DEFAULT_WINDOW_SIZE \
|
20
18
|
(sizeof(void*) >= 8 \
|
21
19
|
? 1 * 1024 * 1024 * 1024 \
|
@@ -84,7 +82,7 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
|
|
84
82
|
|
85
83
|
git_atomic_inc(&pack->refcount);
|
86
84
|
|
87
|
-
git_strmap_insert(git__pack_cache, pack->pack_name, pack, error);
|
85
|
+
git_strmap_insert(git__pack_cache, pack->pack_name, pack, &error);
|
88
86
|
git_mutex_unlock(&git__mwindow_mutex);
|
89
87
|
|
90
88
|
if (error < 0) {
|
data/vendor/libgit2/src/odb.c
CHANGED
@@ -695,7 +695,7 @@ static int odb_freshen_1(
|
|
695
695
|
return (int)found;
|
696
696
|
}
|
697
697
|
|
698
|
-
|
698
|
+
int git_odb__freshen(git_odb *db, const git_oid *id)
|
699
699
|
{
|
700
700
|
assert(db && id);
|
701
701
|
|
@@ -1167,7 +1167,7 @@ int git_odb_write(
|
|
1167
1167
|
assert(oid && db);
|
1168
1168
|
|
1169
1169
|
git_odb_hash(oid, data, len, type);
|
1170
|
-
if (
|
1170
|
+
if (git_odb__freshen(db, oid))
|
1171
1171
|
return 0;
|
1172
1172
|
|
1173
1173
|
for (i = 0; i < db->backends.length && error < 0; ++i) {
|
@@ -1293,7 +1293,7 @@ int git_odb_stream_finalize_write(git_oid *out, git_odb_stream *stream)
|
|
1293
1293
|
|
1294
1294
|
git_hash_final(out, stream->hash_ctx);
|
1295
1295
|
|
1296
|
-
if (
|
1296
|
+
if (git_odb__freshen(stream->backend->odb, out))
|
1297
1297
|
return 0;
|
1298
1298
|
|
1299
1299
|
return stream->finalize_write(stream, out);
|
data/vendor/libgit2/src/odb.h
CHANGED
@@ -98,6 +98,9 @@ int git_odb__read_header_or_object(
|
|
98
98
|
git_odb_object **out, size_t *len_p, git_otype *type_p,
|
99
99
|
git_odb *db, const git_oid *id);
|
100
100
|
|
101
|
+
/* freshen an entry in the object database */
|
102
|
+
int git_odb__freshen(git_odb *db, const git_oid *id);
|
103
|
+
|
101
104
|
/* fully free the object; internal method, DO NOT EXPORT */
|
102
105
|
void git_odb_object__free(void *object);
|
103
106
|
|
@@ -18,8 +18,6 @@
|
|
18
18
|
#include "git2/types.h"
|
19
19
|
#include "git2/pack.h"
|
20
20
|
|
21
|
-
GIT__USE_OIDMAP
|
22
|
-
|
23
21
|
struct memobject {
|
24
22
|
git_oid oid;
|
25
23
|
size_t len;
|
@@ -41,7 +39,7 @@ static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void
|
|
41
39
|
size_t alloc_len;
|
42
40
|
int rval;
|
43
41
|
|
44
|
-
pos =
|
42
|
+
pos = git_oidmap_put(db->objects, oid, &rval);
|
45
43
|
if (rval < 0)
|
46
44
|
return -1;
|
47
45
|
|
@@ -57,8 +55,8 @@ static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void
|
|
57
55
|
obj->len = len;
|
58
56
|
obj->type = type;
|
59
57
|
|
60
|
-
|
61
|
-
|
58
|
+
git_oidmap_set_key_at(db->objects, pos, &obj->oid);
|
59
|
+
git_oidmap_set_value_at(db->objects, pos, obj);
|
62
60
|
|
63
61
|
if (type == GIT_OBJ_COMMIT) {
|
64
62
|
struct memobject **store = git_array_alloc(db->commits);
|
@@ -72,13 +70,8 @@ static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void
|
|
72
70
|
static int impl__exists(git_odb_backend *backend, const git_oid *oid)
|
73
71
|
{
|
74
72
|
struct memory_packer_db *db = (struct memory_packer_db *)backend;
|
75
|
-
khiter_t pos;
|
76
73
|
|
77
|
-
|
78
|
-
if (pos != kh_end(db->objects))
|
79
|
-
return 1;
|
80
|
-
|
81
|
-
return 0;
|
74
|
+
return git_oidmap_exists(db->objects, oid);
|
82
75
|
}
|
83
76
|
|
84
77
|
static int impl__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid)
|
@@ -87,11 +80,11 @@ static int impl__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb
|
|
87
80
|
struct memobject *obj = NULL;
|
88
81
|
khiter_t pos;
|
89
82
|
|
90
|
-
pos =
|
91
|
-
if (
|
83
|
+
pos = git_oidmap_lookup_index(db->objects, oid);
|
84
|
+
if (!git_oidmap_valid_index(db->objects, pos))
|
92
85
|
return GIT_ENOTFOUND;
|
93
86
|
|
94
|
-
obj =
|
87
|
+
obj = git_oidmap_value_at(db->objects, pos);
|
95
88
|
|
96
89
|
*len_p = obj->len;
|
97
90
|
*type_p = obj->type;
|
@@ -108,11 +101,11 @@ static int impl__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *
|
|
108
101
|
struct memobject *obj = NULL;
|
109
102
|
khiter_t pos;
|
110
103
|
|
111
|
-
pos =
|
112
|
-
if (
|
104
|
+
pos = git_oidmap_lookup_index(db->objects, oid);
|
105
|
+
if (!git_oidmap_valid_index(db->objects, pos))
|
113
106
|
return GIT_ENOTFOUND;
|
114
107
|
|
115
|
-
obj =
|
108
|
+
obj = git_oidmap_value_at(db->objects, pos);
|
116
109
|
|
117
110
|
*len_p = obj->len;
|
118
111
|
*type_p = obj->type;
|
@@ -149,7 +142,7 @@ void git_mempack_reset(git_odb_backend *_backend)
|
|
149
142
|
struct memory_packer_db *db = (struct memory_packer_db *)_backend;
|
150
143
|
struct memobject *object = NULL;
|
151
144
|
|
152
|
-
|
145
|
+
git_oidmap_foreach_value(db->objects, object, {
|
153
146
|
git__free(object);
|
154
147
|
});
|
155
148
|
|
@@ -0,0 +1,83 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
3
|
+
*
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "offmap.h"
|
9
|
+
|
10
|
+
__KHASH_IMPL(off, static kh_inline, git_off_t, void *, 1, kh_int64_hash_func, kh_int64_hash_equal)
|
11
|
+
|
12
|
+
git_offmap *git_offmap_alloc(void)
|
13
|
+
{
|
14
|
+
return kh_init(off);
|
15
|
+
}
|
16
|
+
|
17
|
+
void git_offmap__free(git_offmap *map)
|
18
|
+
{
|
19
|
+
kh_destroy(off, map);
|
20
|
+
}
|
21
|
+
|
22
|
+
void git_offmap_clear(git_offmap *map)
|
23
|
+
{
|
24
|
+
kh_clear(off, map);
|
25
|
+
}
|
26
|
+
|
27
|
+
size_t git_offmap_num_entries(git_offmap *map)
|
28
|
+
{
|
29
|
+
return kh_size(map);
|
30
|
+
}
|
31
|
+
|
32
|
+
size_t git_offmap_lookup_index(git_offmap *map, const git_off_t key)
|
33
|
+
{
|
34
|
+
return kh_get(off, map, key);
|
35
|
+
}
|
36
|
+
|
37
|
+
int git_offmap_valid_index(git_offmap *map, size_t idx)
|
38
|
+
{
|
39
|
+
return idx != kh_end(map);
|
40
|
+
}
|
41
|
+
|
42
|
+
int git_offmap_exists(git_offmap *map, const git_off_t key)
|
43
|
+
{
|
44
|
+
return kh_get(off, map, key) != kh_end(map);
|
45
|
+
}
|
46
|
+
|
47
|
+
void *git_offmap_value_at(git_offmap *map, size_t idx)
|
48
|
+
{
|
49
|
+
return kh_val(map, idx);
|
50
|
+
}
|
51
|
+
|
52
|
+
void git_offmap_set_value_at(git_offmap *map, size_t idx, void *value)
|
53
|
+
{
|
54
|
+
kh_val(map, idx) = value;
|
55
|
+
}
|
56
|
+
|
57
|
+
void git_offmap_delete_at(git_offmap *map, size_t idx)
|
58
|
+
{
|
59
|
+
kh_del(off, map, idx);
|
60
|
+
}
|
61
|
+
|
62
|
+
int git_offmap_put(git_offmap *map, const git_off_t key, int *err)
|
63
|
+
{
|
64
|
+
return kh_put(off, map, key, err);
|
65
|
+
}
|
66
|
+
|
67
|
+
void git_offmap_insert(git_offmap *map, const git_off_t key, void *value, int *rval)
|
68
|
+
{
|
69
|
+
khiter_t idx = kh_put(off, map, key, rval);
|
70
|
+
|
71
|
+
if ((*rval) >= 0) {
|
72
|
+
if ((*rval) == 0)
|
73
|
+
kh_key(map, idx) = key;
|
74
|
+
kh_val(map, idx) = value;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
void git_offmap_delete(git_offmap *map, const git_off_t key)
|
79
|
+
{
|
80
|
+
khiter_t idx = git_offmap_lookup_index(map, key);
|
81
|
+
if (git_offmap_valid_index(map, idx))
|
82
|
+
git_offmap_delete_at(map, idx);
|
83
|
+
}
|
data/vendor/libgit2/src/offmap.h
CHANGED
@@ -20,45 +20,25 @@
|
|
20
20
|
__KHASH_TYPE(off, git_off_t, void *)
|
21
21
|
typedef khash_t(off) git_offmap;
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
git_offmap *git_offmap_alloc(void);
|
24
|
+
#define git_offmap_free(h) git_offmap__free(h); (h) = NULL
|
25
|
+
void git_offmap__free(git_offmap *map);
|
26
|
+
void git_offmap_clear(git_offmap *map);
|
25
27
|
|
26
|
-
|
27
|
-
#define git_offmap_free(h) kh_destroy(off, h), h = NULL
|
28
|
-
#define git_offmap_clear(h) kh_clear(off, h)
|
28
|
+
size_t git_offmap_num_entries(git_offmap *map);
|
29
29
|
|
30
|
-
|
30
|
+
size_t git_offmap_lookup_index(git_offmap *map, const git_off_t key);
|
31
|
+
int git_offmap_valid_index(git_offmap *map, size_t idx);
|
31
32
|
|
32
|
-
|
33
|
-
#define git_offmap_valid_index(h, idx) (idx != kh_end(h))
|
33
|
+
int git_offmap_exists(git_offmap *map, const git_off_t key);
|
34
34
|
|
35
|
-
|
35
|
+
void *git_offmap_value_at(git_offmap *map, size_t idx);
|
36
|
+
void git_offmap_set_value_at(git_offmap *map, size_t idx, void *value);
|
37
|
+
void git_offmap_delete_at(git_offmap *map, size_t idx);
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
#define git_offmap_insert(h, key, val, rval) do { \
|
42
|
-
khiter_t __pos = kh_put(off, h, key, &rval); \
|
43
|
-
if (rval >= 0) { \
|
44
|
-
if (rval == 0) kh_key(h, __pos) = key; \
|
45
|
-
kh_val(h, __pos) = val; \
|
46
|
-
} } while (0)
|
47
|
-
|
48
|
-
#define git_offmap_insert2(h, key, val, oldv, rval) do { \
|
49
|
-
khiter_t __pos = kh_put(off, h, key, &rval); \
|
50
|
-
if (rval >= 0) { \
|
51
|
-
if (rval == 0) { \
|
52
|
-
oldv = kh_val(h, __pos); \
|
53
|
-
kh_key(h, __pos) = key; \
|
54
|
-
} else { oldv = NULL; } \
|
55
|
-
kh_val(h, __pos) = val; \
|
56
|
-
} } while (0)
|
57
|
-
|
58
|
-
#define git_offmap_delete(h, key) do { \
|
59
|
-
khiter_t __pos = git_offmap_lookup_index(h, key); \
|
60
|
-
if (git_offmap_valid_index(h, __pos)) \
|
61
|
-
git_offmap_delete_at(h, __pos); } while (0)
|
39
|
+
int git_offmap_put(git_offmap *map, const git_off_t key, int *err);
|
40
|
+
void git_offmap_insert(git_offmap *map, const git_off_t key, void *value, int *rval);
|
41
|
+
void git_offmap_delete(git_offmap *map, const git_off_t key);
|
62
42
|
|
63
43
|
#define git_offmap_foreach kh_foreach
|
64
44
|
#define git_offmap_foreach_value kh_foreach_value
|
@@ -0,0 +1,105 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
3
|
+
*
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "oidmap.h"
|
9
|
+
|
10
|
+
GIT_INLINE(khint_t) git_oidmap_hash(const git_oid *oid)
|
11
|
+
{
|
12
|
+
khint_t h;
|
13
|
+
memcpy(&h, oid, sizeof(khint_t));
|
14
|
+
return h;
|
15
|
+
}
|
16
|
+
|
17
|
+
__KHASH_IMPL(oid, static kh_inline, const git_oid *, void *, 1, git_oidmap_hash, git_oid_equal)
|
18
|
+
|
19
|
+
git_oidmap *git_oidmap_alloc()
|
20
|
+
{
|
21
|
+
return kh_init(oid);
|
22
|
+
}
|
23
|
+
|
24
|
+
void git_oidmap__free(git_oidmap *map)
|
25
|
+
{
|
26
|
+
kh_destroy(oid, map);
|
27
|
+
}
|
28
|
+
|
29
|
+
void git_oidmap_clear(git_oidmap *map)
|
30
|
+
{
|
31
|
+
kh_clear(oid, map);
|
32
|
+
}
|
33
|
+
|
34
|
+
size_t git_oidmap_size(git_oidmap *map)
|
35
|
+
{
|
36
|
+
return kh_size(map);
|
37
|
+
}
|
38
|
+
|
39
|
+
size_t git_oidmap_lookup_index(git_oidmap *map, const git_oid *key)
|
40
|
+
{
|
41
|
+
return kh_get(oid, map, key);
|
42
|
+
}
|
43
|
+
|
44
|
+
int git_oidmap_valid_index(git_oidmap *map, size_t idx)
|
45
|
+
{
|
46
|
+
return idx != kh_end(map);
|
47
|
+
}
|
48
|
+
|
49
|
+
int git_oidmap_exists(git_oidmap *map, const git_oid *key)
|
50
|
+
{
|
51
|
+
return kh_get(oid, map, key) != kh_end(map);
|
52
|
+
}
|
53
|
+
|
54
|
+
int git_oidmap_has_data(git_oidmap *map, size_t idx)
|
55
|
+
{
|
56
|
+
return kh_exist(map, idx);
|
57
|
+
}
|
58
|
+
|
59
|
+
const git_oid *git_oidmap_key(git_oidmap *map, size_t idx)
|
60
|
+
{
|
61
|
+
return kh_key(map, idx);
|
62
|
+
}
|
63
|
+
|
64
|
+
void git_oidmap_set_key_at(git_oidmap *map, size_t idx, git_oid *key)
|
65
|
+
{
|
66
|
+
kh_key(map, idx) = key;
|
67
|
+
}
|
68
|
+
|
69
|
+
void *git_oidmap_value_at(git_oidmap *map, size_t idx)
|
70
|
+
{
|
71
|
+
return kh_val(map, idx);
|
72
|
+
}
|
73
|
+
|
74
|
+
void git_oidmap_set_value_at(git_oidmap *map, size_t idx, void *value)
|
75
|
+
{
|
76
|
+
kh_val(map, idx) = value;
|
77
|
+
}
|
78
|
+
|
79
|
+
void git_oidmap_delete_at(git_oidmap *map, size_t idx)
|
80
|
+
{
|
81
|
+
kh_del(oid, map, idx);
|
82
|
+
}
|
83
|
+
|
84
|
+
int git_oidmap_put(git_oidmap *map, const git_oid *key, int *err)
|
85
|
+
{
|
86
|
+
return kh_put(oid, map, key, err);
|
87
|
+
}
|
88
|
+
|
89
|
+
void git_oidmap_insert(git_oidmap *map, const git_oid *key, void *value, int *rval)
|
90
|
+
{
|
91
|
+
khiter_t idx = kh_put(oid, map, key, rval);
|
92
|
+
|
93
|
+
if ((*rval) >= 0) {
|
94
|
+
if ((*rval) == 0)
|
95
|
+
kh_key(map, idx) = key;
|
96
|
+
kh_val(map, idx) = value;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
void git_oidmap_delete(git_oidmap *map, const git_oid *key)
|
101
|
+
{
|
102
|
+
khiter_t idx = git_oidmap_lookup_index(map, key);
|
103
|
+
if (git_oidmap_valid_index(map, idx))
|
104
|
+
git_oidmap_delete_at(map, idx);
|
105
|
+
}
|
data/vendor/libgit2/src/oidmap.h
CHANGED
@@ -20,35 +20,32 @@
|
|
20
20
|
__KHASH_TYPE(oid, const git_oid *, void *)
|
21
21
|
typedef khash_t(oid) git_oidmap;
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
return h;
|
28
|
-
}
|
23
|
+
git_oidmap *git_oidmap_alloc(void);
|
24
|
+
#define git_oidmap_free(h) git_oidmap__free(h); (h) = NULL
|
25
|
+
void git_oidmap__free(git_oidmap *map);
|
26
|
+
void git_oidmap_clear(git_oidmap *map);
|
29
27
|
|
30
|
-
|
31
|
-
__KHASH_IMPL(oid, static kh_inline, const git_oid *, void *, 1, git_oidmap_hash, git_oid_equal)
|
28
|
+
size_t git_oidmap_size(git_oidmap *map);
|
32
29
|
|
33
|
-
|
34
|
-
|
30
|
+
size_t git_oidmap_lookup_index(git_oidmap *map, const git_oid *key);
|
31
|
+
int git_oidmap_valid_index(git_oidmap *map, size_t idx);
|
35
32
|
|
36
|
-
|
37
|
-
|
33
|
+
int git_oidmap_exists(git_oidmap *map, const git_oid *key);
|
34
|
+
int git_oidmap_has_data(git_oidmap *map, size_t idx);
|
38
35
|
|
39
|
-
|
36
|
+
const git_oid *git_oidmap_key(git_oidmap *map, size_t idx);
|
37
|
+
void git_oidmap_set_key_at(git_oidmap *map, size_t idx, git_oid *key);
|
38
|
+
void *git_oidmap_value_at(git_oidmap *map, size_t idx);
|
39
|
+
void git_oidmap_set_value_at(git_oidmap *map, size_t idx, void *value);
|
40
|
+
void git_oidmap_delete_at(git_oidmap *map, size_t idx);
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
if (rval == 0) kh_key(h, __pos) = key; \
|
45
|
-
kh_val(h, __pos) = val; \
|
46
|
-
} } while (0)
|
42
|
+
int git_oidmap_put(git_oidmap *map, const git_oid *key, int *err);
|
43
|
+
void git_oidmap_insert(git_oidmap *map, const git_oid *key, void *value, int *rval);
|
44
|
+
void git_oidmap_delete(git_oidmap *map, const git_oid *key);
|
47
45
|
|
48
46
|
#define git_oidmap_foreach_value kh_foreach_value
|
49
47
|
|
50
|
-
#define
|
51
|
-
|
52
|
-
#define git_oidmap_clear(h) kh_clear(oid, h)
|
48
|
+
#define git_oidmap_begin kh_begin
|
49
|
+
#define git_oidmap_end kh_end
|
53
50
|
|
54
51
|
#endif
|
@@ -41,8 +41,6 @@ struct pack_write_context {
|
|
41
41
|
git_transfer_progress *stats;
|
42
42
|
};
|
43
43
|
|
44
|
-
GIT__USE_OIDMAP
|
45
|
-
|
46
44
|
#ifdef GIT_THREADS
|
47
45
|
|
48
46
|
#define GIT_PACKBUILDER__MUTEX_OP(pb, mtx, op) do { \
|
@@ -197,10 +195,10 @@ static void rehash(git_packbuilder *pb)
|
|
197
195
|
size_t i;
|
198
196
|
int ret;
|
199
197
|
|
200
|
-
|
198
|
+
git_oidmap_clear(pb->object_ix);
|
201
199
|
for (i = 0, po = pb->object_list; i < pb->nr_objects; i++, po++) {
|
202
|
-
pos =
|
203
|
-
|
200
|
+
pos = git_oidmap_put(pb->object_ix, &po->id, &ret);
|
201
|
+
git_oidmap_set_value_at(pb->object_ix, pos, po);
|
204
202
|
}
|
205
203
|
}
|
206
204
|
|
@@ -216,8 +214,7 @@ int git_packbuilder_insert(git_packbuilder *pb, const git_oid *oid,
|
|
216
214
|
|
217
215
|
/* If the object already exists in the hash table, then we don't
|
218
216
|
* have any work to do */
|
219
|
-
|
220
|
-
if (pos != kh_end(pb->object_ix))
|
217
|
+
if (git_oidmap_exists(pb->object_ix, oid))
|
221
218
|
return 0;
|
222
219
|
|
223
220
|
if (pb->nr_objects >= pb->nr_alloc) {
|
@@ -247,13 +244,13 @@ int git_packbuilder_insert(git_packbuilder *pb, const git_oid *oid,
|
|
247
244
|
git_oid_cpy(&po->id, oid);
|
248
245
|
po->hash = name_hash(name);
|
249
246
|
|
250
|
-
pos =
|
247
|
+
pos = git_oidmap_put(pb->object_ix, &po->id, &ret);
|
251
248
|
if (ret < 0) {
|
252
249
|
giterr_set_oom();
|
253
250
|
return ret;
|
254
251
|
}
|
255
252
|
assert(ret != 0);
|
256
|
-
|
253
|
+
git_oidmap_set_value_at(pb->object_ix, pos, po);
|
257
254
|
|
258
255
|
pb->done = false;
|
259
256
|
|
@@ -517,11 +514,11 @@ static int cb_tag_foreach(const char *name, git_oid *oid, void *data)
|
|
517
514
|
|
518
515
|
GIT_UNUSED(name);
|
519
516
|
|
520
|
-
pos =
|
521
|
-
if (
|
517
|
+
pos = git_oidmap_lookup_index(pb->object_ix, oid);
|
518
|
+
if (!git_oidmap_valid_index(pb->object_ix, pos))
|
522
519
|
return 0;
|
523
520
|
|
524
|
-
po =
|
521
|
+
po = git_oidmap_value_at(pb->object_ix, pos);
|
525
522
|
po->tagged = 1;
|
526
523
|
|
527
524
|
/* TODO: peel objects */
|
@@ -1541,7 +1538,7 @@ static int retrieve_object(git_walk_object **out, git_packbuilder *pb, const git
|
|
1541
1538
|
if ((error = lookup_walk_object(&obj, pb, id)) < 0)
|
1542
1539
|
return error;
|
1543
1540
|
|
1544
|
-
git_oidmap_insert(pb->walk_objects, &obj->id, obj, error);
|
1541
|
+
git_oidmap_insert(pb->walk_objects, &obj->id, obj, &error);
|
1545
1542
|
}
|
1546
1543
|
|
1547
1544
|
*out = obj;
|