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
@@ -13,6 +13,7 @@
13
13
  #include "git2/transport.h"
14
14
  #include "git2/sys/remote.h"
15
15
 
16
+ #include "oid.h"
16
17
  #include "remote.h"
17
18
  #include "refspec.h"
18
19
  #include "pack.h"
@@ -75,7 +76,7 @@ static int maybe_want_oid(git_remote *remote, git_refspec *spec)
75
76
  oid_head = git__calloc(1, sizeof(git_remote_head));
76
77
  GIT_ERROR_CHECK_ALLOC(oid_head);
77
78
 
78
- git_oid_fromstr(&oid_head->oid, spec->src);
79
+ git_oid__fromstr(&oid_head->oid, spec->src, GIT_OID_SHA1);
79
80
 
80
81
  if (spec->dst) {
81
82
  oid_head->name = git__strdup(spec->dst);
@@ -94,7 +95,6 @@ static int filter_wants(git_remote *remote, const git_fetch_options *opts)
94
95
  git_remote_head **heads;
95
96
  git_refspec tagspec, head, *spec;
96
97
  int error = 0;
97
- git_odb *odb;
98
98
  size_t i, heads_len;
99
99
  unsigned int remote_caps;
100
100
  unsigned int oid_mask = GIT_REMOTE_CAPABILITY_TIP_OID |
@@ -125,9 +125,6 @@ static int filter_wants(git_remote *remote, const git_fetch_options *opts)
125
125
  goto cleanup;
126
126
  }
127
127
 
128
- if ((error = git_repository_odb__weakptr(&odb, remote->repo)) < 0)
129
- goto cleanup;
130
-
131
128
  if ((error = git_remote_ls((const git_remote_head ***)&heads, &heads_len, remote)) < 0 ||
132
129
  (error = git_remote_capabilities(&remote_caps, remote)) < 0)
133
130
  goto cleanup;
@@ -140,7 +137,7 @@ static int filter_wants(git_remote *remote, const git_fetch_options *opts)
140
137
 
141
138
  /* Handle explicitly specified OID specs */
142
139
  git_vector_foreach(&remote->active_refspecs, i, spec) {
143
- if (!git_oid__is_hexstr(spec->src))
140
+ if (!git_oid__is_hexstr(spec->src, GIT_OID_SHA1))
144
141
  continue;
145
142
 
146
143
  if (!(remote_caps & oid_mask)) {
@@ -105,7 +105,7 @@ static int fetchhead_ref_write(
105
105
  git_filebuf *file,
106
106
  git_fetchhead_ref *fetchhead_ref)
107
107
  {
108
- char oid[GIT_OID_HEXSZ + 1];
108
+ char oid[GIT_OID_SHA1_HEXSIZE + 1];
109
109
  const char *type, *name;
110
110
  int head = 0;
111
111
 
@@ -113,7 +113,7 @@ static int fetchhead_ref_write(
113
113
  GIT_ASSERT_ARG(fetchhead_ref);
114
114
 
115
115
  git_oid_fmt(oid, &fetchhead_ref->oid);
116
- oid[GIT_OID_HEXSZ] = '\0';
116
+ oid[GIT_OID_SHA1_HEXSIZE] = '\0';
117
117
 
118
118
  if (git__prefixcmp(fetchhead_ref->ref_name, GIT_REFS_HEADS_DIR) == 0) {
119
119
  type = "branch ";
@@ -196,13 +196,13 @@ static int fetchhead_ref_parse(
196
196
  *is_merge = 1;
197
197
  }
198
198
 
199
- if (strlen(oid_str) != GIT_OID_HEXSZ) {
199
+ if (strlen(oid_str) != GIT_OID_SHA1_HEXSIZE) {
200
200
  git_error_set(GIT_ERROR_FETCHHEAD,
201
201
  "invalid object ID in FETCH_HEAD line %"PRIuZ, line_num);
202
202
  return -1;
203
203
  }
204
204
 
205
- if (git_oid_fromstr(oid, oid_str) < 0) {
205
+ if (git_oid__fromstr(oid, oid_str, GIT_OID_SHA1) < 0) {
206
206
  const git_error *oid_err = git_error_last();
207
207
  const char *err_msg = oid_err ? oid_err->message : "invalid object ID";
208
208
 
@@ -42,7 +42,7 @@ static int ident_find_id(
42
42
  static int ident_insert_id(
43
43
  git_str *to, const git_str *from, const git_filter_source *src)
44
44
  {
45
- char oid[GIT_OID_HEXSZ+1];
45
+ char oid[GIT_OID_SHA1_HEXSIZE+1];
46
46
  const char *id_start, *id_end, *from_end = from->ptr + from->size;
47
47
  size_t need_size;
48
48
 
@@ -57,7 +57,7 @@ static int ident_insert_id(
57
57
  return GIT_PASSTHROUGH;
58
58
 
59
59
  need_size = (size_t)(id_start - from->ptr) +
60
- 5 /* "$Id: " */ + GIT_OID_HEXSZ + 2 /* " $" */ +
60
+ 5 /* "$Id: " */ + GIT_OID_SHA1_HEXSIZE + 2 /* " $" */ +
61
61
  (size_t)(from_end - id_end);
62
62
 
63
63
  if (git_str_grow(to, need_size) < 0)
@@ -65,7 +65,7 @@ static int ident_insert_id(
65
65
 
66
66
  git_str_set(to, from->ptr, (size_t)(id_start - from->ptr));
67
67
  git_str_put(to, "$Id: ", 5);
68
- git_str_put(to, oid, GIT_OID_HEXSZ);
68
+ git_str_put(to, oid, GIT_OID_SHA1_HEXSIZE);
69
69
  git_str_put(to, " $", 2);
70
70
  git_str_put(to, id_end, (size_t)(from_end - id_end));
71
71
 
@@ -74,7 +74,7 @@ struct entry_short {
74
74
  uint32_t uid;
75
75
  uint32_t gid;
76
76
  uint32_t file_size;
77
- unsigned char oid[GIT_OID_RAWSZ];
77
+ unsigned char oid[GIT_OID_SHA1_SIZE];
78
78
  uint16_t flags;
79
79
  char path[1]; /* arbitrary length */
80
80
  };
@@ -88,7 +88,7 @@ struct entry_long {
88
88
  uint32_t uid;
89
89
  uint32_t gid;
90
90
  uint32_t file_size;
91
- unsigned char oid[GIT_OID_RAWSZ];
91
+ unsigned char oid[GIT_OID_SHA1_SIZE];
92
92
  uint16_t flags;
93
93
  uint16_t flags_extended;
94
94
  char path[1]; /* arbitrary length */
@@ -2354,14 +2354,16 @@ static int read_reuc(git_index *index, const char *buffer, size_t size)
2354
2354
  for (i = 0; i < 3; i++) {
2355
2355
  if (!lost->mode[i])
2356
2356
  continue;
2357
- if (size < 20) {
2357
+ if (size < GIT_OID_SHA1_SIZE) {
2358
2358
  index_entry_reuc_free(lost);
2359
2359
  return index_error_invalid("reading reuc entry oid");
2360
2360
  }
2361
2361
 
2362
- git_oid_fromraw(&lost->oid[i], (const unsigned char *) buffer);
2363
- size -= 20;
2364
- buffer += 20;
2362
+ if (git_oid__fromraw(&lost->oid[i], (const unsigned char *) buffer, GIT_OID_SHA1) < 0)
2363
+ return -1;
2364
+
2365
+ size -= GIT_OID_SHA1_SIZE;
2366
+ buffer += GIT_OID_SHA1_SIZE;
2365
2367
  }
2366
2368
 
2367
2369
  /* entry was read successfully - insert into reuc vector */
@@ -2482,7 +2484,7 @@ static int read_entry(
2482
2484
  entry.file_size = ntohl(source.file_size);
2483
2485
  entry.flags = ntohs(source.flags);
2484
2486
 
2485
- if (git_oid_fromraw(&entry.id, source.oid) < 0)
2487
+ if (git_oid__fromraw(&entry.id, source.oid, GIT_OID_SHA1) < 0)
2486
2488
  return -1;
2487
2489
 
2488
2490
  if (entry.flags & GIT_INDEX_ENTRY_EXTENDED) {
@@ -2805,7 +2807,7 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const cha
2805
2807
  ondisk.uid = htonl(entry->uid);
2806
2808
  ondisk.gid = htonl(entry->gid);
2807
2809
  ondisk.file_size = htonl((uint32_t)entry->file_size);
2808
- git_oid_raw_cpy(ondisk.oid, entry->id.id);
2810
+ git_oid_raw_cpy(ondisk.oid, entry->id.id, GIT_OID_SHA1_SIZE);
2809
2811
  ondisk.flags = htons(entry->flags);
2810
2812
 
2811
2813
  if (entry->flags & GIT_INDEX_ENTRY_EXTENDED) {
@@ -2968,7 +2970,7 @@ static int create_reuc_extension_data(git_str *reuc_buf, git_index_reuc_entry *r
2968
2970
  }
2969
2971
 
2970
2972
  for (i = 0; i < 3; i++) {
2971
- if (reuc->mode[i] && (error = git_str_put(reuc_buf, (char *)&reuc->oid[i].id, GIT_OID_RAWSZ)) < 0)
2973
+ if (reuc->mode[i] && (error = git_str_put(reuc_buf, (char *)&reuc->oid[i].id, GIT_OID_SHA1_SIZE)) < 0)
2972
2974
  return error;
2973
2975
  }
2974
2976
 
@@ -42,6 +42,7 @@ struct git_indexer {
42
42
  have_delta :1,
43
43
  do_fsync :1,
44
44
  do_verify :1;
45
+ git_oid_t oid_type;
45
46
  struct git_pack_header hdr;
46
47
  struct git_pack_file *pack;
47
48
  unsigned int mode;
@@ -55,8 +56,8 @@ struct git_indexer {
55
56
  git_vector deltas;
56
57
  unsigned int fanout[256];
57
58
  git_hash_ctx hash_ctx;
58
- unsigned char checksum[GIT_HASH_SHA1_SIZE];
59
- char name[(GIT_HASH_SHA1_SIZE * 2) + 1];
59
+ unsigned char checksum[GIT_HASH_MAX_SIZE];
60
+ char name[(GIT_HASH_MAX_SIZE * 2) + 1];
60
61
  git_indexer_progress_cb progress_cb;
61
62
  void *progress_payload;
62
63
  char objbuf[8*1024];
@@ -68,7 +69,7 @@ struct git_indexer {
68
69
  git_odb *odb;
69
70
 
70
71
  /* Fields for calculating the packfile trailer (hash of everything before it) */
71
- char inbuf[GIT_OID_RAWSZ];
72
+ char inbuf[GIT_HASH_MAX_SIZE];
72
73
  size_t inbuf_len;
73
74
  git_hash_ctx trailer;
74
75
  };
@@ -136,17 +137,33 @@ int git_indexer_init_options(git_indexer_options *opts, unsigned int version)
136
137
  }
137
138
  #endif
138
139
 
139
- int git_indexer_new(
140
- git_indexer **out,
141
- const char *prefix,
142
- unsigned int mode,
143
- git_odb *odb,
144
- git_indexer_options *in_opts)
140
+ GIT_INLINE(git_hash_algorithm_t) indexer_hash_algorithm(git_indexer *idx)
141
+ {
142
+ switch (idx->oid_type) {
143
+ case GIT_OID_SHA1:
144
+ return GIT_HASH_ALGORITHM_SHA1;
145
+ #ifdef GIT_EXPERIMENTAL_SHA256
146
+ case GIT_OID_SHA256:
147
+ return GIT_HASH_ALGORITHM_SHA256;
148
+ #endif
149
+ }
150
+
151
+ return GIT_HASH_ALGORITHM_NONE;
152
+ }
153
+
154
+ static int indexer_new(
155
+ git_indexer **out,
156
+ const char *prefix,
157
+ git_oid_t oid_type,
158
+ unsigned int mode,
159
+ git_odb *odb,
160
+ git_indexer_options *in_opts)
145
161
  {
146
162
  git_indexer_options opts = GIT_INDEXER_OPTIONS_INIT;
147
163
  git_indexer *idx;
148
164
  git_str path = GIT_STR_INIT, tmp_path = GIT_STR_INIT;
149
165
  static const char suff[] = "/pack";
166
+ git_hash_algorithm_t checksum_type;
150
167
  int error, fd = -1;
151
168
 
152
169
  if (in_opts)
@@ -154,14 +171,17 @@ int git_indexer_new(
154
171
 
155
172
  idx = git__calloc(1, sizeof(git_indexer));
156
173
  GIT_ERROR_CHECK_ALLOC(idx);
174
+ idx->oid_type = oid_type;
157
175
  idx->odb = odb;
158
176
  idx->progress_cb = opts.progress_cb;
159
177
  idx->progress_payload = opts.progress_cb_payload;
160
178
  idx->mode = mode ? mode : GIT_PACK_FILE_MODE;
161
179
  git_str_init(&idx->entry_data, 0);
162
180
 
163
- if ((error = git_hash_ctx_init(&idx->hash_ctx, GIT_HASH_ALGORITHM_SHA1)) < 0 ||
164
- (error = git_hash_ctx_init(&idx->trailer, GIT_HASH_ALGORITHM_SHA1)) < 0 ||
181
+ checksum_type = indexer_hash_algorithm(idx);
182
+
183
+ if ((error = git_hash_ctx_init(&idx->hash_ctx, checksum_type)) < 0 ||
184
+ (error = git_hash_ctx_init(&idx->trailer, checksum_type)) < 0 ||
165
185
  (error = git_oidmap_new(&idx->expected_oids)) < 0)
166
186
  goto cleanup;
167
187
 
@@ -179,7 +199,7 @@ int git_indexer_new(
179
199
  if (fd < 0)
180
200
  goto cleanup;
181
201
 
182
- error = git_packfile_alloc(&idx->pack, git_str_cstr(&tmp_path));
202
+ error = git_packfile_alloc(&idx->pack, git_str_cstr(&tmp_path), oid_type);
183
203
  git_str_dispose(&tmp_path);
184
204
 
185
205
  if (error < 0)
@@ -208,6 +228,33 @@ cleanup:
208
228
  return -1;
209
229
  }
210
230
 
231
+ #ifdef GIT_EXPERIMENTAL_SHA256
232
+ int git_indexer_new(
233
+ git_indexer **out,
234
+ const char *prefix,
235
+ git_oid_t oid_type,
236
+ git_indexer_options *opts)
237
+ {
238
+ return indexer_new(
239
+ out,
240
+ prefix,
241
+ oid_type,
242
+ opts ? opts->mode : 0,
243
+ opts ? opts->odb : NULL,
244
+ opts);
245
+ }
246
+ #else
247
+ int git_indexer_new(
248
+ git_indexer **out,
249
+ const char *prefix,
250
+ unsigned int mode,
251
+ git_odb *odb,
252
+ git_indexer_options *opts)
253
+ {
254
+ return indexer_new(out, prefix, GIT_OID_SHA1, mode, odb, opts);
255
+ }
256
+ #endif
257
+
211
258
  void git_indexer__set_fsync(git_indexer *idx, int do_fsync)
212
259
  {
213
260
  idx->do_fsync = !!do_fsync;
@@ -272,7 +319,7 @@ static int advance_delta_offset(git_indexer *idx, git_object_t type)
272
319
  GIT_ASSERT_ARG(type == GIT_OBJECT_REF_DELTA || type == GIT_OBJECT_OFS_DELTA);
273
320
 
274
321
  if (type == GIT_OBJECT_REF_DELTA) {
275
- idx->off += GIT_OID_RAWSZ;
322
+ idx->off += git_oid_size(idx->oid_type);
276
323
  } else {
277
324
  off64_t base_off;
278
325
  int error = get_delta_base(&base_off, idx->pack, &w, &idx->off, type, idx->entry_start);
@@ -356,7 +403,7 @@ static int check_object_connectivity(git_indexer *idx, const git_rawobj *obj)
356
403
  obj->type != GIT_OBJECT_TAG)
357
404
  return 0;
358
405
 
359
- if (git_object__from_raw(&object, obj->data, obj->len, obj->type) < 0) {
406
+ if (git_object__from_raw(&object, obj->data, obj->len, obj->type, idx->oid_type) < 0) {
360
407
  /*
361
408
  * parse_raw returns EINVALID on invalid data; downgrade
362
409
  * that to a normal -1 error code.
@@ -444,6 +491,11 @@ static int store_object(git_indexer *idx)
444
491
  git__free(pentry);
445
492
  goto on_error;
446
493
  }
494
+
495
+ #ifdef GIT_EXPERIMENTAL_SHA256
496
+ oid.type = idx->oid_type;
497
+ #endif
498
+
447
499
  entry_size = idx->off - entry_start;
448
500
  if (entry_start > UINT31_MAX) {
449
501
  entry->offset = UINT32_MAX;
@@ -463,16 +515,16 @@ static int store_object(git_indexer *idx)
463
515
  goto on_error;
464
516
  }
465
517
 
466
- git_oid_cpy(&pentry->sha1, &oid);
518
+ git_oid_cpy(&pentry->id, &oid);
467
519
  pentry->offset = entry_start;
468
520
 
469
- if (git_oidmap_exists(idx->pack->idx_cache, &pentry->sha1)) {
470
- git_error_set(GIT_ERROR_INDEXER, "duplicate object %s found in pack", git_oid_tostr_s(&pentry->sha1));
521
+ if (git_oidmap_exists(idx->pack->idx_cache, &pentry->id)) {
522
+ git_error_set(GIT_ERROR_INDEXER, "duplicate object %s found in pack", git_oid_tostr_s(&pentry->id));
471
523
  git__free(pentry);
472
524
  goto on_error;
473
525
  }
474
526
 
475
- if ((error = git_oidmap_set(idx->pack->idx_cache, &pentry->sha1, pentry)) < 0) {
527
+ if ((error = git_oidmap_set(idx->pack->idx_cache, &pentry->id, pentry)) < 0) {
476
528
  git__free(pentry);
477
529
  git_error_set_oom();
478
530
  goto on_error;
@@ -517,8 +569,8 @@ static int save_entry(git_indexer *idx, struct entry *entry, struct git_pack_ent
517
569
 
518
570
  pentry->offset = entry_start;
519
571
 
520
- if (git_oidmap_exists(idx->pack->idx_cache, &pentry->sha1) ||
521
- git_oidmap_set(idx->pack->idx_cache, &pentry->sha1, pentry) < 0) {
572
+ if (git_oidmap_exists(idx->pack->idx_cache, &pentry->id) ||
573
+ git_oidmap_set(idx->pack->idx_cache, &pentry->id, pentry) < 0) {
522
574
  git_error_set(GIT_ERROR_INDEXER, "cannot insert object into pack");
523
575
  return -1;
524
576
  }
@@ -544,7 +596,7 @@ static int hash_and_save(git_indexer *idx, git_rawobj *obj, off64_t entry_start)
544
596
  entry = git__calloc(1, sizeof(*entry));
545
597
  GIT_ERROR_CHECK_ALLOC(entry);
546
598
 
547
- if (git_odb__hashobj(&oid, obj) < 0) {
599
+ if (git_odb__hashobj(&oid, obj, idx->oid_type) < 0) {
548
600
  git_error_set(GIT_ERROR_INDEXER, "failed to hash object");
549
601
  goto on_error;
550
602
  }
@@ -552,7 +604,7 @@ static int hash_and_save(git_indexer *idx, git_rawobj *obj, off64_t entry_start)
552
604
  pentry = git__calloc(1, sizeof(struct git_pack_entry));
553
605
  GIT_ERROR_CHECK_ALLOC(pentry);
554
606
 
555
- git_oid_cpy(&pentry->sha1, &oid);
607
+ git_oid_cpy(&pentry->id, &oid);
556
608
  git_oid_cpy(&entry->oid, &oid);
557
609
  entry->crc = crc32(0L, Z_NULL, 0);
558
610
 
@@ -578,34 +630,38 @@ static int do_progress_callback(git_indexer *idx, git_indexer_progress *stats)
578
630
  return 0;
579
631
  }
580
632
 
581
- /* Hash everything but the last 20B of input */
633
+ /* Hash everything but the checksum trailer */
582
634
  static void hash_partially(git_indexer *idx, const uint8_t *data, size_t size)
583
635
  {
584
636
  size_t to_expell, to_keep;
637
+ size_t oid_size = git_oid_size(idx->oid_type);
585
638
 
586
639
  if (size == 0)
587
640
  return;
588
641
 
589
- /* Easy case, dump the buffer and the data minus the last 20 bytes */
590
- if (size >= GIT_OID_RAWSZ) {
642
+ /*
643
+ * Easy case, dump the buffer and the data minus the trailing
644
+ * checksum (SHA1 or SHA256).
645
+ */
646
+ if (size >= oid_size) {
591
647
  git_hash_update(&idx->trailer, idx->inbuf, idx->inbuf_len);
592
- git_hash_update(&idx->trailer, data, size - GIT_OID_RAWSZ);
648
+ git_hash_update(&idx->trailer, data, size - oid_size);
593
649
 
594
- data += size - GIT_OID_RAWSZ;
595
- memcpy(idx->inbuf, data, GIT_OID_RAWSZ);
596
- idx->inbuf_len = GIT_OID_RAWSZ;
650
+ data += size - oid_size;
651
+ memcpy(idx->inbuf, data, oid_size);
652
+ idx->inbuf_len = oid_size;
597
653
  return;
598
654
  }
599
655
 
600
656
  /* We can just append */
601
- if (idx->inbuf_len + size <= GIT_OID_RAWSZ) {
657
+ if (idx->inbuf_len + size <= oid_size) {
602
658
  memcpy(idx->inbuf + idx->inbuf_len, data, size);
603
659
  idx->inbuf_len += size;
604
660
  return;
605
661
  }
606
662
 
607
663
  /* We need to partially drain the buffer and then append */
608
- to_keep = GIT_OID_RAWSZ - size;
664
+ to_keep = oid_size - size;
609
665
  to_expell = idx->inbuf_len - to_keep;
610
666
 
611
667
  git_hash_update(&idx->trailer, idx->inbuf, to_expell);
@@ -724,12 +780,14 @@ static int read_stream_object(git_indexer *idx, git_indexer_progress *stats)
724
780
  {
725
781
  git_packfile_stream *stream = &idx->stream;
726
782
  off64_t entry_start = idx->off;
727
- size_t entry_size;
783
+ size_t oid_size, entry_size;
728
784
  git_object_t type;
729
785
  git_mwindow *w = NULL;
730
786
  int error;
731
787
 
732
- if (idx->pack->mwf.size <= idx->off + 20)
788
+ oid_size = git_oid_size(idx->oid_type);
789
+
790
+ if (idx->pack->mwf.size <= idx->off + (long long)oid_size)
733
791
  return GIT_EBUFS;
734
792
 
735
793
  if (!idx->have_stream) {
@@ -900,7 +958,7 @@ static int index_path(git_str *path, git_indexer *idx, const char *suffix)
900
958
  slash--;
901
959
 
902
960
  if (git_str_grow(path, slash + 1 + strlen(prefix) +
903
- GIT_OID_HEXSZ + strlen(suffix) + 1) < 0)
961
+ git_oid_hexsize(idx->oid_type) + strlen(suffix) + 1) < 0)
904
962
  return -1;
905
963
 
906
964
  git_str_truncate(path, slash);
@@ -917,7 +975,7 @@ static int index_path(git_str *path, git_indexer *idx, const char *suffix)
917
975
  */
918
976
  static int seek_back_trailer(git_indexer *idx)
919
977
  {
920
- idx->pack->mwf.size -= GIT_OID_RAWSZ;
978
+ idx->pack->mwf.size -= git_oid_size(idx->oid_type);
921
979
  return git_mwindow_free_all(&idx->pack->mwf);
922
980
  }
923
981
 
@@ -926,15 +984,17 @@ static int inject_object(git_indexer *idx, git_oid *id)
926
984
  git_odb_object *obj = NULL;
927
985
  struct entry *entry = NULL;
928
986
  struct git_pack_entry *pentry = NULL;
929
- unsigned char empty_checksum[GIT_HASH_SHA1_SIZE] = {0};
987
+ unsigned char empty_checksum[GIT_HASH_MAX_SIZE] = {0};
930
988
  unsigned char hdr[64];
931
989
  git_str buf = GIT_STR_INIT;
932
990
  off64_t entry_start;
933
991
  const void *data;
934
992
  size_t len, hdr_len;
935
- size_t checksum_size = GIT_HASH_SHA1_SIZE;
993
+ size_t checksum_size;
936
994
  int error;
937
995
 
996
+ checksum_size = git_hash_size(indexer_hash_algorithm(idx));
997
+
938
998
  if ((error = seek_back_trailer(idx)) < 0)
939
999
  goto cleanup;
940
1000
 
@@ -977,12 +1037,12 @@ static int inject_object(git_indexer *idx, git_oid *id)
977
1037
  if ((error = append_to_pack(idx, empty_checksum, checksum_size)) < 0)
978
1038
  goto cleanup;
979
1039
 
980
- idx->pack->mwf.size += GIT_OID_RAWSZ;
1040
+ idx->pack->mwf.size += git_oid_size(idx->oid_type);
981
1041
 
982
1042
  pentry = git__calloc(1, sizeof(struct git_pack_entry));
983
1043
  GIT_ERROR_CHECK_ALLOC(pentry);
984
1044
 
985
- git_oid_cpy(&pentry->sha1, id);
1045
+ git_oid_cpy(&pentry->id, id);
986
1046
  git_oid_cpy(&entry->oid, id);
987
1047
  idx->off = entry_start + hdr_len + len;
988
1048
 
@@ -1040,13 +1100,13 @@ static int fix_thin_pack(git_indexer *idx, git_indexer_progress *stats)
1040
1100
  }
1041
1101
 
1042
1102
  /* curpos now points to the base information, which is an OID */
1043
- base_info = git_mwindow_open(&idx->pack->mwf, &w, curpos, GIT_OID_RAWSZ, &left);
1103
+ base_info = git_mwindow_open(&idx->pack->mwf, &w, curpos, git_oid_size(idx->oid_type), &left);
1044
1104
  if (base_info == NULL) {
1045
1105
  git_error_set(GIT_ERROR_INDEXER, "failed to map delta information");
1046
1106
  return -1;
1047
1107
  }
1048
1108
 
1049
- git_oid_fromraw(&base, base_info);
1109
+ git_oid__fromraw(&base, base_info, idx->oid_type);
1050
1110
  git_mwindow_close(&w);
1051
1111
 
1052
1112
  if (has_entry(idx, &base))
@@ -1168,10 +1228,10 @@ int git_indexer_commit(git_indexer *idx, git_indexer_progress *stats)
1168
1228
  struct git_pack_idx_header hdr;
1169
1229
  git_str filename = GIT_STR_INIT;
1170
1230
  struct entry *entry;
1171
- unsigned char checksum[GIT_HASH_SHA1_SIZE];
1231
+ unsigned char checksum[GIT_HASH_MAX_SIZE];
1172
1232
  git_filebuf index_file = {0};
1173
1233
  void *packfile_trailer;
1174
- size_t checksum_size = GIT_HASH_SHA1_SIZE;
1234
+ size_t checksum_size;
1175
1235
  bool mismatch;
1176
1236
 
1177
1237
  if (!idx->parsed_header) {
@@ -1179,6 +1239,9 @@ int git_indexer_commit(git_indexer *idx, git_indexer_progress *stats)
1179
1239
  return -1;
1180
1240
  }
1181
1241
 
1242
+ checksum_size = git_hash_size(indexer_hash_algorithm(idx));
1243
+ GIT_ASSERT(checksum_size);
1244
+
1182
1245
  /* Test for this before resolve_deltas(), as it plays with idx->off */
1183
1246
  if (idx->off + (ssize_t)checksum_size < idx->pack->mwf.size) {
1184
1247
  git_error_set(GIT_ERROR_INDEXER, "unexpected data at the end of the pack");
@@ -1269,7 +1332,7 @@ int git_indexer_commit(git_indexer *idx, git_indexer_progress *stats)
1269
1332
 
1270
1333
  /* Write out the object names (SHA-1 hashes) */
1271
1334
  git_vector_foreach(&idx->objects, i, entry) {
1272
- git_filebuf_write(&index_file, &entry->oid.id, GIT_OID_RAWSZ);
1335
+ git_filebuf_write(&index_file, &entry->oid.id, git_oid_size(idx->oid_type));
1273
1336
  }
1274
1337
 
1275
1338
  /* Write out the CRC32 values */
@@ -1271,7 +1271,7 @@ static int filesystem_iterator_entry_hash(
1271
1271
  int error;
1272
1272
 
1273
1273
  if (S_ISDIR(entry->st.st_mode)) {
1274
- memset(&entry->id, 0, GIT_OID_RAWSZ);
1274
+ memset(&entry->id, 0, GIT_OID_SHA1_SIZE);
1275
1275
  return 0;
1276
1276
  }
1277
1277
 
@@ -1281,7 +1281,7 @@ static int filesystem_iterator_entry_hash(
1281
1281
 
1282
1282
  if (!(error = git_str_joinpath(&fullpath, iter->root, entry->path)) &&
1283
1283
  !(error = git_path_validate_str_length(iter->base.repo, &fullpath)))
1284
- error = git_odb_hashfile(&entry->id, fullpath.ptr, GIT_OBJECT_BLOB);
1284
+ error = git_odb__hashfile(&entry->id, fullpath.ptr, GIT_OBJECT_BLOB, GIT_OID_SHA1);
1285
1285
 
1286
1286
  git_str_dispose(&fullpath);
1287
1287
  return error;
@@ -1529,6 +1529,8 @@ static void filesystem_iterator_set_current(
1529
1529
 
1530
1530
  if (iter->base.flags & GIT_ITERATOR_INCLUDE_HASH)
1531
1531
  git_oid_cpy(&iter->entry.id, &entry->id);
1532
+ else
1533
+ git_oid_clear(&iter->entry.id, GIT_OID_SHA1);
1532
1534
 
1533
1535
  iter->entry.path = entry->path;
1534
1536
 
@@ -414,6 +414,25 @@ int git_libgit2_opts(int key, ...)
414
414
  git_repository__validate_ownership = (va_arg(ap, int) != 0);
415
415
  break;
416
416
 
417
+ case GIT_OPT_GET_HOMEDIR:
418
+ {
419
+ git_buf *out = va_arg(ap, git_buf *);
420
+ git_str str = GIT_STR_INIT;
421
+ const git_str *tmp;
422
+
423
+ if ((error = git_buf_tostr(&str, out)) < 0 ||
424
+ (error = git_sysdir_get(&tmp, GIT_SYSDIR_HOME)) < 0 ||
425
+ (error = git_str_put(&str, tmp->ptr, tmp->size)) < 0)
426
+ break;
427
+
428
+ error = git_buf_fromstr(out, &str);
429
+ }
430
+ break;
431
+
432
+ case GIT_OPT_SET_HOMEDIR:
433
+ error = git_sysdir_set(GIT_SYSDIR_HOME, va_arg(ap, const char *));
434
+ break;
435
+
417
436
  default:
418
437
  git_error_set(GIT_ERROR_INVALID, "invalid option key");
419
438
  error = -1;
@@ -611,13 +611,13 @@ int git_repository_mergehead_foreach(
611
611
  buffer = merge_head_file.ptr;
612
612
 
613
613
  while ((line = git__strsep(&buffer, "\n")) != NULL) {
614
- if (strlen(line) != GIT_OID_HEXSZ) {
614
+ if (strlen(line) != GIT_OID_SHA1_HEXSIZE) {
615
615
  git_error_set(GIT_ERROR_INVALID, "unable to parse OID - invalid length");
616
616
  error = -1;
617
617
  goto cleanup;
618
618
  }
619
619
 
620
- if ((error = git_oid_fromstr(&oid, line)) < 0)
620
+ if ((error = git_oid__fromstr(&oid, line, GIT_OID_SHA1)) < 0)
621
621
  goto cleanup;
622
622
 
623
623
  if ((error = cb(&oid, payload)) != 0) {
@@ -1061,7 +1061,7 @@ static int index_entry_similarity_calc(
1061
1061
  const git_merge_options *opts)
1062
1062
  {
1063
1063
  git_blob *blob;
1064
- git_diff_file diff_file = {{{0}}};
1064
+ git_diff_file diff_file = { GIT_OID_SHA1_ZERO };
1065
1065
  git_object_size_t blobsize;
1066
1066
  int error;
1067
1067