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
@@ -26,9 +26,11 @@ enum {
26
26
  GIT_EAMBIGUOUS = -5,
27
27
  GIT_EBUFS = -6,
28
28
  GIT_EUSER = -7,
29
+ GIT_EBAREREPO = -8,
30
+ GIT_EORPHANEDHEAD = -9,
29
31
 
30
32
  GIT_PASSTHROUGH = -30,
31
- GIT_REVWALKOVER = -31,
33
+ GIT_ITEROVER = -31,
32
34
  };
33
35
 
34
36
  typedef struct {
@@ -54,6 +56,8 @@ typedef enum {
54
56
  GITERR_TREE,
55
57
  GITERR_INDEXER,
56
58
  GITERR_SSL,
59
+ GITERR_SUBMODULE,
60
+ GITERR_THREAD,
57
61
  } git_error_t;
58
62
 
59
63
  /**
@@ -69,6 +73,40 @@ GIT_EXTERN(const git_error *) giterr_last(void);
69
73
  */
70
74
  GIT_EXTERN(void) giterr_clear(void);
71
75
 
76
+ /**
77
+ * Set the error message string for this thread.
78
+ *
79
+ * This function is public so that custom ODB backends and the like can
80
+ * relay an error message through libgit2. Most regular users of libgit2
81
+ * will never need to call this function -- actually, calling it in most
82
+ * circumstances (for example, calling from within a callback function)
83
+ * will just end up having the value overwritten by libgit2 internals.
84
+ *
85
+ * This error message is stored in thread-local storage and only applies
86
+ * to the particular thread that this libgit2 call is made from.
87
+ *
88
+ * NOTE: Passing the `error_class` as GITERR_OS has a special behavior: we
89
+ * attempt to append the system default error message for the last OS error
90
+ * that occurred and then clear the last error. The specific implementation
91
+ * of looking up and clearing this last OS error will vary by platform.
92
+ *
93
+ * @param error_class One of the `git_error_t` enum above describing the
94
+ * general subsystem that is responsible for the error.
95
+ * @param message The formatted error message to keep
96
+ */
97
+ GIT_EXTERN(void) giterr_set_str(int error_class, const char *string);
98
+
99
+ /**
100
+ * Set the error message to a special value for memory allocation failure.
101
+ *
102
+ * The normal `giterr_set_str()` function attempts to `strdup()` the string
103
+ * that is passed in. This is not a good idea when the error in question
104
+ * is a memory allocation failure. That circumstance has a special setter
105
+ * function that sets the error string to a known and statically allocated
106
+ * internal value.
107
+ */
108
+ GIT_EXTERN(void) giterr_set_oom(void);
109
+
72
110
  /** @} */
73
111
  GIT_END_DECL
74
112
  #endif
@@ -54,9 +54,12 @@ GIT_EXTERN(int) git_ignore_clear_internal_rules(
54
54
  /**
55
55
  * Test if the ignore rules apply to a given path.
56
56
  *
57
- * This function simply checks the ignore rules to see if they would apply
58
- * to the given file. This indicates if the file would be ignored regardless
59
- * of whether the file is already in the index or commited to the repository.
57
+ * This function checks the ignore rules to see if they would apply to the
58
+ * given file. This indicates if the file would be ignored regardless of
59
+ * whether the file is already in the index or commited to the repository.
60
+ *
61
+ * One way to think of this is if you were to do "git add ." on the
62
+ * directory containing the file, would it be added or not?
60
63
  *
61
64
  * @param ignored boolean returning 0 if the file is not ignored, 1 if it is
62
65
  * @param repo a repository object
@@ -19,6 +19,7 @@ GIT_BEGIN_DECL
19
19
  typedef struct git_indexer_stats {
20
20
  unsigned int total;
21
21
  unsigned int processed;
22
+ unsigned int received;
22
23
  } git_indexer_stats;
23
24
 
24
25
 
@@ -28,7 +28,7 @@ GIT_BEGIN_DECL
28
28
  * @param one one of the commits
29
29
  * @param two the other commit
30
30
  */
31
- GIT_EXTERN(int) git_merge_base(git_oid *out, git_repository *repo, git_oid *one, git_oid *two);
31
+ GIT_EXTERN(int) git_merge_base(git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two);
32
32
 
33
33
  /**
34
34
  * Find a merge base given a list of commits
@@ -168,11 +168,14 @@ GIT_EXTERN(int) git_object_typeisloose(git_otype type);
168
168
  GIT_EXTERN(size_t) git_object__size(git_otype type);
169
169
 
170
170
  /**
171
- * Recursively peel an object until an object of the specified
172
- * type is met
171
+ * Recursively peel an object until an object of the specified type is met.
173
172
  *
174
- * The retrieved `peeled` object is owned by the repository
175
- * and should be closed with the `git_object_free` method.
173
+ * The retrieved `peeled` object is owned by the repository and should be
174
+ * closed with the `git_object_free` method.
175
+ *
176
+ * If you pass `GIT_OBJ_ANY` as the target type, then the object will be
177
+ * peeled until the type changes (e.g. a tag will be chased until the
178
+ * referenced object is no longer a tag).
176
179
  *
177
180
  * @param peeled Pointer to the peeled git_object
178
181
  * @param object The object to be processed
@@ -279,8 +279,10 @@ GIT_EXTERN(int) git_odb_hash(git_oid *id, const void *data, size_t len, git_otyp
279
279
  /**
280
280
  * Read a file from disk and fill a git_oid with the object id
281
281
  * that the file would have if it were written to the Object
282
- * Database as an object of the given type. Similar functionality
283
- * to git.git's `git hash-object` without the `-w` flag.
282
+ * Database as an object of the given type (w/o applying filters).
283
+ * Similar functionality to git.git's `git hash-object` without
284
+ * the `-w` flag, however, with the --no-filters flag.
285
+ * If you need filters, see git_repository_hashfile.
284
286
  *
285
287
  * @param out oid structure the result is written into.
286
288
  * @param path file to read and determine object id for
@@ -26,6 +26,10 @@ struct git_odb_stream;
26
26
  struct git_odb_backend {
27
27
  git_odb *odb;
28
28
 
29
+ /* read and read_prefix each return to libgit2 a buffer which
30
+ * will be freed later. The buffer should be allocated using
31
+ * the function git_odb_backend_malloc to ensure that it can
32
+ * be safely freed later. */
29
33
  int (* read)(
30
34
  void **, size_t *, git_otype *,
31
35
  struct git_odb_backend *,
@@ -102,6 +106,8 @@ GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **backend_out, const char *
102
106
  GIT_EXTERN(int) git_odb_backend_loose(git_odb_backend **backend_out, const char *objects_dir, int compression_level, int do_fsync);
103
107
  GIT_EXTERN(int) git_odb_backend_one_pack(git_odb_backend **backend_out, const char *index_file);
104
108
 
109
+ GIT_EXTERN(void *) git_odb_backend_malloc(git_odb_backend *backend, size_t len);
110
+
105
111
  GIT_END_DECL
106
112
 
107
113
  #endif
@@ -185,6 +185,8 @@ GIT_EXTERN(int) git_oid_streq(const git_oid *a, const char *str);
185
185
 
186
186
  /**
187
187
  * Check is an oid is all zeros.
188
+ *
189
+ * @return 1 if all zeros, 0 otherwise.
188
190
  */
189
191
  GIT_EXTERN(int) git_oid_iszero(const git_oid *a);
190
192
 
@@ -0,0 +1,89 @@
1
+ /*
2
+ * Copyright (C) 2009-2012 the libgit2 contributors
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_pack_h__
8
+ #define INCLUDE_git_pack_h__
9
+
10
+ #include "common.h"
11
+ #include "oid.h"
12
+
13
+ /**
14
+ * @file git2/pack.h
15
+ * @brief Git pack management routines
16
+ * @defgroup git_pack Git pack management routines
17
+ * @ingroup Git
18
+ * @{
19
+ */
20
+ GIT_BEGIN_DECL
21
+
22
+ /**
23
+ * Initialize a new packbuilder
24
+ *
25
+ * @param out The new packbuilder object
26
+ * @param repo The repository
27
+ *
28
+ * @return 0 or an error code
29
+ */
30
+ GIT_EXTERN(int) git_packbuilder_new(git_packbuilder **out, git_repository *repo);
31
+
32
+ /**
33
+ * Set number of threads to spawn
34
+ *
35
+ * By default, libgit2 won't spawn any threads at all;
36
+ * when set to 0, libgit2 will autodetect the number of
37
+ * CPUs.
38
+ *
39
+ * @param pb The packbuilder
40
+ * @param n Number of threads to spawn
41
+ */
42
+ GIT_EXTERN(void) git_packbuilder_set_threads(git_packbuilder *pb, unsigned int n);
43
+
44
+ /**
45
+ * Insert a single object
46
+ *
47
+ * For an optimal pack it's mandatory to insert objects in recency order,
48
+ * commits followed by trees and blobs.
49
+ *
50
+ * @param pb The packbuilder
51
+ * @param oid The oid of the commit
52
+ * @param oid The name; might be NULL
53
+ *
54
+ * @return 0 or an error code
55
+ */
56
+ GIT_EXTERN(int) git_packbuilder_insert(git_packbuilder *pb, const git_oid *oid, const char *name);
57
+
58
+ /**
59
+ * Insert a root tree object
60
+ *
61
+ * This will add the tree as well as all referenced trees and blobs.
62
+ *
63
+ * @param pb The packbuilder
64
+ * @param oid The oid of the root tree
65
+ *
66
+ * @return 0 or an error code
67
+ */
68
+ GIT_EXTERN(int) git_packbuilder_insert_tree(git_packbuilder *pb, const git_oid *oid);
69
+
70
+ /**
71
+ * Write the new pack and the corresponding index to path
72
+ *
73
+ * @param pb The packbuilder
74
+ * @param path Directory to store the new pack and index
75
+ *
76
+ * @return 0 or an error code
77
+ */
78
+ GIT_EXTERN(int) git_packbuilder_write(git_packbuilder *pb, const char *file);
79
+
80
+ /**
81
+ * Free the packbuilder and all associated data
82
+ *
83
+ * @param pb The packbuilder
84
+ */
85
+ GIT_EXTERN(void) git_packbuilder_free(git_packbuilder *pb);
86
+
87
+ /** @} */
88
+ GIT_END_DECL
89
+ #endif
@@ -10,6 +10,7 @@
10
10
  #include "common.h"
11
11
  #include "types.h"
12
12
  #include "oid.h"
13
+ #include "strarray.h"
13
14
 
14
15
  /**
15
16
  * @file git2/refs.h
@@ -376,6 +377,93 @@ GIT_EXTERN(int) git_reference_has_log(git_reference *ref);
376
377
  */
377
378
  GIT_EXTERN(int) git_reference_is_branch(git_reference *ref);
378
379
 
380
+ /**
381
+ * Check if a reference is a remote tracking branch
382
+ *
383
+ * @param ref A git reference
384
+ *
385
+ * @return 1 when the reference lives in the refs/remotes
386
+ * namespace; 0 otherwise.
387
+ */
388
+ GIT_EXTERN(int) git_reference_is_remote(git_reference *ref);
389
+
390
+ enum {
391
+ GIT_REF_FORMAT_NORMAL = 0,
392
+
393
+ /**
394
+ * Control whether one-level refnames are accepted
395
+ * (i.e., refnames that do not contain multiple /-separated
396
+ * components). Those are expected to be written only using
397
+ * uppercase letters and underscore (FETCH_HEAD, ...)
398
+ */
399
+ GIT_REF_FORMAT_ALLOW_ONELEVEL = (1 << 0),
400
+
401
+ /**
402
+ * Interpret the provided name as a reference pattern for a
403
+ * refspec (as used with remote repositories). If this option
404
+ * is enabled, the name is allowed to contain a single * (<star>)
405
+ * in place of a one full pathname component
406
+ * (e.g., foo/<star>/bar but not foo/bar<star>).
407
+ */
408
+ GIT_REF_FORMAT_REFSPEC_PATTERN = (1 << 1),
409
+ };
410
+
411
+ /**
412
+ * Normalize the reference name by removing any leading
413
+ * slash (/) characters and collapsing runs of adjacent slashes
414
+ * between name components into a single slash.
415
+ *
416
+ * Once normalized, if the reference name is valid, it will be
417
+ * returned in the user allocated buffer.
418
+ *
419
+ * @param buffer_out The user allocated buffer where the
420
+ * normalized name will be stored.
421
+ *
422
+ * @param buffer_size buffer_out size
423
+ *
424
+ * @param name name to be checked.
425
+ *
426
+ * @param flags Flags to determine the options to be applied while
427
+ * checking the validatity of the name.
428
+ *
429
+ * @return 0 or an error code.
430
+ */
431
+ GIT_EXTERN(int) git_reference_normalize_name(
432
+ char *buffer_out,
433
+ size_t buffer_size,
434
+ const char *name,
435
+ unsigned int flags);
436
+
437
+ /**
438
+ * Recursively peel an reference until an object of the
439
+ * specified type is met.
440
+ *
441
+ * The retrieved `peeled` object is owned by the repository
442
+ * and should be closed with the `git_object_free` method.
443
+ *
444
+ * If you pass `GIT_OBJ_ANY` as the target type, then the object
445
+ * will be peeled until a non-tag object is met.
446
+ *
447
+ * @param peeled Pointer to the peeled git_object
448
+ * @param ref The reference to be processed
449
+ * @param target_type The type of the requested object
450
+ * @return 0 or an error code
451
+ */
452
+ GIT_EXTERN(int) git_reference_peel(
453
+ git_object **out,
454
+ git_reference *ref,
455
+ git_otype type);
456
+
457
+ /**
458
+ * Ensure the reference name is well-formed.
459
+ *
460
+ * @param refname name to be checked.
461
+ *
462
+ * @return 1 if the reference name is acceptable; 0 if it isn't
463
+ */
464
+ GIT_EXTERN(int) git_reference_is_valid_name(
465
+ const char *refname);
466
+
379
467
  /** @} */
380
468
  GIT_END_DECL
381
469
  #endif
@@ -19,14 +19,6 @@
19
19
  */
20
20
  GIT_BEGIN_DECL
21
21
 
22
- /**
23
- * Parse a refspec string and create a refspec object
24
- *
25
- * @param refspec pointer to the refspec structure to be used
26
- * @param str the refspec as a string
27
- */
28
- GIT_EXTERN(int) git_refspec_parse(git_refspec *refspec, const char *str);
29
-
30
22
  /**
31
23
  * Get the source specifier
32
24
  *
@@ -12,6 +12,7 @@
12
12
  #include "refspec.h"
13
13
  #include "net.h"
14
14
  #include "indexer.h"
15
+ #include "strarray.h"
15
16
 
16
17
  /**
17
18
  * @file git2/remote.h
@@ -197,6 +198,14 @@ GIT_EXTERN(int) git_remote_download(git_remote *remote, git_off_t *bytes, git_in
197
198
  */
198
199
  GIT_EXTERN(int) git_remote_connected(git_remote *remote);
199
200
 
201
+ /**
202
+ * Cancel the operation
203
+ *
204
+ * At certain points in its operation, the network code checks whether
205
+ * the operation has been cancelled and if so stops the operation.
206
+ */
207
+ GIT_EXTERN(void) git_remote_stop(git_remote *remote);
208
+
200
209
  /**
201
210
  * Disconnect from the remote
202
211
  *
@@ -287,7 +296,7 @@ typedef enum git_remote_completion_type {
287
296
  * Set the calbacks to be called by the remote.
288
297
  */
289
298
  struct git_remote_callbacks {
290
- int (*progress)(const char *str, void *data);
299
+ void (*progress)(const char *str, int len, void *data);
291
300
  int (*completion)(git_remote_completion_type type, void *data);
292
301
  int (*update_tips)(const char *refname, const git_oid *a, const git_oid *b, void *data);
293
302
  void *data;
@@ -304,6 +313,30 @@ struct git_remote_callbacks {
304
313
  */
305
314
  GIT_EXTERN(void) git_remote_set_callbacks(git_remote *remote, git_remote_callbacks *callbacks);
306
315
 
316
+ enum {
317
+ GIT_REMOTE_DOWNLOAD_TAGS_UNSET,
318
+ GIT_REMOTE_DOWNLOAD_TAGS_NONE,
319
+ GIT_REMOTE_DOWNLOAD_TAGS_AUTO,
320
+ GIT_REMOTE_DOWNLOAD_TAGS_ALL
321
+ };
322
+
323
+ /**
324
+ * Retrieve the tag auto-follow setting
325
+ *
326
+ * @param remote the remote to query
327
+ * @return the auto-follow setting
328
+ */
329
+ GIT_EXTERN(int) git_remote_autotag(git_remote *remote);
330
+
331
+ /**
332
+ * Set the tag auto-follow setting
333
+ *
334
+ * @param remote the remote to configure
335
+ * @param value a GIT_REMOTE_DOWNLOAD_TAGS value
336
+ */
337
+ GIT_EXTERN(void) git_remote_set_autotag(git_remote *remote, int value);
338
+
339
+
307
340
  /** @} */
308
341
  GIT_END_DECL
309
342
  #endif
@@ -83,6 +83,18 @@ GIT_EXTERN(int) git_repository_discover(
83
83
  int across_fs,
84
84
  const char *ceiling_dirs);
85
85
 
86
+ /**
87
+ * Option flags for `git_repository_open_ext`.
88
+ *
89
+ * * GIT_REPOSITORY_OPEN_NO_SEARCH - Only open the repository if it can be
90
+ * immediately found in the start_path. Do not walk up from the
91
+ * start_path looking at parent directories.
92
+ * * GIT_REPOSITORY_OPEN_CROSS_FS - Unless this flag is set, open will not
93
+ * continue searching across filesystem boundaries (i.e. when `st_dev`
94
+ * changes from the `stat` system call). (E.g. Searching in a user's home
95
+ * directory "/home/user/source/" will not return "/.git/" as the found
96
+ * repo if "/" is a different filesystem than "/home".)
97
+ */
86
98
  enum {
87
99
  GIT_REPOSITORY_OPEN_NO_SEARCH = (1 << 0),
88
100
  GIT_REPOSITORY_OPEN_CROSS_FS = (1 << 1),
@@ -90,6 +102,20 @@ enum {
90
102
 
91
103
  /**
92
104
  * Find and open a repository with extended controls.
105
+ *
106
+ * @param repo_out Pointer to the repo which will be opened. This can
107
+ * actually be NULL if you only want to use the error code to
108
+ * see if a repo at this path could be opened.
109
+ * @param start_path Path to open as git repository. If the flags
110
+ * permit "searching", then this can be a path to a subdirectory
111
+ * inside the working directory of the repository.
112
+ * @param flags A combination of the GIT_REPOSITORY_OPEN flags above.
113
+ * @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR delimited list of path
114
+ * prefixes at which the search for a containing repository should
115
+ * terminate.
116
+ * @return 0 on success, GIT_ENOTFOUND if no repository could be found,
117
+ * or -1 if there was a repository but open failed for some reason
118
+ * (such as repo corruption or system errors).
93
119
  */
94
120
  GIT_EXTERN(int) git_repository_open_ext(
95
121
  git_repository **repo,
@@ -118,13 +144,127 @@ GIT_EXTERN(void) git_repository_free(git_repository *repo);
118
144
  *
119
145
  * @param repo_out pointer to the repo which will be created or reinitialized
120
146
  * @param path the path to the repository
121
- * @param is_bare if true, a Git repository without a working directory is created
122
- * at the pointed path. If false, provided path will be considered as the working
123
- * directory into which the .git directory will be created.
147
+ * @param is_bare if true, a Git repository without a working directory is
148
+ * created at the pointed path. If false, provided path will be
149
+ * considered as the working directory into which the .git directory
150
+ * will be created.
124
151
  *
125
152
  * @return 0 or an error code
126
153
  */
127
- GIT_EXTERN(int) git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare);
154
+ GIT_EXTERN(int) git_repository_init(
155
+ git_repository **repo_out,
156
+ const char *path,
157
+ unsigned is_bare);
158
+
159
+ /**
160
+ * Option flags for `git_repository_init_ext`.
161
+ *
162
+ * These flags configure extra behaviors to `git_repository_init_ext`.
163
+ * In every case, the default behavior is the zero value (i.e. flag is
164
+ * not set). Just OR the flag values together for the `flags` parameter
165
+ * when initializing a new repo. Details of individual values are:
166
+ *
167
+ * * BARE - Create a bare repository with no working directory.
168
+ * * NO_REINIT - Return an EEXISTS error if the repo_path appears to
169
+ * already be an git repository.
170
+ * * NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo
171
+ * path for non-bare repos (if it is not already there), but
172
+ * passing this flag prevents that behavior.
173
+ * * MKDIR - Make the repo_path (and workdir_path) as needed. Init is
174
+ * always willing to create the ".git" directory even without this
175
+ * flag. This flag tells init to create the trailing component of
176
+ * the repo and workdir paths as needed.
177
+ * * MKPATH - Recursively make all components of the repo and workdir
178
+ * paths as necessary.
179
+ * * EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to
180
+ * initialize a new repo. This flags enables external templates,
181
+ * looking the "template_path" from the options if set, or the
182
+ * `init.templatedir` global config if not, or falling back on
183
+ * "/usr/share/git-core/templates" if it exists.
184
+ */
185
+ enum {
186
+ GIT_REPOSITORY_INIT_BARE = (1u << 0),
187
+ GIT_REPOSITORY_INIT_NO_REINIT = (1u << 1),
188
+ GIT_REPOSITORY_INIT_NO_DOTGIT_DIR = (1u << 2),
189
+ GIT_REPOSITORY_INIT_MKDIR = (1u << 3),
190
+ GIT_REPOSITORY_INIT_MKPATH = (1u << 4),
191
+ GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE = (1u << 5),
192
+ };
193
+
194
+ /**
195
+ * Mode options for `git_repository_init_ext`.
196
+ *
197
+ * Set the mode field of the `git_repository_init_options` structure
198
+ * either to the custom mode that you would like, or to one of the
199
+ * following modes:
200
+ *
201
+ * * SHARED_UMASK - Use permissions configured by umask - the default.
202
+ * * SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo
203
+ * to be group writable and "g+sx" for sticky group assignment.
204
+ * * SHARED_ALL - Use "--shared=all" behavior, adding world readability.
205
+ * * Anything else - Set to custom value.
206
+ */
207
+ enum {
208
+ GIT_REPOSITORY_INIT_SHARED_UMASK = 0,
209
+ GIT_REPOSITORY_INIT_SHARED_GROUP = 0002775,
210
+ GIT_REPOSITORY_INIT_SHARED_ALL = 0002777,
211
+ };
212
+
213
+ /**
214
+ * Extended options structure for `git_repository_init_ext`.
215
+ *
216
+ * This contains extra options for `git_repository_init_ext` that enable
217
+ * additional initialization features. The fields are:
218
+ *
219
+ * * flags - Combination of GIT_REPOSITORY_INIT flags above.
220
+ * * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...
221
+ * constants above, or to a custom value that you would like.
222
+ * * workdir_path - The path to the working dir or NULL for default (i.e.
223
+ * repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,
224
+ * IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not
225
+ * the "natural" working directory, a .git gitlink file will be
226
+ * created here linking to the repo_path.
227
+ * * description - If set, this will be used to initialize the "description"
228
+ * file in the repository, instead of using the template content.
229
+ * * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,
230
+ * this contains the path to use for the template directory. If
231
+ * this is NULL, the config or default directory options will be
232
+ * used instead.
233
+ * * initial_head - The name of the head to point HEAD at. If NULL, then
234
+ * this will be treated as "master" and the HEAD ref will be set
235
+ * to "refs/heads/master". If this begins with "refs/" it will be
236
+ * used verbatim; otherwise "refs/heads/" will be prefixed.
237
+ * * origin_url - If this is non-NULL, then after the rest of the
238
+ * repository initialization is completed, an "origin" remote
239
+ * will be added pointing to this URL.
240
+ */
241
+ typedef struct {
242
+ uint32_t flags;
243
+ uint32_t mode;
244
+ const char *workdir_path;
245
+ const char *description;
246
+ const char *template_path;
247
+ const char *initial_head;
248
+ const char *origin_url;
249
+ } git_repository_init_options;
250
+
251
+ /**
252
+ * Create a new Git repository in the given folder with extended controls.
253
+ *
254
+ * This will initialize a new git repository (creating the repo_path
255
+ * if requested by flags) and working directory as needed. It will
256
+ * auto-detect the case sensitivity of the file system and if the
257
+ * file system supports file mode bits correctly.
258
+ *
259
+ * @param repo_out Pointer to the repo which will be created or reinitialized.
260
+ * @param repo_path The path to the repository.
261
+ * @param opts Pointer to git_repository_init_options struct.
262
+ * @return 0 or an error code on failure.
263
+ */
264
+ GIT_EXTERN(int) git_repository_init_ext(
265
+ git_repository **repo_out,
266
+ const char *repo_path,
267
+ git_repository_init_options *opts);
128
268
 
129
269
  /**
130
270
  * Retrieve and resolve the reference pointed at by HEAD.
@@ -132,7 +272,8 @@ GIT_EXTERN(int) git_repository_init(git_repository **repo_out, const char *path,
132
272
  * @param head_out pointer to the reference which will be retrieved
133
273
  * @param repo a repository object
134
274
  *
135
- * @return 0 on success; error code otherwise
275
+ * @return 0 on success, GIT_EORPHANEDHEAD when HEAD points to a non existing
276
+ * branch, an error code otherwise
136
277
  */
137
278
  GIT_EXTERN(int) git_repository_head(git_reference **head_out, git_repository *repo);
138
279
 
@@ -316,7 +457,7 @@ GIT_EXTERN(int) git_repository_index(git_index **out, git_repository *repo);
316
457
  GIT_EXTERN(void) git_repository_set_index(git_repository *repo, git_index *index);
317
458
 
318
459
  /**
319
- * Retrive git's prepared message
460
+ * Retrieve git's prepared message
320
461
  *
321
462
  * Operations such as git revert/cherry-pick/merge with the -n option
322
463
  * stop just short of creating a commit with the changes and save
@@ -326,6 +467,11 @@ GIT_EXTERN(void) git_repository_set_index(git_repository *repo, git_index *index
326
467
  *
327
468
  * Use this function to get the contents of this file. Don't forget to
328
469
  * remove the file after you create the commit.
470
+ *
471
+ * @param buffer Buffer to write data into or NULL to just read required size
472
+ * @param len Length of buffer in bytes
473
+ * @param repo Repository to read prepared message from
474
+ * @return Bytes written to buffer, GIT_ENOTFOUND if no message, or -1 on error
329
475
  */
330
476
  GIT_EXTERN(int) git_repository_message(char *buffer, size_t len, git_repository *repo);
331
477
 
@@ -336,6 +482,92 @@ GIT_EXTERN(int) git_repository_message(char *buffer, size_t len, git_repository
336
482
  */
337
483
  GIT_EXTERN(int) git_repository_message_remove(git_repository *repo);
338
484
 
485
+ /**
486
+ * Calculate hash of file using repository filtering rules.
487
+ *
488
+ * If you simply want to calculate the hash of a file on disk with no filters,
489
+ * you can just use the `git_odb_hashfile()` API. However, if you want to
490
+ * hash a file in the repository and you want to apply filtering rules (e.g.
491
+ * crlf filters) before generating the SHA, then use this function.
492
+ *
493
+ * @param out Output value of calculated SHA
494
+ * @param repo Repository pointer
495
+ * @param path Path to file on disk whose contents should be hashed. If the
496
+ * repository is not NULL, this can be a relative path.
497
+ * @param type The object type to hash as (e.g. GIT_OBJ_BLOB)
498
+ * @param as_path The path to use to look up filtering rules. If this is
499
+ * NULL, then the `path` parameter will be used instead. If
500
+ * this is passed as the empty string, then no filters will be
501
+ * applied when calculating the hash.
502
+ */
503
+ GIT_EXTERN(int) git_repository_hashfile(
504
+ git_oid *out,
505
+ git_repository *repo,
506
+ const char *path,
507
+ git_otype type,
508
+ const char *as_path);
509
+
510
+ /**
511
+ * Make the repository HEAD point to the specified reference.
512
+ *
513
+ * If the provided reference points to a Tree or a Blob, the HEAD is
514
+ * unaltered and -1 is returned.
515
+ *
516
+ * If the provided reference points to a branch, the HEAD will point
517
+ * to that branch, staying attached, or become attached if it isn't yet.
518
+ * If the branch doesn't exist yet, no error will be return. The HEAD
519
+ * will then be attached to an unborn branch.
520
+ *
521
+ * Otherwise, the HEAD will be detached and will directly point to
522
+ * the Commit.
523
+ *
524
+ * @param repo Repository pointer
525
+ * @param refname Canonical name of the reference the HEAD should point at
526
+ * @return 0 on success, or an error code
527
+ */
528
+ GIT_EXTERN(int) git_repository_set_head(
529
+ git_repository* repo,
530
+ const char* refname);
531
+
532
+ /**
533
+ * Make the repository HEAD directly point to the Commit.
534
+ *
535
+ * If the provided committish cannot be found in the repository, the HEAD
536
+ * is unaltered and GIT_ENOTFOUND is returned.
537
+ *
538
+ * If the provided commitish cannot be peeled into a commit, the HEAD
539
+ * is unaltered and -1 is returned.
540
+ *
541
+ * Otherwise, the HEAD will eventually be detached and will directly point to
542
+ * the peeled Commit.
543
+ *
544
+ * @param repo Repository pointer
545
+ * @param commitish Object id of the Commit the HEAD should point to
546
+ * @return 0 on success, or an error code
547
+ */
548
+ GIT_EXTERN(int) git_repository_set_head_detached(
549
+ git_repository* repo,
550
+ const git_oid* commitish);
551
+
552
+ /**
553
+ * Detach the HEAD.
554
+ *
555
+ * If the HEAD is already detached and points to a Commit, 0 is returned.
556
+ *
557
+ * If the HEAD is already detached and points to a Tag, the HEAD is
558
+ * updated into making it point to the peeled Commit, and 0 is returned.
559
+ *
560
+ * If the HEAD is already detached and points to a non commitish, the HEAD is
561
+ * unaletered, and -1 is returned.
562
+ *
563
+ * Otherwise, the HEAD will be detached and point to the peeled Commit.
564
+ *
565
+ * @param repo Repository pointer
566
+ * @return 0 on success, GIT_EORPHANEDHEAD when HEAD points to a non existing
567
+ * branch or an error code
568
+ */
569
+ GIT_EXTERN(int) git_repository_detach_head(
570
+ git_repository* repo);
339
571
 
340
572
  /** @} */
341
573
  GIT_END_DECL