rugged 1.0.1 → 1.1.0

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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_commit.c +1 -1
  3. data/lib/rugged/commit.rb +16 -2
  4. data/lib/rugged/version.rb +1 -1
  5. data/vendor/libgit2/CMakeLists.txt +31 -69
  6. data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
  7. data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
  8. data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
  9. data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
  10. data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
  11. data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
  12. data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
  13. data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
  14. data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
  15. data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
  16. data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
  17. data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
  18. data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
  19. data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
  20. data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
  21. data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
  22. data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
  23. data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +25 -32
  24. data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +20 -28
  25. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
  26. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +6 -5
  27. data/vendor/libgit2/deps/ntlmclient/compat.h +8 -1
  28. data/vendor/libgit2/deps/ntlmclient/ntlm.c +8 -11
  29. data/vendor/libgit2/deps/pcre/LICENCE +93 -0
  30. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  31. data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
  32. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
  33. data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
  34. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
  35. data/vendor/libgit2/deps/zlib/deflate.c +1 -0
  36. data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
  37. data/vendor/libgit2/include/git2/blame.h +2 -0
  38. data/vendor/libgit2/include/git2/common.h +15 -3
  39. data/vendor/libgit2/include/git2/deprecated.h +42 -2
  40. data/vendor/libgit2/include/git2/errors.h +2 -1
  41. data/vendor/libgit2/include/git2/index.h +1 -2
  42. data/vendor/libgit2/include/git2/pack.h +1 -1
  43. data/vendor/libgit2/include/git2/strarray.h +6 -10
  44. data/vendor/libgit2/include/git2/version.h +4 -4
  45. data/vendor/libgit2/src/CMakeLists.txt +53 -41
  46. data/vendor/libgit2/src/apply.c +5 -1
  47. data/vendor/libgit2/src/assert_safe.h +58 -0
  48. data/vendor/libgit2/src/attr_file.c +8 -3
  49. data/vendor/libgit2/src/attrcache.c +2 -3
  50. data/vendor/libgit2/src/blame.c +2 -0
  51. data/vendor/libgit2/src/blame_git.c +6 -3
  52. data/vendor/libgit2/src/blob.c +2 -0
  53. data/vendor/libgit2/src/branch.c +19 -21
  54. data/vendor/libgit2/src/buffer.c +6 -3
  55. data/vendor/libgit2/src/cache.c +1 -22
  56. data/vendor/libgit2/src/checkout.c +49 -72
  57. data/vendor/libgit2/src/cherrypick.c +2 -0
  58. data/vendor/libgit2/src/clone.c +78 -18
  59. data/vendor/libgit2/src/common.h +1 -0
  60. data/vendor/libgit2/src/config.c +3 -7
  61. data/vendor/libgit2/src/config_entries.c +35 -27
  62. data/vendor/libgit2/src/config_parse.c +1 -1
  63. data/vendor/libgit2/src/config_snapshot.c +2 -1
  64. data/vendor/libgit2/src/describe.c +5 -1
  65. data/vendor/libgit2/src/diff.c +12 -11
  66. data/vendor/libgit2/src/diff_file.c +3 -1
  67. data/vendor/libgit2/src/diff_generate.c +10 -11
  68. data/vendor/libgit2/src/diff_parse.c +2 -3
  69. data/vendor/libgit2/src/diff_print.c +63 -60
  70. data/vendor/libgit2/src/diff_stats.c +12 -11
  71. data/vendor/libgit2/src/diff_tform.c +2 -3
  72. data/vendor/libgit2/src/errors.c +2 -0
  73. data/vendor/libgit2/src/fetch.c +2 -0
  74. data/vendor/libgit2/src/filter.c +3 -3
  75. data/vendor/libgit2/src/futils.c +3 -3
  76. data/vendor/libgit2/src/futils.h +3 -3
  77. data/vendor/libgit2/src/global.c +3 -1
  78. data/vendor/libgit2/src/idxmap.c +0 -22
  79. data/vendor/libgit2/src/index.c +12 -7
  80. data/vendor/libgit2/src/indexer.c +10 -4
  81. data/vendor/libgit2/src/iterator.c +4 -4
  82. data/vendor/libgit2/src/merge.c +13 -7
  83. data/vendor/libgit2/src/merge_file.c +4 -6
  84. data/vendor/libgit2/src/midx.c +418 -0
  85. data/vendor/libgit2/src/midx.h +83 -0
  86. data/vendor/libgit2/src/mwindow.c +124 -51
  87. data/vendor/libgit2/src/net.c +6 -1
  88. data/vendor/libgit2/src/object.c +2 -1
  89. data/vendor/libgit2/src/odb.c +9 -6
  90. data/vendor/libgit2/src/odb_loose.c +3 -3
  91. data/vendor/libgit2/src/odb_mempack.c +2 -0
  92. data/vendor/libgit2/src/oid.c +2 -0
  93. data/vendor/libgit2/src/pack-objects.c +29 -21
  94. data/vendor/libgit2/src/pack.c +47 -28
  95. data/vendor/libgit2/src/pack.h +19 -2
  96. data/vendor/libgit2/src/patch_generate.c +1 -3
  97. data/vendor/libgit2/src/patch_parse.c +4 -2
  98. data/vendor/libgit2/src/path.c +4 -4
  99. data/vendor/libgit2/src/pathspec.c +4 -3
  100. data/vendor/libgit2/src/pool.c +21 -15
  101. data/vendor/libgit2/src/pool.h +9 -1
  102. data/vendor/libgit2/src/proxy.c +2 -0
  103. data/vendor/libgit2/src/push.c +2 -0
  104. data/vendor/libgit2/src/rebase.c +2 -0
  105. data/vendor/libgit2/src/refdb.c +135 -0
  106. data/vendor/libgit2/src/refdb.h +69 -0
  107. data/vendor/libgit2/src/refdb_fs.c +19 -81
  108. data/vendor/libgit2/src/reflog.c +2 -6
  109. data/vendor/libgit2/src/refs.c +60 -188
  110. data/vendor/libgit2/src/refs.h +1 -19
  111. data/vendor/libgit2/src/regexp.c +2 -2
  112. data/vendor/libgit2/src/remote.c +32 -17
  113. data/vendor/libgit2/src/repository.c +168 -79
  114. data/vendor/libgit2/src/repository.h +10 -27
  115. data/vendor/libgit2/src/revert.c +2 -0
  116. data/vendor/libgit2/src/revparse.c +5 -4
  117. data/vendor/libgit2/src/revwalk.c +3 -5
  118. data/vendor/libgit2/src/settings.c +9 -0
  119. data/vendor/libgit2/src/sortedcache.c +2 -3
  120. data/vendor/libgit2/src/stash.c +2 -0
  121. data/vendor/libgit2/src/status.c +2 -0
  122. data/vendor/libgit2/src/strarray.c +63 -0
  123. data/vendor/libgit2/src/streams/openssl.c +12 -6
  124. data/vendor/libgit2/src/streams/registry.c +5 -3
  125. data/vendor/libgit2/src/submodule.c +6 -4
  126. data/vendor/libgit2/src/sysdir.c +4 -20
  127. data/vendor/libgit2/src/sysdir.h +0 -11
  128. data/vendor/libgit2/src/tag.c +2 -0
  129. data/vendor/libgit2/src/thread-utils.h +139 -21
  130. data/vendor/libgit2/src/transaction.c +2 -1
  131. data/vendor/libgit2/src/transports/credential.c +2 -0
  132. data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
  133. data/vendor/libgit2/src/transports/httpclient.c +6 -8
  134. data/vendor/libgit2/src/transports/local.c +2 -2
  135. data/vendor/libgit2/src/transports/smart.c +2 -2
  136. data/vendor/libgit2/src/transports/winhttp.c +18 -7
  137. data/vendor/libgit2/src/unix/posix.h +13 -1
  138. data/vendor/libgit2/src/util.c +25 -58
  139. data/vendor/libgit2/src/util.h +2 -2
  140. data/vendor/libgit2/src/win32/git2.rc +18 -3
  141. data/vendor/libgit2/src/win32/path_w32.c +2 -2
  142. data/vendor/libgit2/src/worktree.c +4 -0
  143. metadata +27 -25
  144. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
  145. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
  146. data/vendor/libgit2/src/refdb_fs.h +0 -19
@@ -0,0 +1,83 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #ifndef INCLUDE_midx_h__
9
+ #define INCLUDE_midx_h__
10
+
11
+ #include "common.h"
12
+
13
+ #include <ctype.h>
14
+
15
+ #include "map.h"
16
+ #include "mwindow.h"
17
+
18
+ /*
19
+ * A multi-pack-index file.
20
+ *
21
+ * This file contains a merged index for multiple independent .pack files. This
22
+ * can help speed up locating objects without requiring a garbage collection
23
+ * cycle to create a single .pack file.
24
+ *
25
+ * Support for this feature was added in git 2.21, and requires the
26
+ * `core.multiPackIndex` config option to be set.
27
+ */
28
+ typedef struct git_midx_file {
29
+ git_map index_map;
30
+
31
+ /* The table of Packfile Names. */
32
+ git_vector packfile_names;
33
+
34
+ /* The OID Fanout table. */
35
+ const uint32_t *oid_fanout;
36
+ /* The total number of objects in the index. */
37
+ uint32_t num_objects;
38
+
39
+ /* The OID Lookup table. */
40
+ git_oid *oid_lookup;
41
+
42
+ /* The Object Offsets table. Each entry has two 4-byte fields with the pack index and the offset. */
43
+ const unsigned char *object_offsets;
44
+
45
+ /* The Object Large Offsets table. */
46
+ const unsigned char *object_large_offsets;
47
+ /* The number of entries in the Object Large Offsets table. Each entry has an 8-byte with an offset */
48
+ size_t num_object_large_offsets;
49
+
50
+ /* The trailer of the file. Contains the SHA1-checksum of the whole file. */
51
+ git_oid checksum;
52
+ } git_midx_file;
53
+
54
+ /*
55
+ * An entry in the multi-pack-index file. Similar in purpose to git_pack_entry.
56
+ */
57
+ typedef struct git_midx_entry {
58
+ /* The index within idx->packfile_names where the packfile name can be found. */
59
+ size_t pack_index;
60
+ /* The offset within the .pack file where the requested object is found. */
61
+ off64_t offset;
62
+ /* The SHA-1 hash of the requested object. */
63
+ git_oid sha1;
64
+ } git_midx_entry;
65
+
66
+ int git_midx_open(
67
+ git_midx_file **idx_out,
68
+ const char *path);
69
+ int git_midx_entry_find(
70
+ git_midx_entry *e,
71
+ git_midx_file *idx,
72
+ const git_oid *short_oid,
73
+ size_t len);
74
+ void git_midx_close(git_midx_file *idx);
75
+ void git_midx_free(git_midx_file *idx);
76
+
77
+ /* This is exposed for use in the fuzzers. */
78
+ int git_midx_parse(
79
+ git_midx_file *idx,
80
+ const unsigned char *data,
81
+ size_t size);
82
+
83
+ #endif
@@ -22,11 +22,15 @@
22
22
  #define DEFAULT_MAPPED_LIMIT \
23
23
  ((1024 * 1024) * (sizeof(void*) >= 8 ? 8192ULL : 256UL))
24
24
 
25
+ /* default is unlimited */
26
+ #define DEFAULT_FILE_LIMIT 0
27
+
25
28
  size_t git_mwindow__window_size = DEFAULT_WINDOW_SIZE;
26
29
  size_t git_mwindow__mapped_limit = DEFAULT_MAPPED_LIMIT;
30
+ size_t git_mwindow__file_limit = DEFAULT_FILE_LIMIT;
27
31
 
28
32
  /* Whenever you want to read or modify this, grab git__mwindow_mutex */
29
- static git_mwindow_ctl mem_ctl;
33
+ git_mwindow_ctl git_mwindow__mem_ctl;
30
34
 
31
35
  /* Global list of mwindow files, to open packs once across repos */
32
36
  git_strmap *git__pack_cache = NULL;
@@ -132,7 +136,7 @@ void git_mwindow_free_all(git_mwindow_file *mwf)
132
136
  */
133
137
  void git_mwindow_free_all_locked(git_mwindow_file *mwf)
134
138
  {
135
- git_mwindow_ctl *ctl = &mem_ctl;
139
+ git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
136
140
  size_t i;
137
141
 
138
142
  /*
@@ -174,82 +178,146 @@ int git_mwindow_contains(git_mwindow *win, off64_t offset)
174
178
  && offset <= (off64_t)(win_off + win->window_map.len);
175
179
  }
176
180
 
181
+ #define GIT_MWINDOW__LRU -1
182
+ #define GIT_MWINDOW__MRU 1
183
+
177
184
  /*
178
- * Find the least-recently-used window in a file
185
+ * Find the least- or most-recently-used window in a file that is not currently
186
+ * being used. The 'only_unused' flag controls whether the caller requires the
187
+ * file to only have unused windows. If '*out_window' is non-null, it is used as
188
+ * a starting point for the comparison.
189
+ *
190
+ * Returns whether such a window was found in the file.
179
191
  */
180
- static void git_mwindow_scan_lru(
181
- git_mwindow_file *mwf,
182
- git_mwindow **lru_w,
183
- git_mwindow **lru_l)
192
+ static bool git_mwindow_scan_recently_used(
193
+ git_mwindow_file *mwf,
194
+ git_mwindow **out_window,
195
+ git_mwindow **out_last,
196
+ bool only_unused,
197
+ int comparison_sign)
184
198
  {
185
- git_mwindow *w, *w_l;
186
-
187
- for (w_l = NULL, w = mwf->windows; w; w = w->next) {
188
- if (!w->inuse_cnt) {
189
- /*
190
- * If the current one is more recent than the last one,
191
- * store it in the output parameter. If lru_w is NULL,
192
- * it's the first loop, so store it as well.
193
- */
194
- if (!*lru_w || w->last_used < (*lru_w)->last_used) {
195
- *lru_w = w;
196
- *lru_l = w_l;
197
- }
199
+ git_mwindow *w, *w_last;
200
+ git_mwindow *lru_window = NULL, *lru_last = NULL;
201
+ bool found = false;
202
+
203
+ assert(mwf);
204
+ assert(out_window);
205
+
206
+ lru_window = *out_window;
207
+ if (out_last)
208
+ lru_last = *out_last;
209
+
210
+ for (w_last = NULL, w = mwf->windows; w; w_last = w, w = w->next) {
211
+ if (w->inuse_cnt) {
212
+ if (only_unused)
213
+ return false;
214
+ /* This window is currently being used. Skip it. */
215
+ continue;
216
+ }
217
+
218
+ /*
219
+ * If the current one is more (or less) recent than the last one,
220
+ * store it in the output parameter. If lru_window is NULL,
221
+ * it's the first loop, so store it as well.
222
+ */
223
+ if (!lru_window ||
224
+ (comparison_sign == GIT_MWINDOW__LRU && lru_window->last_used > w->last_used) ||
225
+ (comparison_sign == GIT_MWINDOW__MRU && lru_window->last_used < w->last_used)) {
226
+ lru_window = w;
227
+ lru_last = w_last;
228
+ found = true;
198
229
  }
199
- w_l = w;
200
230
  }
231
+
232
+ if (!found)
233
+ return false;
234
+
235
+ *out_window = lru_window;
236
+ if (out_last)
237
+ *out_last = lru_last;
238
+ return true;
201
239
  }
202
240
 
203
241
  /*
204
- * Close the least recently used window. You should check to see if
205
- * the file descriptors need closing from time to time. Called under
206
- * lock from new_window.
242
+ * Close the least recently used window (that is currently not being used) out
243
+ * of all the files. Called under lock from new_window.
207
244
  */
208
- static int git_mwindow_close_lru(git_mwindow_file *mwf)
245
+ static int git_mwindow_close_lru_window(void)
209
246
  {
210
- git_mwindow_ctl *ctl = &mem_ctl;
247
+ git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
248
+ git_mwindow_file *cur;
211
249
  size_t i;
212
- git_mwindow *lru_w = NULL, *lru_l = NULL, **list = &mwf->windows;
213
-
214
- /* FIXME: Does this give us any advantage? */
215
- if(mwf->windows)
216
- git_mwindow_scan_lru(mwf, &lru_w, &lru_l);
250
+ git_mwindow *lru_window = NULL, *lru_last = NULL, **list = NULL;
217
251
 
218
- for (i = 0; i < ctl->windowfiles.length; ++i) {
219
- git_mwindow *last = lru_w;
220
- git_mwindow_file *cur = git_vector_get(&ctl->windowfiles, i);
221
- git_mwindow_scan_lru(cur, &lru_w, &lru_l);
222
- if (lru_w != last)
252
+ git_vector_foreach(&ctl->windowfiles, i, cur) {
253
+ if (git_mwindow_scan_recently_used(
254
+ cur, &lru_window, &lru_last, false, GIT_MWINDOW__LRU)) {
223
255
  list = &cur->windows;
256
+ }
224
257
  }
225
258
 
226
- if (!lru_w) {
259
+ if (!lru_window) {
227
260
  git_error_set(GIT_ERROR_OS, "failed to close memory window; couldn't find LRU");
228
261
  return -1;
229
262
  }
230
263
 
231
- ctl->mapped -= lru_w->window_map.len;
232
- git_futils_mmap_free(&lru_w->window_map);
264
+ ctl->mapped -= lru_window->window_map.len;
265
+ git_futils_mmap_free(&lru_window->window_map);
233
266
 
234
- if (lru_l)
235
- lru_l->next = lru_w->next;
267
+ if (lru_last)
268
+ lru_last->next = lru_window->next;
236
269
  else
237
- *list = lru_w->next;
270
+ *list = lru_window->next;
238
271
 
239
- git__free(lru_w);
272
+ git__free(lru_window);
240
273
  ctl->open_windows--;
241
274
 
242
275
  return 0;
243
276
  }
244
277
 
278
+ /*
279
+ * Close the file that does not have any open windows AND whose
280
+ * most-recently-used window is the least-recently used one across all
281
+ * currently open files.
282
+ *
283
+ * Called under lock from new_window.
284
+ */
285
+ static int git_mwindow_close_lru_file(void)
286
+ {
287
+ git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
288
+ git_mwindow_file *lru_file = NULL, *current_file = NULL;
289
+ git_mwindow *lru_window = NULL;
290
+ size_t i;
291
+
292
+ git_vector_foreach(&ctl->windowfiles, i, current_file) {
293
+ git_mwindow *mru_window = NULL;
294
+ if (!git_mwindow_scan_recently_used(
295
+ current_file, &mru_window, NULL, true, GIT_MWINDOW__MRU)) {
296
+ continue;
297
+ }
298
+ if (!lru_window || lru_window->last_used > mru_window->last_used)
299
+ lru_file = current_file;
300
+ }
301
+
302
+ if (!lru_file) {
303
+ git_error_set(GIT_ERROR_OS, "failed to close memory window file; couldn't find LRU");
304
+ return -1;
305
+ }
306
+
307
+ git_mwindow_free_all_locked(lru_file);
308
+ p_close(lru_file->fd);
309
+ lru_file->fd = -1;
310
+
311
+ return 0;
312
+ }
313
+
245
314
  /* This gets called under lock from git_mwindow_open */
246
315
  static git_mwindow *new_window(
247
- git_mwindow_file *mwf,
248
316
  git_file fd,
249
317
  off64_t size,
250
318
  off64_t offset)
251
319
  {
252
- git_mwindow_ctl *ctl = &mem_ctl;
320
+ git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
253
321
  size_t walign = git_mwindow__window_size / 2;
254
322
  off64_t len;
255
323
  git_mwindow *w;
@@ -269,7 +337,7 @@ static git_mwindow *new_window(
269
337
  ctl->mapped += (size_t)len;
270
338
 
271
339
  while (git_mwindow__mapped_limit < ctl->mapped &&
272
- git_mwindow_close_lru(mwf) == 0) /* nop */;
340
+ git_mwindow_close_lru_window() == 0) /* nop */;
273
341
 
274
342
  /*
275
343
  * We treat `mapped_limit` as a soft limit. If we can't find a
@@ -283,7 +351,7 @@ static git_mwindow *new_window(
283
351
  * we're below our soft limits, so free up what we can and try again.
284
352
  */
285
353
 
286
- while (git_mwindow_close_lru(mwf) == 0)
354
+ while (git_mwindow_close_lru_window() == 0)
287
355
  /* nop */;
288
356
 
289
357
  if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) {
@@ -315,7 +383,7 @@ unsigned char *git_mwindow_open(
315
383
  size_t extra,
316
384
  unsigned int *left)
317
385
  {
318
- git_mwindow_ctl *ctl = &mem_ctl;
386
+ git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
319
387
  git_mwindow *w = *cursor;
320
388
 
321
389
  if (git_mutex_lock(&git__mwindow_mutex)) {
@@ -339,7 +407,7 @@ unsigned char *git_mwindow_open(
339
407
  * one.
340
408
  */
341
409
  if (!w) {
342
- w = new_window(mwf, mwf->fd, mwf->size, offset);
410
+ w = new_window(mwf->fd, mwf->size, offset);
343
411
  if (w == NULL) {
344
412
  git_mutex_unlock(&git__mwindow_mutex);
345
413
  return NULL;
@@ -367,7 +435,7 @@ unsigned char *git_mwindow_open(
367
435
 
368
436
  int git_mwindow_file_register(git_mwindow_file *mwf)
369
437
  {
370
- git_mwindow_ctl *ctl = &mem_ctl;
438
+ git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
371
439
  int ret;
372
440
 
373
441
  if (git_mutex_lock(&git__mwindow_mutex)) {
@@ -381,6 +449,11 @@ int git_mwindow_file_register(git_mwindow_file *mwf)
381
449
  return -1;
382
450
  }
383
451
 
452
+ if (git_mwindow__file_limit) {
453
+ while (git_mwindow__file_limit <= ctl->windowfiles.length &&
454
+ git_mwindow_close_lru_file() == 0) /* nop */;
455
+ }
456
+
384
457
  ret = git_vector_insert(&ctl->windowfiles, mwf);
385
458
  git_mutex_unlock(&git__mwindow_mutex);
386
459
 
@@ -389,7 +462,7 @@ int git_mwindow_file_register(git_mwindow_file *mwf)
389
462
 
390
463
  void git_mwindow_file_deregister(git_mwindow_file *mwf)
391
464
  {
392
- git_mwindow_ctl *ctl = &mem_ctl;
465
+ git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
393
466
  git_mwindow_file *cur;
394
467
  size_t i;
395
468
 
@@ -336,7 +336,12 @@ bool git_net_url_valid(git_net_url *url)
336
336
 
337
337
  int git_net_url_is_default_port(git_net_url *url)
338
338
  {
339
- return (strcmp(url->port, default_port_for_scheme(url->scheme)) == 0);
339
+ const char *default_port;
340
+
341
+ if ((default_port = default_port_for_scheme(url->scheme)) != NULL)
342
+ return (strcmp(url->port, default_port) == 0);
343
+ else
344
+ return false;
340
345
  }
341
346
 
342
347
  void git_net_url_swap(git_net_url *a, git_net_url *b)
@@ -86,7 +86,8 @@ int git_object__from_raw(
86
86
  GIT_ERROR_CHECK_ALLOC(object);
87
87
  object->cached.flags = GIT_CACHE_STORE_PARSED;
88
88
  object->cached.type = type;
89
- git_odb_hash(&object->cached.oid, data, size, type);
89
+ if ((error = git_odb_hash(&object->cached.oid, data, size, type)) < 0)
90
+ return error;
90
91
 
91
92
  /* Parse raw object data */
92
93
  def = &git_objects_table[type];
@@ -44,8 +44,8 @@ typedef struct
44
44
 
45
45
  static git_cache *odb_cache(git_odb *odb)
46
46
  {
47
- if (odb->rc.owner != NULL) {
48
- git_repository *owner = odb->rc.owner;
47
+ git_repository *owner = GIT_REFCOUNT_OWNER(odb);
48
+ if (owner != NULL) {
49
49
  return &owner->objects;
50
50
  }
51
51
 
@@ -664,7 +664,7 @@ int git_odb_open(git_odb **out, const char *objects_dir)
664
664
  int git_odb__set_caps(git_odb *odb, int caps)
665
665
  {
666
666
  if (caps == GIT_ODB_CAP_FROM_OWNER) {
667
- git_repository *repo = odb->rc.owner;
667
+ git_repository *repo = GIT_REFCOUNT_OWNER(odb);
668
668
  int val;
669
669
 
670
670
  if (!repo) {
@@ -1283,12 +1283,13 @@ int git_odb_write(
1283
1283
  git_oid *oid, git_odb *db, const void *data, size_t len, git_object_t type)
1284
1284
  {
1285
1285
  size_t i;
1286
- int error = GIT_ERROR;
1286
+ int error;
1287
1287
  git_odb_stream *stream;
1288
1288
 
1289
1289
  assert(oid && db);
1290
1290
 
1291
- git_odb_hash(oid, data, len, type);
1291
+ if ((error = git_odb_hash(oid, data, len, type)) < 0)
1292
+ return error;
1292
1293
 
1293
1294
  if (git_oid_is_zero(oid))
1294
1295
  return error_null_oid(GIT_EINVALID, "cannot write object");
@@ -1296,7 +1297,7 @@ int git_odb_write(
1296
1297
  if (git_odb__freshen(db, oid))
1297
1298
  return 0;
1298
1299
 
1299
- for (i = 0; i < db->backends.length && error < 0; ++i) {
1300
+ for (i = 0, error = GIT_ERROR; i < db->backends.length && error < 0; ++i) {
1300
1301
  backend_internal *internal = git_vector_get(&db->backends, i);
1301
1302
  git_odb_backend *b = internal->backend;
1302
1303
 
@@ -1510,10 +1511,12 @@ void *git_odb_backend_data_alloc(git_odb_backend *backend, size_t len)
1510
1511
  return git__malloc(len);
1511
1512
  }
1512
1513
 
1514
+ #ifndef GIT_DEPRECATE_HARD
1513
1515
  void *git_odb_backend_malloc(git_odb_backend *backend, size_t len)
1514
1516
  {
1515
1517
  return git_odb_backend_data_alloc(backend, len);
1516
1518
  }
1519
+ #endif
1517
1520
 
1518
1521
  void git_odb_backend_data_free(git_odb_backend *backend, void *data)
1519
1522
  {
@@ -304,7 +304,7 @@ static int read_loose_standard(git_rawobj *out, git_buf *obj)
304
304
  * (including the initial sequence in the head buffer).
305
305
  */
306
306
  if (GIT_ADD_SIZET_OVERFLOW(&alloc_size, hdr.size, 1) ||
307
- (body = git__malloc(alloc_size)) == NULL) {
307
+ (body = git__calloc(1, alloc_size)) == NULL) {
308
308
  error = -1;
309
309
  goto done;
310
310
  }
@@ -386,8 +386,8 @@ static int read_header_loose_standard(
386
386
  git_rawobj *out, const unsigned char *data, size_t len)
387
387
  {
388
388
  git_zstream zs = GIT_ZSTREAM_INIT;
389
- obj_hdr hdr;
390
- unsigned char inflated[MAX_HEADER_LEN];
389
+ obj_hdr hdr = {0};
390
+ unsigned char inflated[MAX_HEADER_LEN] = {0};
391
391
  size_t header_len, inflated_len = sizeof(inflated);
392
392
  int error;
393
393