rugged 0.17.0.b6 → 0.17.0.b7

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 (158) hide show
  1. data/README.md +3 -3
  2. data/Rakefile +3 -1
  3. data/ext/rugged/rugged.c +30 -0
  4. data/ext/rugged/rugged.h +9 -0
  5. data/ext/rugged/rugged_branch.c +306 -0
  6. data/ext/rugged/rugged_config.c +16 -13
  7. data/ext/rugged/rugged_index.c +25 -0
  8. data/ext/rugged/rugged_object.c +6 -2
  9. data/ext/rugged/rugged_reference.c +11 -18
  10. data/ext/rugged/rugged_revwalk.c +1 -1
  11. data/lib/rugged.rb +1 -0
  12. data/lib/rugged/branch.rb +28 -0
  13. data/lib/rugged/commit.rb +5 -5
  14. data/lib/rugged/repository.rb +32 -7
  15. data/lib/rugged/tag.rb +5 -1
  16. data/lib/rugged/version.rb +1 -1
  17. data/test/branch_test.rb +227 -0
  18. data/test/config_test.rb +1 -1
  19. data/test/fixtures/testrepo.git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
  20. data/test/fixtures/testrepo.git/objects/a3/e05719b428a2d0ed7a55c4ce53dcc5768c6d5e +0 -0
  21. data/test/index_test.rb +31 -0
  22. data/test/index_test.rb~ +218 -0
  23. data/test/lib_test.rb +22 -0
  24. data/test/reference_test.rb +5 -3
  25. data/vendor/libgit2/Makefile.embed +1 -1
  26. data/vendor/libgit2/include/git2.h +1 -0
  27. data/vendor/libgit2/include/git2/branch.h +17 -13
  28. data/vendor/libgit2/include/git2/checkout.h +83 -22
  29. data/vendor/libgit2/include/git2/clone.h +6 -3
  30. data/vendor/libgit2/include/git2/common.h +1 -8
  31. data/vendor/libgit2/include/git2/config.h +185 -26
  32. data/vendor/libgit2/include/git2/diff.h +229 -17
  33. data/vendor/libgit2/include/git2/errors.h +39 -1
  34. data/vendor/libgit2/include/git2/ignore.h +6 -3
  35. data/vendor/libgit2/include/git2/indexer.h +1 -0
  36. data/vendor/libgit2/include/git2/merge.h +1 -1
  37. data/vendor/libgit2/include/git2/object.h +7 -4
  38. data/vendor/libgit2/include/git2/odb.h +4 -2
  39. data/vendor/libgit2/include/git2/odb_backend.h +6 -0
  40. data/vendor/libgit2/include/git2/oid.h +2 -0
  41. data/vendor/libgit2/include/git2/pack.h +89 -0
  42. data/vendor/libgit2/include/git2/refs.h +88 -0
  43. data/vendor/libgit2/include/git2/refspec.h +0 -8
  44. data/vendor/libgit2/include/git2/remote.h +34 -1
  45. data/vendor/libgit2/include/git2/repository.h +238 -6
  46. data/vendor/libgit2/include/git2/reset.h +4 -1
  47. data/vendor/libgit2/include/git2/revwalk.h +1 -1
  48. data/vendor/libgit2/include/git2/status.h +19 -14
  49. data/vendor/libgit2/include/git2/strarray.h +54 -0
  50. data/vendor/libgit2/include/git2/submodule.h +451 -45
  51. data/vendor/libgit2/include/git2/tag.h +16 -0
  52. data/vendor/libgit2/include/git2/tree.h +2 -2
  53. data/vendor/libgit2/include/git2/types.h +4 -0
  54. data/vendor/libgit2/src/amiga/map.c +4 -7
  55. data/vendor/libgit2/src/attr.c +21 -13
  56. data/vendor/libgit2/src/attr.h +3 -1
  57. data/vendor/libgit2/src/attr_file.c +14 -14
  58. data/vendor/libgit2/src/attr_file.h +6 -5
  59. data/vendor/libgit2/src/blob.c +22 -12
  60. data/vendor/libgit2/src/branch.c +62 -66
  61. data/vendor/libgit2/src/buffer.c +63 -14
  62. data/vendor/libgit2/src/buffer.h +4 -0
  63. data/vendor/libgit2/src/cache.c +5 -4
  64. data/vendor/libgit2/src/checkout.c +381 -159
  65. data/vendor/libgit2/src/clone.c +221 -94
  66. data/vendor/libgit2/src/common.h +13 -3
  67. data/vendor/libgit2/src/compress.c +53 -0
  68. data/vendor/libgit2/src/compress.h +16 -0
  69. data/vendor/libgit2/src/config.c +380 -175
  70. data/vendor/libgit2/src/config.h +2 -5
  71. data/vendor/libgit2/src/config_file.c +63 -46
  72. data/vendor/libgit2/src/config_file.h +16 -4
  73. data/vendor/libgit2/src/crlf.c +4 -3
  74. data/vendor/libgit2/src/delta.c +491 -0
  75. data/vendor/libgit2/src/delta.h +112 -0
  76. data/vendor/libgit2/src/diff.c +310 -67
  77. data/vendor/libgit2/src/diff.h +10 -1
  78. data/vendor/libgit2/src/diff_output.c +1030 -337
  79. data/vendor/libgit2/src/diff_output.h +86 -0
  80. data/vendor/libgit2/src/errors.c +10 -1
  81. data/vendor/libgit2/src/fetch.c +108 -24
  82. data/vendor/libgit2/src/filebuf.c +8 -2
  83. data/vendor/libgit2/src/fileops.c +342 -177
  84. data/vendor/libgit2/src/fileops.h +84 -7
  85. data/vendor/libgit2/src/filter.c +0 -35
  86. data/vendor/libgit2/src/filter.h +0 -12
  87. data/vendor/libgit2/src/{compat/fnmatch.c → fnmatch.c} +16 -4
  88. data/vendor/libgit2/src/{compat/fnmatch.h → fnmatch.h} +4 -3
  89. data/vendor/libgit2/src/global.c +4 -0
  90. data/vendor/libgit2/src/ignore.c +122 -23
  91. data/vendor/libgit2/src/ignore.h +1 -0
  92. data/vendor/libgit2/src/index.c +56 -10
  93. data/vendor/libgit2/src/index.h +2 -0
  94. data/vendor/libgit2/src/indexer.c +8 -9
  95. data/vendor/libgit2/src/iterator.c +244 -31
  96. data/vendor/libgit2/src/iterator.h +30 -1
  97. data/vendor/libgit2/src/message.c +1 -1
  98. data/vendor/libgit2/src/netops.c +44 -4
  99. data/vendor/libgit2/src/object.c +80 -69
  100. data/vendor/libgit2/src/object.h +39 -0
  101. data/vendor/libgit2/src/odb.c +79 -15
  102. data/vendor/libgit2/src/odb.h +20 -5
  103. data/vendor/libgit2/src/odb_pack.c +65 -33
  104. data/vendor/libgit2/src/oid.c +0 -3
  105. data/vendor/libgit2/src/pack-objects.c +1315 -0
  106. data/vendor/libgit2/src/pack-objects.h +87 -0
  107. data/vendor/libgit2/src/pack.c +36 -12
  108. data/vendor/libgit2/src/pack.h +1 -0
  109. data/vendor/libgit2/src/path.c +42 -9
  110. data/vendor/libgit2/src/path.h +14 -0
  111. data/vendor/libgit2/src/pkt.c +52 -2
  112. data/vendor/libgit2/src/pkt.h +10 -0
  113. data/vendor/libgit2/src/pool.h +11 -0
  114. data/vendor/libgit2/src/posix.h +8 -0
  115. data/vendor/libgit2/src/protocol.c +24 -2
  116. data/vendor/libgit2/src/protocol.h +4 -0
  117. data/vendor/libgit2/src/reflog.c +1 -1
  118. data/vendor/libgit2/src/refs.c +292 -124
  119. data/vendor/libgit2/src/refs.h +4 -2
  120. data/vendor/libgit2/src/refspec.c +117 -19
  121. data/vendor/libgit2/src/refspec.h +19 -0
  122. data/vendor/libgit2/src/remote.c +152 -48
  123. data/vendor/libgit2/src/remote.h +4 -1
  124. data/vendor/libgit2/src/repo_template.h +58 -0
  125. data/vendor/libgit2/src/repository.c +594 -179
  126. data/vendor/libgit2/src/repository.h +23 -22
  127. data/vendor/libgit2/src/reset.c +71 -29
  128. data/vendor/libgit2/src/revparse.c +26 -17
  129. data/vendor/libgit2/src/revwalk.c +36 -19
  130. data/vendor/libgit2/src/sha1.h +7 -0
  131. data/vendor/libgit2/src/{sha1.c → sha1/sha1.c} +0 -0
  132. data/vendor/libgit2/src/signature.c +12 -10
  133. data/vendor/libgit2/src/status.c +52 -6
  134. data/vendor/libgit2/src/submodule.c +1363 -255
  135. data/vendor/libgit2/src/submodule.h +102 -0
  136. data/vendor/libgit2/src/tag.c +42 -26
  137. data/vendor/libgit2/src/thread-utils.h +7 -7
  138. data/vendor/libgit2/src/transport.h +15 -1
  139. data/vendor/libgit2/src/transports/git.c +1 -1
  140. data/vendor/libgit2/src/transports/http.c +197 -36
  141. data/vendor/libgit2/src/tree.c +3 -3
  142. data/vendor/libgit2/src/unix/map.c +2 -0
  143. data/vendor/libgit2/src/unix/posix.h +1 -8
  144. data/vendor/libgit2/src/util.c +6 -1
  145. data/vendor/libgit2/src/util.h +7 -0
  146. data/vendor/libgit2/src/vector.c +16 -0
  147. data/vendor/libgit2/src/vector.h +1 -0
  148. data/vendor/libgit2/src/win32/dir.c +8 -21
  149. data/vendor/libgit2/src/win32/findfile.c +149 -0
  150. data/vendor/libgit2/src/win32/findfile.h +23 -0
  151. data/vendor/libgit2/src/win32/posix.h +3 -7
  152. data/vendor/libgit2/src/win32/posix_w32.c +44 -102
  153. data/vendor/libgit2/src/win32/pthread.c +68 -0
  154. data/vendor/libgit2/src/win32/pthread.h +7 -0
  155. data/vendor/libgit2/src/win32/utf-conv.c +60 -71
  156. data/vendor/libgit2/src/win32/utf-conv.h +4 -3
  157. metadata +70 -71
  158. data/vendor/libgit2/include/git2/windows.h +0 -59
@@ -29,9 +29,12 @@ GIT_BEGIN_DECL
29
29
  * @param out pointer that will receive the resulting repository object
30
30
  * @param origin_url repository to clone from
31
31
  * @param workdir_path local directory to clone to
32
- * @param fetch_stats pointer to structure that receives fetch progress information (may be NULL)
33
- * @param checkout_opts options for the checkout step (may be NULL)
34
- * @return 0 on success, GIT_ERROR otherwise (use giterr_last for information about the error)
32
+ * @param fetch_stats pointer to structure that receives fetch progress
33
+ * information (may be NULL)
34
+ * @param checkout_opts options for the checkout step. If NULL, no checkout
35
+ * is performed
36
+ * @return 0 on success, GIT_ERROR otherwise (use giterr_last for information
37
+ * about the error)
35
38
  */
36
39
  GIT_EXTERN(int) git_clone(git_repository **out,
37
40
  const char *origin_url,
@@ -85,14 +85,6 @@ GIT_BEGIN_DECL
85
85
  */
86
86
  #define GIT_PATH_MAX 4096
87
87
 
88
- typedef struct {
89
- char **strings;
90
- size_t count;
91
- } git_strarray;
92
-
93
- GIT_EXTERN(void) git_strarray_free(git_strarray *array);
94
- GIT_EXTERN(int) git_strarray_copy(git_strarray *tgt, const git_strarray *src);
95
-
96
88
  /**
97
89
  * Return the version of the libgit2 library
98
90
  * being currently used.
@@ -128,4 +120,5 @@ GIT_EXTERN(int) git_libgit2_capabilities(void);
128
120
 
129
121
  /** @} */
130
122
  GIT_END_DECL
123
+
131
124
  #endif
@@ -19,6 +19,28 @@
19
19
  */
20
20
  GIT_BEGIN_DECL
21
21
 
22
+ /**
23
+ * Priority level of a config file.
24
+ * These priority levels correspond to the natural escalation logic
25
+ * (from higher to lower) when searching for config entries in git.git.
26
+ *
27
+ * git_config_open_default() and git_repository_config() honor those
28
+ * priority levels as well.
29
+ */
30
+ enum {
31
+ GIT_CONFIG_LEVEL_SYSTEM = 1, /**< System-wide configuration file. */
32
+ GIT_CONFIG_LEVEL_XDG = 2, /**< XDG compatible configuration file (.config/git/config). */
33
+ GIT_CONFIG_LEVEL_GLOBAL = 3, /**< User-specific configuration file, also called Global configuration file. */
34
+ GIT_CONFIG_LEVEL_LOCAL = 4, /**< Repository specific configuration file. */
35
+ GIT_CONFIG_HIGHEST_LEVEL = -1, /**< Represents the highest level of a config file. */
36
+ };
37
+
38
+ typedef struct {
39
+ const char *name;
40
+ const char *value;
41
+ unsigned int level;
42
+ } git_config_entry;
43
+
22
44
  /**
23
45
  * Generic backend that implements the interface to
24
46
  * access a configuration file
@@ -27,13 +49,13 @@ struct git_config_file {
27
49
  struct git_config *cfg;
28
50
 
29
51
  /* Open means open the file/database and parse if necessary */
30
- int (*open)(struct git_config_file *);
31
- int (*get)(struct git_config_file *, const char *key, const char **value);
32
- int (*get_multivar)(struct git_config_file *, const char *key, const char *regexp, int (*fn)(const char *, void *), void *data);
52
+ int (*open)(struct git_config_file *, unsigned int level);
53
+ int (*get)(struct git_config_file *, const char *key, const git_config_entry **entry);
54
+ int (*get_multivar)(struct git_config_file *, const char *key, const char *regexp, int (*fn)(const git_config_entry *, void *), void *data);
33
55
  int (*set)(struct git_config_file *, const char *key, const char *value);
34
56
  int (*set_multivar)(git_config_file *cfg, const char *name, const char *regexp, const char *value);
35
57
  int (*del)(struct git_config_file *, const char *key);
36
- int (*foreach)(struct git_config_file *, const char *, int (*fn)(const char *, const char *, void *), void *data);
58
+ int (*foreach)(struct git_config_file *, const char *, int (*fn)(const git_config_entry *, void *), void *data);
37
59
  void (*free)(struct git_config_file *);
38
60
  };
39
61
 
@@ -61,12 +83,32 @@ typedef struct {
61
83
  * may be used on any `git_config` call to load the
62
84
  * global configuration file.
63
85
  *
86
+ * This method will not guess the path to the xdg compatible
87
+ * config file (.config/git/config).
88
+ *
64
89
  * @param global_config_path Buffer of GIT_PATH_MAX length to store the path
65
90
  * @return 0 if a global configuration file has been
66
91
  * found. Its path will be stored in `buffer`.
67
92
  */
68
93
  GIT_EXTERN(int) git_config_find_global(char *global_config_path, size_t length);
69
94
 
95
+ /**
96
+ * Locate the path to the global xdg compatible configuration file
97
+ *
98
+ * The xdg compatible configuration file is usually
99
+ * located in `$HOME/.config/git/config`.
100
+ *
101
+ * This method will try to guess the full path to that
102
+ * file, if the file exists. The returned path
103
+ * may be used on any `git_config` call to load the
104
+ * xdg compatible configuration file.
105
+ *
106
+ * @param xdg_config_path Buffer of GIT_PATH_MAX length to store the path
107
+ * @return 0 if a xdg compatible configuration file has been
108
+ * found. Its path will be stored in `buffer`.
109
+ */
110
+ GIT_EXTERN(int) git_config_find_xdg(char *xdg_config_path, size_t length);
111
+
70
112
  /**
71
113
  * Locate the path to the system configuration file
72
114
  *
@@ -80,15 +122,16 @@ GIT_EXTERN(int) git_config_find_global(char *global_config_path, size_t length);
80
122
  GIT_EXTERN(int) git_config_find_system(char *system_config_path, size_t length);
81
123
 
82
124
  /**
83
- * Open the global configuration file
125
+ * Open the global, XDG and system configuration files
84
126
  *
85
- * Utility wrapper that calls `git_config_find_global`
86
- * and opens the located file, if it exists.
127
+ * Utility wrapper that finds the global, XDG and system configuration files
128
+ * and opens them into a single prioritized config object that can be
129
+ * used when accessing default config data outside a repository.
87
130
  *
88
131
  * @param out Pointer to store the config instance
89
132
  * @return 0 or an error code
90
133
  */
91
- GIT_EXTERN(int) git_config_open_global(git_config **out);
134
+ GIT_EXTERN(int) git_config_open_default(git_config **out);
92
135
 
93
136
  /**
94
137
  * Create a configuration file backend for ondisk files
@@ -122,14 +165,21 @@ GIT_EXTERN(int) git_config_new(git_config **out);
122
165
  *
123
166
  * Further queries on this config object will access each
124
167
  * of the config file instances in order (instances with
125
- * a higher priority will be accessed first).
168
+ * a higher priority level will be accessed first).
126
169
  *
127
170
  * @param cfg the configuration to add the file to
128
171
  * @param file the configuration file (backend) to add
129
- * @param priority the priority the backend should have
130
- * @return 0 or an error code
172
+ * @param level the priority level of the backend
173
+ * @param force if a config file already exists for the given
174
+ * priority level, replace it
175
+ * @return 0 on success, GIT_EEXISTS when adding more than one file
176
+ * for a given priority level (and force_replace set to 0), or error code
131
177
  */
132
- GIT_EXTERN(int) git_config_add_file(git_config *cfg, git_config_file *file, int priority);
178
+ GIT_EXTERN(int) git_config_add_file(
179
+ git_config *cfg,
180
+ git_config_file *file,
181
+ unsigned int level,
182
+ int force);
133
183
 
134
184
  /**
135
185
  * Add an on-disk config file instance to an existing config
@@ -143,14 +193,21 @@ GIT_EXTERN(int) git_config_add_file(git_config *cfg, git_config_file *file, int
143
193
  *
144
194
  * Further queries on this config object will access each
145
195
  * of the config file instances in order (instances with
146
- * a higher priority will be accessed first).
196
+ * a higher priority level will be accessed first).
147
197
  *
148
198
  * @param cfg the configuration to add the file to
149
199
  * @param path path to the configuration file (backend) to add
150
- * @param priority the priority the backend should have
151
- * @return 0 or an error code
200
+ * @param level the priority level of the backend
201
+ * @param force if a config file already exists for the given
202
+ * priority level, replace it
203
+ * @return 0 on success, GIT_EEXISTS when adding more than one file
204
+ * for a given priority level (and force_replace set to 0), or error code
152
205
  */
153
- GIT_EXTERN(int) git_config_add_file_ondisk(git_config *cfg, const char *path, int priority);
206
+ GIT_EXTERN(int) git_config_add_file_ondisk(
207
+ git_config *cfg,
208
+ const char *path,
209
+ unsigned int level,
210
+ int force);
154
211
 
155
212
 
156
213
  /**
@@ -167,6 +224,24 @@ GIT_EXTERN(int) git_config_add_file_ondisk(git_config *cfg, const char *path, in
167
224
  */
168
225
  GIT_EXTERN(int) git_config_open_ondisk(git_config **cfg, const char *path);
169
226
 
227
+ /**
228
+ * Build a single-level focused config object from a multi-level one.
229
+ *
230
+ * The returned config object can be used to perform get/set/delete operations
231
+ * on a single specific level.
232
+ *
233
+ * Getting several times the same level from the same parent multi-level config
234
+ * will return different config instances, but containing the same config_file
235
+ * instance.
236
+ *
237
+ * @return 0, GIT_ENOTFOUND if the passed level cannot be found in the
238
+ * multi-level parent config, or an error code
239
+ */
240
+ GIT_EXTERN(int) git_config_open_level(
241
+ git_config **cfg_out,
242
+ git_config *cfg_parent,
243
+ unsigned int level);
244
+
170
245
  /**
171
246
  * Free the configuration and its associated memory and files
172
247
  *
@@ -174,9 +249,26 @@ GIT_EXTERN(int) git_config_open_ondisk(git_config **cfg, const char *path);
174
249
  */
175
250
  GIT_EXTERN(void) git_config_free(git_config *cfg);
176
251
 
252
+ /**
253
+ * Get the git_config_entry of a config variable.
254
+ *
255
+ * The git_config_entry is owned by the config and should not be freed by the
256
+ * user.
257
+
258
+ * @param out pointer to the variable git_config_entry
259
+ * @param cfg where to look for the variable
260
+ * @param name the variable's name
261
+ * @return 0 or an error code
262
+ */
263
+ GIT_EXTERN(int) git_config_get_config_entry(const git_config_entry **out, git_config *cfg, const char *name);
264
+
177
265
  /**
178
266
  * Get the value of an integer config variable.
179
267
  *
268
+ * All config files will be looked into, in the order of their
269
+ * defined level. A higher level means a higher priority. The
270
+ * first occurence of the variable will be returned here.
271
+ *
180
272
  * @param out pointer to the variable where the value should be stored
181
273
  * @param cfg where to look for the variable
182
274
  * @param name the variable's name
@@ -187,6 +279,10 @@ GIT_EXTERN(int) git_config_get_int32(int32_t *out, git_config *cfg, const char *
187
279
  /**
188
280
  * Get the value of a long integer config variable.
189
281
  *
282
+ * All config files will be looked into, in the order of their
283
+ * defined level. A higher level means a higher priority. The
284
+ * first occurence of the variable will be returned here.
285
+ *
190
286
  * @param out pointer to the variable where the value should be stored
191
287
  * @param cfg where to look for the variable
192
288
  * @param name the variable's name
@@ -200,6 +296,10 @@ GIT_EXTERN(int) git_config_get_int64(int64_t *out, git_config *cfg, const char *
200
296
  * This function uses the usual C convention of 0 being false and
201
297
  * anything else true.
202
298
  *
299
+ * All config files will be looked into, in the order of their
300
+ * defined level. A higher level means a higher priority. The
301
+ * first occurence of the variable will be returned here.
302
+ *
203
303
  * @param out pointer to the variable where the value should be stored
204
304
  * @param cfg where to look for the variable
205
305
  * @param name the variable's name
@@ -213,6 +313,10 @@ GIT_EXTERN(int) git_config_get_bool(int *out, git_config *cfg, const char *name)
213
313
  * The string is owned by the variable and should not be freed by the
214
314
  * user.
215
315
  *
316
+ * All config files will be looked into, in the order of their
317
+ * defined level. A higher level means a higher priority. The
318
+ * first occurence of the variable will be returned here.
319
+ *
216
320
  * @param out pointer to the variable's value
217
321
  * @param cfg where to look for the variable
218
322
  * @param name the variable's name
@@ -232,10 +336,11 @@ GIT_EXTERN(int) git_config_get_string(const char **out, git_config *cfg, const c
232
336
  * @param fn the function to be called on each value of the variable
233
337
  * @param data opaque pointer to pass to the callback
234
338
  */
235
- GIT_EXTERN(int) git_config_get_multivar(git_config *cfg, const char *name, const char *regexp, int (*fn)(const char *, void *), void *data);
339
+ GIT_EXTERN(int) git_config_get_multivar(git_config *cfg, const char *name, const char *regexp, int (*fn)(const git_config_entry *, void *), void *data);
236
340
 
237
341
  /**
238
- * Set the value of an integer config variable.
342
+ * Set the value of an integer config variable in the config file
343
+ * with the highest level (usually the local one).
239
344
  *
240
345
  * @param cfg where to look for the variable
241
346
  * @param name the variable's name
@@ -245,7 +350,8 @@ GIT_EXTERN(int) git_config_get_multivar(git_config *cfg, const char *name, const
245
350
  GIT_EXTERN(int) git_config_set_int32(git_config *cfg, const char *name, int32_t value);
246
351
 
247
352
  /**
248
- * Set the value of a long integer config variable.
353
+ * Set the value of a long integer config variable in the config file
354
+ * with the highest level (usually the local one).
249
355
  *
250
356
  * @param cfg where to look for the variable
251
357
  * @param name the variable's name
@@ -255,7 +361,8 @@ GIT_EXTERN(int) git_config_set_int32(git_config *cfg, const char *name, int32_t
255
361
  GIT_EXTERN(int) git_config_set_int64(git_config *cfg, const char *name, int64_t value);
256
362
 
257
363
  /**
258
- * Set the value of a boolean config variable.
364
+ * Set the value of a boolean config variable in the config file
365
+ * with the highest level (usually the local one).
259
366
  *
260
367
  * @param cfg where to look for the variable
261
368
  * @param name the variable's name
@@ -265,7 +372,8 @@ GIT_EXTERN(int) git_config_set_int64(git_config *cfg, const char *name, int64_t
265
372
  GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value);
266
373
 
267
374
  /**
268
- * Set the value of a string config variable.
375
+ * Set the value of a string config variable in the config file
376
+ * with the highest level (usually the local one).
269
377
  *
270
378
  * A copy of the string is made and the user is free to use it
271
379
  * afterwards.
@@ -277,9 +385,8 @@ GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value
277
385
  */
278
386
  GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const char *value);
279
387
 
280
-
281
388
  /**
282
- * Set a multivar
389
+ * Set a multivar in the local config file.
283
390
  *
284
391
  * @param cfg where to look for the variable
285
392
  * @param name the variable's name
@@ -289,7 +396,8 @@ GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const c
289
396
  GIT_EXTERN(int) git_config_set_multivar(git_config *cfg, const char *name, const char *regexp, const char *value);
290
397
 
291
398
  /**
292
- * Delete a config variable
399
+ * Delete a config variable from the config file
400
+ * with the highest level (usually the local one).
293
401
  *
294
402
  * @param cfg the configuration
295
403
  * @param name the variable to delete
@@ -311,7 +419,7 @@ GIT_EXTERN(int) git_config_delete(git_config *cfg, const char *name);
311
419
  */
312
420
  GIT_EXTERN(int) git_config_foreach(
313
421
  git_config *cfg,
314
- int (*callback)(const char *var_name, const char *value, void *payload),
422
+ int (*callback)(const git_config_entry *, void *payload),
315
423
  void *payload);
316
424
 
317
425
  /**
@@ -330,7 +438,7 @@ GIT_EXTERN(int) git_config_foreach(
330
438
  GIT_EXTERN(int) git_config_foreach_match(
331
439
  git_config *cfg,
332
440
  const char *regexp,
333
- int (*callback)(const char *var_name, const char *value, void *payload),
441
+ int (*callback)(const git_config_entry *entry, void *payload),
334
442
  void *payload);
335
443
 
336
444
  /**
@@ -369,6 +477,57 @@ GIT_EXTERN(int) git_config_foreach_match(
369
477
  */
370
478
  GIT_EXTERN(int) git_config_get_mapped(int *out, git_config *cfg, const char *name, git_cvar_map *maps, size_t map_n);
371
479
 
480
+ /**
481
+ * Maps a string value to an integer constant
482
+ *
483
+ * @param out place to store the result of the parsing
484
+ * @param maps array of `git_cvar_map` objects specifying the possible mappings
485
+ * @param map_n number of mapping objects in `maps`
486
+ * @param value value to parse
487
+ */
488
+ GIT_EXTERN(int) git_config_lookup_map_value(
489
+ int *out,
490
+ git_cvar_map *maps,
491
+ size_t map_n,
492
+ const char *value);
493
+
494
+ /**
495
+ * Parse a string value as a bool.
496
+ *
497
+ * Valid values for true are: 'true', 'yes', 'on', 1 or any
498
+ * number different from 0
499
+ * Valid values for false are: 'false', 'no', 'off', 0
500
+ *
501
+ * @param out place to store the result of the parsing
502
+ * @param value value to parse
503
+ */
504
+ GIT_EXTERN(int) git_config_parse_bool(int *out, const char *value);
505
+
506
+ /**
507
+ * Parse a string value as an int64.
508
+ *
509
+ * An optional value suffix of 'k', 'm', or 'g' will
510
+ * cause the value to be multiplied by 1024, 1048576,
511
+ * or 1073741824 prior to output.
512
+ *
513
+ * @param out place to store the result of the parsing
514
+ * @param value value to parse
515
+ */
516
+ GIT_EXTERN(int) git_config_parse_int64(int64_t *out, const char *value);
517
+
518
+ /**
519
+ * Parse a string value as an int32.
520
+ *
521
+ * An optional value suffix of 'k', 'm', or 'g' will
522
+ * cause the value to be multiplied by 1024, 1048576,
523
+ * or 1073741824 prior to output.
524
+ *
525
+ * @param out place to store the result of the parsing
526
+ * @param value value to parse
527
+ */
528
+ GIT_EXTERN(int) git_config_parse_int32(int32_t *out, const char *value);
529
+
530
+
372
531
  /** @} */
373
532
  GIT_END_DECL
374
533
  #endif
@@ -34,19 +34,58 @@ GIT_BEGIN_DECL
34
34
  * in via the `flags` value in the `git_diff_options`.
35
35
  */
36
36
  enum {
37
+ /** Normal diff, the default */
37
38
  GIT_DIFF_NORMAL = 0,
39
+ /** Reverse the sides of the diff */
38
40
  GIT_DIFF_REVERSE = (1 << 0),
41
+ /** Treat all files as text, disabling binary attributes & detection */
39
42
  GIT_DIFF_FORCE_TEXT = (1 << 1),
43
+ /** Ignore all whitespace */
40
44
  GIT_DIFF_IGNORE_WHITESPACE = (1 << 2),
45
+ /** Ignore changes in amount of whitespace */
41
46
  GIT_DIFF_IGNORE_WHITESPACE_CHANGE = (1 << 3),
47
+ /** Ignore whitespace at end of line */
42
48
  GIT_DIFF_IGNORE_WHITESPACE_EOL = (1 << 4),
49
+ /** Exclude submodules from the diff completely */
43
50
  GIT_DIFF_IGNORE_SUBMODULES = (1 << 5),
51
+ /** Use the "patience diff" algorithm (currently unimplemented) */
44
52
  GIT_DIFF_PATIENCE = (1 << 6),
53
+ /** Include ignored files in the diff list */
45
54
  GIT_DIFF_INCLUDE_IGNORED = (1 << 7),
55
+ /** Include untracked files in the diff list */
46
56
  GIT_DIFF_INCLUDE_UNTRACKED = (1 << 8),
57
+ /** Include unmodified files in the diff list */
47
58
  GIT_DIFF_INCLUDE_UNMODIFIED = (1 << 9),
59
+ /** Even with the GIT_DIFF_INCLUDE_UNTRACKED flag, when an untracked
60
+ * directory is found, only a single entry for the directory is added
61
+ * to the diff list; with this flag, all files under the directory will
62
+ * be included, too.
63
+ */
48
64
  GIT_DIFF_RECURSE_UNTRACKED_DIRS = (1 << 10),
65
+ /** If the pathspec is set in the diff options, this flags means to
66
+ * apply it as an exact match instead of as an fnmatch pattern.
67
+ */
49
68
  GIT_DIFF_DISABLE_PATHSPEC_MATCH = (1 << 11),
69
+ /** Use case insensitive filename comparisons */
70
+ GIT_DIFF_DELTAS_ARE_ICASE = (1 << 12),
71
+ /** When generating patch text, include the content of untracked files */
72
+ GIT_DIFF_INCLUDE_UNTRACKED_CONTENT = (1 << 13),
73
+ /** Disable updating of the `binary` flag in delta records. This is
74
+ * useful when iterating over a diff if you don't need hunk and data
75
+ * callbacks and want to avoid having to load file completely.
76
+ */
77
+ GIT_DIFF_SKIP_BINARY_CHECK = (1 << 14),
78
+ /** Normally, a type change between files will be converted into a
79
+ * DELETED record for the old and an ADDED record for the new; this
80
+ * options enabled the generation of TYPECHANGE delta records.
81
+ */
82
+ GIT_DIFF_INCLUDE_TYPECHANGE = (1 << 15),
83
+ /** Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still
84
+ * generally show as a DELETED blob. This flag tries to correctly
85
+ * label blob->tree transitions as TYPECHANGE records with new_file's
86
+ * mode set to tree. Note: the tree SHA will not be available.
87
+ */
88
+ GIT_DIFF_INCLUDE_TYPECHANGE_TREES = (1 << 16),
50
89
  };
51
90
 
52
91
  /**
@@ -56,7 +95,13 @@ enum {
56
95
  * values. Similarly, passing NULL for the options structure will
57
96
  * give the defaults. The default values are marked below.
58
97
  *
59
- * @todo Most of the parameters here are not actually supported at this time.
98
+ * - flags: a combination of the GIT_DIFF_... values above
99
+ * - context_lines: number of lines of context to show around diffs
100
+ * - interhunk_lines: min lines between diff hunks to merge them
101
+ * - old_prefix: "directory" to prefix to old file names (default "a")
102
+ * - new_prefix: "directory" to prefix to new file names (default "b")
103
+ * - pathspec: array of paths / patterns to constrain diff
104
+ * - max_size: maximum blob size to diff, above this treated as binary
60
105
  */
61
106
  typedef struct {
62
107
  uint32_t flags; /**< defaults to GIT_DIFF_NORMAL */
@@ -65,6 +110,7 @@ typedef struct {
65
110
  char *old_prefix; /**< defaults to "a" */
66
111
  char *new_prefix; /**< defaults to "b" */
67
112
  git_strarray pathspec; /**< defaults to show all paths */
113
+ git_off_t max_size; /**< defaults to 512Mb */
68
114
  } git_diff_options;
69
115
 
70
116
  /**
@@ -72,13 +118,20 @@ typedef struct {
72
118
  */
73
119
  typedef struct git_diff_list git_diff_list;
74
120
 
121
+ /**
122
+ * Flags that can be set for the file on side of a diff.
123
+ *
124
+ * Most of the flags are just for internal consumption by libgit2,
125
+ * but some of them may be interesting to external users.
126
+ */
75
127
  enum {
76
- GIT_DIFF_FILE_VALID_OID = (1 << 0),
77
- GIT_DIFF_FILE_FREE_PATH = (1 << 1),
78
- GIT_DIFF_FILE_BINARY = (1 << 2),
79
- GIT_DIFF_FILE_NOT_BINARY = (1 << 3),
80
- GIT_DIFF_FILE_FREE_DATA = (1 << 4),
81
- GIT_DIFF_FILE_UNMAP_DATA = (1 << 5)
128
+ GIT_DIFF_FILE_VALID_OID = (1 << 0), /** `oid` value is known correct */
129
+ GIT_DIFF_FILE_FREE_PATH = (1 << 1), /** `path` is allocated memory */
130
+ GIT_DIFF_FILE_BINARY = (1 << 2), /** should be considered binary data */
131
+ GIT_DIFF_FILE_NOT_BINARY = (1 << 3), /** should be considered text data */
132
+ GIT_DIFF_FILE_FREE_DATA = (1 << 4), /** internal file data is allocated */
133
+ GIT_DIFF_FILE_UNMAP_DATA = (1 << 5), /** internal file data is mmap'ed */
134
+ GIT_DIFF_FILE_NO_DATA = (1 << 6), /** file data should not be loaded */
82
135
  };
83
136
 
84
137
  /**
@@ -92,7 +145,8 @@ typedef enum {
92
145
  GIT_DELTA_RENAMED = 4,
93
146
  GIT_DELTA_COPIED = 5,
94
147
  GIT_DELTA_IGNORED = 6,
95
- GIT_DELTA_UNTRACKED = 7
148
+ GIT_DELTA_UNTRACKED = 7,
149
+ GIT_DELTA_TYPECHANGE = 8,
96
150
  } git_delta_t;
97
151
 
98
152
  /**
@@ -100,7 +154,7 @@ typedef enum {
100
154
  */
101
155
  typedef struct {
102
156
  git_oid oid;
103
- char *path;
157
+ const char *path;
104
158
  git_off_t size;
105
159
  unsigned int flags;
106
160
  uint16_t mode;
@@ -132,7 +186,7 @@ typedef struct {
132
186
  */
133
187
  typedef int (*git_diff_file_fn)(
134
188
  void *cb_data,
135
- git_diff_delta *delta,
189
+ const git_diff_delta *delta,
136
190
  float progress);
137
191
 
138
192
  /**
@@ -150,8 +204,8 @@ typedef struct {
150
204
  */
151
205
  typedef int (*git_diff_hunk_fn)(
152
206
  void *cb_data,
153
- git_diff_delta *delta,
154
- git_diff_range *range,
207
+ const git_diff_delta *delta,
208
+ const git_diff_range *range,
155
209
  const char *header,
156
210
  size_t header_len);
157
211
 
@@ -169,7 +223,7 @@ enum {
169
223
  GIT_DIFF_LINE_CONTEXT = ' ',
170
224
  GIT_DIFF_LINE_ADDITION = '+',
171
225
  GIT_DIFF_LINE_DELETION = '-',
172
- GIT_DIFF_LINE_ADD_EOFNL = '\n', /**< DEPRECATED */
226
+ GIT_DIFF_LINE_ADD_EOFNL = '\n', /**< Removed line w/o LF & added one with */
173
227
  GIT_DIFF_LINE_DEL_EOFNL = '\0', /**< LF was removed at end of file */
174
228
 
175
229
  /* The following values will only be sent to a `git_diff_data_fn` when
@@ -191,12 +245,21 @@ enum {
191
245
  */
192
246
  typedef int (*git_diff_data_fn)(
193
247
  void *cb_data,
194
- git_diff_delta *delta,
195
- git_diff_range *range,
248
+ const git_diff_delta *delta,
249
+ const git_diff_range *range,
196
250
  char line_origin, /**< GIT_DIFF_LINE_... value from above */
197
251
  const char *content,
198
252
  size_t content_len);
199
253
 
254
+ /**
255
+ * The diff patch is used to store all the text diffs for a delta.
256
+ *
257
+ * You can easily loop over the content of patches and get information about
258
+ * them.
259
+ */
260
+ typedef struct git_diff_patch git_diff_patch;
261
+
262
+
200
263
  /** @name Diff List Generator Functions
201
264
  *
202
265
  * These are the functions you would use to create (or destroy) a
@@ -322,7 +385,7 @@ GIT_EXTERN(int) git_diff_merge(
322
385
  /**@{*/
323
386
 
324
387
  /**
325
- * Iterate over a diff list issuing callbacks.
388
+ * Loop over all deltas in a diff list issuing callbacks.
326
389
  *
327
390
  * This will iterate through all of the files described in a diff. You
328
391
  * should provide a file callback to learn about each file.
@@ -369,6 +432,20 @@ GIT_EXTERN(int) git_diff_print_compact(
369
432
  void *cb_data,
370
433
  git_diff_data_fn print_cb);
371
434
 
435
+ /**
436
+ * Look up the single character abbreviation for a delta status code.
437
+ *
438
+ * When you call `git_diff_print_compact` it prints single letter codes into
439
+ * the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc.
440
+ * It is sometimes convenient to convert a git_delta_t value into these
441
+ * letters for your own purposes. This function does just that. By the
442
+ * way, unmodified will return a space (i.e. ' ').
443
+ *
444
+ * @param delta_t The git_delta_t value to look up
445
+ * @return The single character label for that code
446
+ */
447
+ GIT_EXTERN(char) git_diff_status_char(git_delta_t status);
448
+
372
449
  /**
373
450
  * Iterate over a diff generating text output like "git diff".
374
451
  *
@@ -391,6 +468,141 @@ GIT_EXTERN(int) git_diff_print_patch(
391
468
  void *cb_data,
392
469
  git_diff_data_fn print_cb);
393
470
 
471
+ /**
472
+ * Query how many diff records are there in a diff list.
473
+ *
474
+ * @param diff A git_diff_list generated by one of the above functions
475
+ * @return Count of number of deltas in the list
476
+ */
477
+ GIT_EXTERN(size_t) git_diff_num_deltas(git_diff_list *diff);
478
+
479
+ /**
480
+ * Query how many diff deltas are there in a diff list filtered by type.
481
+ *
482
+ * This works just like `git_diff_entrycount()` with an extra parameter
483
+ * that is a `git_delta_t` and returns just the count of how many deltas
484
+ * match that particular type.
485
+ *
486
+ * @param diff A git_diff_list generated by one of the above functions
487
+ * @param type A git_delta_t value to filter the count
488
+ * @return Count of number of deltas matching delta_t type
489
+ */
490
+ GIT_EXTERN(size_t) git_diff_num_deltas_of_type(
491
+ git_diff_list *diff,
492
+ git_delta_t type);
493
+
494
+ /**
495
+ * Return the diff delta and patch for an entry in the diff list.
496
+ *
497
+ * The `git_diff_patch` is a newly created object contains the text diffs
498
+ * for the delta. You have to call `git_diff_patch_free()` when you are
499
+ * done with it. You can use the patch object to loop over all the hunks
500
+ * and lines in the diff of the one delta.
501
+ *
502
+ * For an unchanged file or a binary file, no `git_diff_patch` will be
503
+ * created, the output will be set to NULL, and the `binary` flag will be
504
+ * set true in the `git_diff_delta` structure.
505
+ *
506
+ * The `git_diff_delta` pointer points to internal data and you do not have
507
+ * to release it when you are done with it. It will go away when the
508
+ * `git_diff_list` and `git_diff_patch` go away.
509
+ *
510
+ * It is okay to pass NULL for either of the output parameters; if you pass
511
+ * NULL for the `git_diff_patch`, then the text diff will not be calculated.
512
+ *
513
+ * @param patch Output parameter for the delta patch object
514
+ * @param delta Output parameter for the delta object
515
+ * @param diff Diff list object
516
+ * @param idx Index into diff list
517
+ * @return 0 on success, other value < 0 on error
518
+ */
519
+ GIT_EXTERN(int) git_diff_get_patch(
520
+ git_diff_patch **patch,
521
+ const git_diff_delta **delta,
522
+ git_diff_list *diff,
523
+ size_t idx);
524
+
525
+ /**
526
+ * Free a git_diff_patch object.
527
+ */
528
+ GIT_EXTERN(void) git_diff_patch_free(
529
+ git_diff_patch *patch);
530
+
531
+ /**
532
+ * Get the delta associated with a patch
533
+ */
534
+ GIT_EXTERN(const git_diff_delta *) git_diff_patch_delta(
535
+ git_diff_patch *patch);
536
+
537
+ /**
538
+ * Get the number of hunks in a patch
539
+ */
540
+ GIT_EXTERN(size_t) git_diff_patch_num_hunks(
541
+ git_diff_patch *patch);
542
+
543
+ /**
544
+ * Get the information about a hunk in a patch
545
+ *
546
+ * Given a patch and a hunk index into the patch, this returns detailed
547
+ * information about that hunk. Any of the output pointers can be passed
548
+ * as NULL if you don't care about that particular piece of information.
549
+ *
550
+ * @param range Output pointer to git_diff_range of hunk
551
+ * @param header Output pointer to header string for hunk. Unlike the
552
+ * content pointer for each line, this will be NUL-terminated
553
+ * @param header_len Output value of characters in header string
554
+ * @param lines_in_hunk Output count of total lines in this hunk
555
+ * @param patch Input pointer to patch object
556
+ * @param hunk_idx Input index of hunk to get information about
557
+ * @return 0 on success, GIT_ENOTFOUND if hunk_idx out of range, <0 on error
558
+ */
559
+ GIT_EXTERN(int) git_diff_patch_get_hunk(
560
+ const git_diff_range **range,
561
+ const char **header,
562
+ size_t *header_len,
563
+ size_t *lines_in_hunk,
564
+ git_diff_patch *patch,
565
+ size_t hunk_idx);
566
+
567
+ /**
568
+ * Get the number of lines in a hunk.
569
+ *
570
+ * @param patch The git_diff_patch object
571
+ * @param hunk_idx Index of the hunk
572
+ * @return Number of lines in hunk or -1 if invalid hunk index
573
+ */
574
+ GIT_EXTERN(int) git_diff_patch_num_lines_in_hunk(
575
+ git_diff_patch *patch,
576
+ size_t hunk_idx);
577
+
578
+ /**
579
+ * Get data about a line in a hunk of a patch.
580
+ *
581
+ * Given a patch, a hunk index, and a line index in the hunk, this
582
+ * will return a lot of details about that line. If you pass a hunk
583
+ * index larger than the number of hunks or a line index larger than
584
+ * the number of lines in the hunk, this will return -1.
585
+ *
586
+ * @param line_origin A GIT_DIFF_LINE constant from above
587
+ * @param content Pointer to content of diff line, not NUL-terminated
588
+ * @param content_len Number of characters in content
589
+ * @param old_lineno Line number in old file or -1 if line is added
590
+ * @param new_lineno Line number in new file or -1 if line is deleted
591
+ * @param patch The patch to look in
592
+ * @param hunk_idx The index of the hunk
593
+ * @param line_of_index The index of the line in the hunk
594
+ * @return 0 on success, <0 on failure
595
+ */
596
+ GIT_EXTERN(int) git_diff_patch_get_line_in_hunk(
597
+ char *line_origin,
598
+ const char **content,
599
+ size_t *content_len,
600
+ int *old_lineno,
601
+ int *new_lineno,
602
+ git_diff_patch *patch,
603
+ size_t hunk_idx,
604
+ size_t line_of_hunk);
605
+
394
606
  /**@}*/
395
607
 
396
608
 
@@ -415,7 +627,7 @@ GIT_EXTERN(int) git_diff_print_patch(
415
627
  GIT_EXTERN(int) git_diff_blobs(
416
628
  git_blob *old_blob,
417
629
  git_blob *new_blob,
418
- git_diff_options *options,
630
+ const git_diff_options *options,
419
631
  void *cb_data,
420
632
  git_diff_file_fn file_cb,
421
633
  git_diff_hunk_fn hunk_cb,