rugged 1.6.2 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_allocator.c +0 -54
  3. data/lib/rugged/version.rb +1 -1
  4. data/vendor/libgit2/CMakeLists.txt +3 -8
  5. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  6. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +3 -3
  7. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +21 -2
  8. data/vendor/libgit2/cmake/SelectHashes.cmake +4 -0
  9. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  10. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  11. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  12. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  13. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  14. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  15. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
  16. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
  17. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
  18. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
  19. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
  20. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
  21. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +24 -22
  22. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
  23. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
  24. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
  25. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
  26. data/vendor/libgit2/include/git2/common.h +26 -1
  27. data/vendor/libgit2/include/git2/diff.h +41 -3
  28. data/vendor/libgit2/include/git2/errors.h +4 -2
  29. data/vendor/libgit2/include/git2/index.h +9 -0
  30. data/vendor/libgit2/include/git2/oid.h +1 -1
  31. data/vendor/libgit2/include/git2/remote.h +18 -0
  32. data/vendor/libgit2/include/git2/repository.h +12 -2
  33. data/vendor/libgit2/include/git2/sys/alloc.h +0 -34
  34. data/vendor/libgit2/include/git2/sys/commit_graph.h +12 -2
  35. data/vendor/libgit2/include/git2/sys/midx.h +5 -1
  36. data/vendor/libgit2/include/git2/sys/stream.h +16 -2
  37. data/vendor/libgit2/include/git2/sys/transport.h +20 -2
  38. data/vendor/libgit2/include/git2/version.h +4 -4
  39. data/vendor/libgit2/include/git2/worktree.h +3 -1
  40. data/vendor/libgit2/src/CMakeLists.txt +34 -11
  41. data/vendor/libgit2/src/cli/CMakeLists.txt +0 -1
  42. data/vendor/libgit2/src/cli/cmd_clone.c +22 -6
  43. data/vendor/libgit2/src/cli/progress.c +9 -8
  44. data/vendor/libgit2/src/cli/progress.h +4 -4
  45. data/vendor/libgit2/src/libgit2/CMakeLists.txt +1 -20
  46. data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
  47. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  48. data/vendor/libgit2/src/libgit2/apply.c +4 -3
  49. data/vendor/libgit2/src/libgit2/blame.c +23 -16
  50. data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
  51. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  52. data/vendor/libgit2/src/libgit2/cherrypick.c +3 -3
  53. data/vendor/libgit2/src/libgit2/clone.c +3 -1
  54. data/vendor/libgit2/src/libgit2/commit.c +31 -9
  55. data/vendor/libgit2/src/libgit2/commit_graph.c +110 -43
  56. data/vendor/libgit2/src/libgit2/commit_graph.h +20 -4
  57. data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
  58. data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
  59. data/vendor/libgit2/src/libgit2/config.c +5 -2
  60. data/vendor/libgit2/src/libgit2/config_file.c +14 -8
  61. data/vendor/libgit2/src/libgit2/describe.c +10 -7
  62. data/vendor/libgit2/src/libgit2/diff.c +16 -7
  63. data/vendor/libgit2/src/libgit2/diff.h +6 -6
  64. data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
  65. data/vendor/libgit2/src/libgit2/diff_generate.c +36 -15
  66. data/vendor/libgit2/src/libgit2/diff_parse.c +20 -4
  67. data/vendor/libgit2/src/libgit2/diff_print.c +26 -7
  68. data/vendor/libgit2/src/libgit2/diff_tform.c +4 -4
  69. data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
  70. data/vendor/libgit2/src/libgit2/email.c +4 -3
  71. data/vendor/libgit2/src/libgit2/errors.c +73 -18
  72. data/vendor/libgit2/src/libgit2/fetch.c +37 -9
  73. data/vendor/libgit2/src/libgit2/fetch.h +0 -2
  74. data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
  75. data/vendor/libgit2/src/libgit2/grafts.c +272 -0
  76. data/vendor/libgit2/src/libgit2/grafts.h +36 -0
  77. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  78. data/vendor/libgit2/src/libgit2/index.c +325 -123
  79. data/vendor/libgit2/src/libgit2/index.h +14 -1
  80. data/vendor/libgit2/src/libgit2/indexer.c +10 -3
  81. data/vendor/libgit2/src/libgit2/iterator.c +20 -5
  82. data/vendor/libgit2/src/libgit2/iterator.h +3 -0
  83. data/vendor/libgit2/src/libgit2/libgit2.c +39 -0
  84. data/vendor/libgit2/src/libgit2/merge.c +14 -9
  85. data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
  86. data/vendor/libgit2/src/libgit2/midx.c +66 -37
  87. data/vendor/libgit2/src/libgit2/midx.h +13 -3
  88. data/vendor/libgit2/src/libgit2/notes.c +9 -8
  89. data/vendor/libgit2/src/libgit2/object.c +40 -15
  90. data/vendor/libgit2/src/libgit2/object.h +6 -0
  91. data/vendor/libgit2/src/libgit2/odb.c +30 -5
  92. data/vendor/libgit2/src/libgit2/odb_pack.c +16 -3
  93. data/vendor/libgit2/src/libgit2/oid.c +7 -1
  94. data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
  95. data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
  96. data/vendor/libgit2/src/libgit2/pack-objects.c +19 -12
  97. data/vendor/libgit2/src/libgit2/pack-objects.h +5 -2
  98. data/vendor/libgit2/src/libgit2/pack.c +7 -8
  99. data/vendor/libgit2/src/libgit2/parse.c +7 -4
  100. data/vendor/libgit2/src/libgit2/parse.h +1 -1
  101. data/vendor/libgit2/src/libgit2/patch.h +7 -1
  102. data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
  103. data/vendor/libgit2/src/libgit2/patch_parse.c +16 -8
  104. data/vendor/libgit2/src/libgit2/push.c +2 -2
  105. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  106. data/vendor/libgit2/src/libgit2/rebase.c +72 -84
  107. data/vendor/libgit2/src/libgit2/refdb_fs.c +22 -13
  108. data/vendor/libgit2/src/libgit2/refs.c +8 -1
  109. data/vendor/libgit2/src/libgit2/remote.c +15 -6
  110. data/vendor/libgit2/src/libgit2/remote.h +1 -0
  111. data/vendor/libgit2/src/libgit2/repository.c +580 -301
  112. data/vendor/libgit2/src/libgit2/repository.h +17 -2
  113. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  114. data/vendor/libgit2/src/libgit2/revert.c +8 -11
  115. data/vendor/libgit2/src/libgit2/revwalk.c +26 -4
  116. data/vendor/libgit2/src/libgit2/stash.c +9 -8
  117. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +0 -1
  118. data/vendor/libgit2/src/libgit2/streams/openssl.c +8 -16
  119. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  120. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  121. data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
  122. data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
  123. data/vendor/libgit2/src/libgit2/streams/stransport.c +40 -12
  124. data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
  125. data/vendor/libgit2/src/libgit2/submodule.h +3 -3
  126. data/vendor/libgit2/src/libgit2/sysdir.h +2 -0
  127. data/vendor/libgit2/src/libgit2/threadstate.c +15 -2
  128. data/vendor/libgit2/src/libgit2/threadstate.h +1 -3
  129. data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
  130. data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
  131. data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
  132. data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
  133. data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
  134. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  135. data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
  136. data/vendor/libgit2/src/libgit2/transports/http.c +7 -2
  137. data/vendor/libgit2/src/libgit2/transports/httpclient.c +5 -0
  138. data/vendor/libgit2/src/libgit2/transports/local.c +13 -4
  139. data/vendor/libgit2/src/libgit2/transports/smart.c +33 -27
  140. data/vendor/libgit2/src/libgit2/transports/smart.h +23 -8
  141. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +135 -15
  142. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +154 -47
  143. data/vendor/libgit2/src/libgit2/transports/ssh.c +3 -3
  144. data/vendor/libgit2/src/libgit2/transports/winhttp.c +14 -15
  145. data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
  146. data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
  147. data/vendor/libgit2/src/libgit2/tree.c +1 -1
  148. data/vendor/libgit2/src/libgit2/worktree.c +25 -10
  149. data/vendor/libgit2/src/util/CMakeLists.txt +0 -1
  150. data/vendor/libgit2/src/util/alloc.c +65 -6
  151. data/vendor/libgit2/src/util/alloc.h +34 -9
  152. data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
  153. data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
  154. data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -105
  155. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
  156. data/vendor/libgit2/src/util/array.h +6 -1
  157. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  158. data/vendor/libgit2/src/util/filebuf.c +6 -1
  159. data/vendor/libgit2/src/util/filebuf.h +19 -6
  160. data/vendor/libgit2/src/util/fs_path.c +1 -1
  161. data/vendor/libgit2/src/util/futils.c +8 -5
  162. data/vendor/libgit2/src/util/git2_features.h.in +9 -3
  163. data/vendor/libgit2/src/util/net.c +308 -157
  164. data/vendor/libgit2/src/util/net.h +25 -0
  165. data/vendor/libgit2/src/util/posix.c +54 -0
  166. data/vendor/libgit2/src/util/posix.h +22 -0
  167. data/vendor/libgit2/src/util/rand.c +6 -4
  168. data/vendor/libgit2/src/util/staticstr.h +66 -0
  169. data/vendor/libgit2/src/util/util.c +15 -10
  170. data/vendor/libgit2/src/util/util.h +24 -16
  171. data/vendor/libgit2/src/util/win32/error.c +1 -1
  172. data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
  173. data/vendor/libgit2/src/util/win32/posix_w32.c +1 -1
  174. data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
  175. data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
  176. data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
  177. metadata +29 -23
  178. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
  179. data/vendor/libgit2/src/libgit2/netops.c +0 -124
  180. data/vendor/libgit2/src/libgit2/netops.h +0 -68
  181. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
  182. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
  183. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
  184. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
  185. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xtypes.h +0 -0
@@ -118,8 +118,8 @@ static int parse_refspec(git_push *push, push_spec **spec, const char *str)
118
118
  s = git__calloc(1, sizeof(*s));
119
119
  GIT_ERROR_CHECK_ALLOC(s);
120
120
 
121
- git_oid_clear(&s->loid, GIT_OID_SHA1);
122
- git_oid_clear(&s->roid, GIT_OID_SHA1);
121
+ git_oid_clear(&s->loid, push->repo->oid_type);
122
+ git_oid_clear(&s->roid, push->repo->oid_type);
123
123
 
124
124
  if (git_refspec__parse(&s->refspec, str, false) < 0) {
125
125
  git_error_set(GIT_ERROR_INVALID, "invalid refspec %s", str);
@@ -125,7 +125,7 @@ static int workdir_reader_read(
125
125
  goto done;
126
126
 
127
127
  if (out_id || reader->index) {
128
- if ((error = git_odb__hash(&id, out->ptr, out->size, GIT_OBJECT_BLOB, GIT_OID_SHA1)) < 0)
128
+ if ((error = git_odb__hash(&id, out->ptr, out->size, GIT_OBJECT_BLOB, reader->repo->oid_type)) < 0)
129
129
  goto done;
130
130
  }
131
131
 
@@ -65,6 +65,9 @@ struct git_rebase {
65
65
  git_rebase_t type;
66
66
  char *state_path;
67
67
 
68
+ /* Temporary buffer for paths within the state path. */
69
+ git_str state_filename;
70
+
68
71
  unsigned int head_detached:1,
69
72
  inmemory:1,
70
73
  quiet:1,
@@ -134,33 +137,42 @@ done:
134
137
 
135
138
  GIT_INLINE(int) rebase_readfile(
136
139
  git_str *out,
137
- git_str *state_path,
140
+ git_rebase *rebase,
138
141
  const char *filename)
139
142
  {
140
- size_t state_path_len = state_path->size;
143
+ /*
144
+ * `rebase->state_filename` is a temporary buffer to avoid
145
+ * unnecessary allocations and copies of `rebase->state_path`.
146
+ * At the start and end of this function it always contains the
147
+ * contents of `rebase->state_path` itself.
148
+ */
149
+ size_t state_path_len = rebase->state_filename.size;
141
150
  int error;
142
151
 
143
152
  git_str_clear(out);
144
153
 
145
- if ((error = git_str_joinpath(state_path, state_path->ptr, filename)) < 0 ||
146
- (error = git_futils_readbuffer(out, state_path->ptr)) < 0)
154
+ if ((error = git_str_joinpath(&rebase->state_filename, rebase->state_filename.ptr, filename)) < 0 ||
155
+ (error = git_futils_readbuffer(out, rebase->state_filename.ptr)) < 0)
147
156
  goto done;
148
157
 
149
158
  git_str_rtrim(out);
150
159
 
151
160
  done:
152
- git_str_truncate(state_path, state_path_len);
161
+ git_str_truncate(&rebase->state_filename, state_path_len);
153
162
  return error;
154
163
  }
155
164
 
156
165
  GIT_INLINE(int) rebase_readint(
157
- size_t *out, git_str *asc_out, git_str *state_path, const char *filename)
166
+ size_t *out,
167
+ git_str *asc_out,
168
+ git_rebase *rebase,
169
+ const char *filename)
158
170
  {
159
171
  int32_t num;
160
172
  const char *eol;
161
173
  int error = 0;
162
174
 
163
- if ((error = rebase_readfile(asc_out, state_path, filename)) < 0)
175
+ if ((error = rebase_readfile(asc_out, rebase, filename)) < 0)
164
176
  return error;
165
177
 
166
178
  if (git__strntol32(&num, asc_out->ptr, asc_out->size, &eol, 10) < 0 || num < 0 || *eol) {
@@ -174,15 +186,18 @@ GIT_INLINE(int) rebase_readint(
174
186
  }
175
187
 
176
188
  GIT_INLINE(int) rebase_readoid(
177
- git_oid *out, git_str *str_out, git_str *state_path, const char *filename)
189
+ git_oid *out,
190
+ git_str *str_out,
191
+ git_rebase *rebase,
192
+ const char *filename)
178
193
  {
179
194
  int error;
180
195
 
181
- if ((error = rebase_readfile(str_out, state_path, filename)) < 0)
196
+ if ((error = rebase_readfile(str_out, rebase, filename)) < 0)
182
197
  return error;
183
198
 
184
- if (str_out->size != GIT_OID_SHA1_HEXSIZE ||
185
- git_oid__fromstr(out, str_out->ptr, GIT_OID_SHA1) < 0) {
199
+ if (str_out->size != git_oid_hexsize(rebase->repo->oid_type) ||
200
+ git_oid__fromstr(out, str_out->ptr, rebase->repo->oid_type) < 0) {
186
201
  git_error_set(GIT_ERROR_REBASE, "the file '%s' contains an invalid object ID", filename);
187
202
  return -1;
188
203
  }
@@ -213,17 +228,14 @@ static git_rebase_operation *rebase_operation_alloc(
213
228
 
214
229
  static int rebase_open_merge(git_rebase *rebase)
215
230
  {
216
- git_str state_path = GIT_STR_INIT, buf = GIT_STR_INIT, cmt = GIT_STR_INIT;
231
+ git_str buf = GIT_STR_INIT, cmt = GIT_STR_INIT;
217
232
  git_oid id;
218
233
  git_rebase_operation *operation;
219
234
  size_t i, msgnum = 0, end;
220
235
  int error;
221
236
 
222
- if ((error = git_str_puts(&state_path, rebase->state_path)) < 0)
223
- goto done;
224
-
225
237
  /* Read 'msgnum' if it exists (otherwise, let msgnum = 0) */
226
- if ((error = rebase_readint(&msgnum, &buf, &state_path, MSGNUM_FILE)) < 0 &&
238
+ if ((error = rebase_readint(&msgnum, &buf, rebase, MSGNUM_FILE)) < 0 &&
227
239
  error != GIT_ENOTFOUND)
228
240
  goto done;
229
241
 
@@ -233,11 +245,11 @@ static int rebase_open_merge(git_rebase *rebase)
233
245
  }
234
246
 
235
247
  /* Read 'end' */
236
- if ((error = rebase_readint(&end, &buf, &state_path, END_FILE)) < 0)
248
+ if ((error = rebase_readint(&end, &buf, rebase, END_FILE)) < 0)
237
249
  goto done;
238
250
 
239
251
  /* Read 'current' if it exists */
240
- if ((error = rebase_readoid(&id, &buf, &state_path, CURRENT_FILE)) < 0 &&
252
+ if ((error = rebase_readoid(&id, &buf, rebase, CURRENT_FILE)) < 0 &&
241
253
  error != GIT_ENOTFOUND)
242
254
  goto done;
243
255
 
@@ -249,7 +261,7 @@ static int rebase_open_merge(git_rebase *rebase)
249
261
  git_str_clear(&cmt);
250
262
 
251
263
  if ((error = git_str_printf(&cmt, "cmt.%" PRIuZ, (i+1))) < 0 ||
252
- (error = rebase_readoid(&id, &buf, &state_path, cmt.ptr)) < 0)
264
+ (error = rebase_readoid(&id, &buf, rebase, cmt.ptr)) < 0)
253
265
  goto done;
254
266
 
255
267
  operation = rebase_operation_alloc(rebase, GIT_REBASE_OPERATION_PICK, &id, NULL);
@@ -257,14 +269,13 @@ static int rebase_open_merge(git_rebase *rebase)
257
269
  }
258
270
 
259
271
  /* Read 'onto_name' */
260
- if ((error = rebase_readfile(&buf, &state_path, ONTO_NAME_FILE)) < 0)
272
+ if ((error = rebase_readfile(&buf, rebase, ONTO_NAME_FILE)) < 0)
261
273
  goto done;
262
274
 
263
275
  rebase->onto_name = git_str_detach(&buf);
264
276
 
265
277
  done:
266
278
  git_str_dispose(&cmt);
267
- git_str_dispose(&state_path);
268
279
  git_str_dispose(&buf);
269
280
 
270
281
  return error;
@@ -308,9 +319,9 @@ int git_rebase_open(
308
319
  const git_rebase_options *given_opts)
309
320
  {
310
321
  git_rebase *rebase;
311
- git_str path = GIT_STR_INIT, orig_head_name = GIT_STR_INIT,
312
- orig_head_id = GIT_STR_INIT, onto_id = GIT_STR_INIT;
313
- size_t state_path_len;
322
+ git_str orig_head_name = GIT_STR_INIT,
323
+ orig_head_id = GIT_STR_INIT,
324
+ onto_id = GIT_STR_INIT;
314
325
  int error;
315
326
 
316
327
  GIT_ASSERT_ARG(repo);
@@ -332,13 +343,10 @@ int git_rebase_open(
332
343
  goto done;
333
344
  }
334
345
 
335
- if ((error = git_str_puts(&path, rebase->state_path)) < 0)
346
+ if ((error = git_str_puts(&rebase->state_filename, rebase->state_path)) < 0)
336
347
  goto done;
337
348
 
338
- state_path_len = git_str_len(&path);
339
-
340
- if ((error = git_str_joinpath(&path, path.ptr, HEAD_NAME_FILE)) < 0 ||
341
- (error = git_futils_readbuffer(&orig_head_name, path.ptr)) < 0)
349
+ if ((error = rebase_readfile(&orig_head_name, rebase, HEAD_NAME_FILE)) < 0)
342
350
  goto done;
343
351
 
344
352
  git_str_rtrim(&orig_head_name);
@@ -346,36 +354,16 @@ int git_rebase_open(
346
354
  if (strcmp(ORIG_DETACHED_HEAD, orig_head_name.ptr) == 0)
347
355
  rebase->head_detached = 1;
348
356
 
349
- git_str_truncate(&path, state_path_len);
350
-
351
- if ((error = git_str_joinpath(&path, path.ptr, ORIG_HEAD_FILE)) < 0)
352
- goto done;
353
-
354
- if (!git_fs_path_isfile(path.ptr)) {
357
+ if ((error = rebase_readoid(&rebase->orig_head_id, &orig_head_id, rebase, ORIG_HEAD_FILE)) < 0) {
355
358
  /* Previous versions of git.git used 'head' here; support that. */
356
- git_str_truncate(&path, state_path_len);
359
+ if (error == GIT_ENOTFOUND)
360
+ error = rebase_readoid(&rebase->orig_head_id, &orig_head_id, rebase, HEAD_FILE);
357
361
 
358
- if ((error = git_str_joinpath(&path, path.ptr, HEAD_FILE)) < 0)
362
+ if (error < 0)
359
363
  goto done;
360
364
  }
361
365
 
362
- if ((error = git_futils_readbuffer(&orig_head_id, path.ptr)) < 0)
363
- goto done;
364
-
365
- git_str_rtrim(&orig_head_id);
366
-
367
- if ((error = git_oid__fromstr(&rebase->orig_head_id, orig_head_id.ptr, GIT_OID_SHA1)) < 0)
368
- goto done;
369
-
370
- git_str_truncate(&path, state_path_len);
371
-
372
- if ((error = git_str_joinpath(&path, path.ptr, ONTO_FILE)) < 0 ||
373
- (error = git_futils_readbuffer(&onto_id, path.ptr)) < 0)
374
- goto done;
375
-
376
- git_str_rtrim(&onto_id);
377
-
378
- if ((error = git_oid__fromstr(&rebase->onto_id, onto_id.ptr, GIT_OID_SHA1)) < 0)
366
+ if ((error = rebase_readoid(&rebase->onto_id, &onto_id, rebase, ONTO_FILE)) < 0)
379
367
  goto done;
380
368
 
381
369
  if (!rebase->head_detached)
@@ -403,7 +391,6 @@ done:
403
391
  else
404
392
  git_rebase_free(rebase);
405
393
 
406
- git_str_dispose(&path);
407
394
  git_str_dispose(&orig_head_name);
408
395
  git_str_dispose(&orig_head_id);
409
396
  git_str_dispose(&onto_id);
@@ -453,13 +440,13 @@ static const char *rebase_onto_name(const git_annotated_commit *onto)
453
440
  static int rebase_setupfiles_merge(git_rebase *rebase)
454
441
  {
455
442
  git_str commit_filename = GIT_STR_INIT;
456
- char id_str[GIT_OID_SHA1_HEXSIZE];
443
+ char id_str[GIT_OID_MAX_HEXSIZE + 1];
457
444
  git_rebase_operation *operation;
458
445
  size_t i;
459
446
  int error = 0;
460
447
 
461
448
  if ((error = rebase_setupfile(rebase, END_FILE, 0, "%" PRIuZ "\n", git_array_size(rebase->operations))) < 0 ||
462
- (error = rebase_setupfile(rebase, ONTO_NAME_FILE, 0, "%s\n", rebase->onto_name)) < 0)
449
+ (error = rebase_setupfile(rebase, ONTO_NAME_FILE, 0, "%s\n", rebase->onto_name)) < 0)
463
450
  goto done;
464
451
 
465
452
  for (i = 0; i < git_array_size(rebase->operations); i++) {
@@ -468,10 +455,9 @@ static int rebase_setupfiles_merge(git_rebase *rebase)
468
455
  git_str_clear(&commit_filename);
469
456
  git_str_printf(&commit_filename, CMT_FILE_FMT, i+1);
470
457
 
471
- git_oid_fmt(id_str, &operation->id);
458
+ git_oid_tostr(id_str, GIT_OID_MAX_HEXSIZE + 1, &operation->id);
472
459
 
473
- if ((error = rebase_setupfile(rebase, commit_filename.ptr, 0,
474
- "%.*s\n", GIT_OID_SHA1_HEXSIZE, id_str)) < 0)
460
+ if ((error = rebase_setupfile(rebase, commit_filename.ptr, 0, "%s\n", id_str)) < 0)
475
461
  goto done;
476
462
  }
477
463
 
@@ -482,11 +468,11 @@ done:
482
468
 
483
469
  static int rebase_setupfiles(git_rebase *rebase)
484
470
  {
485
- char onto[GIT_OID_SHA1_HEXSIZE], orig_head[GIT_OID_SHA1_HEXSIZE];
471
+ char onto[GIT_OID_MAX_HEXSIZE + 1], orig_head[GIT_OID_MAX_HEXSIZE + 1];
486
472
  const char *orig_head_name;
487
473
 
488
- git_oid_fmt(onto, &rebase->onto_id);
489
- git_oid_fmt(orig_head, &rebase->orig_head_id);
474
+ git_oid_tostr(onto, GIT_OID_MAX_HEXSIZE + 1, &rebase->onto_id);
475
+ git_oid_tostr(orig_head, GIT_OID_MAX_HEXSIZE + 1, &rebase->orig_head_id);
490
476
 
491
477
  if (p_mkdir(rebase->state_path, REBASE_DIR_MODE) < 0) {
492
478
  git_error_set(GIT_ERROR_OS, "failed to create rebase directory '%s'", rebase->state_path);
@@ -498,8 +484,8 @@ static int rebase_setupfiles(git_rebase *rebase)
498
484
 
499
485
  if (git_repository__set_orig_head(rebase->repo, &rebase->orig_head_id) < 0 ||
500
486
  rebase_setupfile(rebase, HEAD_NAME_FILE, 0, "%s\n", orig_head_name) < 0 ||
501
- rebase_setupfile(rebase, ONTO_FILE, 0, "%.*s\n", GIT_OID_SHA1_HEXSIZE, onto) < 0 ||
502
- rebase_setupfile(rebase, ORIG_HEAD_FILE, 0, "%.*s\n", GIT_OID_SHA1_HEXSIZE, orig_head) < 0 ||
487
+ rebase_setupfile(rebase, ONTO_FILE, 0, "%s\n", onto) < 0 ||
488
+ rebase_setupfile(rebase, ORIG_HEAD_FILE, 0, "%s\n", orig_head) < 0 ||
503
489
  rebase_setupfile(rebase, QUIET_FILE, 0, rebase->quiet ? "t\n" : "\n") < 0)
504
490
  return -1;
505
491
 
@@ -644,7 +630,8 @@ static int rebase_init_merge(
644
630
 
645
631
  GIT_UNUSED(upstream);
646
632
 
647
- if ((error = git_str_joinpath(&state_path, repo->gitdir, REBASE_MERGE_DIR)) < 0)
633
+ if ((error = git_str_joinpath(&state_path, repo->gitdir, REBASE_MERGE_DIR)) < 0 ||
634
+ (error = git_str_put(&rebase->state_filename, state_path.ptr, state_path.size)) < 0)
648
635
  goto done;
649
636
 
650
637
  rebase->state_path = git_str_detach(&state_path);
@@ -814,7 +801,7 @@ static int rebase_next_merge(
814
801
  git_indexwriter indexwriter = GIT_INDEXWRITER_INIT;
815
802
  git_rebase_operation *operation;
816
803
  git_checkout_options checkout_opts;
817
- char current_idstr[GIT_OID_SHA1_HEXSIZE];
804
+ char current_idstr[GIT_OID_MAX_HEXSIZE + 1];
818
805
  unsigned int parent_count;
819
806
  int error;
820
807
 
@@ -837,13 +824,13 @@ static int rebase_next_merge(
837
824
  goto done;
838
825
  }
839
826
 
840
- git_oid_fmt(current_idstr, &operation->id);
827
+ git_oid_tostr(current_idstr, GIT_OID_MAX_HEXSIZE + 1, &operation->id);
841
828
 
842
829
  normalize_checkout_options_for_apply(&checkout_opts, rebase, current_commit);
843
830
 
844
831
  if ((error = git_indexwriter_init_for_operation(&indexwriter, rebase->repo, &checkout_opts.checkout_strategy)) < 0 ||
845
832
  (error = rebase_setupfile(rebase, MSGNUM_FILE, 0, "%" PRIuZ "\n", rebase->current+1)) < 0 ||
846
- (error = rebase_setupfile(rebase, CURRENT_FILE, 0, "%.*s\n", GIT_OID_SHA1_HEXSIZE, current_idstr)) < 0 ||
833
+ (error = rebase_setupfile(rebase, CURRENT_FILE, 0, "%s\n", current_idstr)) < 0 ||
847
834
  (error = git_merge_trees(&index, rebase->repo, parent_tree, head_tree, current_tree, &rebase->options.merge_options)) < 0 ||
848
835
  (error = git_merge__check_result(rebase->repo, index)) < 0 ||
849
836
  (error = git_checkout_index(rebase->repo, index, &checkout_opts)) < 0 ||
@@ -1103,7 +1090,7 @@ static int rebase_commit_merge(
1103
1090
  git_reference *head = NULL;
1104
1091
  git_commit *head_commit = NULL, *commit = NULL;
1105
1092
  git_index *index = NULL;
1106
- char old_idstr[GIT_OID_SHA1_HEXSIZE], new_idstr[GIT_OID_SHA1_HEXSIZE];
1093
+ char old_idstr[GIT_OID_MAX_HEXSIZE + 1], new_idstr[GIT_OID_MAX_HEXSIZE + 1];
1107
1094
  int error;
1108
1095
 
1109
1096
  operation = git_array_get(rebase->operations, rebase->current);
@@ -1119,11 +1106,11 @@ static int rebase_commit_merge(
1119
1106
  rebase->repo, NULL, "HEAD", git_commit_id(commit), "rebase")) < 0)
1120
1107
  goto done;
1121
1108
 
1122
- git_oid_fmt(old_idstr, &operation->id);
1123
- git_oid_fmt(new_idstr, git_commit_id(commit));
1109
+ git_oid_tostr(old_idstr, GIT_OID_MAX_HEXSIZE + 1, &operation->id);
1110
+ git_oid_tostr(new_idstr, GIT_OID_MAX_HEXSIZE + 1, git_commit_id(commit));
1124
1111
 
1125
1112
  if ((error = rebase_setupfile(rebase, REWRITTEN_FILE, O_CREAT|O_WRONLY|O_APPEND,
1126
- "%.*s %.*s\n", GIT_OID_SHA1_HEXSIZE, old_idstr, GIT_OID_SHA1_HEXSIZE, new_idstr)) < 0)
1113
+ "%s %s\n", old_idstr, new_idstr)) < 0)
1127
1114
  goto done;
1128
1115
 
1129
1116
  git_oid_cpy(commit_id, git_commit_id(commit));
@@ -1306,7 +1293,9 @@ static int rebase_copy_notes(
1306
1293
  git_rebase *rebase,
1307
1294
  const git_signature *committer)
1308
1295
  {
1309
- git_str path = GIT_STR_INIT, rewritten = GIT_STR_INIT, notes_ref = GIT_STR_INIT;
1296
+ git_str path = GIT_STR_INIT,
1297
+ rewritten = GIT_STR_INIT,
1298
+ notes_ref = GIT_STR_INIT;
1310
1299
  char *pair_list, *fromstr, *tostr, *end;
1311
1300
  git_oid from, to;
1312
1301
  unsigned int linenum = 1;
@@ -1342,10 +1331,10 @@ static int rebase_copy_notes(
1342
1331
  tostr = end+1;
1343
1332
  *end = '\0';
1344
1333
 
1345
- if (strlen(fromstr) != GIT_OID_SHA1_HEXSIZE ||
1346
- strlen(tostr) != GIT_OID_SHA1_HEXSIZE ||
1347
- git_oid__fromstr(&from, fromstr, GIT_OID_SHA1) < 0 ||
1348
- git_oid__fromstr(&to, tostr, GIT_OID_SHA1) < 0)
1334
+ if (strlen(fromstr) != git_oid_hexsize(rebase->repo->oid_type) ||
1335
+ strlen(tostr) != git_oid_hexsize(rebase->repo->oid_type) ||
1336
+ git_oid__fromstr(&from, fromstr, rebase->repo->oid_type) < 0 ||
1337
+ git_oid__fromstr(&to, tostr, rebase->repo->oid_type) < 0)
1349
1338
  goto on_error;
1350
1339
 
1351
1340
  if ((error = rebase_copy_note(rebase, notes_ref.ptr, &from, &to, committer)) < 0)
@@ -1373,17 +1362,15 @@ static int return_to_orig_head(git_rebase *rebase)
1373
1362
  git_reference *terminal_ref = NULL, *branch_ref = NULL, *head_ref = NULL;
1374
1363
  git_commit *terminal_commit = NULL;
1375
1364
  git_str branch_msg = GIT_STR_INIT, head_msg = GIT_STR_INIT;
1376
- char onto[GIT_OID_SHA1_HEXSIZE];
1365
+ char onto[GIT_OID_MAX_HEXSIZE + 1];
1377
1366
  int error = 0;
1378
1367
 
1379
- git_oid_fmt(onto, &rebase->onto_id);
1368
+ git_oid_tostr(onto, GIT_OID_MAX_HEXSIZE + 1, &rebase->onto_id);
1380
1369
 
1381
1370
  if ((error = git_str_printf(&branch_msg,
1382
- "rebase finished: %s onto %.*s",
1383
- rebase->orig_head_name, GIT_OID_SHA1_HEXSIZE, onto)) == 0 &&
1371
+ "rebase finished: %s onto %s", rebase->orig_head_name, onto)) == 0 &&
1384
1372
  (error = git_str_printf(&head_msg,
1385
- "rebase finished: returning to %s",
1386
- rebase->orig_head_name)) == 0 &&
1373
+ "rebase finished: returning to %s", rebase->orig_head_name)) == 0 &&
1387
1374
  (error = git_repository_head(&terminal_ref, rebase->repo)) == 0 &&
1388
1375
  (error = git_reference_peel((git_object **)&terminal_commit,
1389
1376
  terminal_ref, GIT_OBJECT_COMMIT)) == 0 &&
@@ -1475,6 +1462,7 @@ void git_rebase_free(git_rebase *rebase)
1475
1462
  git__free(rebase->onto_name);
1476
1463
  git__free(rebase->orig_head_name);
1477
1464
  git__free(rebase->state_path);
1465
+ git_str_dispose(&rebase->state_filename);
1478
1466
  git_array_clear(rebase->operations);
1479
1467
  git__free((char *)rebase->options.rewrite_notes_ref);
1480
1468
  git__free(rebase);
@@ -805,7 +805,9 @@ static void refdb_fs_backend__iterator_free(git_reference_iterator *_iter)
805
805
  git__free(iter);
806
806
  }
807
807
 
808
- static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
808
+ static int iter_load_loose_paths(
809
+ refdb_fs_backend *backend,
810
+ refdb_fs_iter *iter)
809
811
  {
810
812
  int error = 0;
811
813
  git_str path = GIT_STR_INIT;
@@ -819,6 +821,7 @@ static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
819
821
  return 0;
820
822
 
821
823
  fsit_opts.flags = backend->iterator_flags;
824
+ fsit_opts.oid_type = backend->oid_type;
822
825
 
823
826
  if (iter->glob) {
824
827
  const char *last_sep = NULL;
@@ -1782,7 +1785,7 @@ static int refdb_fs_backend__rename(
1782
1785
  (error = refdb_fs_backend__lookup(&old, _backend, old_name)) < 0)
1783
1786
  return error;
1784
1787
 
1785
- if ((error = refdb_fs_backend__delete(_backend, old_name, NULL, NULL)) < 0) {
1788
+ if ((error = loose_lock(&file, backend, old->name)) < 0) {
1786
1789
  git_reference_free(old);
1787
1790
  return error;
1788
1791
  }
@@ -1790,32 +1793,33 @@ static int refdb_fs_backend__rename(
1790
1793
  new = git_reference__realloc(&old, new_name);
1791
1794
  if (!new) {
1792
1795
  git_reference_free(old);
1796
+ git_filebuf_cleanup(&file);
1793
1797
  return -1;
1794
1798
  }
1795
1799
 
1796
- if ((error = loose_lock(&file, backend, new->name)) < 0) {
1800
+ if ((error = refdb_fs_backend__delete_tail(_backend, &file, old_name, NULL, NULL)) < 0) {
1797
1801
  git_reference_free(new);
1802
+ git_filebuf_cleanup(&file);
1798
1803
  return error;
1799
1804
  }
1800
1805
 
1801
- /* Try to rename the refog; it's ok if the old doesn't exist */
1802
- error = refdb_reflog_fs__rename(_backend, old_name, new_name);
1803
- if (((error == 0) || (error == GIT_ENOTFOUND)) &&
1804
- ((error = reflog_append(backend, new, git_reference_target(new), NULL, who, message)) < 0)) {
1806
+ if ((error = loose_lock(&file, backend, new_name)) < 0) {
1805
1807
  git_reference_free(new);
1806
- git_filebuf_cleanup(&file);
1807
1808
  return error;
1808
1809
  }
1809
1810
 
1810
- if (error < 0) {
1811
+ /* Try to rename the refog; it's ok if the old doesn't exist */
1812
+ error = refdb_reflog_fs__rename(_backend, old_name, new_name);
1813
+ if (((error == 0) || (error == GIT_ENOTFOUND)) &&
1814
+ ((error = reflog_append(backend, new, git_reference_target(new), NULL, who, message)) < 0)) {
1811
1815
  git_reference_free(new);
1812
1816
  git_filebuf_cleanup(&file);
1813
1817
  return error;
1814
1818
  }
1815
1819
 
1816
-
1817
1820
  if ((error = loose_commit(&file, new)) < 0 || out == NULL) {
1818
1821
  git_reference_free(new);
1822
+ git_filebuf_cleanup(&file);
1819
1823
  return error;
1820
1824
  }
1821
1825
 
@@ -1949,9 +1953,9 @@ static int reflog_parse(git_reflog *log, const char *buf, size_t buf_size)
1949
1953
  entry->committer = git__calloc(1, sizeof(*entry->committer));
1950
1954
  GIT_ERROR_CHECK_ALLOC(entry->committer);
1951
1955
 
1952
- if (git_parse_advance_oid(&entry->oid_old, &parser) < 0 ||
1956
+ if (git_parse_advance_oid(&entry->oid_old, &parser, log->oid_type) < 0 ||
1953
1957
  git_parse_advance_expected(&parser, " ", 1) < 0 ||
1954
- git_parse_advance_oid(&entry->oid_cur, &parser) < 0)
1958
+ git_parse_advance_oid(&entry->oid_cur, &parser, log->oid_type) < 0)
1955
1959
  goto next;
1956
1960
 
1957
1961
  sig = parser.line;
@@ -2398,7 +2402,12 @@ static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name
2398
2402
  if ((error = reflog_path(&path, backend->repo, name)) < 0)
2399
2403
  goto out;
2400
2404
 
2401
- if (!git_fs_path_exists(path.ptr))
2405
+ /*
2406
+ * If a reference was moved downwards, eg refs/heads/br2 -> refs/heads/br2/new-name,
2407
+ * refs/heads/br2 does exist but it's a directory. That's a valid situation.
2408
+ * Proceed only if it's a file.
2409
+ */
2410
+ if (!git_fs_path_isfile(path.ptr))
2402
2411
  goto out;
2403
2412
 
2404
2413
  if ((error = p_unlink(path.ptr)) < 0)
@@ -72,6 +72,7 @@ git_reference *git_reference__alloc(
72
72
  const git_oid *oid,
73
73
  const git_oid *peel)
74
74
  {
75
+ git_oid_t oid_type;
75
76
  git_reference *ref;
76
77
 
77
78
  GIT_ASSERT_ARG_WITH_RETVAL(name, NULL);
@@ -84,10 +85,16 @@ git_reference *git_reference__alloc(
84
85
  ref->type = GIT_REFERENCE_DIRECT;
85
86
  git_oid_cpy(&ref->target.oid, oid);
86
87
 
88
+ #ifdef GIT_EXPERIMENTAL_SHA256
89
+ oid_type = oid->type;
90
+ #else
91
+ oid_type = GIT_OID_SHA1;
92
+ #endif
93
+
87
94
  if (peel != NULL)
88
95
  git_oid_cpy(&ref->peel, peel);
89
96
  else
90
- git_oid_clear(&ref->peel, GIT_OID_SHA1);
97
+ git_oid_clear(&ref->peel, oid_type);
91
98
 
92
99
  return ref;
93
100
  }
@@ -23,6 +23,7 @@
23
23
  #include "git2/types.h"
24
24
  #include "git2/oid.h"
25
25
  #include "git2/net.h"
26
+ #include "transports/smart.h"
26
27
 
27
28
  #define CONFIG_URL_FMT "remote.%s.url"
28
29
  #define CONFIG_PUSHURL_FMT "remote.%s.pushurl"
@@ -1631,7 +1632,10 @@ int git_remote_prune(git_remote *remote, const git_remote_callbacks *callbacks)
1631
1632
  const git_refspec *spec;
1632
1633
  const char *refname;
1633
1634
  int error;
1634
- git_oid zero_id = GIT_OID_SHA1_ZERO;
1635
+ git_oid zero_id;
1636
+
1637
+ GIT_ASSERT(remote && remote->repo);
1638
+ git_oid_clear(&zero_id, remote->repo->oid_type);
1635
1639
 
1636
1640
  if (callbacks)
1637
1641
  GIT_ERROR_CHECK_VERSION(callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
@@ -1733,9 +1737,12 @@ static int update_ref(
1733
1737
  const git_remote_callbacks *callbacks)
1734
1738
  {
1735
1739
  git_reference *ref;
1736
- git_oid old_id = GIT_OID_SHA1_ZERO;
1740
+ git_oid old_id;
1737
1741
  int error;
1738
1742
 
1743
+ GIT_ASSERT(remote && remote->repo);
1744
+ git_oid_clear(&old_id, remote->repo->oid_type);
1745
+
1739
1746
  error = git_reference_name_to_id(&old_id, remote->repo, ref_name);
1740
1747
 
1741
1748
  if (error < 0 && error != GIT_ENOTFOUND)
@@ -1779,6 +1786,8 @@ static int update_one_tip(
1779
1786
  int valid;
1780
1787
  int error;
1781
1788
 
1789
+ GIT_ASSERT(remote && remote->repo);
1790
+
1782
1791
  if ((error = git_repository_odb__weakptr(&odb, remote->repo)) < 0)
1783
1792
  goto done;
1784
1793
 
@@ -1839,7 +1848,7 @@ static int update_one_tip(
1839
1848
  }
1840
1849
 
1841
1850
  if (error == GIT_ENOTFOUND) {
1842
- git_oid_clear(&old, GIT_OID_SHA1);
1851
+ git_oid_clear(&old, remote->repo->oid_type);
1843
1852
  error = 0;
1844
1853
 
1845
1854
  if (autotag && (error = git_vector_insert(update_heads, head)) < 0)
@@ -1885,7 +1894,7 @@ static int update_tips_for_spec(
1885
1894
  int error = 0;
1886
1895
  size_t i;
1887
1896
 
1888
- GIT_ASSERT_ARG(remote);
1897
+ GIT_ASSERT_ARG(remote && remote->repo);
1889
1898
 
1890
1899
  if (git_refspec__parse(&tagspec, GIT_REFSPEC_TAGS, true) < 0)
1891
1900
  return -1;
@@ -1901,10 +1910,10 @@ static int update_tips_for_spec(
1901
1910
  }
1902
1911
 
1903
1912
  /* Handle specified oid sources */
1904
- if (git_oid__is_hexstr(spec->src, GIT_OID_SHA1)) {
1913
+ if (git_oid__is_hexstr(spec->src, remote->repo->oid_type)) {
1905
1914
  git_oid id;
1906
1915
 
1907
- if ((error = git_oid__fromstr(&id, spec->src, GIT_OID_SHA1)) < 0)
1916
+ if ((error = git_oid__fromstr(&id, spec->src, remote->repo->oid_type)) < 0)
1908
1917
  goto on_error;
1909
1918
 
1910
1919
  if (spec->dst &&
@@ -38,6 +38,7 @@ struct git_remote {
38
38
  git_remote_autotag_option_t download_tags;
39
39
  int prune_refs;
40
40
  int passed_refspecs;
41
+ git_fetch_negotiation nego;
41
42
  };
42
43
 
43
44
  int git_remote__urlfordirection(git_str *url_out, struct git_remote *remote, int direction, const git_remote_callbacks *callbacks);