rugged 0.24.0 → 0.24.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +20 -9
- data/vendor/libgit2/deps/http-parser/http_parser.c +5 -2
- data/vendor/libgit2/include/git2/checkout.h +7 -0
- data/vendor/libgit2/include/git2/common.h +16 -1
- data/vendor/libgit2/include/git2/version.h +2 -2
- data/vendor/libgit2/src/array.h +40 -0
- data/vendor/libgit2/src/blame.c +8 -3
- data/vendor/libgit2/src/blame_git.c +20 -9
- data/vendor/libgit2/src/checkout.c +13 -5
- data/vendor/libgit2/src/commit.c +5 -4
- data/vendor/libgit2/src/common.h +1 -1
- data/vendor/libgit2/src/config_cache.c +2 -1
- data/vendor/libgit2/src/config_file.c +14 -20
- data/vendor/libgit2/src/delta-apply.c +36 -5
- data/vendor/libgit2/src/delta-apply.h +12 -0
- data/vendor/libgit2/src/describe.c +2 -1
- data/vendor/libgit2/src/diff_tform.c +5 -3
- data/vendor/libgit2/src/filebuf.c +6 -1
- data/vendor/libgit2/src/global.c +28 -8
- data/vendor/libgit2/src/global.h +1 -0
- data/vendor/libgit2/src/ignore.c +56 -19
- data/vendor/libgit2/src/index.c +27 -8
- data/vendor/libgit2/src/indexer.c +11 -7
- data/vendor/libgit2/src/iterator.c +2 -2
- data/vendor/libgit2/src/merge.c +1 -0
- data/vendor/libgit2/src/mwindow.c +20 -21
- data/vendor/libgit2/src/mwindow.h +1 -2
- data/vendor/libgit2/src/object.c +3 -6
- data/vendor/libgit2/src/odb.c +11 -15
- data/vendor/libgit2/src/odb.h +2 -1
- data/vendor/libgit2/src/odb_loose.c +13 -9
- data/vendor/libgit2/src/odb_pack.c +5 -6
- data/vendor/libgit2/src/oid.h +9 -0
- data/vendor/libgit2/src/openssl_stream.c +60 -27
- data/vendor/libgit2/src/openssl_stream.h +106 -0
- data/vendor/libgit2/src/pack-objects.c +4 -2
- data/vendor/libgit2/src/pack.c +10 -14
- data/vendor/libgit2/src/posix.c +7 -0
- data/vendor/libgit2/src/posix.h +1 -0
- data/vendor/libgit2/src/push.c +6 -6
- data/vendor/libgit2/src/refdb_fs.c +1 -0
- data/vendor/libgit2/src/refs.c +3 -0
- data/vendor/libgit2/src/refspec.c +4 -2
- data/vendor/libgit2/src/remote.c +15 -5
- data/vendor/libgit2/src/repository.c +29 -21
- data/vendor/libgit2/src/settings.c +23 -1
- data/vendor/libgit2/src/stransport_stream.c +15 -9
- data/vendor/libgit2/src/submodule.c +3 -2
- data/vendor/libgit2/src/sysdir.c +41 -47
- data/vendor/libgit2/src/sysdir.h +0 -5
- data/vendor/libgit2/src/tag.c +8 -2
- data/vendor/libgit2/src/thread-utils.h +5 -51
- data/vendor/libgit2/src/transport.c +2 -0
- data/vendor/libgit2/src/transports/http.c +2 -1
- data/vendor/libgit2/src/transports/smart_pkt.c +1 -0
- data/vendor/libgit2/src/transports/smart_protocol.c +72 -17
- data/vendor/libgit2/src/transports/ssh.c +32 -17
- data/vendor/libgit2/src/tree.c +83 -100
- data/vendor/libgit2/src/tree.h +4 -5
- data/vendor/libgit2/src/unix/map.c +5 -0
- data/vendor/libgit2/src/unix/pthread.h +54 -0
- data/vendor/libgit2/src/util.c +3 -3
- data/vendor/libgit2/src/win32/map.c +24 -5
- data/vendor/libgit2/src/win32/precompiled.h +1 -1
- data/vendor/libgit2/src/win32/{pthread.c → thread.c} +50 -80
- data/vendor/libgit2/src/win32/thread.h +62 -0
- data/vendor/libgit2/src/xdiff/xprepare.c +2 -1
- metadata +384 -394
- data/vendor/libgit2/src/win32/pthread.h +0 -92
@@ -13,4 +13,110 @@ extern int git_openssl_stream_global_init(void);
|
|
13
13
|
|
14
14
|
extern int git_openssl_stream_new(git_stream **out, const char *host, const char *port);
|
15
15
|
|
16
|
+
/*
|
17
|
+
* OpenSSL 1.1 made BIO opaque so we have to use functions to interact with it
|
18
|
+
* which do not exist in previous versions. We define these inline functions so
|
19
|
+
* we can program against the interface instead of littering the implementation
|
20
|
+
* with ifdefs.
|
21
|
+
*/
|
22
|
+
#ifdef GIT_OPENSSL
|
23
|
+
# include <openssl/ssl.h>
|
24
|
+
# include <openssl/err.h>
|
25
|
+
# include <openssl/x509v3.h>
|
26
|
+
# include <openssl/bio.h>
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
# if OPENSSL_VERSION_NUMBER < 0x10100000L
|
31
|
+
|
32
|
+
GIT_INLINE(BIO_METHOD*) BIO_meth_new(int type, const char *name)
|
33
|
+
{
|
34
|
+
BIO_METHOD *meth = git__calloc(1, sizeof(BIO_METHOD));
|
35
|
+
if (!meth) {
|
36
|
+
return NULL;
|
37
|
+
}
|
38
|
+
|
39
|
+
meth->type = type;
|
40
|
+
meth->name = name;
|
41
|
+
|
42
|
+
return meth;
|
43
|
+
}
|
44
|
+
|
45
|
+
GIT_INLINE(void) BIO_meth_free(BIO_METHOD *biom)
|
46
|
+
{
|
47
|
+
git__free(biom);
|
48
|
+
}
|
49
|
+
|
50
|
+
GIT_INLINE(int) BIO_meth_set_write(BIO_METHOD *biom, int (*write) (BIO *, const char *, int))
|
51
|
+
{
|
52
|
+
biom->bwrite = write;
|
53
|
+
return 1;
|
54
|
+
}
|
55
|
+
|
56
|
+
GIT_INLINE(int) BIO_meth_set_read(BIO_METHOD *biom, int (*read) (BIO *, char *, int))
|
57
|
+
{
|
58
|
+
biom->bread = read;
|
59
|
+
return 1;
|
60
|
+
}
|
61
|
+
|
62
|
+
GIT_INLINE(int) BIO_meth_set_puts(BIO_METHOD *biom, int (*puts) (BIO *, const char *))
|
63
|
+
{
|
64
|
+
biom->bputs = puts;
|
65
|
+
return 1;
|
66
|
+
}
|
67
|
+
|
68
|
+
GIT_INLINE(int) BIO_meth_set_gets(BIO_METHOD *biom, int (*gets) (BIO *, char *, int))
|
69
|
+
|
70
|
+
{
|
71
|
+
biom->bgets = gets;
|
72
|
+
return 1;
|
73
|
+
}
|
74
|
+
|
75
|
+
GIT_INLINE(int) BIO_meth_set_ctrl(BIO_METHOD *biom, long (*ctrl) (BIO *, int, long, void *))
|
76
|
+
{
|
77
|
+
biom->ctrl = ctrl;
|
78
|
+
return 1;
|
79
|
+
}
|
80
|
+
|
81
|
+
GIT_INLINE(int) BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *))
|
82
|
+
{
|
83
|
+
biom->create = create;
|
84
|
+
return 1;
|
85
|
+
}
|
86
|
+
|
87
|
+
GIT_INLINE(int) BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *))
|
88
|
+
{
|
89
|
+
biom->destroy = destroy;
|
90
|
+
return 1;
|
91
|
+
}
|
92
|
+
|
93
|
+
GIT_INLINE(int) BIO_get_new_index(void)
|
94
|
+
{
|
95
|
+
/* This exists as of 1.1 so before we'd just have 0 */
|
96
|
+
return 0;
|
97
|
+
}
|
98
|
+
|
99
|
+
GIT_INLINE(void) BIO_set_init(BIO *b, int init)
|
100
|
+
{
|
101
|
+
b->init = init;
|
102
|
+
}
|
103
|
+
|
104
|
+
GIT_INLINE(void) BIO_set_data(BIO *a, void *ptr)
|
105
|
+
{
|
106
|
+
a->ptr = ptr;
|
107
|
+
}
|
108
|
+
|
109
|
+
GIT_INLINE(void*) BIO_get_data(BIO *a)
|
110
|
+
{
|
111
|
+
return a->ptr;
|
112
|
+
}
|
113
|
+
|
114
|
+
GIT_INLINE(const unsigned char *) ASN1_STRING_get0_data(const ASN1_STRING *x)
|
115
|
+
{
|
116
|
+
return ASN1_STRING_data((ASN1_STRING *)x);
|
117
|
+
}
|
118
|
+
|
119
|
+
# endif // OpenSSL < 1.1
|
120
|
+
#endif // GIT_OPENSSL
|
121
|
+
|
16
122
|
#endif
|
@@ -848,8 +848,10 @@ static int try_delta(git_packbuilder *pb, struct unpacked *trg,
|
|
848
848
|
|
849
849
|
git_packbuilder__cache_unlock(pb);
|
850
850
|
|
851
|
-
if (overflow)
|
851
|
+
if (overflow) {
|
852
|
+
git__free(delta_buf);
|
852
853
|
return -1;
|
854
|
+
}
|
853
855
|
|
854
856
|
trg_object->delta_data = git__realloc(delta_buf, delta_size);
|
855
857
|
GITERR_CHECK_ALLOC(trg_object->delta_data);
|
@@ -1184,7 +1186,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
|
|
1184
1186
|
git_mutex_init(&p[i].mutex);
|
1185
1187
|
git_cond_init(&p[i].cond);
|
1186
1188
|
|
1187
|
-
ret = git_thread_create(&p[i].thread,
|
1189
|
+
ret = git_thread_create(&p[i].thread,
|
1188
1190
|
threaded_find_deltas, &p[i]);
|
1189
1191
|
if (ret) {
|
1190
1192
|
giterr_set(GITERR_THREAD, "unable to create thread");
|
data/vendor/libgit2/src/pack.c
CHANGED
@@ -494,21 +494,19 @@ int git_packfile_resolve_header(
|
|
494
494
|
int error;
|
495
495
|
|
496
496
|
error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos);
|
497
|
-
git_mwindow_close(&w_curs);
|
498
497
|
if (error < 0)
|
499
498
|
return error;
|
500
499
|
|
501
500
|
if (type == GIT_OBJ_OFS_DELTA || type == GIT_OBJ_REF_DELTA) {
|
502
501
|
size_t base_size;
|
503
|
-
|
502
|
+
git_packfile_stream stream;
|
503
|
+
|
504
504
|
base_offset = get_delta_base(p, &w_curs, &curpos, type, offset);
|
505
505
|
git_mwindow_close(&w_curs);
|
506
|
-
error =
|
507
|
-
git_mwindow_close(&w_curs);
|
508
|
-
if (error < 0)
|
506
|
+
if ((error = git_packfile_stream_open(&stream, p, curpos)) < 0)
|
509
507
|
return error;
|
510
|
-
error =
|
511
|
-
|
508
|
+
error = git__delta_read_header_fromstream(&base_size, size_p, &stream);
|
509
|
+
git_packfile_stream_free(&stream);
|
512
510
|
if (error < 0)
|
513
511
|
return error;
|
514
512
|
} else
|
@@ -517,7 +515,6 @@ int git_packfile_resolve_header(
|
|
517
515
|
while (type == GIT_OBJ_OFS_DELTA || type == GIT_OBJ_REF_DELTA) {
|
518
516
|
curpos = base_offset;
|
519
517
|
error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos);
|
520
|
-
git_mwindow_close(&w_curs);
|
521
518
|
if (error < 0)
|
522
519
|
return error;
|
523
520
|
if (type != GIT_OBJ_OFS_DELTA && type != GIT_OBJ_REF_DELTA)
|
@@ -585,7 +582,6 @@ static int pack_dependency_chain(git_dependency_chain *chain_out,
|
|
585
582
|
elem->base_key = obj_offset;
|
586
583
|
|
587
584
|
error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos);
|
588
|
-
git_mwindow_close(&w_curs);
|
589
585
|
|
590
586
|
if (error < 0)
|
591
587
|
goto on_error;
|
@@ -1018,7 +1014,7 @@ static int packfile_open(struct git_pack_file *p)
|
|
1018
1014
|
unsigned char *idx_sha1;
|
1019
1015
|
|
1020
1016
|
if (p->index_version == -1 && pack_index_open(p) < 0)
|
1021
|
-
return git_odb__error_notfound("failed to open packfile", NULL);
|
1017
|
+
return git_odb__error_notfound("failed to open packfile", NULL, 0);
|
1022
1018
|
|
1023
1019
|
/* if mwf opened by another thread, return now */
|
1024
1020
|
if (git_mutex_lock(&p->lock) < 0)
|
@@ -1099,7 +1095,7 @@ int git_packfile__name(char **out, const char *path)
|
|
1099
1095
|
path_len = strlen(path);
|
1100
1096
|
|
1101
1097
|
if (path_len < strlen(".idx"))
|
1102
|
-
return git_odb__error_notfound("invalid packfile path", NULL);
|
1098
|
+
return git_odb__error_notfound("invalid packfile path", NULL, 0);
|
1103
1099
|
|
1104
1100
|
if (git_buf_printf(&buf, "%.*s.pack", (int)(path_len - strlen(".idx")), path) < 0)
|
1105
1101
|
return -1;
|
@@ -1117,7 +1113,7 @@ int git_packfile_alloc(struct git_pack_file **pack_out, const char *path)
|
|
1117
1113
|
*pack_out = NULL;
|
1118
1114
|
|
1119
1115
|
if (path_len < strlen(".idx"))
|
1120
|
-
return git_odb__error_notfound("invalid packfile path", NULL);
|
1116
|
+
return git_odb__error_notfound("invalid packfile path", NULL, 0);
|
1121
1117
|
|
1122
1118
|
GITERR_CHECK_ALLOC_ADD(&alloc_len, sizeof(*p), path_len);
|
1123
1119
|
GITERR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 2);
|
@@ -1143,7 +1139,7 @@ int git_packfile_alloc(struct git_pack_file **pack_out, const char *path)
|
|
1143
1139
|
|
1144
1140
|
if (p_stat(p->pack_name, &st) < 0 || !S_ISREG(st.st_mode)) {
|
1145
1141
|
git__free(p);
|
1146
|
-
return git_odb__error_notfound("packfile not found", NULL);
|
1142
|
+
return git_odb__error_notfound("packfile not found", NULL, 0);
|
1147
1143
|
}
|
1148
1144
|
|
1149
1145
|
/* ok, it looks sane as far as we can check without
|
@@ -1344,7 +1340,7 @@ static int pack_entry_find_offset(
|
|
1344
1340
|
}
|
1345
1341
|
|
1346
1342
|
if (!found)
|
1347
|
-
return git_odb__error_notfound("failed to find offset for pack entry", short_oid);
|
1343
|
+
return git_odb__error_notfound("failed to find offset for pack entry", short_oid, len);
|
1348
1344
|
if (found > 1)
|
1349
1345
|
return git_odb__error_ambiguous("found multiple offsets for pack entry");
|
1350
1346
|
|
data/vendor/libgit2/src/posix.c
CHANGED
@@ -224,6 +224,13 @@ int git__page_size(size_t *page_size)
|
|
224
224
|
return 0;
|
225
225
|
}
|
226
226
|
|
227
|
+
int git__mmap_alignment(size_t *alignment)
|
228
|
+
{
|
229
|
+
/* dummy; here we don't need any alignment anyway */
|
230
|
+
*alignment = 4096;
|
231
|
+
return 0;
|
232
|
+
}
|
233
|
+
|
227
234
|
|
228
235
|
int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)
|
229
236
|
{
|
data/vendor/libgit2/src/posix.h
CHANGED
@@ -109,6 +109,7 @@ extern int p_getcwd(char *buffer_out, size_t size);
|
|
109
109
|
extern int p_rename(const char *from, const char *to);
|
110
110
|
|
111
111
|
extern int git__page_size(size_t *page_size);
|
112
|
+
extern int git__mmap_alignment(size_t *page_size);
|
112
113
|
|
113
114
|
/**
|
114
115
|
* Platform-dependent methods
|
data/vendor/libgit2/src/push.c
CHANGED
@@ -374,9 +374,9 @@ static int enqueue_object(
|
|
374
374
|
case GIT_OBJ_COMMIT:
|
375
375
|
return 0;
|
376
376
|
case GIT_OBJ_TREE:
|
377
|
-
return git_packbuilder_insert_tree(pb,
|
377
|
+
return git_packbuilder_insert_tree(pb, entry->oid);
|
378
378
|
default:
|
379
|
-
return git_packbuilder_insert(pb,
|
379
|
+
return git_packbuilder_insert(pb, entry->oid, entry->filename);
|
380
380
|
}
|
381
381
|
}
|
382
382
|
|
@@ -396,7 +396,7 @@ static int queue_differences(
|
|
396
396
|
const git_tree_entry *d_entry = git_tree_entry_byindex(delta, j);
|
397
397
|
int cmp = 0;
|
398
398
|
|
399
|
-
if (!git_oid__cmp(
|
399
|
+
if (!git_oid__cmp(b_entry->oid, d_entry->oid))
|
400
400
|
goto loop;
|
401
401
|
|
402
402
|
cmp = strcmp(b_entry->filename, d_entry->filename);
|
@@ -407,15 +407,15 @@ static int queue_differences(
|
|
407
407
|
git_tree_entry__is_tree(b_entry) &&
|
408
408
|
git_tree_entry__is_tree(d_entry)) {
|
409
409
|
/* Add the right-hand entry */
|
410
|
-
if ((error = git_packbuilder_insert(pb,
|
410
|
+
if ((error = git_packbuilder_insert(pb, d_entry->oid,
|
411
411
|
d_entry->filename)) < 0)
|
412
412
|
goto on_error;
|
413
413
|
|
414
414
|
/* Acquire the subtrees and recurse */
|
415
415
|
if ((error = git_tree_lookup(&b_child,
|
416
|
-
git_tree_owner(base),
|
416
|
+
git_tree_owner(base), b_entry->oid)) < 0 ||
|
417
417
|
(error = git_tree_lookup(&d_child,
|
418
|
-
git_tree_owner(delta),
|
418
|
+
git_tree_owner(delta), d_entry->oid)) < 0 ||
|
419
419
|
(error = queue_differences(b_child, d_child, pb)) < 0)
|
420
420
|
goto on_error;
|
421
421
|
|
@@ -962,6 +962,7 @@ static int packed_write(refdb_fs_backend *backend)
|
|
962
962
|
|
963
963
|
for (i = 0; i < git_sortedcache_entrycount(refcache); ++i) {
|
964
964
|
struct packref *ref = git_sortedcache_entry(refcache, i);
|
965
|
+
assert(ref);
|
965
966
|
|
966
967
|
if (packed_find_peel(backend, ref) < 0)
|
967
968
|
goto fail;
|
data/vendor/libgit2/src/refs.c
CHANGED
@@ -289,6 +289,9 @@ cleanup:
|
|
289
289
|
"Could not use '%s' as valid reference name", git_buf_cstr(&name));
|
290
290
|
}
|
291
291
|
|
292
|
+
if (error == GIT_ENOTFOUND)
|
293
|
+
giterr_set(GITERR_REFERENCE, "no reference found for shorthand '%s'", refname);
|
294
|
+
|
292
295
|
git_buf_free(&name);
|
293
296
|
git_buf_free(&refnamebuf);
|
294
297
|
return error;
|
@@ -53,8 +53,10 @@ int git_refspec__parse(git_refspec *refspec, const char *input, bool is_fetch)
|
|
53
53
|
|
54
54
|
if (rhs) {
|
55
55
|
size_t rlen = strlen(++rhs);
|
56
|
-
|
57
|
-
|
56
|
+
if (rlen || !is_fetch) {
|
57
|
+
is_glob = (1 <= rlen && strchr(rhs, '*'));
|
58
|
+
refspec->dst = git__strndup(rhs, rlen);
|
59
|
+
}
|
58
60
|
}
|
59
61
|
|
60
62
|
llen = (rhs ? (size_t)(rhs - lhs - 1) : strlen(lhs));
|
data/vendor/libgit2/src/remote.c
CHANGED
@@ -1414,7 +1414,11 @@ static int update_tips_for_spec(
|
|
1414
1414
|
/* In autotag mode, don't overwrite any locally-existing tags */
|
1415
1415
|
error = git_reference_create(&ref, remote->repo, refname.ptr, &head->oid, !autotag,
|
1416
1416
|
log_message);
|
1417
|
-
|
1417
|
+
|
1418
|
+
if (error == GIT_EEXISTS)
|
1419
|
+
continue;
|
1420
|
+
|
1421
|
+
if (error < 0)
|
1418
1422
|
goto on_error;
|
1419
1423
|
|
1420
1424
|
git_reference_free(ref);
|
@@ -2224,15 +2228,21 @@ static int remove_branch_config_related_entries(
|
|
2224
2228
|
if (git_buf_printf(&buf, "branch.%.*s.merge", (int)branch_len, branch) < 0)
|
2225
2229
|
break;
|
2226
2230
|
|
2227
|
-
if ((error = git_config_delete_entry(config, git_buf_cstr(&buf))) < 0)
|
2228
|
-
|
2231
|
+
if ((error = git_config_delete_entry(config, git_buf_cstr(&buf))) < 0) {
|
2232
|
+
if (error != GIT_ENOTFOUND)
|
2233
|
+
break;
|
2234
|
+
giterr_clear();
|
2235
|
+
}
|
2229
2236
|
|
2230
2237
|
git_buf_clear(&buf);
|
2231
2238
|
if (git_buf_printf(&buf, "branch.%.*s.remote", (int)branch_len, branch) < 0)
|
2232
2239
|
break;
|
2233
2240
|
|
2234
|
-
if ((error = git_config_delete_entry(config, git_buf_cstr(&buf))) < 0)
|
2235
|
-
|
2241
|
+
if ((error = git_config_delete_entry(config, git_buf_cstr(&buf))) < 0) {
|
2242
|
+
if (error != GIT_ENOTFOUND)
|
2243
|
+
break;
|
2244
|
+
giterr_clear();
|
2245
|
+
}
|
2236
2246
|
}
|
2237
2247
|
|
2238
2248
|
if (error == GIT_ITEROVER)
|
@@ -264,7 +264,7 @@ cleanup:
|
|
264
264
|
* the stack could remove directories name limits, but at the cost of doing
|
265
265
|
* repeated malloc/frees inside the loop below, so let's not do it now.
|
266
266
|
*/
|
267
|
-
static
|
267
|
+
static size_t find_ceiling_dir_offset(
|
268
268
|
const char *path,
|
269
269
|
const char *ceiling_directories)
|
270
270
|
{
|
@@ -278,7 +278,7 @@ static int find_ceiling_dir_offset(
|
|
278
278
|
min_len = (size_t)(git_path_root(path) + 1);
|
279
279
|
|
280
280
|
if (ceiling_directories == NULL || min_len == 0)
|
281
|
-
return
|
281
|
+
return min_len;
|
282
282
|
|
283
283
|
for (sep = ceil = ceiling_directories; *sep; ceil = sep + 1) {
|
284
284
|
for (sep = ceil; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++);
|
@@ -305,7 +305,7 @@ static int find_ceiling_dir_offset(
|
|
305
305
|
}
|
306
306
|
}
|
307
307
|
|
308
|
-
return (
|
308
|
+
return (max_len <= min_len ? min_len : max_len);
|
309
309
|
}
|
310
310
|
|
311
311
|
/*
|
@@ -359,21 +359,36 @@ static int find_repo(
|
|
359
359
|
git_buf path = GIT_BUF_INIT;
|
360
360
|
struct stat st;
|
361
361
|
dev_t initial_device = 0;
|
362
|
-
|
363
|
-
|
362
|
+
int min_iterations;
|
363
|
+
bool in_dot_git;
|
364
|
+
size_t ceiling_offset = 0;
|
364
365
|
|
365
366
|
git_buf_free(repo_path);
|
366
367
|
|
367
368
|
if ((error = git_path_prettify(&path, start_path, NULL)) < 0)
|
368
369
|
return error;
|
369
370
|
|
370
|
-
|
371
|
+
/* in_dot_git toggles each loop:
|
372
|
+
* /a/b/c/.git, /a/b/c, /a/b/.git, /a/b, /a/.git, /a
|
373
|
+
* With GIT_REPOSITORY_OPEN_BARE, we assume we started with /a/b/c.git
|
374
|
+
* and don't append .git the first time through.
|
375
|
+
* min_iterations indicates the number of iterations left before going
|
376
|
+
* further counts as a search. */
|
377
|
+
if (flags & GIT_REPOSITORY_OPEN_BARE) {
|
378
|
+
in_dot_git = true;
|
379
|
+
min_iterations = 1;
|
380
|
+
} else {
|
381
|
+
in_dot_git = false;
|
382
|
+
min_iterations = 2;
|
383
|
+
}
|
371
384
|
|
372
|
-
|
373
|
-
|
374
|
-
|
385
|
+
while (!error && (min_iterations || !(path.ptr[ceiling_offset] == 0 ||
|
386
|
+
(flags & GIT_REPOSITORY_OPEN_NO_SEARCH)))) {
|
387
|
+
if (!in_dot_git)
|
388
|
+
if ((error = git_buf_joinpath(&path, path.ptr, DOT_GIT)) < 0)
|
389
|
+
break;
|
390
|
+
in_dot_git = !in_dot_git;
|
375
391
|
|
376
|
-
while (!error && !git_buf_len(repo_path)) {
|
377
392
|
if (p_stat(path.ptr, &st) == 0) {
|
378
393
|
/* check that we have not crossed device boundaries */
|
379
394
|
if (initial_device == 0)
|
@@ -414,17 +429,10 @@ static int find_repo(
|
|
414
429
|
break;
|
415
430
|
}
|
416
431
|
|
417
|
-
if
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
if (path.ptr[ceiling_offset] == '\0' ||
|
422
|
-
(flags & GIT_REPOSITORY_OPEN_NO_SEARCH) != 0)
|
423
|
-
break;
|
424
|
-
/* otherwise look first for .git item */
|
425
|
-
error = git_buf_joinpath(&path, path.ptr, DOT_GIT);
|
426
|
-
}
|
427
|
-
try_with_dot_git = !try_with_dot_git;
|
432
|
+
/* Once we've checked the directory (and .git if applicable),
|
433
|
+
* find the ceiling for a search. */
|
434
|
+
if (min_iterations && (--min_iterations == 0))
|
435
|
+
ceiling_offset = find_ceiling_dir_offset(path.ptr, ceiling_dirs);
|
428
436
|
}
|
429
437
|
|
430
438
|
if (!error && parent_path && !(flags & GIT_REPOSITORY_OPEN_BARE)) {
|
@@ -71,12 +71,18 @@ static int config_level_to_sysdir(int config_level)
|
|
71
71
|
}
|
72
72
|
|
73
73
|
extern char *git__user_agent;
|
74
|
+
extern char *git__ssl_ciphers;
|
74
75
|
|
75
76
|
const char *git_libgit2__user_agent()
|
76
77
|
{
|
77
78
|
return git__user_agent;
|
78
79
|
}
|
79
80
|
|
81
|
+
const char *git_libgit2__ssl_ciphers()
|
82
|
+
{
|
83
|
+
return git__ssl_ciphers;
|
84
|
+
}
|
85
|
+
|
80
86
|
int git_libgit2_opts(int key, ...)
|
81
87
|
{
|
82
88
|
int error = 0;
|
@@ -169,7 +175,7 @@ int git_libgit2_opts(int key, ...)
|
|
169
175
|
}
|
170
176
|
}
|
171
177
|
#else
|
172
|
-
giterr_set(GITERR_NET, "
|
178
|
+
giterr_set(GITERR_NET, "cannot set certificate locations: OpenSSL is not enabled");
|
173
179
|
error = -1;
|
174
180
|
#endif
|
175
181
|
break;
|
@@ -187,6 +193,22 @@ int git_libgit2_opts(int key, ...)
|
|
187
193
|
git_object__strict_input_validation = (va_arg(ap, int) != 0);
|
188
194
|
break;
|
189
195
|
|
196
|
+
case GIT_OPT_SET_SSL_CIPHERS:
|
197
|
+
#ifdef GIT_OPENSSL
|
198
|
+
{
|
199
|
+
git__free(git__ssl_ciphers);
|
200
|
+
git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
|
201
|
+
if (!git__ssl_ciphers) {
|
202
|
+
giterr_set_oom();
|
203
|
+
error = -1;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
#else
|
207
|
+
giterr_set(GITERR_NET, "cannot set custom ciphers: OpenSSL is not enabled");
|
208
|
+
error = -1;
|
209
|
+
#endif
|
210
|
+
break;
|
211
|
+
|
190
212
|
default:
|
191
213
|
giterr_set(GITERR_INVALID, "invalid option key");
|
192
214
|
error = -1;
|