rugged 0.25.0b2 → 0.25.0b3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/ext/rugged/extconf.rb +3 -1
- data/ext/rugged/rugged.c +1 -1
- data/ext/rugged/rugged.h +1 -1
- data/ext/rugged/rugged_blob.c +29 -38
- data/ext/rugged/rugged_commit.c +215 -78
- data/ext/rugged/rugged_rebase.c +18 -11
- data/ext/rugged/rugged_remote.c +2 -2
- data/ext/rugged/rugged_tree.c +132 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +11 -3
- data/vendor/libgit2/include/git2.h +1 -0
- data/vendor/libgit2/include/git2/blob.h +39 -28
- data/vendor/libgit2/include/git2/commit.h +30 -0
- data/vendor/libgit2/include/git2/common.h +16 -1
- data/vendor/libgit2/include/git2/merge.h +10 -1
- data/vendor/libgit2/include/git2/proxy.h +92 -0
- data/vendor/libgit2/include/git2/refs.h +11 -0
- data/vendor/libgit2/include/git2/remote.h +17 -4
- data/vendor/libgit2/include/git2/signature.h +13 -0
- data/vendor/libgit2/include/git2/sys/merge.h +177 -0
- data/vendor/libgit2/include/git2/sys/remote.h +16 -0
- data/vendor/libgit2/include/git2/sys/stream.h +2 -1
- data/vendor/libgit2/include/git2/sys/transport.h +3 -1
- data/vendor/libgit2/include/git2/tag.h +9 -0
- data/vendor/libgit2/include/git2/tree.h +55 -0
- data/vendor/libgit2/src/annotated_commit.c +99 -80
- data/vendor/libgit2/src/annotated_commit.h +5 -2
- data/vendor/libgit2/src/array.h +40 -0
- data/vendor/libgit2/src/blame.c +8 -3
- data/vendor/libgit2/src/blame_git.c +2 -1
- data/vendor/libgit2/src/blob.c +71 -39
- data/vendor/libgit2/src/branch.c +2 -1
- data/vendor/libgit2/src/checkout.c +66 -42
- data/vendor/libgit2/src/commit.c +67 -3
- data/vendor/libgit2/src/config_cache.c +2 -1
- data/vendor/libgit2/src/config_file.c +32 -27
- data/vendor/libgit2/src/curl_stream.c +89 -6
- data/vendor/libgit2/src/delta-apply.c +36 -5
- data/vendor/libgit2/src/delta-apply.h +12 -0
- data/vendor/libgit2/src/describe.c +3 -2
- data/vendor/libgit2/src/diff.c +13 -20
- data/vendor/libgit2/src/diff_tform.c +5 -3
- data/vendor/libgit2/src/filebuf.c +12 -2
- data/vendor/libgit2/src/filebuf.h +1 -0
- data/vendor/libgit2/src/fnmatch.c +18 -5
- data/vendor/libgit2/src/global.c +18 -0
- data/vendor/libgit2/src/global.h +1 -0
- data/vendor/libgit2/src/ignore.c +11 -3
- data/vendor/libgit2/src/index.c +11 -5
- data/vendor/libgit2/src/indexer.c +11 -7
- data/vendor/libgit2/src/iterator.c +1575 -1468
- data/vendor/libgit2/src/iterator.h +52 -69
- data/vendor/libgit2/src/merge.c +160 -63
- data/vendor/libgit2/src/merge.h +61 -2
- data/vendor/libgit2/src/merge_driver.c +397 -0
- data/vendor/libgit2/src/merge_driver.h +60 -0
- data/vendor/libgit2/src/merge_file.c +11 -49
- data/vendor/libgit2/src/netops.c +12 -10
- data/vendor/libgit2/src/object.c +3 -6
- data/vendor/libgit2/src/object_api.c +19 -1
- data/vendor/libgit2/src/odb_loose.c +1 -1
- data/vendor/libgit2/src/openssl_stream.c +16 -3
- data/vendor/libgit2/src/pack-objects.c +3 -1
- data/vendor/libgit2/src/pack.c +5 -9
- data/vendor/libgit2/src/path.c +14 -0
- data/vendor/libgit2/src/path.h +12 -0
- data/vendor/libgit2/src/pathspec.c +1 -1
- data/vendor/libgit2/src/posix.c +7 -0
- data/vendor/libgit2/src/posix.h +1 -0
- data/vendor/libgit2/src/proxy.c +32 -0
- data/vendor/libgit2/src/proxy.h +14 -0
- data/vendor/libgit2/src/push.c +7 -7
- data/vendor/libgit2/src/rebase.c +61 -31
- data/vendor/libgit2/src/refdb_fs.c +1 -0
- data/vendor/libgit2/src/refs.c +16 -1
- data/vendor/libgit2/src/remote.c +20 -6
- data/vendor/libgit2/src/repository.c +1 -1
- data/vendor/libgit2/src/reset.c +1 -1
- data/vendor/libgit2/src/settings.c +23 -1
- data/vendor/libgit2/src/signature.c +26 -1
- data/vendor/libgit2/src/stransport_stream.c +5 -2
- data/vendor/libgit2/src/stream.h +2 -2
- data/vendor/libgit2/src/submodule.c +3 -2
- data/vendor/libgit2/src/tag.c +8 -2
- data/vendor/libgit2/src/transports/http.c +32 -9
- data/vendor/libgit2/src/transports/local.c +4 -1
- data/vendor/libgit2/src/transports/smart.c +6 -0
- data/vendor/libgit2/src/transports/smart.h +1 -0
- data/vendor/libgit2/src/transports/smart_protocol.c +61 -17
- data/vendor/libgit2/src/transports/winhttp.c +130 -11
- data/vendor/libgit2/src/tree.c +329 -98
- data/vendor/libgit2/src/tree.h +4 -5
- data/vendor/libgit2/src/unix/map.c +5 -0
- data/vendor/libgit2/src/win32/map.c +24 -5
- data/vendor/libgit2/src/xdiff/xprepare.c +2 -1
- metadata +10 -4
- data/vendor/libgit2/Makefile.embed +0 -60
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
#include "git2/common.h"
|
|
11
11
|
#include "git2/types.h"
|
|
12
|
+
#include "git2/proxy.h"
|
|
12
13
|
|
|
13
14
|
GIT_BEGIN_DECL
|
|
14
15
|
|
|
@@ -32,7 +33,7 @@ typedef struct git_stream {
|
|
|
32
33
|
int proxy_support;
|
|
33
34
|
int (*connect)(struct git_stream *);
|
|
34
35
|
int (*certificate)(git_cert **, struct git_stream *);
|
|
35
|
-
int (*set_proxy)(struct git_stream *, const
|
|
36
|
+
int (*set_proxy)(struct git_stream *, const git_proxy_options *proxy_opts);
|
|
36
37
|
ssize_t (*read)(struct git_stream *, void *, size_t);
|
|
37
38
|
ssize_t (*write)(struct git_stream *, const char *, size_t, int);
|
|
38
39
|
int (*close)(struct git_stream *);
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
#include "git2/net.h"
|
|
12
12
|
#include "git2/types.h"
|
|
13
13
|
#include "git2/strarray.h"
|
|
14
|
+
#include "git2/proxy.h"
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* @file git2/sys/transport.h
|
|
@@ -53,6 +54,7 @@ struct git_transport {
|
|
|
53
54
|
const char *url,
|
|
54
55
|
git_cred_acquire_cb cred_acquire_cb,
|
|
55
56
|
void *cred_acquire_payload,
|
|
57
|
+
const git_proxy_options *proxy_opts,
|
|
56
58
|
int direction,
|
|
57
59
|
int flags);
|
|
58
60
|
|
|
@@ -65,7 +67,7 @@ struct git_transport {
|
|
|
65
67
|
git_transport *transport);
|
|
66
68
|
|
|
67
69
|
/* Executes the push whose context is in the git_push object. */
|
|
68
|
-
int
|
|
70
|
+
int(*push)(git_transport *transport, git_push *push, const git_remote_callbacks *callbacks);
|
|
69
71
|
|
|
70
72
|
/* This function may be called after a successful call to connect(), when
|
|
71
73
|
* the direction is FETCH. The function performs a negotiation to calculate
|
|
@@ -347,6 +347,15 @@ GIT_EXTERN(int) git_tag_peel(
|
|
|
347
347
|
git_object **tag_target_out,
|
|
348
348
|
const git_tag *tag);
|
|
349
349
|
|
|
350
|
+
/**
|
|
351
|
+
* Create an in-memory copy of a tag. The copy must be explicitly
|
|
352
|
+
* free'd or it will leak.
|
|
353
|
+
*
|
|
354
|
+
* @param out Pointer to store the copy of the tag
|
|
355
|
+
* @param source Original tag to copy
|
|
356
|
+
*/
|
|
357
|
+
GIT_EXTERN(int) git_tag_dup(git_tag **out, git_tag *source);
|
|
358
|
+
|
|
350
359
|
/** @} */
|
|
351
360
|
GIT_END_DECL
|
|
352
361
|
#endif
|
|
@@ -409,6 +409,61 @@ GIT_EXTERN(int) git_tree_walk(
|
|
|
409
409
|
git_treewalk_cb callback,
|
|
410
410
|
void *payload);
|
|
411
411
|
|
|
412
|
+
/**
|
|
413
|
+
* Create an in-memory copy of a tree. The copy must be explicitly
|
|
414
|
+
* free'd or it will leak.
|
|
415
|
+
*
|
|
416
|
+
* @param out Pointer to store the copy of the tree
|
|
417
|
+
* @param source Original tree to copy
|
|
418
|
+
*/
|
|
419
|
+
GIT_EXTERN(int) git_tree_dup(git_tree **out, git_tree *source);
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* The kind of update to perform
|
|
423
|
+
*/
|
|
424
|
+
typedef enum {
|
|
425
|
+
/** Update or insert an entry at the specified path */
|
|
426
|
+
GIT_TREE_UPDATE_UPSERT,
|
|
427
|
+
/** Remove an entry from the specified path */
|
|
428
|
+
GIT_TREE_UPDATE_REMOVE,
|
|
429
|
+
} git_tree_update_t;
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* An action to perform during the update of a tree
|
|
433
|
+
*/
|
|
434
|
+
typedef struct {
|
|
435
|
+
/** Update action. If it's an removal, only the path is looked at */
|
|
436
|
+
git_tree_update_t action;
|
|
437
|
+
/** The entry's id */
|
|
438
|
+
git_oid id;
|
|
439
|
+
/** The filemode/kind of object */
|
|
440
|
+
git_filemode_t filemode;
|
|
441
|
+
/** The full path from the root tree */
|
|
442
|
+
const char *path;
|
|
443
|
+
} git_tree_update;
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Create a tree based on another one with the specified modifications
|
|
447
|
+
*
|
|
448
|
+
* Given the `baseline` perform the changes described in the list of
|
|
449
|
+
* `updates` and create a new tree.
|
|
450
|
+
*
|
|
451
|
+
* This function is optimized for common file/directory addition, removal and
|
|
452
|
+
* replacement in trees. It is much more efficient than reading the tree into a
|
|
453
|
+
* `git_index` and modifying that, but in exchange it is not as flexible.
|
|
454
|
+
*
|
|
455
|
+
* Deleting and adding the same entry is undefined behaviour, changing
|
|
456
|
+
* a tree to a blob or viceversa is not supported.
|
|
457
|
+
*
|
|
458
|
+
* @param out id of the new tree
|
|
459
|
+
* @param repo the repository in which to create the tree, must be the
|
|
460
|
+
* same as for `baseline`
|
|
461
|
+
* @param baseline the tree to base these changes on
|
|
462
|
+
* @param nupdates the number of elements in the update list
|
|
463
|
+
* @param updates the list of updates to perform
|
|
464
|
+
*/
|
|
465
|
+
GIT_EXTERN(int) git_tree_create_updated(git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates);
|
|
466
|
+
|
|
412
467
|
/** @} */
|
|
413
468
|
|
|
414
469
|
GIT_END_DECL
|
|
@@ -19,39 +19,102 @@
|
|
|
19
19
|
#include "git2/index.h"
|
|
20
20
|
|
|
21
21
|
static int annotated_commit_init(
|
|
22
|
+
git_annotated_commit **out,
|
|
23
|
+
git_commit *commit,
|
|
24
|
+
const char *description)
|
|
25
|
+
{
|
|
26
|
+
git_annotated_commit *annotated_commit;
|
|
27
|
+
int error = 0;
|
|
28
|
+
|
|
29
|
+
assert(out && commit);
|
|
30
|
+
|
|
31
|
+
*out = NULL;
|
|
32
|
+
|
|
33
|
+
annotated_commit = git__calloc(1, sizeof(git_annotated_commit));
|
|
34
|
+
GITERR_CHECK_ALLOC(annotated_commit);
|
|
35
|
+
|
|
36
|
+
annotated_commit->type = GIT_ANNOTATED_COMMIT_REAL;
|
|
37
|
+
|
|
38
|
+
if ((error = git_commit_dup(&annotated_commit->commit, commit)) < 0)
|
|
39
|
+
goto done;
|
|
40
|
+
|
|
41
|
+
git_oid_fmt(annotated_commit->id_str, git_commit_id(commit));
|
|
42
|
+
annotated_commit->id_str[GIT_OID_HEXSZ] = '\0';
|
|
43
|
+
|
|
44
|
+
if (!description)
|
|
45
|
+
description = annotated_commit->id_str;
|
|
46
|
+
|
|
47
|
+
annotated_commit->description = git__strdup(description);
|
|
48
|
+
GITERR_CHECK_ALLOC(annotated_commit->description);
|
|
49
|
+
|
|
50
|
+
done:
|
|
51
|
+
if (!error)
|
|
52
|
+
*out = annotated_commit;
|
|
53
|
+
|
|
54
|
+
return error;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static int annotated_commit_init_from_id(
|
|
22
58
|
git_annotated_commit **out,
|
|
23
59
|
git_repository *repo,
|
|
24
60
|
const git_oid *id,
|
|
25
|
-
const char *
|
|
26
|
-
const char *remote_url)
|
|
61
|
+
const char *description)
|
|
27
62
|
{
|
|
28
|
-
git_annotated_commit *annotated_commit;
|
|
29
63
|
git_commit *commit = NULL;
|
|
30
64
|
int error = 0;
|
|
31
65
|
|
|
32
|
-
assert(out && id);
|
|
66
|
+
assert(out && repo && id);
|
|
33
67
|
|
|
34
68
|
*out = NULL;
|
|
35
69
|
|
|
36
|
-
if ((error = git_commit_lookup(&commit, repo, id)) < 0
|
|
37
|
-
(error = git_annotated_commit_from_commit(&annotated_commit,
|
|
38
|
-
commit)) < 0)
|
|
70
|
+
if ((error = git_commit_lookup(&commit, repo, id)) < 0)
|
|
39
71
|
goto done;
|
|
40
72
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
73
|
+
error = annotated_commit_init(out, commit, description);
|
|
74
|
+
|
|
75
|
+
done:
|
|
76
|
+
git_commit_free(commit);
|
|
77
|
+
return error;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
int git_annotated_commit_lookup(
|
|
81
|
+
git_annotated_commit **out,
|
|
82
|
+
git_repository *repo,
|
|
83
|
+
const git_oid *id)
|
|
84
|
+
{
|
|
85
|
+
return annotated_commit_init_from_id(out, repo, id, NULL);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
int git_annotated_commit_from_commit(
|
|
89
|
+
git_annotated_commit **out,
|
|
90
|
+
git_commit *commit)
|
|
91
|
+
{
|
|
92
|
+
return annotated_commit_init(out, commit, NULL);
|
|
93
|
+
}
|
|
45
94
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
95
|
+
int git_annotated_commit_from_revspec(
|
|
96
|
+
git_annotated_commit **out,
|
|
97
|
+
git_repository *repo,
|
|
98
|
+
const char *revspec)
|
|
99
|
+
{
|
|
100
|
+
git_object *obj, *commit;
|
|
101
|
+
int error;
|
|
102
|
+
|
|
103
|
+
assert(out && repo && revspec);
|
|
104
|
+
|
|
105
|
+
if ((error = git_revparse_single(&obj, repo, revspec)) < 0)
|
|
106
|
+
return error;
|
|
107
|
+
|
|
108
|
+
if ((error = git_object_peel(&commit, obj, GIT_OBJ_COMMIT))) {
|
|
109
|
+
git_object_free(obj);
|
|
110
|
+
return error;
|
|
49
111
|
}
|
|
50
112
|
|
|
51
|
-
|
|
113
|
+
error = annotated_commit_init(out, (git_commit *)commit, revspec);
|
|
114
|
+
|
|
115
|
+
git_object_free(obj);
|
|
116
|
+
git_object_free(commit);
|
|
52
117
|
|
|
53
|
-
done:
|
|
54
|
-
git_commit_free(commit);
|
|
55
118
|
return error;
|
|
56
119
|
}
|
|
57
120
|
|
|
@@ -70,8 +133,15 @@ int git_annotated_commit_from_ref(
|
|
|
70
133
|
if ((error = git_reference_resolve(&resolved, ref)) < 0)
|
|
71
134
|
return error;
|
|
72
135
|
|
|
73
|
-
error =
|
|
74
|
-
|
|
136
|
+
error = annotated_commit_init_from_id(out,
|
|
137
|
+
repo,
|
|
138
|
+
git_reference_target(resolved),
|
|
139
|
+
git_reference_name(ref));
|
|
140
|
+
|
|
141
|
+
if (!error) {
|
|
142
|
+
(*out)->ref_name = git__strdup(git_reference_name(ref));
|
|
143
|
+
GITERR_CHECK_ALLOC((*out)->ref_name);
|
|
144
|
+
}
|
|
75
145
|
|
|
76
146
|
git_reference_free(resolved);
|
|
77
147
|
return error;
|
|
@@ -97,41 +167,6 @@ int git_annotated_commit_from_head(
|
|
|
97
167
|
return error;
|
|
98
168
|
}
|
|
99
169
|
|
|
100
|
-
int git_annotated_commit_from_commit(
|
|
101
|
-
git_annotated_commit **out,
|
|
102
|
-
git_commit *commit)
|
|
103
|
-
{
|
|
104
|
-
git_annotated_commit *annotated_commit;
|
|
105
|
-
|
|
106
|
-
assert(out && commit);
|
|
107
|
-
|
|
108
|
-
*out = NULL;
|
|
109
|
-
|
|
110
|
-
annotated_commit = git__calloc(1, sizeof(git_annotated_commit));
|
|
111
|
-
GITERR_CHECK_ALLOC(annotated_commit);
|
|
112
|
-
|
|
113
|
-
annotated_commit->type = GIT_ANNOTATED_COMMIT_REAL;
|
|
114
|
-
|
|
115
|
-
git_cached_obj_incref(commit);
|
|
116
|
-
annotated_commit->commit = commit;
|
|
117
|
-
|
|
118
|
-
git_oid_fmt(annotated_commit->id_str, git_commit_id(commit));
|
|
119
|
-
annotated_commit->id_str[GIT_OID_HEXSZ] = '\0';
|
|
120
|
-
|
|
121
|
-
*out = annotated_commit;
|
|
122
|
-
return 0;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
int git_annotated_commit_lookup(
|
|
126
|
-
git_annotated_commit **out,
|
|
127
|
-
git_repository *repo,
|
|
128
|
-
const git_oid *id)
|
|
129
|
-
{
|
|
130
|
-
assert(out && repo && id);
|
|
131
|
-
|
|
132
|
-
return annotated_commit_init(out, repo, id, NULL, NULL);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
170
|
int git_annotated_commit_from_fetchhead(
|
|
136
171
|
git_annotated_commit **out,
|
|
137
172
|
git_repository *repo,
|
|
@@ -141,33 +176,16 @@ int git_annotated_commit_from_fetchhead(
|
|
|
141
176
|
{
|
|
142
177
|
assert(repo && id && branch_name && remote_url);
|
|
143
178
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
int git_annotated_commit_from_revspec(
|
|
148
|
-
git_annotated_commit **out,
|
|
149
|
-
git_repository *repo,
|
|
150
|
-
const char *revspec)
|
|
151
|
-
{
|
|
152
|
-
git_object *obj, *commit;
|
|
153
|
-
int error;
|
|
154
|
-
|
|
155
|
-
assert(out && repo && revspec);
|
|
156
|
-
|
|
157
|
-
if ((error = git_revparse_single(&obj, repo, revspec)) < 0)
|
|
158
|
-
return error;
|
|
159
|
-
|
|
160
|
-
if ((error = git_object_peel(&commit, obj, GIT_OBJ_COMMIT))) {
|
|
161
|
-
git_object_free(obj);
|
|
162
|
-
return error;
|
|
163
|
-
}
|
|
179
|
+
if (annotated_commit_init_from_id(out, repo, id, branch_name) < 0)
|
|
180
|
+
return -1;
|
|
164
181
|
|
|
165
|
-
|
|
182
|
+
(*out)->ref_name = git__strdup(branch_name);
|
|
183
|
+
GITERR_CHECK_ALLOC((*out)->ref_name);
|
|
166
184
|
|
|
167
|
-
|
|
168
|
-
|
|
185
|
+
(*out)->remote_url = git__strdup(remote_url);
|
|
186
|
+
GITERR_CHECK_ALLOC((*out)->remote_url);
|
|
169
187
|
|
|
170
|
-
return
|
|
188
|
+
return 0;
|
|
171
189
|
}
|
|
172
190
|
|
|
173
191
|
|
|
@@ -187,8 +205,9 @@ void git_annotated_commit_free(git_annotated_commit *annotated_commit)
|
|
|
187
205
|
case GIT_ANNOTATED_COMMIT_REAL:
|
|
188
206
|
git_commit_free(annotated_commit->commit);
|
|
189
207
|
git_tree_free(annotated_commit->tree);
|
|
190
|
-
git__free(annotated_commit->
|
|
191
|
-
git__free(annotated_commit->
|
|
208
|
+
git__free((char *)annotated_commit->description);
|
|
209
|
+
git__free((char *)annotated_commit->ref_name);
|
|
210
|
+
git__free((char *)annotated_commit->remote_url);
|
|
192
211
|
break;
|
|
193
212
|
case GIT_ANNOTATED_COMMIT_VIRTUAL:
|
|
194
213
|
git_index_free(annotated_commit->index);
|
|
@@ -33,8 +33,11 @@ struct git_annotated_commit {
|
|
|
33
33
|
git_index *index;
|
|
34
34
|
git_array_oid_t parents;
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
char *
|
|
36
|
+
/* how this commit was looked up */
|
|
37
|
+
const char *description;
|
|
38
|
+
|
|
39
|
+
const char *ref_name;
|
|
40
|
+
const char *remote_url;
|
|
38
41
|
|
|
39
42
|
char id_str[GIT_OID_HEXSZ+1];
|
|
40
43
|
};
|
data/vendor/libgit2/src/array.h
CHANGED
|
@@ -82,4 +82,44 @@ on_oom:
|
|
|
82
82
|
|
|
83
83
|
#define git_array_valid_index(a, i) ((i) < (a).size)
|
|
84
84
|
|
|
85
|
+
#define git_array_foreach(a, i, element) \
|
|
86
|
+
for ((i) = 0; (i) < (a).size && ((element) = &(a).ptr[(i)]); (i)++)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
GIT_INLINE(int) git_array__search(
|
|
90
|
+
size_t *out,
|
|
91
|
+
void *array_ptr,
|
|
92
|
+
size_t item_size,
|
|
93
|
+
size_t array_len,
|
|
94
|
+
int (*compare)(const void *, const void *),
|
|
95
|
+
const void *key)
|
|
96
|
+
{
|
|
97
|
+
size_t lim;
|
|
98
|
+
unsigned char *part, *array = array_ptr, *base = array_ptr;
|
|
99
|
+
int cmp = -1;
|
|
100
|
+
|
|
101
|
+
for (lim = array_len; lim != 0; lim >>= 1) {
|
|
102
|
+
part = base + (lim >> 1) * item_size;
|
|
103
|
+
cmp = (*compare)(key, part);
|
|
104
|
+
|
|
105
|
+
if (cmp == 0) {
|
|
106
|
+
base = part;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
if (cmp > 0) { /* key > p; take right partition */
|
|
110
|
+
base = part + 1 * item_size;
|
|
111
|
+
lim--;
|
|
112
|
+
} /* else take left partition */
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (out)
|
|
116
|
+
*out = (base - array) / item_size;
|
|
117
|
+
|
|
118
|
+
return (cmp == 0) ? 0 : GIT_ENOTFOUND;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
#define git_array_search(out, a, cmp, key) \
|
|
122
|
+
git_array__search(out, (a).ptr, sizeof(*(a).ptr), (a).size, \
|
|
123
|
+
(cmp), (key))
|
|
124
|
+
|
|
85
125
|
#endif
|
data/vendor/libgit2/src/blame.c
CHANGED
|
@@ -178,7 +178,7 @@ const git_blame_hunk *git_blame_get_hunk_byline(git_blame *blame, size_t lineno)
|
|
|
178
178
|
return NULL;
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
static
|
|
181
|
+
static int normalize_options(
|
|
182
182
|
git_blame_options *out,
|
|
183
183
|
const git_blame_options *in,
|
|
184
184
|
git_repository *repo)
|
|
@@ -190,7 +190,9 @@ static void normalize_options(
|
|
|
190
190
|
|
|
191
191
|
/* No newest_commit => HEAD */
|
|
192
192
|
if (git_oid_iszero(&out->newest_commit)) {
|
|
193
|
-
git_reference_name_to_id(&out->newest_commit, repo, "HEAD")
|
|
193
|
+
if (git_reference_name_to_id(&out->newest_commit, repo, "HEAD") < 0) {
|
|
194
|
+
return -1;
|
|
195
|
+
}
|
|
194
196
|
}
|
|
195
197
|
|
|
196
198
|
/* min_line 0 really means 1 */
|
|
@@ -204,6 +206,8 @@ static void normalize_options(
|
|
|
204
206
|
out->flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES;
|
|
205
207
|
if (out->flags & GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES)
|
|
206
208
|
out->flags |= GIT_BLAME_TRACK_COPIES_SAME_FILE;
|
|
209
|
+
|
|
210
|
+
return 0;
|
|
207
211
|
}
|
|
208
212
|
|
|
209
213
|
static git_blame_hunk *split_hunk_in_vector(
|
|
@@ -362,7 +366,8 @@ int git_blame_file(
|
|
|
362
366
|
git_blame *blame = NULL;
|
|
363
367
|
|
|
364
368
|
assert(out && repo && path);
|
|
365
|
-
normalize_options(&normOptions, options, repo)
|
|
369
|
+
if ((error = normalize_options(&normOptions, options, repo)) < 0)
|
|
370
|
+
goto on_error;
|
|
366
371
|
|
|
367
372
|
blame = git_blame__alloc(repo, normOptions, path);
|
|
368
373
|
GITERR_CHECK_ALLOC(blame);
|