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
@@ -16,7 +16,7 @@
|
|
16
16
|
#include "socket_stream.h"
|
17
17
|
#include "curl_stream.h"
|
18
18
|
|
19
|
-
int stransport_error(OSStatus ret)
|
19
|
+
static int stransport_error(OSStatus ret)
|
20
20
|
{
|
21
21
|
CFStringRef message;
|
22
22
|
|
@@ -33,6 +33,7 @@ int stransport_error(OSStatus ret)
|
|
33
33
|
CFRelease(message);
|
34
34
|
#else
|
35
35
|
giterr_set(GITERR_NET, "SecureTransport error: OSStatus %d", (unsigned int)ret);
|
36
|
+
GIT_UNUSED(message);
|
36
37
|
#endif
|
37
38
|
|
38
39
|
return -1;
|
@@ -46,7 +47,7 @@ typedef struct {
|
|
46
47
|
git_cert_x509 cert_info;
|
47
48
|
} stransport_stream;
|
48
49
|
|
49
|
-
int stransport_connect(git_stream *stream)
|
50
|
+
static int stransport_connect(git_stream *stream)
|
50
51
|
{
|
51
52
|
stransport_stream *st = (stransport_stream *) stream;
|
52
53
|
int error;
|
@@ -66,6 +67,9 @@ int stransport_connect(git_stream *stream)
|
|
66
67
|
if ((ret = SSLCopyPeerTrust(st->ctx, &trust)) != noErr)
|
67
68
|
goto on_error;
|
68
69
|
|
70
|
+
if (!trust)
|
71
|
+
return GIT_ECERTIFICATE;
|
72
|
+
|
69
73
|
if ((ret = SecTrustEvaluate(trust, &sec_res)) != noErr)
|
70
74
|
goto on_error;
|
71
75
|
|
@@ -89,7 +93,7 @@ on_error:
|
|
89
93
|
return stransport_error(ret);
|
90
94
|
}
|
91
95
|
|
92
|
-
int stransport_certificate(git_cert **out, git_stream *stream)
|
96
|
+
static int stransport_certificate(git_cert **out, git_stream *stream)
|
93
97
|
{
|
94
98
|
stransport_stream *st = (stransport_stream *) stream;
|
95
99
|
SecTrustRef trust = NULL;
|
@@ -116,7 +120,7 @@ int stransport_certificate(git_cert **out, git_stream *stream)
|
|
116
120
|
return 0;
|
117
121
|
}
|
118
122
|
|
119
|
-
int stransport_set_proxy(git_stream *stream, const char *proxy)
|
123
|
+
static int stransport_set_proxy(git_stream *stream, const char *proxy)
|
120
124
|
{
|
121
125
|
stransport_stream *st = (stransport_stream *) stream;
|
122
126
|
|
@@ -146,7 +150,7 @@ static OSStatus write_cb(SSLConnectionRef conn, const void *data, size_t *len)
|
|
146
150
|
return noErr;
|
147
151
|
}
|
148
152
|
|
149
|
-
ssize_t stransport_write(git_stream *stream, const char *data, size_t len, int flags)
|
153
|
+
static ssize_t stransport_write(git_stream *stream, const char *data, size_t len, int flags)
|
150
154
|
{
|
151
155
|
stransport_stream *st = (stransport_stream *) stream;
|
152
156
|
size_t data_len, processed;
|
@@ -195,7 +199,7 @@ static OSStatus read_cb(SSLConnectionRef conn, void *data, size_t *len)
|
|
195
199
|
return error;
|
196
200
|
}
|
197
201
|
|
198
|
-
ssize_t stransport_read(git_stream *stream, void *data, size_t len)
|
202
|
+
static ssize_t stransport_read(git_stream *stream, void *data, size_t len)
|
199
203
|
{
|
200
204
|
stransport_stream *st = (stransport_stream *) stream;
|
201
205
|
size_t processed;
|
@@ -207,7 +211,7 @@ ssize_t stransport_read(git_stream *stream, void *data, size_t len)
|
|
207
211
|
return processed;
|
208
212
|
}
|
209
213
|
|
210
|
-
int stransport_close(git_stream *stream)
|
214
|
+
static int stransport_close(git_stream *stream)
|
211
215
|
{
|
212
216
|
stransport_stream *st = (stransport_stream *) stream;
|
213
217
|
OSStatus ret;
|
@@ -219,7 +223,7 @@ int stransport_close(git_stream *stream)
|
|
219
223
|
return git_stream_close(st->io);
|
220
224
|
}
|
221
225
|
|
222
|
-
void stransport_free(git_stream *stream)
|
226
|
+
static void stransport_free(git_stream *stream)
|
223
227
|
{
|
224
228
|
stransport_stream *st = (stransport_stream *) stream;
|
225
229
|
|
@@ -255,6 +259,7 @@ int git_stransport_stream_new(git_stream **out, const char *host, const char *po
|
|
255
259
|
st->ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType);
|
256
260
|
if (!st->ctx) {
|
257
261
|
giterr_set(GITERR_NET, "failed to create SSL context");
|
262
|
+
git__free(st);
|
258
263
|
return -1;
|
259
264
|
}
|
260
265
|
|
@@ -264,7 +269,8 @@ int git_stransport_stream_new(git_stream **out, const char *host, const char *po
|
|
264
269
|
(ret = SSLSetProtocolVersionMin(st->ctx, kTLSProtocol1)) != noErr ||
|
265
270
|
(ret = SSLSetProtocolVersionMax(st->ctx, kTLSProtocol12)) != noErr ||
|
266
271
|
(ret = SSLSetPeerDomainName(st->ctx, host, strlen(host))) != noErr) {
|
267
|
-
|
272
|
+
CFRelease(st->ctx);
|
273
|
+
git__free(st);
|
268
274
|
return stransport_error(ret);
|
269
275
|
}
|
270
276
|
|
@@ -80,7 +80,8 @@ static kh_inline int str_equal_no_trailing_slash(const char *a, const char *b)
|
|
80
80
|
if (blen > 0 && b[blen - 1] == '/')
|
81
81
|
blen--;
|
82
82
|
|
83
|
-
return (alen ==
|
83
|
+
return (alen == 0 && blen == 0) ||
|
84
|
+
(alen == blen && strncmp(a, b, alen) == 0);
|
84
85
|
}
|
85
86
|
|
86
87
|
__KHASH_IMPL(
|
@@ -1416,7 +1417,7 @@ static int submodule_update_head(git_submodule *submodule)
|
|
1416
1417
|
git_tree_entry_bypath(&te, head, submodule->path) < 0)
|
1417
1418
|
giterr_clear();
|
1418
1419
|
else
|
1419
|
-
submodule_update_from_head_data(submodule, te->attr,
|
1420
|
+
submodule_update_from_head_data(submodule, te->attr, git_tree_entry_id(te));
|
1420
1421
|
|
1421
1422
|
git_tree_entry_free(te);
|
1422
1423
|
git_tree_free(head);
|
data/vendor/libgit2/src/sysdir.c
CHANGED
@@ -83,45 +83,43 @@ static int git_sysdir_guess_template_dirs(git_buf *out)
|
|
83
83
|
#endif
|
84
84
|
}
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
86
|
+
struct git_sysdir__dir {
|
87
|
+
git_buf buf;
|
88
|
+
int (*guess)(git_buf *out);
|
89
|
+
};
|
90
90
|
|
91
|
-
static
|
92
|
-
git_sysdir_guess_system_dirs,
|
93
|
-
git_sysdir_guess_global_dirs,
|
94
|
-
git_sysdir_guess_xdg_dirs,
|
95
|
-
git_sysdir_guess_programdata_dirs,
|
96
|
-
git_sysdir_guess_template_dirs,
|
91
|
+
static struct git_sysdir__dir git_sysdir__dirs[] = {
|
92
|
+
{ GIT_BUF_INIT, git_sysdir_guess_system_dirs },
|
93
|
+
{ GIT_BUF_INIT, git_sysdir_guess_global_dirs },
|
94
|
+
{ GIT_BUF_INIT, git_sysdir_guess_xdg_dirs },
|
95
|
+
{ GIT_BUF_INIT, git_sysdir_guess_programdata_dirs },
|
96
|
+
{ GIT_BUF_INIT, git_sysdir_guess_template_dirs },
|
97
97
|
};
|
98
98
|
|
99
|
-
static
|
99
|
+
static void git_sysdir_global_shutdown(void)
|
100
|
+
{
|
101
|
+
size_t i;
|
102
|
+
|
103
|
+
for (i = 0; i < ARRAY_SIZE(git_sysdir__dirs); ++i)
|
104
|
+
git_buf_free(&git_sysdir__dirs[i].buf);
|
105
|
+
}
|
100
106
|
|
101
107
|
int git_sysdir_global_init(void)
|
102
108
|
{
|
103
|
-
|
104
|
-
const git_buf *path;
|
109
|
+
size_t i;
|
105
110
|
int error = 0;
|
106
111
|
|
107
|
-
for (i = 0; !error && i <
|
108
|
-
error =
|
112
|
+
for (i = 0; !error && i < ARRAY_SIZE(git_sysdir__dirs); i++)
|
113
|
+
error = git_sysdir__dirs[i].guess(&git_sysdir__dirs[i].buf);
|
109
114
|
|
110
|
-
|
111
|
-
}
|
115
|
+
git__on_shutdown(git_sysdir_global_shutdown);
|
112
116
|
|
113
|
-
|
114
|
-
{
|
115
|
-
int i;
|
116
|
-
for (i = 0; i < GIT_SYSDIR__MAX; ++i)
|
117
|
-
git_buf_free(&git_sysdir__dirs[i]);
|
118
|
-
|
119
|
-
git_sysdir__dirs_shutdown_set = 0;
|
117
|
+
return error;
|
120
118
|
}
|
121
119
|
|
122
120
|
static int git_sysdir_check_selector(git_sysdir_t which)
|
123
121
|
{
|
124
|
-
if (which <
|
122
|
+
if (which < ARRAY_SIZE(git_sysdir__dirs))
|
125
123
|
return 0;
|
126
124
|
|
127
125
|
giterr_set(GITERR_INVALID, "config directory selector out of range");
|
@@ -137,18 +135,7 @@ int git_sysdir_get(const git_buf **out, git_sysdir_t which)
|
|
137
135
|
|
138
136
|
GITERR_CHECK_ERROR(git_sysdir_check_selector(which));
|
139
137
|
|
140
|
-
|
141
|
-
/* prepare shutdown if we're going to need it */
|
142
|
-
if (!git_sysdir__dirs_shutdown_set) {
|
143
|
-
git__on_shutdown(git_sysdir_global_shutdown);
|
144
|
-
git_sysdir__dirs_shutdown_set = 1;
|
145
|
-
}
|
146
|
-
|
147
|
-
GITERR_CHECK_ERROR(
|
148
|
-
git_sysdir__dir_guess[which](&git_sysdir__dirs[which]));
|
149
|
-
}
|
150
|
-
|
151
|
-
*out = &git_sysdir__dirs[which];
|
138
|
+
*out = &git_sysdir__dirs[which].buf;
|
152
139
|
return 0;
|
153
140
|
}
|
154
141
|
|
@@ -183,31 +170,38 @@ int git_sysdir_set(git_sysdir_t which, const char *search_path)
|
|
183
170
|
if (search_path != NULL)
|
184
171
|
expand_path = strstr(search_path, PATH_MAGIC);
|
185
172
|
|
186
|
-
/*
|
187
|
-
if (
|
188
|
-
|
189
|
-
git_sysdir__dir_guess[which](&git_sysdir__dirs[which]);
|
173
|
+
/* reset the default if this path has been cleared */
|
174
|
+
if (!search_path || expand_path)
|
175
|
+
git_sysdir__dirs[which].guess(&git_sysdir__dirs[which].buf);
|
190
176
|
|
191
177
|
/* if $PATH is not referenced, then just set the path */
|
192
|
-
if (!expand_path)
|
193
|
-
|
178
|
+
if (!expand_path) {
|
179
|
+
if (search_path)
|
180
|
+
git_buf_sets(&git_sysdir__dirs[which].buf, search_path);
|
181
|
+
|
182
|
+
goto done;
|
183
|
+
}
|
194
184
|
|
195
185
|
/* otherwise set to join(before $PATH, old value, after $PATH) */
|
196
186
|
if (expand_path > search_path)
|
197
187
|
git_buf_set(&merge, search_path, expand_path - search_path);
|
198
188
|
|
199
|
-
if (git_buf_len(&git_sysdir__dirs[which]))
|
189
|
+
if (git_buf_len(&git_sysdir__dirs[which].buf))
|
200
190
|
git_buf_join(&merge, GIT_PATH_LIST_SEPARATOR,
|
201
|
-
merge.ptr, git_sysdir__dirs[which].ptr);
|
191
|
+
merge.ptr, git_sysdir__dirs[which].buf.ptr);
|
202
192
|
|
203
193
|
expand_path += strlen(PATH_MAGIC);
|
204
194
|
if (*expand_path)
|
205
195
|
git_buf_join(&merge, GIT_PATH_LIST_SEPARATOR, merge.ptr, expand_path);
|
206
196
|
|
207
|
-
git_buf_swap(&git_sysdir__dirs[which], &merge);
|
197
|
+
git_buf_swap(&git_sysdir__dirs[which].buf, &merge);
|
208
198
|
git_buf_free(&merge);
|
209
199
|
|
210
|
-
|
200
|
+
done:
|
201
|
+
if (git_buf_oom(&git_sysdir__dirs[which].buf))
|
202
|
+
return -1;
|
203
|
+
|
204
|
+
return 0;
|
211
205
|
}
|
212
206
|
|
213
207
|
static int git_sysdir_find_in_dirlist(
|
data/vendor/libgit2/src/sysdir.h
CHANGED
@@ -103,9 +103,4 @@ extern int git_sysdir_get_str(char *out, size_t outlen, git_sysdir_t which);
|
|
103
103
|
*/
|
104
104
|
extern int git_sysdir_set(git_sysdir_t which, const char *paths);
|
105
105
|
|
106
|
-
/**
|
107
|
-
* Free the configuration file search paths.
|
108
|
-
*/
|
109
|
-
extern void git_sysdir_global_shutdown(void);
|
110
|
-
|
111
106
|
#endif /* INCLUDE_sysdir_h__ */
|
data/vendor/libgit2/src/tag.c
CHANGED
@@ -137,8 +137,14 @@ static int tag_parse(git_tag *tag, const char *buffer, const char *buffer_end)
|
|
137
137
|
|
138
138
|
tag->message = NULL;
|
139
139
|
if (buffer < buffer_end) {
|
140
|
-
|
141
|
-
|
140
|
+
/* If we're not at the end of the header, search for it */
|
141
|
+
if( *buffer != '\n' ) {
|
142
|
+
search = strstr(buffer, "\n\n");
|
143
|
+
if (search)
|
144
|
+
buffer = search + 1;
|
145
|
+
else
|
146
|
+
return tag_error("tag contains no message");
|
147
|
+
}
|
142
148
|
|
143
149
|
text_len = buffer_end - ++buffer;
|
144
150
|
|
@@ -40,58 +40,12 @@ typedef git_atomic git_atomic_ssize;
|
|
40
40
|
|
41
41
|
#ifdef GIT_THREADS
|
42
42
|
|
43
|
-
#
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
} git_thread;
|
48
|
-
|
49
|
-
#define git_thread_create(git_thread_ptr, attr, start_routine, arg) \
|
50
|
-
pthread_create(&(git_thread_ptr)->thread, attr, start_routine, arg)
|
51
|
-
#define git_thread_join(git_thread_ptr, status) \
|
52
|
-
pthread_join((git_thread_ptr)->thread, status)
|
53
|
-
|
54
|
-
#endif
|
55
|
-
|
56
|
-
/* Pthreads Mutex */
|
57
|
-
#define git_mutex pthread_mutex_t
|
58
|
-
#define git_mutex_init(a) pthread_mutex_init(a, NULL)
|
59
|
-
#define git_mutex_lock(a) pthread_mutex_lock(a)
|
60
|
-
#define git_mutex_unlock(a) pthread_mutex_unlock(a)
|
61
|
-
#define git_mutex_free(a) pthread_mutex_destroy(a)
|
62
|
-
|
63
|
-
/* Pthreads condition vars */
|
64
|
-
#define git_cond pthread_cond_t
|
65
|
-
#define git_cond_init(c) pthread_cond_init(c, NULL)
|
66
|
-
#define git_cond_free(c) pthread_cond_destroy(c)
|
67
|
-
#define git_cond_wait(c, l) pthread_cond_wait(c, l)
|
68
|
-
#define git_cond_signal(c) pthread_cond_signal(c)
|
69
|
-
#define git_cond_broadcast(c) pthread_cond_broadcast(c)
|
70
|
-
|
71
|
-
/* Pthread (-ish) rwlock
|
72
|
-
*
|
73
|
-
* This differs from normal pthreads rwlocks in two ways:
|
74
|
-
* 1. Separate APIs for releasing read locks and write locks (as
|
75
|
-
* opposed to the pure POSIX API which only has one unlock fn)
|
76
|
-
* 2. You should not use recursive read locks (i.e. grabbing a read
|
77
|
-
* lock in a thread that already holds a read lock) because the
|
78
|
-
* Windows implementation doesn't support it
|
79
|
-
*/
|
80
|
-
#define git_rwlock pthread_rwlock_t
|
81
|
-
#define git_rwlock_init(a) pthread_rwlock_init(a, NULL)
|
82
|
-
#define git_rwlock_rdlock(a) pthread_rwlock_rdlock(a)
|
83
|
-
#define git_rwlock_rdunlock(a) pthread_rwlock_rdunlock(a)
|
84
|
-
#define git_rwlock_wrlock(a) pthread_rwlock_wrlock(a)
|
85
|
-
#define git_rwlock_wrunlock(a) pthread_rwlock_wrunlock(a)
|
86
|
-
#define git_rwlock_free(a) pthread_rwlock_destroy(a)
|
87
|
-
#define GIT_RWLOCK_STATIC_INIT PTHREAD_RWLOCK_INITIALIZER
|
88
|
-
|
89
|
-
#ifndef GIT_WIN32
|
90
|
-
#define pthread_rwlock_rdunlock pthread_rwlock_unlock
|
91
|
-
#define pthread_rwlock_wrunlock pthread_rwlock_unlock
|
43
|
+
#ifdef GIT_WIN32
|
44
|
+
# include "win32/thread.h"
|
45
|
+
#else
|
46
|
+
# include "unix/pthread.h"
|
92
47
|
#endif
|
93
48
|
|
94
|
-
|
95
49
|
GIT_INLINE(void) git_atomic_set(git_atomic *a, int val)
|
96
50
|
{
|
97
51
|
#if defined(GIT_WIN32)
|
@@ -178,7 +132,7 @@ GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend)
|
|
178
132
|
#else
|
179
133
|
|
180
134
|
#define git_thread unsigned int
|
181
|
-
#define git_thread_create(thread,
|
135
|
+
#define git_thread_create(thread, start_routine, arg) 0
|
182
136
|
#define git_thread_join(id, status) (void)0
|
183
137
|
|
184
138
|
/* Pthreads Mutex */
|
@@ -35,6 +35,8 @@ static transport_definition transports[] = {
|
|
35
35
|
{ "file://", git_transport_local, NULL },
|
36
36
|
#ifdef GIT_SSH
|
37
37
|
{ "ssh://", git_transport_smart, &ssh_subtransport_definition },
|
38
|
+
{ "ssh+git://", git_transport_smart, &ssh_subtransport_definition },
|
39
|
+
{ "git+ssh://", git_transport_smart, &ssh_subtransport_definition },
|
38
40
|
#endif
|
39
41
|
{ NULL, 0, 0 }
|
40
42
|
};
|
@@ -114,7 +114,7 @@ static bool challenge_match(git_http_auth_scheme *scheme, void *data)
|
|
114
114
|
size_t scheme_len;
|
115
115
|
|
116
116
|
scheme_len = strlen(scheme_name);
|
117
|
-
return (
|
117
|
+
return (strncasecmp(challenge, scheme_name, scheme_len) == 0 &&
|
118
118
|
(challenge[scheme_len] == '\0' || challenge[scheme_len] == ' '));
|
119
119
|
}
|
120
120
|
|
@@ -569,6 +569,7 @@ static int http_connect(http_subtransport *t)
|
|
569
569
|
git_stream_close(t->io);
|
570
570
|
git_stream_free(t->io);
|
571
571
|
t->io = NULL;
|
572
|
+
t->connected = 0;
|
572
573
|
}
|
573
574
|
|
574
575
|
if (t->connection_data.use_ssl) {
|
@@ -721,32 +721,66 @@ static int add_push_report_pkt(git_push *push, git_pkt *pkt)
|
|
721
721
|
return 0;
|
722
722
|
}
|
723
723
|
|
724
|
-
static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt)
|
724
|
+
static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt, git_buf *data_pkt_buf)
|
725
725
|
{
|
726
726
|
git_pkt *pkt;
|
727
|
-
const char *line
|
728
|
-
size_t line_len
|
727
|
+
const char *line, *line_end;
|
728
|
+
size_t line_len;
|
729
729
|
int error;
|
730
|
+
int reading_from_buf = data_pkt_buf->size > 0;
|
731
|
+
|
732
|
+
if (reading_from_buf) {
|
733
|
+
/* We had an existing partial packet, so add the new
|
734
|
+
* packet to the buffer and parse the whole thing */
|
735
|
+
git_buf_put(data_pkt_buf, data_pkt->data, data_pkt->len);
|
736
|
+
line = data_pkt_buf->ptr;
|
737
|
+
line_len = data_pkt_buf->size;
|
738
|
+
}
|
739
|
+
else {
|
740
|
+
line = data_pkt->data;
|
741
|
+
line_len = data_pkt->len;
|
742
|
+
}
|
730
743
|
|
731
744
|
while (line_len > 0) {
|
732
745
|
error = git_pkt_parse_line(&pkt, line, &line_end, line_len);
|
733
746
|
|
734
|
-
if (error
|
735
|
-
|
747
|
+
if (error == GIT_EBUFS) {
|
748
|
+
/* Buffer the data when the inner packet is split
|
749
|
+
* across multiple sideband packets */
|
750
|
+
if (!reading_from_buf)
|
751
|
+
git_buf_put(data_pkt_buf, line, line_len);
|
752
|
+
error = 0;
|
753
|
+
goto done;
|
754
|
+
}
|
755
|
+
else if (error < 0)
|
756
|
+
goto done;
|
736
757
|
|
737
758
|
/* Advance in the buffer */
|
738
759
|
line_len -= (line_end - line);
|
739
760
|
line = line_end;
|
740
761
|
|
762
|
+
/* When a valid packet with no content has been
|
763
|
+
* read, git_pkt_parse_line does not report an
|
764
|
+
* error, but the pkt pointer has not been set.
|
765
|
+
* Handle this by skipping over empty packets.
|
766
|
+
*/
|
767
|
+
if (pkt == NULL)
|
768
|
+
continue;
|
769
|
+
|
741
770
|
error = add_push_report_pkt(push, pkt);
|
742
771
|
|
743
772
|
git_pkt_free(pkt);
|
744
773
|
|
745
774
|
if (error < 0 && error != GIT_ITEROVER)
|
746
|
-
|
775
|
+
goto done;
|
747
776
|
}
|
748
777
|
|
749
|
-
|
778
|
+
error = 0;
|
779
|
+
|
780
|
+
done:
|
781
|
+
if (reading_from_buf)
|
782
|
+
git_buf_consume(data_pkt_buf, line_end);
|
783
|
+
return error;
|
750
784
|
}
|
751
785
|
|
752
786
|
static int parse_report(transport_smart *transport, git_push *push)
|
@@ -755,6 +789,7 @@ static int parse_report(transport_smart *transport, git_push *push)
|
|
755
789
|
const char *line_end = NULL;
|
756
790
|
gitno_buffer *buf = &transport->buffer;
|
757
791
|
int error, recvd;
|
792
|
+
git_buf data_pkt_buf = GIT_BUF_INIT;
|
758
793
|
|
759
794
|
for (;;) {
|
760
795
|
if (buf->offset > 0)
|
@@ -763,16 +798,21 @@ static int parse_report(transport_smart *transport, git_push *push)
|
|
763
798
|
else
|
764
799
|
error = GIT_EBUFS;
|
765
800
|
|
766
|
-
if (error < 0 && error != GIT_EBUFS)
|
767
|
-
|
801
|
+
if (error < 0 && error != GIT_EBUFS) {
|
802
|
+
error = -1;
|
803
|
+
goto done;
|
804
|
+
}
|
768
805
|
|
769
806
|
if (error == GIT_EBUFS) {
|
770
|
-
if ((recvd = gitno_recv(buf)) < 0)
|
771
|
-
|
807
|
+
if ((recvd = gitno_recv(buf)) < 0) {
|
808
|
+
error = recvd;
|
809
|
+
goto done;
|
810
|
+
}
|
772
811
|
|
773
812
|
if (recvd == 0) {
|
774
813
|
giterr_set(GITERR_NET, "early EOF");
|
775
|
-
|
814
|
+
error = GIT_EEOF;
|
815
|
+
goto done;
|
776
816
|
}
|
777
817
|
continue;
|
778
818
|
}
|
@@ -781,10 +821,13 @@ static int parse_report(transport_smart *transport, git_push *push)
|
|
781
821
|
|
782
822
|
error = 0;
|
783
823
|
|
824
|
+
if (pkt == NULL)
|
825
|
+
continue;
|
826
|
+
|
784
827
|
switch (pkt->type) {
|
785
828
|
case GIT_PKT_DATA:
|
786
829
|
/* This is a sideband packet which contains other packets */
|
787
|
-
error = add_push_report_sideband_pkt(push, (git_pkt_data *)pkt);
|
830
|
+
error = add_push_report_sideband_pkt(push, (git_pkt_data *)pkt, &data_pkt_buf);
|
788
831
|
break;
|
789
832
|
case GIT_PKT_ERR:
|
790
833
|
giterr_set(GITERR_NET, "report-status: Error reported: %s",
|
@@ -805,12 +848,24 @@ static int parse_report(transport_smart *transport, git_push *push)
|
|
805
848
|
git_pkt_free(pkt);
|
806
849
|
|
807
850
|
/* add_push_report_pkt returns GIT_ITEROVER when it receives a flush */
|
808
|
-
if (error == GIT_ITEROVER)
|
809
|
-
|
851
|
+
if (error == GIT_ITEROVER) {
|
852
|
+
error = 0;
|
853
|
+
if (data_pkt_buf.size > 0) {
|
854
|
+
/* If there was data remaining in the pack data buffer,
|
855
|
+
* then the server sent a partial pkt-line */
|
856
|
+
giterr_set(GITERR_NET, "Incomplete pack data pkt-line");
|
857
|
+
error = GIT_ERROR;
|
858
|
+
}
|
859
|
+
goto done;
|
860
|
+
}
|
810
861
|
|
811
|
-
if (error < 0)
|
812
|
-
|
862
|
+
if (error < 0) {
|
863
|
+
goto done;
|
864
|
+
}
|
813
865
|
}
|
866
|
+
done:
|
867
|
+
git_buf_free(&data_pkt_buf);
|
868
|
+
return error;
|
814
869
|
}
|
815
870
|
|
816
871
|
static int add_ref_from_push_spec(git_vector *refs, push_spec *push_spec)
|