rugged 0.24.0 → 0.24.5
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 +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;
|