rugged 1.5.1 → 1.6.2

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 (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
@@ -38,6 +38,25 @@ typedef enum {
38
38
  */
39
39
  typedef int GIT_CALLBACK(git_odb_foreach_cb)(const git_oid *id, void *payload);
40
40
 
41
+ /** Options for configuring a loose object backend. */
42
+ typedef struct {
43
+ unsigned int version; /**< version for the struct */
44
+
45
+ /**
46
+ * Type of object IDs to use for this object database, or
47
+ * 0 for default (currently SHA1).
48
+ */
49
+ git_oid_t oid_type;
50
+ } git_odb_options;
51
+
52
+ /* The current version of the diff options structure */
53
+ #define GIT_ODB_OPTIONS_VERSION 1
54
+
55
+ /* Stack initializer for odb options. Alternatively use
56
+ * `git_odb_options_init` programmatic initialization.
57
+ */
58
+ #define GIT_ODB_OPTIONS_INIT { GIT_ODB_OPTIONS_VERSION }
59
+
41
60
  /**
42
61
  * Create a new object database with no backends.
43
62
  *
@@ -46,9 +65,14 @@ typedef int GIT_CALLBACK(git_odb_foreach_cb)(const git_oid *id, void *payload);
46
65
  *
47
66
  * @param out location to store the database pointer, if opened.
48
67
  * Set to NULL if the open failed.
68
+ * @param opts the options for this object database or NULL for defaults
49
69
  * @return 0 or an error code
50
70
  */
71
+ #ifdef GIT_EXPERIMENTAL_SHA256
72
+ GIT_EXTERN(int) git_odb_new(git_odb **out, const git_odb_options *opts);
73
+ #else
51
74
  GIT_EXTERN(int) git_odb_new(git_odb **out);
75
+ #endif
52
76
 
53
77
  /**
54
78
  * Create a new object database and automatically add
@@ -64,9 +88,17 @@ GIT_EXTERN(int) git_odb_new(git_odb **out);
64
88
  * @param out location to store the database pointer, if opened.
65
89
  * Set to NULL if the open failed.
66
90
  * @param objects_dir path of the backends' "objects" directory.
91
+ * @param opts the options for this object database or NULL for defaults
67
92
  * @return 0 or an error code
68
93
  */
94
+ #ifdef GIT_EXPERIMENTAL_SHA256
95
+ GIT_EXTERN(int) git_odb_open(
96
+ git_odb **out,
97
+ const char *objects_dir,
98
+ const git_odb_options *opts);
99
+ #else
69
100
  GIT_EXTERN(int) git_odb_open(git_odb **out, const char *objects_dir);
101
+ #endif
70
102
 
71
103
  /**
72
104
  * Add an on-disk alternate to an existing Object DB.
@@ -117,7 +149,7 @@ GIT_EXTERN(int) git_odb_read(git_odb_object **out, git_odb *db, const git_oid *i
117
149
  * This method queries all available ODB backends
118
150
  * trying to match the 'len' first hexadecimal
119
151
  * characters of the 'short_id'.
120
- * The remaining (GIT_OID_HEXSZ-len)*4 bits of
152
+ * The remaining (GIT_OID_SHA1_HEXSIZE-len)*4 bits of
121
153
  * 'short_id' must be 0s.
122
154
  * 'len' must be at least GIT_OID_MINPREFIXLEN,
123
155
  * and the prefix must be long enough to identify
@@ -218,7 +250,7 @@ typedef struct git_odb_expand_id {
218
250
  *
219
251
  * The given array will be updated in place: for each abbreviated ID that is
220
252
  * unique in the database, and of the given type (if specified),
221
- * the full object ID, object ID length (`GIT_OID_HEXSZ`) and type will be
253
+ * the full object ID, object ID length (`GIT_OID_SHA1_HEXSIZE`) and type will be
222
254
  * written back to the array. For IDs that are not found (or are ambiguous),
223
255
  * the array entry will be zeroed.
224
256
  *
@@ -435,18 +467,28 @@ GIT_EXTERN(int) git_odb_write_multi_pack_index(
435
467
  git_odb *db);
436
468
 
437
469
  /**
438
- * Determine the object-ID (sha1 hash) of a data buffer
470
+ * Determine the object-ID (sha1 or sha256 hash) of a data buffer
439
471
  *
440
- * The resulting SHA-1 OID will be the identifier for the data
441
- * buffer as if the data buffer it were to written to the ODB.
472
+ * The resulting OID will be the identifier for the data buffer as if
473
+ * the data buffer it were to written to the ODB.
442
474
  *
443
475
  * @param out the resulting object-ID.
444
476
  * @param data data to hash
445
477
  * @param len size of the data
446
- * @param type of the data to hash
478
+ * @param object_type of the data to hash
479
+ * @param oid_type the oid type to hash to
447
480
  * @return 0 or an error code
448
481
  */
482
+ #ifdef GIT_EXPERIMENTAL_SHA256
483
+ GIT_EXTERN(int) git_odb_hash(
484
+ git_oid *out,
485
+ const void *data,
486
+ size_t len,
487
+ git_object_t object_type,
488
+ git_oid_t oid_type);
489
+ #else
449
490
  GIT_EXTERN(int) git_odb_hash(git_oid *out, const void *data, size_t len, git_object_t type);
491
+ #endif
450
492
 
451
493
  /**
452
494
  * Read a file from disk and fill a git_oid with the object id
@@ -458,10 +500,19 @@ GIT_EXTERN(int) git_odb_hash(git_oid *out, const void *data, size_t len, git_obj
458
500
  *
459
501
  * @param out oid structure the result is written into.
460
502
  * @param path file to read and determine object id for
461
- * @param type the type of the object that will be hashed
503
+ * @param object_type of the data to hash
504
+ * @param oid_type the oid type to hash to
462
505
  * @return 0 or an error code
463
506
  */
507
+ #ifdef GIT_EXPERIMENTAL_SHA256
508
+ GIT_EXTERN(int) git_odb_hashfile(
509
+ git_oid *out,
510
+ const char *path,
511
+ git_object_t object_type,
512
+ git_oid_t oid_type);
513
+ #else
464
514
  GIT_EXTERN(int) git_odb_hashfile(git_oid *out, const char *path, git_object_t type);
515
+ #endif
465
516
 
466
517
  /**
467
518
  * Create a copy of an odb_object
@@ -24,6 +24,26 @@ GIT_BEGIN_DECL
24
24
  * Constructors for in-box ODB backends.
25
25
  */
26
26
 
27
+ /** Options for configuring a packfile object backend. */
28
+ typedef struct {
29
+ unsigned int version; /**< version for the struct */
30
+
31
+ /**
32
+ * Type of object IDs to use for this object database, or
33
+ * 0 for default (currently SHA1).
34
+ */
35
+ git_oid_t oid_type;
36
+ } git_odb_backend_pack_options;
37
+
38
+ /* The current version of the diff options structure */
39
+ #define GIT_ODB_BACKEND_PACK_OPTIONS_VERSION 1
40
+
41
+ /* Stack initializer for odb pack backend options. Alternatively use
42
+ * `git_odb_backend_pack_options_init` programmatic initialization.
43
+ */
44
+ #define GIT_ODB_BACKEND_PACK_OPTIONS_INIT \
45
+ { GIT_ODB_BACKEND_PACK_OPTIONS_VERSION }
46
+
27
47
  /**
28
48
  * Create a backend for the packfiles.
29
49
  *
@@ -32,20 +52,96 @@ GIT_BEGIN_DECL
32
52
  *
33
53
  * @return 0 or an error code
34
54
  */
35
- GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **out, const char *objects_dir);
55
+ #ifdef GIT_EXPERIMENTAL_SHA256
56
+ GIT_EXTERN(int) git_odb_backend_pack(
57
+ git_odb_backend **out,
58
+ const char *objects_dir,
59
+ const git_odb_backend_pack_options *opts);
60
+ #else
61
+ GIT_EXTERN(int) git_odb_backend_pack(
62
+ git_odb_backend **out,
63
+ const char *objects_dir);
64
+ #endif
65
+
66
+ /**
67
+ * Create a backend out of a single packfile
68
+ *
69
+ * This can be useful for inspecting the contents of a single
70
+ * packfile.
71
+ *
72
+ * @param out location to store the odb backend pointer
73
+ * @param index_file path to the packfile's .idx file
74
+ *
75
+ * @return 0 or an error code
76
+ */
77
+ #ifdef GIT_EXPERIMENTAL_SHA256
78
+ GIT_EXTERN(int) git_odb_backend_one_pack(
79
+ git_odb_backend **out,
80
+ const char *index_file,
81
+ const git_odb_backend_pack_options *opts);
82
+ #else
83
+ GIT_EXTERN(int) git_odb_backend_one_pack(
84
+ git_odb_backend **out,
85
+ const char *index_file);
86
+ #endif
87
+
88
+ typedef enum {
89
+ GIT_ODB_BACKEND_LOOSE_FSYNC = (1 << 0)
90
+ } git_odb_backend_loose_flag_t;
91
+
92
+ /** Options for configuring a loose object backend. */
93
+ typedef struct {
94
+ unsigned int version; /**< version for the struct */
95
+
96
+ /** A combination of the `git_odb_backend_loose_flag_t` types. */
97
+ uint32_t flags;
98
+
99
+ /**
100
+ * zlib compression level to use (0-9), where 1 is the fastest
101
+ * at the expense of larger files, and 9 produces the best
102
+ * compression at the expense of speed. 0 indicates that no
103
+ * compression should be performed. -1 is the default (currently
104
+ * optimizing for speed).
105
+ */
106
+ int compression_level;
107
+
108
+ /** Permissions to use creating a directory or 0 for defaults */
109
+ unsigned int dir_mode;
110
+
111
+ /** Permissions to use creating a file or 0 for defaults */
112
+ unsigned int file_mode;
113
+
114
+ /**
115
+ * Type of object IDs to use for this object database, or
116
+ * 0 for default (currently SHA1).
117
+ */
118
+ git_oid_t oid_type;
119
+ } git_odb_backend_loose_options;
120
+
121
+ /* The current version of the diff options structure */
122
+ #define GIT_ODB_BACKEND_LOOSE_OPTIONS_VERSION 1
123
+
124
+ /* Stack initializer for odb loose backend options. Alternatively use
125
+ * `git_odb_backend_loose_options_init` programmatic initialization.
126
+ */
127
+ #define GIT_ODB_BACKEND_LOOSE_OPTIONS_INIT \
128
+ { GIT_ODB_BACKEND_LOOSE_OPTIONS_VERSION, 0, -1 }
36
129
 
37
130
  /**
38
131
  * Create a backend for loose objects
39
132
  *
40
133
  * @param out location to store the odb backend pointer
41
134
  * @param objects_dir the Git repository's objects directory
42
- * @param compression_level zlib compression level to use
43
- * @param do_fsync whether to do an fsync() after writing
44
- * @param dir_mode permissions to use creating a directory or 0 for defaults
45
- * @param file_mode permissions to use creating a file or 0 for defaults
135
+ * @param opts options for the loose object backend or NULL
46
136
  *
47
137
  * @return 0 or an error code
48
138
  */
139
+ #ifdef GIT_EXPERIMENTAL_SHA256
140
+ GIT_EXTERN(int) git_odb_backend_loose(
141
+ git_odb_backend **out,
142
+ const char *objects_dir,
143
+ git_odb_backend_loose_options *opts);
144
+ #else
49
145
  GIT_EXTERN(int) git_odb_backend_loose(
50
146
  git_odb_backend **out,
51
147
  const char *objects_dir,
@@ -53,19 +149,7 @@ GIT_EXTERN(int) git_odb_backend_loose(
53
149
  int do_fsync,
54
150
  unsigned int dir_mode,
55
151
  unsigned int file_mode);
56
-
57
- /**
58
- * Create a backend out of a single packfile
59
- *
60
- * This can be useful for inspecting the contents of a single
61
- * packfile.
62
- *
63
- * @param out location to store the odb backend pointer
64
- * @param index_file path to the packfile's .idx file
65
- *
66
- * @return 0 or an error code
67
- */
68
- GIT_EXTERN(int) git_odb_backend_one_pack(git_odb_backend **out, const char *index_file);
152
+ #endif
69
153
 
70
154
  /** Streaming mode */
71
155
  typedef enum {
@@ -87,6 +171,10 @@ struct git_odb_stream {
87
171
  unsigned int mode;
88
172
  void *hash_ctx;
89
173
 
174
+ #ifdef GIT_EXPERIMENTAL_SHA256
175
+ git_oid_t oid_type;
176
+ #endif
177
+
90
178
  git_object_size_t declared_size;
91
179
  git_object_size_t received_bytes;
92
180
 
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include "common.h"
11
11
  #include "types.h"
12
+ #include "experimental.h"
12
13
 
13
14
  /**
14
15
  * @file git2/oid.h
@@ -19,11 +20,76 @@
19
20
  */
20
21
  GIT_BEGIN_DECL
21
22
 
22
- /** Size (in bytes) of a raw/binary oid */
23
- #define GIT_OID_RAWSZ 20
23
+ /** The type of object id. */
24
+ typedef enum {
24
25
 
25
- /** Size (in bytes) of a hex formatted oid */
26
- #define GIT_OID_HEXSZ (GIT_OID_RAWSZ * 2)
26
+ #ifdef GIT_EXPERIMENTAL_SHA256
27
+ GIT_OID_SHA1 = 1, /**< SHA1 */
28
+ GIT_OID_SHA256 = 2 /**< SHA256 */
29
+ #else
30
+ GIT_OID_SHA1 = 1 /**< SHA1 */
31
+ #endif
32
+
33
+ } git_oid_t;
34
+
35
+ /*
36
+ * SHA1 is currently the only supported object ID type.
37
+ */
38
+
39
+ /** SHA1 is currently libgit2's default oid type. */
40
+ #define GIT_OID_DEFAULT GIT_OID_SHA1
41
+
42
+ /** Size (in bytes) of a raw/binary sha1 oid */
43
+ #define GIT_OID_SHA1_SIZE 20
44
+ /** Size (in bytes) of a hex formatted sha1 oid */
45
+ #define GIT_OID_SHA1_HEXSIZE (GIT_OID_SHA1_SIZE * 2)
46
+
47
+ /**
48
+ * The binary representation of the null sha1 object ID.
49
+ */
50
+ #ifndef GIT_EXPERIMENTAL_SHA256
51
+ # define GIT_OID_SHA1_ZERO { { 0 } }
52
+ #else
53
+ # define GIT_OID_SHA1_ZERO { GIT_OID_SHA1, { 0 } }
54
+ #endif
55
+
56
+ /**
57
+ * The string representation of the null sha1 object ID.
58
+ */
59
+ #define GIT_OID_SHA1_HEXZERO "0000000000000000000000000000000000000000"
60
+
61
+ /*
62
+ * Experimental SHA256 support is a breaking change to the API.
63
+ * This exists for application compatibility testing.
64
+ */
65
+
66
+ #ifdef GIT_EXPERIMENTAL_SHA256
67
+
68
+ /** Size (in bytes) of a raw/binary sha256 oid */
69
+ # define GIT_OID_SHA256_SIZE 32
70
+ /** Size (in bytes) of a hex formatted sha256 oid */
71
+ # define GIT_OID_SHA256_HEXSIZE (GIT_OID_SHA256_SIZE * 2)
72
+
73
+ /**
74
+ * The binary representation of the null sha256 object ID.
75
+ */
76
+ # define GIT_OID_SHA256_ZERO { GIT_OID_SHA256, { 0 } }
77
+
78
+ /**
79
+ * The string representation of the null sha256 object ID.
80
+ */
81
+ # define GIT_OID_SHA256_HEXZERO "0000000000000000000000000000000000000000000000000000000000000000"
82
+
83
+ #endif
84
+
85
+ /* Maximum possible object ID size in raw / hex string format. */
86
+ #ifndef GIT_EXPERIMENTAL_SHA256
87
+ # define GIT_OID_MAX_SIZE GIT_OID_SHA1_SIZE
88
+ # define GIT_OID_MAX_HEXSIZE GIT_OID_SHA1_HEXSIZE
89
+ #else
90
+ # define GIT_OID_MAX_SIZE GIT_OID_SHA256_SIZE
91
+ # define GIT_OID_MAX_HEXSIZE GIT_OID_SHA256_HEXSIZE
92
+ #endif
27
93
 
28
94
  /** Minimum length (in number of hex characters,
29
95
  * i.e. packets of 4 bits) of an oid prefix */
@@ -31,29 +97,50 @@ GIT_BEGIN_DECL
31
97
 
32
98
  /** Unique identity of any object (commit, tree, blob, tag). */
33
99
  typedef struct git_oid {
100
+
101
+ #ifdef GIT_EXPERIMENTAL_SHA256
102
+ /** type of object id */
103
+ unsigned char type;
104
+ #endif
105
+
34
106
  /** raw binary formatted id */
35
- unsigned char id[GIT_OID_RAWSZ];
107
+ unsigned char id[GIT_OID_MAX_SIZE];
36
108
  } git_oid;
37
109
 
38
110
  /**
39
111
  * Parse a hex formatted object id into a git_oid.
40
112
  *
113
+ * The appropriate number of bytes for the given object ID type will
114
+ * be read from the string - 40 bytes for SHA1, 64 bytes for SHA256.
115
+ * The given string need not be NUL terminated.
116
+ *
41
117
  * @param out oid structure the result is written into.
42
118
  * @param str input hex string; must be pointing at the start of
43
119
  * the hex sequence and have at least the number of bytes
44
- * needed for an oid encoded in hex (40 bytes).
120
+ * needed for an oid encoded in hex (40 bytes for sha1,
121
+ * 256 bytes for sha256).
122
+ * @param type the type of object id
45
123
  * @return 0 or an error code
46
124
  */
125
+ #ifdef GIT_EXPERIMENTAL_SHA256
126
+ GIT_EXTERN(int) git_oid_fromstr(git_oid *out, const char *str, git_oid_t type);
127
+ #else
47
128
  GIT_EXTERN(int) git_oid_fromstr(git_oid *out, const char *str);
129
+ #endif
48
130
 
49
131
  /**
50
- * Parse a hex formatted null-terminated string into a git_oid.
132
+ * Parse a hex formatted NUL-terminated string into a git_oid.
51
133
  *
52
134
  * @param out oid structure the result is written into.
53
135
  * @param str input hex string; must be null-terminated.
136
+ * @param type the type of object id
54
137
  * @return 0 or an error code
55
138
  */
139
+ #ifdef GIT_EXPERIMENTAL_SHA256
140
+ GIT_EXTERN(int) git_oid_fromstrp(git_oid *out, const char *str, git_oid_t type);
141
+ #else
56
142
  GIT_EXTERN(int) git_oid_fromstrp(git_oid *out, const char *str);
143
+ #endif
57
144
 
58
145
  /**
59
146
  * Parse N characters of a hex formatted object id into a git_oid.
@@ -64,9 +151,14 @@ GIT_EXTERN(int) git_oid_fromstrp(git_oid *out, const char *str);
64
151
  * @param out oid structure the result is written into.
65
152
  * @param str input hex string of at least size `length`
66
153
  * @param length length of the input string
154
+ * @param type the type of object id
67
155
  * @return 0 or an error code
68
156
  */
157
+ #ifdef GIT_EXPERIMENTAL_SHA256
158
+ GIT_EXTERN(int) git_oid_fromstrn(git_oid *out, const char *str, size_t length, git_oid_t type);
159
+ #else
69
160
  GIT_EXTERN(int) git_oid_fromstrn(git_oid *out, const char *str, size_t length);
161
+ #endif
70
162
 
71
163
  /**
72
164
  * Copy an already raw oid into a git_oid structure.
@@ -75,16 +167,21 @@ GIT_EXTERN(int) git_oid_fromstrn(git_oid *out, const char *str, size_t length);
75
167
  * @param raw the raw input bytes to be copied.
76
168
  * @return 0 on success or error code
77
169
  */
170
+ #ifdef GIT_EXPERIMENTAL_SHA256
171
+ GIT_EXTERN(int) git_oid_fromraw(git_oid *out, const unsigned char *raw, git_oid_t type);
172
+ #else
78
173
  GIT_EXTERN(int) git_oid_fromraw(git_oid *out, const unsigned char *raw);
174
+ #endif
79
175
 
80
176
  /**
81
177
  * Format a git_oid into a hex string.
82
178
  *
83
179
  * @param out output hex string; must be pointing at the start of
84
180
  * the hex sequence and have at least the number of bytes
85
- * needed for an oid encoded in hex (40 bytes). Only the
86
- * oid digits are written; a '\\0' terminator must be added
87
- * by the caller if it is required.
181
+ * needed for an oid encoded in hex (40 bytes for SHA1,
182
+ * 64 bytes for SHA256). Only the oid digits are written;
183
+ * a '\\0' terminator must be added by the caller if it is
184
+ * required.
88
185
  * @param id oid structure to format.
89
186
  * @return 0 on success or error code
90
187
  */
@@ -94,7 +191,7 @@ GIT_EXTERN(int) git_oid_fmt(char *out, const git_oid *id);
94
191
  * Format a git_oid into a partial hex string.
95
192
  *
96
193
  * @param out output hex string; you say how many bytes to write.
97
- * If the number of bytes is > GIT_OID_HEXSZ, extra bytes
194
+ * If the number of bytes is > GIT_OID_SHA1_HEXSIZE, extra bytes
98
195
  * will be zeroed; if not, a '\0' terminator is NOT added.
99
196
  * @param n number of characters to write into out string
100
197
  * @param id oid structure to format.
@@ -110,9 +207,10 @@ GIT_EXTERN(int) git_oid_nfmt(char *out, size_t n, const git_oid *id);
110
207
  *
111
208
  * @param out output hex string; must be pointing at the start of
112
209
  * the hex sequence and have at least the number of bytes
113
- * needed for an oid encoded in hex (41 bytes). Only the
114
- * oid digits are written; a '\\0' terminator must be added
115
- * by the caller if it is required.
210
+ * needed for an oid encoded in hex (41 bytes for SHA1,
211
+ * 65 bytes for SHA256). Only the oid digits are written;
212
+ * a '\\0' terminator must be added by the caller if it
213
+ * is required.
116
214
  * @param id oid structure to format.
117
215
  * @return 0 on success, non-zero callback return value, or error code
118
216
  */
@@ -134,7 +232,9 @@ GIT_EXTERN(char *) git_oid_tostr_s(const git_oid *oid);
134
232
  /**
135
233
  * Format a git_oid into a buffer as a hex format c-string.
136
234
  *
137
- * If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting
235
+ * If the buffer is smaller than the size of a hex-formatted oid string
236
+ * plus an additional byte (GIT_OID_SHA_HEXSIZE + 1 for SHA1 or
237
+ * GIT_OID_SHA256_HEXSIZE + 1 for SHA256), then the resulting
138
238
  * oid c-string will be truncated to n-1 characters (but will still be
139
239
  * NUL-byte terminated).
140
240
  *
@@ -351,6 +351,15 @@ typedef struct {
351
351
  * pointing to this URL.
352
352
  */
353
353
  const char *origin_url;
354
+
355
+ #ifdef GIT_EXPERIMENTAL_SHA256
356
+ /**
357
+ *
358
+ * Type of object IDs to use for this repository, or 0 for
359
+ * default (currently SHA1).
360
+ */
361
+ git_oid_t oid_type;
362
+ #endif
354
363
  } git_repository_init_options;
355
364
 
356
365
  #define GIT_REPOSITORY_INIT_OPTIONS_VERSION 1
@@ -456,7 +465,9 @@ GIT_EXTERN(int) git_repository_head_unborn(git_repository *repo);
456
465
  * Check if a repository is empty
457
466
  *
458
467
  * An empty repository has just been initialized and contains no references
459
- * apart from HEAD, which must be pointing to the unborn master branch.
468
+ * apart from HEAD, which must be pointing to the unborn master branch,
469
+ * or the branch specified for the repository in the `init.defaultBranch`
470
+ * configuration variable.
460
471
  *
461
472
  * @param repo Repo to test
462
473
  * @return 1 if the repository is empty, 0 if it isn't, error code
@@ -949,6 +960,14 @@ GIT_EXTERN(int) git_repository_ident(const char **name, const char **email, cons
949
960
  */
950
961
  GIT_EXTERN(int) git_repository_set_ident(git_repository *repo, const char *name, const char *email);
951
962
 
963
+ /**
964
+ * Gets the object type used by this repository.
965
+ *
966
+ * @param repo the repository
967
+ * @return the object id type
968
+ */
969
+ GIT_EXTERN(git_oid_t) git_repository_oid_type(git_repository *repo);
970
+
952
971
  /** @} */
953
972
  GIT_END_DECL
954
973
  #endif
@@ -44,7 +44,12 @@ typedef enum {
44
44
  * All ignored files are also stashed and then cleaned up from
45
45
  * the working directory
46
46
  */
47
- GIT_STASH_INCLUDE_IGNORED = (1 << 2)
47
+ GIT_STASH_INCLUDE_IGNORED = (1 << 2),
48
+
49
+ /**
50
+ * All changes in the index and working directory are left intact
51
+ */
52
+ GIT_STASH_KEEP_ALL = (1 << 3)
48
53
  } git_stash_flags;
49
54
 
50
55
  /**
@@ -52,15 +57,10 @@ typedef enum {
52
57
  *
53
58
  * @param out Object id of the commit containing the stashed state.
54
59
  * This commit is also the target of the direct reference refs/stash.
55
- *
56
60
  * @param repo The owning repository.
57
- *
58
61
  * @param stasher The identity of the person performing the stashing.
59
- *
60
62
  * @param message Optional description along with the stashed state.
61
- *
62
63
  * @param flags Flags to control the stashing process. (see GIT_STASH_* above)
63
- *
64
64
  * @return 0 on success, GIT_ENOTFOUND where there's nothing to stash,
65
65
  * or error code.
66
66
  */
@@ -71,6 +71,60 @@ GIT_EXTERN(int) git_stash_save(
71
71
  const char *message,
72
72
  uint32_t flags);
73
73
 
74
+ /**
75
+ * Stash save options structure
76
+ *
77
+ * Initialize with `GIT_STASH_SAVE_OPTIONS_INIT`. Alternatively, you can
78
+ * use `git_stash_save_options_init`.
79
+ *
80
+ */
81
+ typedef struct git_stash_save_options {
82
+ unsigned int version;
83
+
84
+ /** Flags to control the stashing process. (see GIT_STASH_* above) */
85
+ uint32_t flags;
86
+
87
+ /** The identity of the person performing the stashing. */
88
+ const git_signature *stasher;
89
+
90
+ /** Optional description along with the stashed state. */
91
+ const char *message;
92
+
93
+ /** Optional paths that control which files are stashed. */
94
+ git_strarray paths;
95
+ } git_stash_save_options;
96
+
97
+ #define GIT_STASH_SAVE_OPTIONS_VERSION 1
98
+ #define GIT_STASH_SAVE_OPTIONS_INIT { GIT_STASH_SAVE_OPTIONS_VERSION }
99
+
100
+ /**
101
+ * Initialize git_stash_save_options structure
102
+ *
103
+ * Initializes a `git_stash_save_options` with default values. Equivalent to
104
+ * creating an instance with `GIT_STASH_SAVE_OPTIONS_INIT`.
105
+ *
106
+ * @param opts The `git_stash_save_options` struct to initialize.
107
+ * @param version The struct version; pass `GIT_STASH_SAVE_OPTIONS_VERSION`.
108
+ * @return Zero on success; -1 on failure.
109
+ */
110
+ GIT_EXTERN(int) git_stash_save_options_init(
111
+ git_stash_save_options *opts, unsigned int version);
112
+
113
+ /**
114
+ * Save the local modifications to a new stash, with options.
115
+ *
116
+ * @param out Object id of the commit containing the stashed state.
117
+ * This commit is also the target of the direct reference refs/stash.
118
+ * @param repo The owning repository.
119
+ * @param opts The stash options.
120
+ * @return 0 on success, GIT_ENOTFOUND where there's nothing to stash,
121
+ * or error code.
122
+ */
123
+ GIT_EXTERN(int) git_stash_save_with_opts(
124
+ git_oid *out,
125
+ git_repository *repo,
126
+ const git_stash_save_options *opts);
127
+
74
128
  /** Stash application flags. */
75
129
  typedef enum {
76
130
  GIT_STASH_APPLY_DEFAULT = 0,
@@ -36,19 +36,6 @@ typedef struct git_strarray {
36
36
  */
37
37
  GIT_EXTERN(void) git_strarray_dispose(git_strarray *array);
38
38
 
39
- /**
40
- * Copy a string array object from source to target.
41
- *
42
- * Note: target is overwritten and hence should be empty, otherwise its
43
- * contents are leaked. Call git_strarray_free() if necessary.
44
- *
45
- * @param tgt target
46
- * @param src source
47
- * @return 0 on success, < 0 on allocation failure
48
- */
49
- GIT_EXTERN(int) git_strarray_copy(git_strarray *tgt, const git_strarray *src);
50
-
51
-
52
39
  /** @} */
53
40
  GIT_END_DECL
54
41
 
@@ -36,7 +36,7 @@ struct git_odb_backend {
36
36
  void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *);
37
37
 
38
38
  /* To find a unique object given a prefix of its oid. The oid given
39
- * must be so that the remaining (GIT_OID_HEXSZ - len)*4 bits are 0s.
39
+ * must be so that the remaining (GIT_OID_SHA1_HEXSIZE - len)*4 bits are 0s.
40
40
  */
41
41
  int GIT_CALLBACK(read_prefix)(
42
42
  git_oid *, void **, size_t *, git_object_t *,
@@ -57,6 +57,18 @@ struct git_transport {
57
57
  unsigned int *capabilities,
58
58
  git_transport *transport);
59
59
 
60
+ #ifdef GIT_EXPERIMENTAL_SHA256
61
+ /**
62
+ * Gets the object type for the remote repository.
63
+ *
64
+ * This function may be called after a successful call to
65
+ * `connect()`.
66
+ */
67
+ int GIT_CALLBACK(oid_type)(
68
+ git_oid_t *object_type,
69
+ git_transport *transport);
70
+ #endif
71
+
60
72
  /**
61
73
  * Get the list of available references in the remote repository.
62
74
  *