rugged 1.5.1 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +2 -2
  3. data/ext/rugged/rugged_blame.c +2 -0
  4. data/ext/rugged/rugged_blob.c +3 -0
  5. data/ext/rugged/rugged_commit.c +1 -0
  6. data/ext/rugged/rugged_config.c +2 -0
  7. data/ext/rugged/rugged_diff.c +1 -0
  8. data/ext/rugged/rugged_index.c +2 -0
  9. data/ext/rugged/rugged_patch.c +1 -0
  10. data/ext/rugged/rugged_rebase.c +1 -0
  11. data/ext/rugged/rugged_reference.c +1 -0
  12. data/ext/rugged/rugged_remote.c +1 -0
  13. data/ext/rugged/rugged_repo.c +5 -2
  14. data/ext/rugged/rugged_revwalk.c +5 -1
  15. data/ext/rugged/rugged_submodule.c +1 -0
  16. data/ext/rugged/rugged_tag.c +1 -0
  17. data/ext/rugged/rugged_tree.c +4 -0
  18. data/lib/rugged/index.rb +1 -1
  19. data/lib/rugged/tree.rb +1 -1
  20. data/lib/rugged/version.rb +1 -1
  21. data/vendor/libgit2/CMakeLists.txt +5 -1
  22. data/vendor/libgit2/COPYING +30 -0
  23. data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
  24. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +2 -0
  25. data/vendor/libgit2/include/git2/common.h +13 -6
  26. data/vendor/libgit2/include/git2/deprecated.h +6 -0
  27. data/vendor/libgit2/include/git2/diff.h +1 -1
  28. data/vendor/libgit2/include/git2/experimental.h +20 -0
  29. data/vendor/libgit2/include/git2/indexer.h +29 -0
  30. data/vendor/libgit2/include/git2/object.h +28 -2
  31. data/vendor/libgit2/include/git2/odb.h +58 -7
  32. data/vendor/libgit2/include/git2/odb_backend.h +106 -18
  33. data/vendor/libgit2/include/git2/oid.h +115 -15
  34. data/vendor/libgit2/include/git2/repository.h +20 -1
  35. data/vendor/libgit2/include/git2/stash.h +60 -6
  36. data/vendor/libgit2/include/git2/strarray.h +0 -13
  37. data/vendor/libgit2/include/git2/sys/odb_backend.h +1 -1
  38. data/vendor/libgit2/include/git2/sys/transport.h +12 -0
  39. data/vendor/libgit2/include/git2/version.h +4 -4
  40. data/vendor/libgit2/include/git2.h +1 -0
  41. data/vendor/libgit2/src/CMakeLists.txt +0 -6
  42. data/vendor/libgit2/src/cli/CMakeLists.txt +6 -2
  43. data/vendor/libgit2/src/cli/cmd_hash_object.c +27 -8
  44. data/vendor/libgit2/src/cli/opt.c +1 -1
  45. data/vendor/libgit2/src/libgit2/CMakeLists.txt +25 -15
  46. data/vendor/libgit2/src/libgit2/annotated_commit.c +1 -1
  47. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  48. data/vendor/libgit2/src/libgit2/attr_file.c +1 -1
  49. data/vendor/libgit2/src/libgit2/attrcache.c +1 -1
  50. data/vendor/libgit2/src/libgit2/blame.c +2 -0
  51. data/vendor/libgit2/src/libgit2/blob.c +4 -2
  52. data/vendor/libgit2/src/libgit2/blob.h +2 -2
  53. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  54. data/vendor/libgit2/src/libgit2/cherrypick.c +3 -3
  55. data/vendor/libgit2/src/libgit2/clone.c +31 -2
  56. data/vendor/libgit2/src/libgit2/commit.c +52 -17
  57. data/vendor/libgit2/src/libgit2/commit.h +25 -7
  58. data/vendor/libgit2/src/libgit2/commit_graph.c +47 -32
  59. data/vendor/libgit2/src/libgit2/commit_graph.h +3 -0
  60. data/vendor/libgit2/src/libgit2/commit_list.c +6 -2
  61. data/vendor/libgit2/src/libgit2/config.c +1 -1
  62. data/vendor/libgit2/src/libgit2/config_file.c +2 -2
  63. data/vendor/libgit2/src/libgit2/describe.c +8 -8
  64. data/vendor/libgit2/src/libgit2/diff.c +5 -1
  65. data/vendor/libgit2/src/libgit2/diff_file.c +15 -6
  66. data/vendor/libgit2/src/libgit2/diff_generate.c +17 -12
  67. data/vendor/libgit2/src/libgit2/diff_print.c +5 -5
  68. data/vendor/libgit2/src/libgit2/diff_tform.c +4 -0
  69. data/vendor/libgit2/src/libgit2/email.c +2 -2
  70. data/vendor/libgit2/src/libgit2/experimental.h.in +13 -0
  71. data/vendor/libgit2/src/libgit2/fetch.c +3 -6
  72. data/vendor/libgit2/src/libgit2/fetchhead.c +4 -4
  73. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  74. data/vendor/libgit2/src/libgit2/index.c +11 -9
  75. data/vendor/libgit2/src/libgit2/indexer.c +107 -44
  76. data/vendor/libgit2/src/libgit2/iterator.c +4 -2
  77. data/vendor/libgit2/src/libgit2/libgit2.c +19 -0
  78. data/vendor/libgit2/src/libgit2/merge.c +3 -3
  79. data/vendor/libgit2/src/libgit2/midx.c +16 -15
  80. data/vendor/libgit2/src/libgit2/mwindow.c +5 -2
  81. data/vendor/libgit2/src/libgit2/mwindow.h +4 -1
  82. data/vendor/libgit2/src/libgit2/notes.c +5 -5
  83. data/vendor/libgit2/src/libgit2/object.c +89 -25
  84. data/vendor/libgit2/src/libgit2/object.h +12 -3
  85. data/vendor/libgit2/src/libgit2/odb.c +194 -50
  86. data/vendor/libgit2/src/libgit2/odb.h +43 -4
  87. data/vendor/libgit2/src/libgit2/odb_loose.c +128 -70
  88. data/vendor/libgit2/src/libgit2/odb_pack.c +96 -44
  89. data/vendor/libgit2/src/libgit2/oid.c +134 -76
  90. data/vendor/libgit2/src/libgit2/oid.h +183 -9
  91. data/vendor/libgit2/src/libgit2/pack-objects.c +15 -4
  92. data/vendor/libgit2/src/libgit2/pack.c +90 -66
  93. data/vendor/libgit2/src/libgit2/pack.h +29 -15
  94. data/vendor/libgit2/src/libgit2/parse.c +4 -3
  95. data/vendor/libgit2/src/libgit2/patch_parse.c +5 -5
  96. data/vendor/libgit2/src/libgit2/push.c +13 -3
  97. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  98. data/vendor/libgit2/src/libgit2/rebase.c +19 -18
  99. data/vendor/libgit2/src/libgit2/refdb_fs.c +70 -39
  100. data/vendor/libgit2/src/libgit2/reflog.c +7 -5
  101. data/vendor/libgit2/src/libgit2/reflog.h +1 -2
  102. data/vendor/libgit2/src/libgit2/refs.c +2 -0
  103. data/vendor/libgit2/src/libgit2/remote.c +38 -37
  104. data/vendor/libgit2/src/libgit2/remote.h +40 -0
  105. data/vendor/libgit2/src/libgit2/repository.c +212 -36
  106. data/vendor/libgit2/src/libgit2/repository.h +9 -0
  107. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  108. data/vendor/libgit2/src/libgit2/revert.c +4 -4
  109. data/vendor/libgit2/src/libgit2/revparse.c +23 -7
  110. data/vendor/libgit2/src/libgit2/revwalk.c +5 -1
  111. data/vendor/libgit2/src/libgit2/stash.c +201 -26
  112. data/vendor/libgit2/src/libgit2/strarray.c +1 -0
  113. data/vendor/libgit2/src/libgit2/strarray.h +25 -0
  114. data/vendor/libgit2/src/libgit2/streams/openssl.c +1 -1
  115. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +7 -3
  116. data/vendor/libgit2/src/libgit2/streams/socket.c +4 -1
  117. data/vendor/libgit2/src/libgit2/submodule.c +6 -2
  118. data/vendor/libgit2/src/libgit2/sysdir.c +294 -7
  119. data/vendor/libgit2/src/libgit2/sysdir.h +39 -9
  120. data/vendor/libgit2/src/libgit2/tag.c +29 -10
  121. data/vendor/libgit2/src/libgit2/tag.h +2 -2
  122. data/vendor/libgit2/src/libgit2/threadstate.h +1 -1
  123. data/vendor/libgit2/src/libgit2/transports/http.c +8 -7
  124. data/vendor/libgit2/src/libgit2/transports/httpclient.c +9 -0
  125. data/vendor/libgit2/src/libgit2/transports/httpclient.h +10 -0
  126. data/vendor/libgit2/src/libgit2/transports/local.c +14 -0
  127. data/vendor/libgit2/src/libgit2/transports/smart.c +35 -0
  128. data/vendor/libgit2/src/libgit2/transports/smart.h +10 -1
  129. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +153 -41
  130. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +42 -12
  131. data/vendor/libgit2/src/libgit2/transports/ssh.c +62 -65
  132. data/vendor/libgit2/src/libgit2/transports/winhttp.c +9 -4
  133. data/vendor/libgit2/src/libgit2/tree-cache.c +4 -4
  134. data/vendor/libgit2/src/libgit2/tree.c +22 -16
  135. data/vendor/libgit2/src/libgit2/tree.h +2 -2
  136. data/vendor/libgit2/src/libgit2/worktree.c +5 -0
  137. data/vendor/libgit2/src/util/CMakeLists.txt +7 -1
  138. data/vendor/libgit2/src/util/fs_path.c +1 -1
  139. data/vendor/libgit2/src/util/futils.c +0 -3
  140. data/vendor/libgit2/src/util/git2_util.h +2 -2
  141. data/vendor/libgit2/src/util/hash/openssl.c +4 -3
  142. data/vendor/libgit2/src/util/hash/rfc6234/sha.h +0 -112
  143. data/vendor/libgit2/src/util/hash.h +13 -0
  144. data/vendor/libgit2/src/util/net.c +338 -84
  145. data/vendor/libgit2/src/util/net.h +7 -0
  146. data/vendor/libgit2/src/util/posix.h +2 -0
  147. data/vendor/libgit2/src/util/rand.c +4 -0
  148. data/vendor/libgit2/src/util/regexp.c +3 -3
  149. data/vendor/libgit2/src/util/thread.h +20 -19
  150. data/vendor/libgit2/src/util/util.h +1 -0
  151. metadata +7 -5
  152. data/vendor/libgit2/src/util/win32/findfile.c +0 -286
  153. data/vendor/libgit2/src/util/win32/findfile.h +0 -22
  154. /data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +0 -0
@@ -93,121 +93,367 @@ int git_net_url_dup(git_net_url *out, git_net_url *in)
93
93
  return 0;
94
94
  }
95
95
 
96
- int git_net_url_parse(git_net_url *url, const char *given)
96
+ static int url_invalid(const char *message)
97
97
  {
98
- struct http_parser_url u = {0};
99
- bool has_scheme, has_host, has_port, has_path, has_query, has_userinfo;
100
- git_str scheme = GIT_STR_INIT,
101
- host = GIT_STR_INIT,
102
- port = GIT_STR_INIT,
103
- path = GIT_STR_INIT,
104
- username = GIT_STR_INIT,
105
- password = GIT_STR_INIT,
106
- query = GIT_STR_INIT;
107
- int error = GIT_EINVALIDSPEC;
108
-
109
- if (http_parser_parse_url(given, strlen(given), false, &u)) {
110
- git_error_set(GIT_ERROR_NET, "malformed URL '%s'", given);
111
- goto done;
112
- }
98
+ git_error_set(GIT_ERROR_NET, "invalid url: %s", message);
99
+ return GIT_EINVALIDSPEC;
100
+ }
113
101
 
114
- has_scheme = !!(u.field_set & (1 << UF_SCHEMA));
115
- has_host = !!(u.field_set & (1 << UF_HOST));
116
- has_port = !!(u.field_set & (1 << UF_PORT));
117
- has_path = !!(u.field_set & (1 << UF_PATH));
118
- has_query = !!(u.field_set & (1 << UF_QUERY));
119
- has_userinfo = !!(u.field_set & (1 << UF_USERINFO));
102
+ static int url_parse_authority(
103
+ const char **user_start, size_t *user_len,
104
+ const char **password_start, size_t *password_len,
105
+ const char **host_start, size_t *host_len,
106
+ const char **port_start, size_t *port_len,
107
+ const char *authority_start, size_t len,
108
+ const char *scheme_start, size_t scheme_len)
109
+ {
110
+ const char *c, *hostport_end, *host_end = NULL,
111
+ *userpass_end, *user_end = NULL;
120
112
 
121
- if (has_scheme) {
122
- const char *url_scheme = given + u.field_data[UF_SCHEMA].off;
123
- size_t url_scheme_len = u.field_data[UF_SCHEMA].len;
124
- git_str_put(&scheme, url_scheme, url_scheme_len);
125
- git__strntolower(scheme.ptr, scheme.size);
126
- } else {
127
- git_error_set(GIT_ERROR_NET, "malformed URL '%s'", given);
128
- goto done;
129
- }
113
+ enum {
114
+ HOSTPORT, HOST, IPV6, HOST_END, USERPASS, USER
115
+ } state = HOSTPORT;
130
116
 
131
- if (has_host) {
132
- const char *url_host = given + u.field_data[UF_HOST].off;
133
- size_t url_host_len = u.field_data[UF_HOST].len;
134
- git_str_decode_percent(&host, url_host, url_host_len);
135
- }
117
+ if (len == 0)
118
+ return 0;
136
119
 
137
- if (has_port) {
138
- const char *url_port = given + u.field_data[UF_PORT].off;
139
- size_t url_port_len = u.field_data[UF_PORT].len;
140
- git_str_put(&port, url_port, url_port_len);
141
- } else {
142
- const char *default_port = default_port_for_scheme(scheme.ptr);
120
+ /*
121
+ * walk the authority backwards so that we can parse google code's
122
+ * ssh urls that are not rfc compliant and allow @ in the username
123
+ */
124
+ for (hostport_end = authority_start + len, c = hostport_end - 1;
125
+ c >= authority_start && !user_end;
126
+ c--) {
127
+ switch (state) {
128
+ case HOSTPORT:
129
+ if (*c == ':') {
130
+ *port_start = c + 1;
131
+ *port_len = hostport_end - *port_start;
132
+ host_end = c;
133
+ state = HOST;
134
+ break;
135
+ }
143
136
 
144
- if (default_port == NULL) {
145
- git_error_set(GIT_ERROR_NET, "unknown scheme for URL '%s'", given);
146
- goto done;
147
- }
137
+ /*
138
+ * if we've only seen digits then we don't know
139
+ * if we're parsing just a host or a host and port.
140
+ * if we see a non-digit, then we're in a host,
141
+ * otherwise, fall through to possibly match the
142
+ * "@" (user/host separator).
143
+ */
144
+
145
+ if (*c < '0' || *c > '9') {
146
+ host_end = hostport_end;
147
+ state = HOST;
148
+ }
148
149
 
149
- git_str_puts(&port, default_port);
150
- }
150
+ /* fall through */
151
151
 
152
- if (has_path) {
153
- const char *url_path = given + u.field_data[UF_PATH].off;
154
- size_t url_path_len = u.field_data[UF_PATH].len;
155
- git_str_put(&path, url_path, url_path_len);
156
- } else {
157
- git_str_puts(&path, "/");
152
+ case HOST:
153
+ if (*c == ']' && host_end == c + 1) {
154
+ host_end = c;
155
+ state = IPV6;
156
+ }
157
+
158
+ else if (*c == '@') {
159
+ *host_start = c + 1;
160
+ *host_len = host_end ? host_end - *host_start :
161
+ hostport_end - *host_start;
162
+ userpass_end = c;
163
+ state = USERPASS;
164
+ }
165
+
166
+ else if (*c == '[' || *c == ']' || *c == ':') {
167
+ return url_invalid("malformed hostname");
168
+ }
169
+
170
+ break;
171
+
172
+ case IPV6:
173
+ if (*c == '[') {
174
+ *host_start = c + 1;
175
+ *host_len = host_end - *host_start;
176
+ state = HOST_END;
177
+ }
178
+
179
+ else if ((*c < '0' || *c > '9') &&
180
+ (*c < 'a' || *c > 'f') &&
181
+ (*c < 'A' || *c > 'F') &&
182
+ (*c != ':')) {
183
+ return url_invalid("malformed hostname");
184
+ }
185
+
186
+ break;
187
+
188
+ case HOST_END:
189
+ if (*c == '@') {
190
+ userpass_end = c;
191
+ state = USERPASS;
192
+ break;
193
+ }
194
+
195
+ return url_invalid("malformed hostname");
196
+
197
+ case USERPASS:
198
+ if (*c == '@' &&
199
+ strncasecmp(scheme_start, "ssh", scheme_len))
200
+ return url_invalid("malformed hostname");
201
+
202
+ if (*c == ':') {
203
+ *password_start = c + 1;
204
+ *password_len = userpass_end - *password_start;
205
+ user_end = c;
206
+ state = USER;
207
+ break;
208
+ }
209
+
210
+ break;
211
+
212
+ default:
213
+ GIT_ASSERT(!"unhandled state");
214
+ }
158
215
  }
159
216
 
160
- if (has_query) {
161
- const char *url_query = given + u.field_data[UF_QUERY].off;
162
- size_t url_query_len = u.field_data[UF_QUERY].len;
163
- git_str_decode_percent(&query, url_query, url_query_len);
217
+ switch (state) {
218
+ case HOSTPORT:
219
+ *host_start = authority_start;
220
+ *host_len = (hostport_end - *host_start);
221
+ break;
222
+ case HOST:
223
+ *host_start = authority_start;
224
+ *host_len = (host_end - *host_start);
225
+ break;
226
+ case IPV6:
227
+ return url_invalid("malformed hostname");
228
+ case HOST_END:
229
+ break;
230
+ case USERPASS:
231
+ *user_start = authority_start;
232
+ *user_len = (userpass_end - *user_start);
233
+ break;
234
+ case USER:
235
+ *user_start = authority_start;
236
+ *user_len = (user_end - *user_start);
237
+ break;
238
+ default:
239
+ GIT_ASSERT(!"unhandled state");
164
240
  }
165
241
 
166
- if (has_userinfo) {
167
- const char *url_userinfo = given + u.field_data[UF_USERINFO].off;
168
- size_t url_userinfo_len = u.field_data[UF_USERINFO].len;
169
- const char *colon = memchr(url_userinfo, ':', url_userinfo_len);
242
+ return 0;
243
+ }
244
+
245
+ int git_net_url_parse(git_net_url *url, const char *given)
246
+ {
247
+ const char *c, *scheme_start, *authority_start, *user_start,
248
+ *password_start, *host_start, *port_start, *path_start,
249
+ *query_start, *fragment_start, *default_port;
250
+ git_str scheme = GIT_STR_INIT, user = GIT_STR_INIT,
251
+ password = GIT_STR_INIT, host = GIT_STR_INIT,
252
+ port = GIT_STR_INIT, path = GIT_STR_INIT,
253
+ query = GIT_STR_INIT, fragment = GIT_STR_INIT;
254
+ size_t scheme_len = 0, user_len = 0, password_len = 0, host_len = 0,
255
+ port_len = 0, path_len = 0, query_len = 0, fragment_len = 0;
256
+ bool hierarchical = false;
257
+ int error = 0;
258
+
259
+ enum {
260
+ SCHEME,
261
+ AUTHORITY_START, AUTHORITY,
262
+ PATH_START, PATH,
263
+ QUERY,
264
+ FRAGMENT
265
+ } state = SCHEME;
266
+
267
+ memset(url, 0, sizeof(git_net_url));
268
+
269
+ for (c = scheme_start = given; *c; c++) {
270
+ switch (state) {
271
+ case SCHEME:
272
+ if (*c == ':') {
273
+ scheme_len = (c - scheme_start);
274
+
275
+ if (*(c+1) == '/' && *(c+2) == '/') {
276
+ c += 2;
277
+ hierarchical = true;
278
+ state = AUTHORITY_START;
279
+ } else {
280
+ state = PATH_START;
281
+ }
282
+ } else if ((*c < 'A' || *c > 'Z') &&
283
+ (*c < 'a' || *c > 'z') &&
284
+ (*c < '0' || *c > '9') &&
285
+ (*c != '+' && *c != '-' && *c != '.')) {
286
+ /*
287
+ * an illegal scheme character means that we
288
+ * were just given a relative path
289
+ */
290
+ path_start = given;
291
+ state = PATH;
292
+ break;
293
+ }
294
+ break;
295
+
296
+ case AUTHORITY_START:
297
+ authority_start = c;
298
+ state = AUTHORITY;
299
+
300
+ /* fall through */
301
+
302
+ case AUTHORITY:
303
+ if (*c != '/')
304
+ break;
305
+
306
+ /*
307
+ * authority is sufficiently complex that we parse
308
+ * it separately
309
+ */
310
+ if ((error = url_parse_authority(
311
+ &user_start, &user_len,
312
+ &password_start,&password_len,
313
+ &host_start, &host_len,
314
+ &port_start, &port_len,
315
+ authority_start, (c - authority_start),
316
+ scheme_start, scheme_len)) < 0)
317
+ goto done;
318
+
319
+ /* fall through */
320
+
321
+ case PATH_START:
322
+ path_start = c;
323
+ state = PATH;
324
+ /* fall through */
325
+
326
+ case PATH:
327
+ switch (*c) {
328
+ case '?':
329
+ path_len = (c - path_start);
330
+ query_start = c + 1;
331
+ state = QUERY;
332
+ break;
333
+ case '#':
334
+ path_len = (c - path_start);
335
+ fragment_start = c + 1;
336
+ state = FRAGMENT;
337
+ break;
338
+ }
339
+ break;
340
+
341
+ case QUERY:
342
+ if (*c == '#') {
343
+ query_len = (c - query_start);
344
+ fragment_start = c + 1;
345
+ state = FRAGMENT;
346
+ }
347
+ break;
170
348
 
171
- if (colon) {
172
- const char *url_username = url_userinfo;
173
- size_t url_username_len = colon - url_userinfo;
174
- const char *url_password = colon + 1;
175
- size_t url_password_len = url_userinfo_len - (url_username_len + 1);
349
+ case FRAGMENT:
350
+ break;
176
351
 
177
- git_str_decode_percent(&username, url_username, url_username_len);
178
- git_str_decode_percent(&password, url_password, url_password_len);
179
- } else {
180
- git_str_decode_percent(&username, url_userinfo, url_userinfo_len);
352
+ default:
353
+ GIT_ASSERT(!"unhandled state");
181
354
  }
182
355
  }
183
356
 
184
- if (git_str_oom(&scheme) ||
185
- git_str_oom(&host) ||
186
- git_str_oom(&port) ||
187
- git_str_oom(&path) ||
188
- git_str_oom(&query) ||
189
- git_str_oom(&username) ||
190
- git_str_oom(&password))
191
- return -1;
357
+ switch (state) {
358
+ case SCHEME:
359
+ /*
360
+ * if we never saw a ':' then we were given a relative
361
+ * path, not a bare scheme
362
+ */
363
+ path_start = given;
364
+ path_len = (c - scheme_start);
365
+ break;
366
+ case AUTHORITY_START:
367
+ break;
368
+ case AUTHORITY:
369
+ if ((error = url_parse_authority(
370
+ &user_start, &user_len,
371
+ &password_start,&password_len,
372
+ &host_start, &host_len,
373
+ &port_start, &port_len,
374
+ authority_start, (c - authority_start),
375
+ scheme_start, scheme_len)) < 0)
376
+ goto done;
377
+ break;
378
+ case PATH_START:
379
+ break;
380
+ case PATH:
381
+ path_len = (c - path_start);
382
+ break;
383
+ case QUERY:
384
+ query_len = (c - query_start);
385
+ break;
386
+ case FRAGMENT:
387
+ fragment_len = (c - fragment_start);
388
+ break;
389
+ default:
390
+ GIT_ASSERT(!"unhandled state");
391
+ }
392
+
393
+ if (scheme_len) {
394
+ if ((error = git_str_put(&scheme, scheme_start, scheme_len)) < 0)
395
+ goto done;
396
+
397
+ git__strntolower(scheme.ptr, scheme.size);
398
+ }
399
+
400
+ if (user_len &&
401
+ (error = git_str_decode_percent(&user, user_start, user_len)) < 0)
402
+ goto done;
403
+
404
+ if (password_len &&
405
+ (error = git_str_decode_percent(&password, password_start, password_len)) < 0)
406
+ goto done;
407
+
408
+ if (host_len &&
409
+ (error = git_str_decode_percent(&host, host_start, host_len)) < 0)
410
+ goto done;
411
+
412
+ if (port_len)
413
+ error = git_str_put(&port, port_start, port_len);
414
+ else if (scheme_len && (default_port = default_port_for_scheme(scheme.ptr)) != NULL)
415
+ error = git_str_puts(&port, default_port);
416
+
417
+ if (error < 0)
418
+ goto done;
419
+
420
+ if (path_len)
421
+ error = git_str_put(&path, path_start, path_len);
422
+ else if (hierarchical)
423
+ error = git_str_puts(&path, "/");
424
+
425
+ if (error < 0)
426
+ goto done;
427
+
428
+ if (query_len &&
429
+ (error = git_str_decode_percent(&query, query_start, query_len)) < 0)
430
+ goto done;
431
+
432
+ if (fragment_len &&
433
+ (error = git_str_decode_percent(&fragment, fragment_start, fragment_len)) < 0)
434
+ goto done;
192
435
 
193
436
  url->scheme = git_str_detach(&scheme);
194
437
  url->host = git_str_detach(&host);
195
438
  url->port = git_str_detach(&port);
196
439
  url->path = git_str_detach(&path);
197
440
  url->query = git_str_detach(&query);
198
- url->username = git_str_detach(&username);
441
+ url->fragment = git_str_detach(&fragment);
442
+ url->username = git_str_detach(&user);
199
443
  url->password = git_str_detach(&password);
200
444
 
201
445
  error = 0;
202
446
 
203
447
  done:
204
448
  git_str_dispose(&scheme);
449
+ git_str_dispose(&user);
450
+ git_str_dispose(&password);
205
451
  git_str_dispose(&host);
206
452
  git_str_dispose(&port);
207
453
  git_str_dispose(&path);
208
454
  git_str_dispose(&query);
209
- git_str_dispose(&username);
210
- git_str_dispose(&password);
455
+ git_str_dispose(&fragment);
456
+
211
457
  return error;
212
458
  }
213
459
 
@@ -374,7 +620,7 @@ int git_net_url_parse_scp(git_net_url *url, const char *given)
374
620
  break;
375
621
 
376
622
  default:
377
- GIT_ASSERT("unhandled state");
623
+ GIT_ASSERT(!"unhandled state");
378
624
  }
379
625
  }
380
626
 
@@ -400,6 +646,13 @@ int git_net_url_parse_scp(git_net_url *url, const char *given)
400
646
  return 0;
401
647
  }
402
648
 
649
+ int git_net_url_parse_standard_or_scp(git_net_url *url, const char *given)
650
+ {
651
+ return git_net_str_is_url(given) ?
652
+ git_net_url_parse(url, given) :
653
+ git_net_url_parse_scp(url, given);
654
+ }
655
+
403
656
  int git_net_url_joinpath(
404
657
  git_net_url *out,
405
658
  git_net_url *one,
@@ -588,7 +841,7 @@ bool git_net_url_is_default_port(git_net_url *url)
588
841
  {
589
842
  const char *default_port;
590
843
 
591
- if ((default_port = default_port_for_scheme(url->scheme)) != NULL)
844
+ if (url->scheme && (default_port = default_port_for_scheme(url->scheme)) != NULL)
592
845
  return (strcmp(url->port, default_port) == 0);
593
846
  else
594
847
  return false;
@@ -744,6 +997,7 @@ void git_net_url_dispose(git_net_url *url)
744
997
  git__free(url->port); url->port = NULL;
745
998
  git__free(url->path); url->path = NULL;
746
999
  git__free(url->query); url->query = NULL;
1000
+ git__free(url->fragment); url->fragment = NULL;
747
1001
  git__free(url->username); url->username = NULL;
748
1002
  git__free(url->password); url->password = NULL;
749
1003
  }
@@ -15,6 +15,7 @@ typedef struct git_net_url {
15
15
  char *port;
16
16
  char *path;
17
17
  char *query;
18
+ char *fragment;
18
19
  char *username;
19
20
  char *password;
20
21
  } git_net_url;
@@ -33,6 +34,12 @@ extern int git_net_url_parse(git_net_url *url, const char *str);
33
34
  /** Parses a string containing an SCP style path into a URL structure. */
34
35
  extern int git_net_url_parse_scp(git_net_url *url, const char *str);
35
36
 
37
+ /**
38
+ * Parses a string containing a standard URL or an SCP style path into
39
+ * a URL structure.
40
+ */
41
+ extern int git_net_url_parse_standard_or_scp(git_net_url *url, const char *str);
42
+
36
43
  /** Appends a path and/or query string to the given URL */
37
44
  extern int git_net_url_joinpath(
38
45
  git_net_url *out,
@@ -104,6 +104,8 @@ typedef __int64 off64_t;
104
104
  typedef __haiku_std_int64 off64_t;
105
105
  #elif defined(__APPLE__)
106
106
  typedef __int64_t off64_t;
107
+ #elif defined(_AIX)
108
+ typedef long long off64_t;
107
109
  #else
108
110
  typedef int64_t off64_t;
109
111
  #endif
@@ -14,6 +14,10 @@ See <http://creativecommons.org/publicdomain/zero/1.0/>. */
14
14
  # include <sys/random.h>
15
15
  #endif
16
16
 
17
+ #if defined(GIT_WIN32)
18
+ # include <wincrypt.h>
19
+ #endif
20
+
17
21
  static uint64_t state[4];
18
22
  static git_mutex state_lock;
19
23
 
@@ -108,11 +108,11 @@ int git_regexp_match(const git_regexp *r, const char *string)
108
108
  data = pcre2_match_data_create(1, NULL);
109
109
  GIT_ERROR_CHECK_ALLOC(data);
110
110
 
111
- if ((error = pcre2_match(*r, (const unsigned char *) string, strlen(string),
112
- 0, 0, data, NULL)) < 0)
111
+ error = pcre2_match(*r, (const unsigned char *) string, strlen(string), 0, 0, data, NULL);
112
+ pcre2_match_data_free(data);
113
+ if (error < 0)
113
114
  return (error == PCRE2_ERROR_NOMATCH) ? GIT_ENOTFOUND : GIT_EINVALIDSPEC;
114
115
 
115
- pcre2_match_data_free(data);
116
116
  return 0;
117
117
  }
118
118
 
@@ -260,36 +260,37 @@ GIT_INLINE(int64_t) git_atomic64_get(git_atomic64 *a)
260
260
 
261
261
  #else
262
262
 
263
- #define git_threads_global_init git__noop
263
+ #define git_threads_global_init git__noop
264
264
 
265
265
  #define git_thread unsigned int
266
- #define git_thread_create(thread, start_routine, arg) git__noop()
267
- #define git_thread_join(id, status) git__noop()
266
+ #define git_thread_create(t, s, a) git__noop(t, s, a)
267
+ #define git_thread_join(i, s) git__noop_args(i, s)
268
268
 
269
269
  /* Pthreads Mutex */
270
270
  #define git_mutex unsigned int
271
- #define git_mutex_init(a) git__noop()
272
- #define git_mutex_init(a) git__noop()
273
- #define git_mutex_lock(a) git__noop()
274
- #define git_mutex_unlock(a) git__noop()
275
- #define git_mutex_free(a) git__noop()
271
+ #define git_mutex_init(a) git__noop_args(a)
272
+ #define git_mutex_init(a) git__noop_args(a)
273
+ #define git_mutex_lock(a) git__noop_args(a)
274
+ #define git_mutex_unlock(a) git__noop_args(a)
275
+ #define git_mutex_free(a) git__noop_args(a)
276
276
 
277
277
  /* Pthreads condition vars */
278
278
  #define git_cond unsigned int
279
- #define git_cond_init(c) git__noop()
280
- #define git_cond_free(c) git__noop()
281
- #define git_cond_wait(c, l) git__noop()
282
- #define git_cond_signal(c) git__noop()
283
- #define git_cond_broadcast(c) git__noop()
279
+ #define git_cond_init(c) git__noop_args(c)
280
+ #define git_cond_free(c) git__noop_args(c)
281
+ #define git_cond_wait(c, l) git__noop_args(c, l)
282
+ #define git_cond_signal(c) git__noop_args(c)
283
+ #define git_cond_broadcast(c) git__noop_args(c)
284
284
 
285
285
  /* Pthreads rwlock */
286
286
  #define git_rwlock unsigned int
287
- #define git_rwlock_init(a) git__noop()
288
- #define git_rwlock_rdlock(a) git__noop()
289
- #define git_rwlock_rdunlock(a) git__noop()
290
- #define git_rwlock_wrlock(a) git__noop()
291
- #define git_rwlock_wrunlock(a) git__noop()
292
- #define git_rwlock_free(a) git__noop()
287
+ #define git_rwlock_init(a) git__noop_args(a)
288
+ #define git_rwlock_rdlock(a) git__noop_args(a)
289
+ #define git_rwlock_rdunlock(a) git__noop_args(a)
290
+ #define git_rwlock_wrlock(a) git__noop_args(a)
291
+ #define git_rwlock_wrunlock(a) git__noop_args(a)
292
+ #define git_rwlock_free(a) git__noop_args(a)
293
+
293
294
  #define GIT_RWLOCK_STATIC_INIT 0
294
295
 
295
296
 
@@ -381,6 +381,7 @@ extern int git__getenv(git_str *out, const char *name);
381
381
  extern int git__online_cpus(void);
382
382
 
383
383
  GIT_INLINE(int) git__noop(void) { return 0; }
384
+ GIT_INLINE(int) git__noop_args(void *a, ...) { GIT_UNUSED(a); return 0; }
384
385
 
385
386
  #include "alloc.h"
386
387
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rugged
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chacon
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-01-21 00:00:00.000000000 Z
12
+ date: 2023-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake-compiler
@@ -127,6 +127,7 @@ files:
127
127
  - vendor/libgit2/cmake/AddClarTest.cmake
128
128
  - vendor/libgit2/cmake/DefaultCFlags.cmake
129
129
  - vendor/libgit2/cmake/EnableWarnings.cmake
130
+ - vendor/libgit2/cmake/ExperimentalFeatures.cmake
130
131
  - vendor/libgit2/cmake/FindCoreFoundation.cmake
131
132
  - vendor/libgit2/cmake/FindGSSAPI.cmake
132
133
  - vendor/libgit2/cmake/FindGSSFramework.cmake
@@ -263,6 +264,7 @@ files:
263
264
  - vendor/libgit2/include/git2/diff.h
264
265
  - vendor/libgit2/include/git2/email.h
265
266
  - vendor/libgit2/include/git2/errors.h
267
+ - vendor/libgit2/include/git2/experimental.h
266
268
  - vendor/libgit2/include/git2/filter.h
267
269
  - vendor/libgit2/include/git2/global.h
268
270
  - vendor/libgit2/include/git2/graph.h
@@ -356,7 +358,6 @@ files:
356
358
  - vendor/libgit2/src/cli/win32/precompiled.c
357
359
  - vendor/libgit2/src/cli/win32/precompiled.h
358
360
  - vendor/libgit2/src/cli/win32/sighandler.c
359
- - vendor/libgit2/src/features.h.in
360
361
  - vendor/libgit2/src/libgit2/CMakeLists.txt
361
362
  - vendor/libgit2/src/libgit2/annotated_commit.c
362
363
  - vendor/libgit2/src/libgit2/annotated_commit.h
@@ -428,6 +429,7 @@ files:
428
429
  - vendor/libgit2/src/libgit2/email.h
429
430
  - vendor/libgit2/src/libgit2/errors.c
430
431
  - vendor/libgit2/src/libgit2/errors.h
432
+ - vendor/libgit2/src/libgit2/experimental.h.in
431
433
  - vendor/libgit2/src/libgit2/fetch.c
432
434
  - vendor/libgit2/src/libgit2/fetch.h
433
435
  - vendor/libgit2/src/libgit2/fetchhead.c
@@ -531,6 +533,7 @@ files:
531
533
  - vendor/libgit2/src/libgit2/status.c
532
534
  - vendor/libgit2/src/libgit2/status.h
533
535
  - vendor/libgit2/src/libgit2/strarray.c
536
+ - vendor/libgit2/src/libgit2/strarray.h
534
537
  - vendor/libgit2/src/libgit2/stream.h
535
538
  - vendor/libgit2/src/libgit2/streams/mbedtls.c
536
539
  - vendor/libgit2/src/libgit2/streams/mbedtls.h
@@ -627,6 +630,7 @@ files:
627
630
  - vendor/libgit2/src/util/fs_path.h
628
631
  - vendor/libgit2/src/util/futils.c
629
632
  - vendor/libgit2/src/util/futils.h
633
+ - vendor/libgit2/src/util/git2_features.h.in
630
634
  - vendor/libgit2/src/util/git2_util.h
631
635
  - vendor/libgit2/src/util/hash.c
632
636
  - vendor/libgit2/src/util/hash.h
@@ -694,8 +698,6 @@ files:
694
698
  - vendor/libgit2/src/util/win32/dir.h
695
699
  - vendor/libgit2/src/util/win32/error.c
696
700
  - vendor/libgit2/src/util/win32/error.h
697
- - vendor/libgit2/src/util/win32/findfile.c
698
- - vendor/libgit2/src/util/win32/findfile.h
699
701
  - vendor/libgit2/src/util/win32/map.c
700
702
  - vendor/libgit2/src/util/win32/mingw-compat.h
701
703
  - vendor/libgit2/src/util/win32/msvc-compat.h