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)
         |