rugged 0.24.6.1 → 0.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/ext/rugged/extconf.rb +9 -2
  4. data/ext/rugged/rugged.c +85 -21
  5. data/ext/rugged/rugged.h +7 -21
  6. data/ext/rugged/rugged_backend.c +3 -20
  7. data/ext/rugged/rugged_blame.c +7 -24
  8. data/ext/rugged/rugged_blob.c +136 -59
  9. data/ext/rugged/rugged_branch.c +3 -20
  10. data/ext/rugged/rugged_branch_collection.c +3 -20
  11. data/ext/rugged/rugged_commit.c +251 -101
  12. data/ext/rugged/rugged_config.c +3 -20
  13. data/ext/rugged/rugged_cred.c +3 -20
  14. data/ext/rugged/rugged_diff.c +3 -20
  15. data/ext/rugged/rugged_diff_delta.c +3 -20
  16. data/ext/rugged/rugged_diff_hunk.c +3 -20
  17. data/ext/rugged/rugged_diff_line.c +3 -20
  18. data/ext/rugged/rugged_index.c +46 -229
  19. data/ext/rugged/rugged_note.c +3 -20
  20. data/ext/rugged/rugged_object.c +3 -20
  21. data/ext/rugged/rugged_patch.c +192 -34
  22. data/ext/rugged/rugged_rebase.c +90 -48
  23. data/ext/rugged/rugged_reference.c +4 -21
  24. data/ext/rugged/rugged_reference_collection.c +3 -20
  25. data/ext/rugged/rugged_remote.c +70 -42
  26. data/ext/rugged/rugged_remote_collection.c +3 -20
  27. data/ext/rugged/rugged_repo.c +50 -59
  28. data/ext/rugged/rugged_revwalk.c +4 -21
  29. data/ext/rugged/rugged_settings.c +3 -20
  30. data/ext/rugged/rugged_signature.c +3 -20
  31. data/ext/rugged/rugged_submodule.c +4 -21
  32. data/ext/rugged/rugged_submodule_collection.c +3 -20
  33. data/ext/rugged/rugged_tag.c +3 -20
  34. data/ext/rugged/rugged_tag_collection.c +3 -20
  35. data/ext/rugged/rugged_tree.c +189 -184
  36. data/lib/rugged/attributes.rb +5 -0
  37. data/lib/rugged/blob.rb +5 -0
  38. data/lib/rugged/branch.rb +6 -1
  39. data/lib/rugged/commit.rb +5 -0
  40. data/lib/rugged/console.rb +5 -0
  41. data/lib/rugged/credentials.rb +5 -0
  42. data/lib/rugged/diff/delta.rb +5 -0
  43. data/lib/rugged/diff/hunk.rb +5 -0
  44. data/lib/rugged/diff/line.rb +5 -0
  45. data/lib/rugged/diff.rb +5 -0
  46. data/lib/rugged/index.rb +120 -0
  47. data/lib/rugged/object.rb +5 -0
  48. data/lib/rugged/patch.rb +5 -0
  49. data/lib/rugged/reference.rb +5 -0
  50. data/lib/rugged/remote.rb +5 -0
  51. data/lib/rugged/repository.rb +9 -4
  52. data/lib/rugged/submodule_collection.rb +5 -0
  53. data/lib/rugged/tag.rb +5 -0
  54. data/lib/rugged/tree.rb +156 -1
  55. data/lib/rugged/version.rb +6 -1
  56. data/lib/rugged/walker.rb +5 -0
  57. data/lib/rugged.rb +5 -0
  58. data/vendor/libgit2/CMakeLists.txt +12 -2
  59. data/vendor/libgit2/include/git2/blob.h +39 -28
  60. data/vendor/libgit2/include/git2/commit.h +76 -0
  61. data/vendor/libgit2/include/git2/common.h +21 -1
  62. data/vendor/libgit2/include/git2/describe.h +5 -2
  63. data/vendor/libgit2/include/git2/diff.h +62 -7
  64. data/vendor/libgit2/include/git2/errors.h +2 -1
  65. data/vendor/libgit2/include/git2/index.h +25 -0
  66. data/vendor/libgit2/include/git2/merge.h +10 -1
  67. data/vendor/libgit2/include/git2/odb.h +47 -1
  68. data/vendor/libgit2/include/git2/pack.h +4 -4
  69. data/vendor/libgit2/include/git2/patch.h +1 -1
  70. data/vendor/libgit2/include/git2/proxy.h +92 -0
  71. data/vendor/libgit2/include/git2/refs.h +11 -0
  72. data/vendor/libgit2/include/git2/remote.h +21 -8
  73. data/vendor/libgit2/include/git2/repository.h +20 -1
  74. data/vendor/libgit2/include/git2/revwalk.h +4 -6
  75. data/vendor/libgit2/include/git2/signature.h +13 -0
  76. data/vendor/libgit2/include/git2/submodule.h +11 -3
  77. data/vendor/libgit2/include/git2/sys/merge.h +177 -0
  78. data/vendor/libgit2/include/git2/sys/odb_backend.h +11 -0
  79. data/vendor/libgit2/include/git2/sys/remote.h +16 -0
  80. data/vendor/libgit2/include/git2/sys/stream.h +2 -1
  81. data/vendor/libgit2/include/git2/sys/time.h +31 -0
  82. data/vendor/libgit2/include/git2/sys/transport.h +3 -1
  83. data/vendor/libgit2/include/git2/tag.h +9 -0
  84. data/vendor/libgit2/include/git2/transaction.h +9 -0
  85. data/vendor/libgit2/include/git2/tree.h +55 -0
  86. data/vendor/libgit2/include/git2/version.h +4 -4
  87. data/vendor/libgit2/include/git2.h +1 -0
  88. data/vendor/libgit2/src/annotated_commit.c +99 -80
  89. data/vendor/libgit2/src/annotated_commit.h +5 -2
  90. data/vendor/libgit2/src/apply.c +377 -0
  91. data/vendor/libgit2/src/apply.h +21 -0
  92. data/vendor/libgit2/src/array.h +0 -1
  93. data/vendor/libgit2/src/blob.c +71 -39
  94. data/vendor/libgit2/src/branch.c +7 -5
  95. data/vendor/libgit2/src/buffer.c +252 -20
  96. data/vendor/libgit2/src/buffer.h +8 -0
  97. data/vendor/libgit2/src/checkout.c +69 -42
  98. data/vendor/libgit2/src/clone.c +0 -8
  99. data/vendor/libgit2/src/commit.c +193 -49
  100. data/vendor/libgit2/src/commit_list.c +8 -3
  101. data/vendor/libgit2/src/commit_list.h +1 -0
  102. data/vendor/libgit2/src/common.h +2 -1
  103. data/vendor/libgit2/src/config.c +3 -3
  104. data/vendor/libgit2/src/config_file.c +20 -10
  105. data/vendor/libgit2/src/crlf.c +1 -0
  106. data/vendor/libgit2/src/curl_stream.c +106 -6
  107. data/vendor/libgit2/src/delta.c +238 -62
  108. data/vendor/libgit2/src/delta.h +79 -58
  109. data/vendor/libgit2/src/describe.c +1 -1
  110. data/vendor/libgit2/src/diff.c +32 -1554
  111. data/vendor/libgit2/src/diff.h +14 -122
  112. data/vendor/libgit2/src/diff_driver.c +4 -6
  113. data/vendor/libgit2/src/diff_file.c +3 -0
  114. data/vendor/libgit2/src/diff_generate.c +1613 -0
  115. data/vendor/libgit2/src/diff_generate.h +123 -0
  116. data/vendor/libgit2/src/diff_parse.c +101 -0
  117. data/vendor/libgit2/src/diff_parse.h +18 -0
  118. data/vendor/libgit2/src/diff_print.c +263 -144
  119. data/vendor/libgit2/src/diff_stats.c +21 -12
  120. data/vendor/libgit2/src/diff_tform.c +1 -0
  121. data/vendor/libgit2/src/diff_tform.h +22 -0
  122. data/vendor/libgit2/src/diff_xdiff.c +9 -9
  123. data/vendor/libgit2/src/diff_xdiff.h +5 -5
  124. data/vendor/libgit2/src/fetchhead.c +8 -8
  125. data/vendor/libgit2/src/filebuf.c +6 -1
  126. data/vendor/libgit2/src/filebuf.h +1 -0
  127. data/vendor/libgit2/src/fileops.c +22 -1
  128. data/vendor/libgit2/src/fileops.h +8 -2
  129. data/vendor/libgit2/src/fnmatch.c +18 -5
  130. data/vendor/libgit2/src/global.c +21 -4
  131. data/vendor/libgit2/src/global.h +6 -0
  132. data/vendor/libgit2/src/graph.c +1 -1
  133. data/vendor/libgit2/src/index.c +159 -46
  134. data/vendor/libgit2/src/index.h +2 -0
  135. data/vendor/libgit2/src/iterator.c +1573 -1468
  136. data/vendor/libgit2/src/iterator.h +52 -69
  137. data/vendor/libgit2/src/merge.c +163 -64
  138. data/vendor/libgit2/src/merge.h +61 -2
  139. data/vendor/libgit2/src/merge_driver.c +397 -0
  140. data/vendor/libgit2/src/merge_driver.h +60 -0
  141. data/vendor/libgit2/src/merge_file.c +11 -49
  142. data/vendor/libgit2/src/netops.c +12 -10
  143. data/vendor/libgit2/src/object_api.c +19 -1
  144. data/vendor/libgit2/src/odb.c +228 -52
  145. data/vendor/libgit2/src/odb_loose.c +19 -1
  146. data/vendor/libgit2/src/odb_mempack.c +1 -1
  147. data/vendor/libgit2/src/odb_pack.c +27 -1
  148. data/vendor/libgit2/src/openssl_stream.c +4 -5
  149. data/vendor/libgit2/src/pack-objects.c +105 -76
  150. data/vendor/libgit2/src/pack-objects.h +13 -12
  151. data/vendor/libgit2/src/pack.c +16 -10
  152. data/vendor/libgit2/src/pack.h +2 -0
  153. data/vendor/libgit2/src/patch.c +216 -0
  154. data/vendor/libgit2/src/patch.h +66 -0
  155. data/vendor/libgit2/src/{diff_patch.c → patch_generate.c} +203 -376
  156. data/vendor/libgit2/src/patch_generate.h +68 -0
  157. data/vendor/libgit2/src/patch_parse.c +1159 -0
  158. data/vendor/libgit2/src/patch_parse.h +56 -0
  159. data/vendor/libgit2/src/path.c +38 -2
  160. data/vendor/libgit2/src/path.h +18 -0
  161. data/vendor/libgit2/src/pathspec.c +1 -1
  162. data/vendor/libgit2/src/pool.h +5 -0
  163. data/vendor/libgit2/src/pqueue.c +12 -5
  164. data/vendor/libgit2/src/pqueue.h +1 -0
  165. data/vendor/libgit2/src/proxy.c +32 -0
  166. data/vendor/libgit2/src/proxy.h +14 -0
  167. data/vendor/libgit2/src/push.c +1 -1
  168. data/vendor/libgit2/src/rebase.c +63 -36
  169. data/vendor/libgit2/src/refdb.c +4 -2
  170. data/vendor/libgit2/src/refdb_fs.c +82 -54
  171. data/vendor/libgit2/src/refs.c +13 -1
  172. data/vendor/libgit2/src/remote.c +20 -81
  173. data/vendor/libgit2/src/repository.c +212 -29
  174. data/vendor/libgit2/src/reset.c +1 -1
  175. data/vendor/libgit2/src/revparse.c +1 -1
  176. data/vendor/libgit2/src/revwalk.c +260 -184
  177. data/vendor/libgit2/src/settings.c +11 -3
  178. data/vendor/libgit2/src/signature.c +27 -2
  179. data/vendor/libgit2/src/sortedcache.c +14 -5
  180. data/vendor/libgit2/src/stash.c +1 -0
  181. data/vendor/libgit2/src/status.c +1 -0
  182. data/vendor/libgit2/src/stransport_stream.c +4 -2
  183. data/vendor/libgit2/src/stream.h +2 -2
  184. data/vendor/libgit2/src/submodule.c +16 -4
  185. data/vendor/libgit2/src/sysdir.c +1 -1
  186. data/vendor/libgit2/src/transport.c +3 -5
  187. data/vendor/libgit2/src/transports/http.c +38 -13
  188. data/vendor/libgit2/src/transports/local.c +4 -1
  189. data/vendor/libgit2/src/transports/smart.c +6 -0
  190. data/vendor/libgit2/src/transports/smart.h +1 -0
  191. data/vendor/libgit2/src/transports/smart_pkt.c +5 -13
  192. data/vendor/libgit2/src/transports/smart_protocol.c +22 -7
  193. data/vendor/libgit2/src/transports/winhttp.c +144 -11
  194. data/vendor/libgit2/src/tree.c +267 -2
  195. data/vendor/libgit2/src/unix/posix.h +10 -0
  196. data/vendor/libgit2/src/unix/pthread.h +2 -0
  197. data/vendor/libgit2/src/util.c +25 -2
  198. data/vendor/libgit2/src/util.h +10 -0
  199. data/vendor/libgit2/src/varint.c +44 -0
  200. data/vendor/libgit2/src/varint.h +15 -0
  201. data/vendor/libgit2/src/vector.c +58 -0
  202. data/vendor/libgit2/src/vector.h +8 -0
  203. data/vendor/libgit2/src/win32/posix.h +3 -0
  204. data/vendor/libgit2/src/win32/thread.c +18 -0
  205. data/vendor/libgit2/src/win32/thread.h +2 -0
  206. data/vendor/libgit2/src/win32/w32_util.h +1 -1
  207. data/vendor/libgit2/src/zstream.c +37 -8
  208. data/vendor/libgit2/src/zstream.h +8 -1
  209. metadata +100 -82
  210. data/vendor/libgit2/Makefile.embed +0 -60
  211. data/vendor/libgit2/src/delta-apply.c +0 -166
  212. data/vendor/libgit2/src/delta-apply.h +0 -62
  213. data/vendor/libgit2/src/diff_patch.h +0 -83
@@ -83,6 +83,17 @@ struct git_odb_backend {
83
83
  git_odb_writepack **, git_odb_backend *, git_odb *odb,
84
84
  git_transfer_progress_cb progress_cb, void *progress_payload);
85
85
 
86
+ /**
87
+ * "Freshens" an already existing object, updating its last-used
88
+ * time. This occurs when `git_odb_write` was called, but the
89
+ * object already existed (and will not be re-written). The
90
+ * underlying implementation may want to update last-used timestamps.
91
+ *
92
+ * If callers implement this, they should return `0` if the object
93
+ * exists and was freshened, and non-zero otherwise.
94
+ */
95
+ int (* freshen)(git_odb_backend *, const git_oid *);
96
+
86
97
  /**
87
98
  * Frees any resources held by the odb (including the `git_odb_backend`
88
99
  * itself). An odb backend implementation must provide this function.
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #ifndef INCLUDE_sys_git_transport_h
9
+ #define INCLUDE_sys_git_transport_h
10
+
11
+ #include "git2/net.h"
12
+ #include "git2/types.h"
13
+
14
+ GIT_BEGIN_DECL
15
+
16
+ GIT_END_DECL
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include "git2/common.h"
11
11
  #include "git2/types.h"
12
+ #include "git2/proxy.h"
12
13
 
13
14
  GIT_BEGIN_DECL
14
15
 
@@ -32,7 +33,7 @@ typedef struct git_stream {
32
33
  int proxy_support;
33
34
  int (*connect)(struct git_stream *);
34
35
  int (*certificate)(git_cert **, struct git_stream *);
35
- int (*set_proxy)(struct git_stream *, const char *proxy_url);
36
+ int (*set_proxy)(struct git_stream *, const git_proxy_options *proxy_opts);
36
37
  ssize_t (*read)(struct git_stream *, void *, size_t);
37
38
  ssize_t (*write)(struct git_stream *, const char *, size_t, int);
38
39
  int (*close)(struct git_stream *);
@@ -0,0 +1,31 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+ #ifndef INCLUDE_git_time_h__
8
+ #define INCLUDE_git_time_h__
9
+
10
+ #include "git2/common.h"
11
+
12
+ GIT_BEGIN_DECL
13
+
14
+ /**
15
+ * Return a monotonic time value, useful for measuring running time
16
+ * and setting up timeouts.
17
+ *
18
+ * The returned value is an arbitrary point in time -- it can only be
19
+ * used when comparing it to another `git_time_monotonic` call.
20
+ *
21
+ * The time is returned in seconds, with a decimal fraction that differs
22
+ * on accuracy based on the underlying system, but should be least
23
+ * accurate to Nanoseconds.
24
+ *
25
+ * This function cannot fail.
26
+ */
27
+ GIT_EXTERN(double) git_time_monotonic(void);
28
+
29
+ GIT_END_DECL
30
+ #endif
31
+
@@ -11,6 +11,7 @@
11
11
  #include "git2/net.h"
12
12
  #include "git2/types.h"
13
13
  #include "git2/strarray.h"
14
+ #include "git2/proxy.h"
14
15
 
15
16
  /**
16
17
  * @file git2/sys/transport.h
@@ -53,6 +54,7 @@ struct git_transport {
53
54
  const char *url,
54
55
  git_cred_acquire_cb cred_acquire_cb,
55
56
  void *cred_acquire_payload,
57
+ const git_proxy_options *proxy_opts,
56
58
  int direction,
57
59
  int flags);
58
60
 
@@ -65,7 +67,7 @@ struct git_transport {
65
67
  git_transport *transport);
66
68
 
67
69
  /* Executes the push whose context is in the git_push object. */
68
- int (*push)(git_transport *transport, git_push *push, const git_remote_callbacks *callbacks);
70
+ int(*push)(git_transport *transport, git_push *push, const git_remote_callbacks *callbacks);
69
71
 
70
72
  /* This function may be called after a successful call to connect(), when
71
73
  * the direction is FETCH. The function performs a negotiation to calculate
@@ -347,6 +347,15 @@ GIT_EXTERN(int) git_tag_peel(
347
347
  git_object **tag_target_out,
348
348
  const git_tag *tag);
349
349
 
350
+ /**
351
+ * Create an in-memory copy of a tag. The copy must be explicitly
352
+ * free'd or it will leak.
353
+ *
354
+ * @param out Pointer to store the copy of the tag
355
+ * @param source Original tag to copy
356
+ */
357
+ GIT_EXTERN(int) git_tag_dup(git_tag **out, git_tag *source);
358
+
350
359
  /** @} */
351
360
  GIT_END_DECL
352
361
  #endif
@@ -8,6 +8,14 @@
8
8
  #define INCLUDE_git_transaction_h__
9
9
 
10
10
  #include "common.h"
11
+
12
+ /**
13
+ * @file git2/transaction.h
14
+ * @brief Git transactional reference routines
15
+ * @defgroup git_transaction Git transactional reference routines
16
+ * @ingroup Git
17
+ * @{
18
+ */
11
19
  GIT_BEGIN_DECL
12
20
 
13
21
  /**
@@ -107,5 +115,6 @@ GIT_EXTERN(int) git_transaction_commit(git_transaction *tx);
107
115
  */
108
116
  GIT_EXTERN(void) git_transaction_free(git_transaction *tx);
109
117
 
118
+ /** @} */
110
119
  GIT_END_DECL
111
120
  #endif
@@ -409,6 +409,61 @@ GIT_EXTERN(int) git_tree_walk(
409
409
  git_treewalk_cb callback,
410
410
  void *payload);
411
411
 
412
+ /**
413
+ * Create an in-memory copy of a tree. The copy must be explicitly
414
+ * free'd or it will leak.
415
+ *
416
+ * @param out Pointer to store the copy of the tree
417
+ * @param source Original tree to copy
418
+ */
419
+ GIT_EXTERN(int) git_tree_dup(git_tree **out, git_tree *source);
420
+
421
+ /**
422
+ * The kind of update to perform
423
+ */
424
+ typedef enum {
425
+ /** Update or insert an entry at the specified path */
426
+ GIT_TREE_UPDATE_UPSERT,
427
+ /** Remove an entry from the specified path */
428
+ GIT_TREE_UPDATE_REMOVE,
429
+ } git_tree_update_t;
430
+
431
+ /**
432
+ * An action to perform during the update of a tree
433
+ */
434
+ typedef struct {
435
+ /** Update action. If it's an removal, only the path is looked at */
436
+ git_tree_update_t action;
437
+ /** The entry's id */
438
+ git_oid id;
439
+ /** The filemode/kind of object */
440
+ git_filemode_t filemode;
441
+ /** The full path from the root tree */
442
+ const char *path;
443
+ } git_tree_update;
444
+
445
+ /**
446
+ * Create a tree based on another one with the specified modifications
447
+ *
448
+ * Given the `baseline` perform the changes described in the list of
449
+ * `updates` and create a new tree.
450
+ *
451
+ * This function is optimized for common file/directory addition, removal and
452
+ * replacement in trees. It is much more efficient than reading the tree into a
453
+ * `git_index` and modifying that, but in exchange it is not as flexible.
454
+ *
455
+ * Deleting and adding the same entry is undefined behaviour, changing
456
+ * a tree to a blob or viceversa is not supported.
457
+ *
458
+ * @param out id of the new tree
459
+ * @param repo the repository in which to create the tree, must be the
460
+ * same as for `baseline`
461
+ * @param baseline the tree to base these changes on
462
+ * @param nupdates the number of elements in the update list
463
+ * @param updates the list of updates to perform
464
+ */
465
+ GIT_EXTERN(int) git_tree_create_updated(git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates);
466
+
412
467
  /** @} */
413
468
 
414
469
  GIT_END_DECL
@@ -7,12 +7,12 @@
7
7
  #ifndef INCLUDE_git_version_h__
8
8
  #define INCLUDE_git_version_h__
9
9
 
10
- #define LIBGIT2_VERSION "0.24.6"
10
+ #define LIBGIT2_VERSION "0.25.0"
11
11
  #define LIBGIT2_VER_MAJOR 0
12
- #define LIBGIT2_VER_MINOR 24
13
- #define LIBGIT2_VER_REVISION 6
12
+ #define LIBGIT2_VER_MINOR 25
13
+ #define LIBGIT2_VER_REVISION 0
14
14
  #define LIBGIT2_VER_PATCH 0
15
15
 
16
- #define LIBGIT2_SOVERSION 24
16
+ #define LIBGIT2_SOVERSION 25
17
17
 
18
18
  #endif
@@ -40,6 +40,7 @@
40
40
  #include "git2/pack.h"
41
41
  #include "git2/patch.h"
42
42
  #include "git2/pathspec.h"
43
+ #include "git2/proxy.h"
43
44
  #include "git2/rebase.h"
44
45
  #include "git2/refdb.h"
45
46
  #include "git2/reflog.h"
@@ -19,39 +19,102 @@
19
19
  #include "git2/index.h"
20
20
 
21
21
  static int annotated_commit_init(
22
+ git_annotated_commit **out,
23
+ git_commit *commit,
24
+ const char *description)
25
+ {
26
+ git_annotated_commit *annotated_commit;
27
+ int error = 0;
28
+
29
+ assert(out && commit);
30
+
31
+ *out = NULL;
32
+
33
+ annotated_commit = git__calloc(1, sizeof(git_annotated_commit));
34
+ GITERR_CHECK_ALLOC(annotated_commit);
35
+
36
+ annotated_commit->type = GIT_ANNOTATED_COMMIT_REAL;
37
+
38
+ if ((error = git_commit_dup(&annotated_commit->commit, commit)) < 0)
39
+ goto done;
40
+
41
+ git_oid_fmt(annotated_commit->id_str, git_commit_id(commit));
42
+ annotated_commit->id_str[GIT_OID_HEXSZ] = '\0';
43
+
44
+ if (!description)
45
+ description = annotated_commit->id_str;
46
+
47
+ annotated_commit->description = git__strdup(description);
48
+ GITERR_CHECK_ALLOC(annotated_commit->description);
49
+
50
+ done:
51
+ if (!error)
52
+ *out = annotated_commit;
53
+
54
+ return error;
55
+ }
56
+
57
+ static int annotated_commit_init_from_id(
22
58
  git_annotated_commit **out,
23
59
  git_repository *repo,
24
60
  const git_oid *id,
25
- const char *ref_name,
26
- const char *remote_url)
61
+ const char *description)
27
62
  {
28
- git_annotated_commit *annotated_commit;
29
63
  git_commit *commit = NULL;
30
64
  int error = 0;
31
65
 
32
- assert(out && id);
66
+ assert(out && repo && id);
33
67
 
34
68
  *out = NULL;
35
69
 
36
- if ((error = git_commit_lookup(&commit, repo, id)) < 0 ||
37
- (error = git_annotated_commit_from_commit(&annotated_commit,
38
- commit)) < 0)
70
+ if ((error = git_commit_lookup(&commit, repo, id)) < 0)
39
71
  goto done;
40
72
 
41
- if (ref_name) {
42
- annotated_commit->ref_name = git__strdup(ref_name);
43
- GITERR_CHECK_ALLOC(annotated_commit->ref_name);
44
- }
73
+ error = annotated_commit_init(out, commit, description);
74
+
75
+ done:
76
+ git_commit_free(commit);
77
+ return error;
78
+ }
79
+
80
+ int git_annotated_commit_lookup(
81
+ git_annotated_commit **out,
82
+ git_repository *repo,
83
+ const git_oid *id)
84
+ {
85
+ return annotated_commit_init_from_id(out, repo, id, NULL);
86
+ }
87
+
88
+ int git_annotated_commit_from_commit(
89
+ git_annotated_commit **out,
90
+ git_commit *commit)
91
+ {
92
+ return annotated_commit_init(out, commit, NULL);
93
+ }
45
94
 
46
- if (remote_url) {
47
- annotated_commit->remote_url = git__strdup(remote_url);
48
- GITERR_CHECK_ALLOC(annotated_commit->remote_url);
95
+ int git_annotated_commit_from_revspec(
96
+ git_annotated_commit **out,
97
+ git_repository *repo,
98
+ const char *revspec)
99
+ {
100
+ git_object *obj, *commit;
101
+ int error;
102
+
103
+ assert(out && repo && revspec);
104
+
105
+ if ((error = git_revparse_single(&obj, repo, revspec)) < 0)
106
+ return error;
107
+
108
+ if ((error = git_object_peel(&commit, obj, GIT_OBJ_COMMIT))) {
109
+ git_object_free(obj);
110
+ return error;
49
111
  }
50
112
 
51
- *out = annotated_commit;
113
+ error = annotated_commit_init(out, (git_commit *)commit, revspec);
114
+
115
+ git_object_free(obj);
116
+ git_object_free(commit);
52
117
 
53
- done:
54
- git_commit_free(commit);
55
118
  return error;
56
119
  }
57
120
 
@@ -70,8 +133,15 @@ int git_annotated_commit_from_ref(
70
133
  if ((error = git_reference_resolve(&resolved, ref)) < 0)
71
134
  return error;
72
135
 
73
- error = annotated_commit_init(out, repo, git_reference_target(resolved),
74
- git_reference_name(ref), NULL);
136
+ error = annotated_commit_init_from_id(out,
137
+ repo,
138
+ git_reference_target(resolved),
139
+ git_reference_name(ref));
140
+
141
+ if (!error) {
142
+ (*out)->ref_name = git__strdup(git_reference_name(ref));
143
+ GITERR_CHECK_ALLOC((*out)->ref_name);
144
+ }
75
145
 
76
146
  git_reference_free(resolved);
77
147
  return error;
@@ -97,41 +167,6 @@ int git_annotated_commit_from_head(
97
167
  return error;
98
168
  }
99
169
 
100
- int git_annotated_commit_from_commit(
101
- git_annotated_commit **out,
102
- git_commit *commit)
103
- {
104
- git_annotated_commit *annotated_commit;
105
-
106
- assert(out && commit);
107
-
108
- *out = NULL;
109
-
110
- annotated_commit = git__calloc(1, sizeof(git_annotated_commit));
111
- GITERR_CHECK_ALLOC(annotated_commit);
112
-
113
- annotated_commit->type = GIT_ANNOTATED_COMMIT_REAL;
114
-
115
- git_cached_obj_incref(commit);
116
- annotated_commit->commit = commit;
117
-
118
- git_oid_fmt(annotated_commit->id_str, git_commit_id(commit));
119
- annotated_commit->id_str[GIT_OID_HEXSZ] = '\0';
120
-
121
- *out = annotated_commit;
122
- return 0;
123
- }
124
-
125
- int git_annotated_commit_lookup(
126
- git_annotated_commit **out,
127
- git_repository *repo,
128
- const git_oid *id)
129
- {
130
- assert(out && repo && id);
131
-
132
- return annotated_commit_init(out, repo, id, NULL, NULL);
133
- }
134
-
135
170
  int git_annotated_commit_from_fetchhead(
136
171
  git_annotated_commit **out,
137
172
  git_repository *repo,
@@ -141,33 +176,16 @@ int git_annotated_commit_from_fetchhead(
141
176
  {
142
177
  assert(repo && id && branch_name && remote_url);
143
178
 
144
- return annotated_commit_init(out, repo, id, branch_name, remote_url);
145
- }
146
-
147
- int git_annotated_commit_from_revspec(
148
- git_annotated_commit **out,
149
- git_repository *repo,
150
- const char *revspec)
151
- {
152
- git_object *obj, *commit;
153
- int error;
154
-
155
- assert(out && repo && revspec);
156
-
157
- if ((error = git_revparse_single(&obj, repo, revspec)) < 0)
158
- return error;
159
-
160
- if ((error = git_object_peel(&commit, obj, GIT_OBJ_COMMIT))) {
161
- git_object_free(obj);
162
- return error;
163
- }
179
+ if (annotated_commit_init_from_id(out, repo, id, branch_name) < 0)
180
+ return -1;
164
181
 
165
- error = annotated_commit_init(out, repo, git_object_id(commit), revspec, NULL);
182
+ (*out)->ref_name = git__strdup(branch_name);
183
+ GITERR_CHECK_ALLOC((*out)->ref_name);
166
184
 
167
- git_object_free(obj);
168
- git_object_free(commit);
185
+ (*out)->remote_url = git__strdup(remote_url);
186
+ GITERR_CHECK_ALLOC((*out)->remote_url);
169
187
 
170
- return error;
188
+ return 0;
171
189
  }
172
190
 
173
191
 
@@ -187,8 +205,9 @@ void git_annotated_commit_free(git_annotated_commit *annotated_commit)
187
205
  case GIT_ANNOTATED_COMMIT_REAL:
188
206
  git_commit_free(annotated_commit->commit);
189
207
  git_tree_free(annotated_commit->tree);
190
- git__free(annotated_commit->ref_name);
191
- git__free(annotated_commit->remote_url);
208
+ git__free((char *)annotated_commit->description);
209
+ git__free((char *)annotated_commit->ref_name);
210
+ git__free((char *)annotated_commit->remote_url);
192
211
  break;
193
212
  case GIT_ANNOTATED_COMMIT_VIRTUAL:
194
213
  git_index_free(annotated_commit->index);
@@ -33,8 +33,11 @@ struct git_annotated_commit {
33
33
  git_index *index;
34
34
  git_array_oid_t parents;
35
35
 
36
- char *ref_name;
37
- char *remote_url;
36
+ /* how this commit was looked up */
37
+ const char *description;
38
+
39
+ const char *ref_name;
40
+ const char *remote_url;
38
41
 
39
42
  char id_str[GIT_OID_HEXSZ+1];
40
43
  };