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
@@ -404,6 +404,30 @@ VALUE rb_git_index_writetree(VALUE self)
404
404
  return rugged_create_oid(&tree_oid);
405
405
  }
406
406
 
407
+ /*
408
+ * call-seq:
409
+ * index.read_tree(tree)
410
+ *
411
+ * Clear the current index and start the index again on top of +tree+
412
+ *
413
+ * Further index operations (+add+, +update+, +remove+, etc) will
414
+ * be considered changes on top of +tree+.
415
+ */
416
+ VALUE rb_git_index_readtree(VALUE self, VALUE rb_tree)
417
+ {
418
+ git_index *index;
419
+ git_tree *tree;
420
+ int error;
421
+
422
+ Data_Get_Struct(self, git_index, index);
423
+ Data_Get_Struct(rb_tree, git_tree, tree);
424
+
425
+ error = git_index_read_tree(index, tree, NULL);
426
+ rugged_exception_check(error);
427
+
428
+ return Qnil;
429
+ }
430
+
407
431
  void Init_rugged_index()
408
432
  {
409
433
  /*
@@ -431,6 +455,7 @@ void Init_rugged_index()
431
455
 
432
456
  rb_define_method(rb_cRuggedIndex, "remove", rb_git_index_remove, 1);
433
457
  rb_define_method(rb_cRuggedIndex, "write_tree", rb_git_index_writetree, 0);
458
+ rb_define_method(rb_cRuggedIndex, "read_tree", rb_git_index_readtree, 1);
434
459
 
435
460
  rb_define_singleton_method(rb_cRuggedIndex, "index_pack", rb_git_indexer, 1);
436
461
 
@@ -92,12 +92,16 @@ git_object *rugged_object_load(git_repository *repo, VALUE object_value, git_oty
92
92
 
93
93
  if (TYPE(object_value) == T_STRING) {
94
94
  git_oid oid;
95
+ int oid_length = (int)RSTRING_LEN(object_value);
95
96
  int error;
96
97
 
97
- error = git_oid_fromstr(&oid, StringValueCStr(object_value));
98
+ error = git_oid_fromstrn(&oid, RSTRING_PTR(object_value), oid_length);
98
99
  rugged_exception_check(error);
99
100
 
100
- error = git_object_lookup(&object, repo, &oid, type);
101
+ if (oid_length < GIT_OID_HEXSZ)
102
+ error = git_object_lookup_prefix(&object, repo, &oid, oid_length, type);
103
+ else
104
+ error = git_object_lookup(&object, repo, &oid, type);
101
105
  rugged_exception_check(error);
102
106
 
103
107
  } else if (rb_obj_is_kind_of(object_value, rb_cRuggedObject)) {
@@ -24,13 +24,6 @@
24
24
 
25
25
  #include "rugged.h"
26
26
 
27
- #define UNPACK_REFERENCE(_rb_obj, _rugged_obj) {\
28
- if (DATA_PTR(_rb_obj) == NULL)\
29
- rb_raise(rb_eRuntimeError,\
30
- "This Git Reference has been deleted and no longer exists on the repository");\
31
- Data_Get_Struct(_rb_obj, git_reference, _rugged_obj);\
32
- }
33
-
34
27
  extern VALUE rb_mRugged;
35
28
  extern VALUE rb_cRuggedRepo;
36
29
  VALUE rb_cRuggedReference;
@@ -235,7 +228,7 @@ static VALUE rb_git_ref_target(VALUE self)
235
228
  {
236
229
  git_reference *ref;
237
230
 
238
- UNPACK_REFERENCE(self, ref);
231
+ RUGGED_UNPACK_REFERENCE(self, ref);
239
232
 
240
233
  if (git_reference_type(ref) == GIT_REF_OID) {
241
234
  return rugged_create_oid(git_reference_oid(ref));
@@ -265,7 +258,7 @@ static VALUE rb_git_ref_set_target(VALUE self, VALUE rb_target)
265
258
  git_reference *ref;
266
259
  int error;
267
260
 
268
- UNPACK_REFERENCE(self, ref);
261
+ RUGGED_UNPACK_REFERENCE(self, ref);
269
262
  Check_Type(rb_target, T_STRING);
270
263
 
271
264
  if (git_reference_type(ref) == GIT_REF_OID) {
@@ -292,7 +285,7 @@ static VALUE rb_git_ref_set_target(VALUE self, VALUE rb_target)
292
285
  static VALUE rb_git_ref_type(VALUE self)
293
286
  {
294
287
  git_reference *ref;
295
- UNPACK_REFERENCE(self, ref);
288
+ RUGGED_UNPACK_REFERENCE(self, ref);
296
289
  switch (git_reference_type(ref)) {
297
290
  case GIT_REF_OID:
298
291
  return CSTR2SYM("direct");
@@ -312,7 +305,7 @@ static VALUE rb_git_ref_type(VALUE self)
312
305
  static VALUE rb_git_ref_packed(VALUE self)
313
306
  {
314
307
  git_reference *ref;
315
- UNPACK_REFERENCE(self, ref);
308
+ RUGGED_UNPACK_REFERENCE(self, ref);
316
309
 
317
310
  return git_reference_is_packed(ref) ? Qtrue : Qfalse;
318
311
  }
@@ -327,7 +320,7 @@ static VALUE rb_git_ref_reload(VALUE self)
327
320
  {
328
321
  int error;
329
322
  git_reference *ref;
330
- UNPACK_REFERENCE(self, ref);
323
+ RUGGED_UNPACK_REFERENCE(self, ref);
331
324
 
332
325
  error = git_reference_reload(ref);
333
326
 
@@ -350,7 +343,7 @@ static VALUE rb_git_ref_reload(VALUE self)
350
343
  static VALUE rb_git_ref_name(VALUE self)
351
344
  {
352
345
  git_reference *ref;
353
- UNPACK_REFERENCE(self, ref);
346
+ RUGGED_UNPACK_REFERENCE(self, ref);
354
347
  return rugged_str_new2(git_reference_name(ref), rb_utf8_encoding());
355
348
  }
356
349
 
@@ -373,7 +366,7 @@ static VALUE rb_git_ref_resolve(VALUE self)
373
366
  git_reference *resolved;
374
367
  int error;
375
368
 
376
- UNPACK_REFERENCE(self, ref);
369
+ RUGGED_UNPACK_REFERENCE(self, ref);
377
370
 
378
371
  error = git_reference_resolve(&resolved, ref);
379
372
  rugged_exception_check(error);
@@ -398,7 +391,7 @@ static VALUE rb_git_ref_rename(int argc, VALUE *argv, VALUE self)
398
391
  VALUE rb_name, rb_force;
399
392
  int error, force = 0;
400
393
 
401
- UNPACK_REFERENCE(self, ref);
394
+ RUGGED_UNPACK_REFERENCE(self, ref);
402
395
  rb_scan_args(argc, argv, "11", &rb_name, &rb_force);
403
396
 
404
397
  Check_Type(rb_name, T_STRING);
@@ -427,7 +420,7 @@ static VALUE rb_git_ref_delete(VALUE self)
427
420
  git_reference *ref;
428
421
  int error;
429
422
 
430
- UNPACK_REFERENCE(self, ref);
423
+ RUGGED_UNPACK_REFERENCE(self, ref);
431
424
 
432
425
  error = git_reference_delete(ref);
433
426
  rugged_exception_check(error);
@@ -495,7 +488,7 @@ static VALUE rb_git_reflog(VALUE self)
495
488
  VALUE rb_log;
496
489
  unsigned int i, ref_count;
497
490
 
498
- UNPACK_REFERENCE(self, ref);
491
+ RUGGED_UNPACK_REFERENCE(self, ref);
499
492
 
500
493
  error = git_reflog_read(&reflog, ref);
501
494
  rugged_exception_check(error);
@@ -533,7 +526,7 @@ static VALUE rb_git_reflog_write(int argc, VALUE *argv, VALUE self)
533
526
 
534
527
  git_oid oid;
535
528
 
536
- UNPACK_REFERENCE(self, ref);
529
+ RUGGED_UNPACK_REFERENCE(self, ref);
537
530
 
538
531
  rb_scan_args(argc, argv, "11", &rb_committer, &rb_message);
539
532
 
@@ -106,7 +106,7 @@ static VALUE rb_git_walker_each(VALUE self)
106
106
  rb_yield(rugged_object_new(rugged_owner(self), (git_object *)commit));
107
107
  }
108
108
 
109
- if (error != GIT_REVWALKOVER)
109
+ if (error != GIT_ITEROVER)
110
110
  rugged_exception_check(error);
111
111
 
112
112
  return Qnil;
@@ -8,3 +8,4 @@ require 'rugged/reference'
8
8
  require 'rugged/walker'
9
9
  require 'rugged/tree'
10
10
  require 'rugged/tag'
11
+ require 'rugged/branch'
@@ -0,0 +1,28 @@
1
+ module Rugged
2
+ class Branch < Rugged::Reference
3
+
4
+ # The object pointed at by the tip of this branch
5
+ def tip
6
+ @owner.lookup(self.resolve.target)
7
+ end
8
+
9
+ def ==(other)
10
+ other.instance_of?(Rugged::Branch) &&
11
+ other.canonical_name == self.canonical_name
12
+ end
13
+
14
+ # The full name of the branch, as a fully-qualified reference
15
+ # path.
16
+ #
17
+ # This is the same as calling Reference#name for the reference behind
18
+ # the path
19
+ alias_method 'canonical_name', 'name'
20
+
21
+ # The name of the branch, without a fully-qualified reference path
22
+ #
23
+ # E.g. 'master' instead of 'refs/heads/master'
24
+ def name
25
+ super.gsub(%r{^(refs/heads/|refs/remotes/)}, '')
26
+ end
27
+ end
28
+ end
@@ -1,8 +1,12 @@
1
1
  module Rugged
2
2
  class Commit
3
3
 
4
+ def self.prettify_message(msg, strip_comments = true)
5
+ Rugged::prettify_message(msg, strip_comments)
6
+ end
7
+
4
8
  def inspect
5
- "#<Rugged::Commit:#{object_id} {message: #{message.inspect}, tree: #{tree.inspect}, parents: #{parent_ids}>"
9
+ "#<Rugged::Commit:#{object_id} {message: #{message.inspect}, tree: #{tree.inspect}, parents: #{parent_oids}>"
6
10
  end
7
11
 
8
12
  # The time when this commit was made effective. This is the same value
@@ -22,10 +26,6 @@ module Rugged
22
26
  :parents => parents,
23
27
  }
24
28
  end
25
-
26
- def parent_ids
27
- parents.map { |parent| parent.oid }
28
- end
29
29
 
30
30
  def modify(new_args, update_ref=nil)
31
31
  args = self.to_hash.merge(new_args)
@@ -107,20 +107,45 @@ module Rugged
107
107
  Rugged::Reference.each(self)
108
108
  end
109
109
 
110
- # All of the tags in the repository.
110
+ # All the tags in the repository.
111
111
  #
112
112
  # Returns an Enumerable::Enumerator containing all the String tag names.
113
113
  def tags(pattern="")
114
114
  Rugged::Tag.each(self, pattern)
115
115
  end
116
116
 
117
- # All of the remotes in the repository.
117
+ # All the remotes in the repository.
118
118
  #
119
119
  # Returns an Enumerable::Enumerator containing all the String remote names.
120
120
  def remotes
121
121
  Rugged::Remote.each(self)
122
122
  end
123
123
 
124
+ # All the branches in the repository
125
+ #
126
+ # Returns an Enumerable::Enumerator containing Rugged::Branch objects
127
+ def branches
128
+ Rugged::Branch.each(self)
129
+ end
130
+
131
+ # Create a new branch in the repository
132
+ #
133
+ # name - The name of the branch (without a full reference path)
134
+ # sha_or_ref - The target of the branch; either a String representing
135
+ # an OID or a reference name, or a Rugged::Object instance.
136
+ #
137
+ # Returns a Rugged::Branch object
138
+ def create_branch(name, sha_or_ref = "HEAD")
139
+ case sha_or_ref
140
+ when Rugged::Object
141
+ target = sha_or_ref.oid
142
+ else
143
+ target = rev_parse_oid(sha_or_ref)
144
+ end
145
+
146
+ Branch.create(self, name, target)
147
+ end
148
+
124
149
  # Get the content of a file at a specific revision.
125
150
  #
126
151
  # revision - The String SHA1.
@@ -129,13 +154,13 @@ module Rugged
129
154
  # Returns a String.
130
155
  def file_at(revision, path)
131
156
  tree = Rugged::Commit.lookup(self, revision).tree
132
- begin
133
- blob_data = tree.path(path)
134
- rescue Rugged::IndexerError
157
+ begin
158
+ blob_data = tree.path(path)
159
+ rescue Rugged::IndexerError
135
160
  return nil
136
- end
161
+ end
137
162
  blob = Rugged::Blob.lookup(self, blob_data[:oid])
138
- (blob.type == :blob) ? blob.content : nil
163
+ (blob.type == :blob) ? blob.content : nil
139
164
  end
140
165
  end
141
166
  end
@@ -1,8 +1,12 @@
1
1
  module Rugged
2
2
  class Tag
3
3
 
4
+ def self.prettify_message(msg, strip_comments = true)
5
+ Rugged::prettify_message(msg, strip_comments)
6
+ end
7
+
4
8
  def inspect
5
- "#<Rugged::Reference:#{object_id} {name: #{name.inspect}, message: #{message.inspect}, target: #{target.inspect}>"
9
+ "#<Rugged::Tag:#{object_id} {name: #{name.inspect}, message: #{message.inspect}, target: #{target.inspect}>"
6
10
  end
7
11
 
8
12
  def to_hash
@@ -1,3 +1,3 @@
1
1
  module Rugged
2
- Version = VERSION = '0.17.0.b6'
2
+ Version = VERSION = '0.17.0.b7'
3
3
  end
@@ -0,0 +1,227 @@
1
+ # encoding: UTF-8
2
+ require "test_helper"
3
+
4
+ context "Rugged::Branch.each_name" do
5
+ setup do
6
+ @path = temp_repo("testrepo.git")
7
+ @repo = Rugged::Repository.new(@path)
8
+ end
9
+
10
+ test "lists the names of all branches in a bare repository" do
11
+ assert_equal [
12
+ "master",
13
+ "origin/HEAD",
14
+ "origin/master",
15
+ "origin/packed",
16
+ ], Rugged::Branch.each_name(@repo).sort
17
+ end
18
+
19
+ test "can list only local branches" do
20
+ assert_equal ["master"], Rugged::Branch.each_name(@repo, :local).sort
21
+ end
22
+
23
+ test "can list only remote branches" do
24
+ assert_equal [
25
+ "origin/HEAD",
26
+ "origin/master",
27
+ "origin/packed",
28
+ ], Rugged::Branch.each_name(@repo, :remote).sort
29
+ end
30
+ end
31
+
32
+ context "Rugged::Branch#tip" do
33
+ setup do
34
+ @path = temp_repo("testrepo.git")
35
+ @repo = Rugged::Repository.new(@path)
36
+ end
37
+
38
+ test "returns the latest commit of the branch" do
39
+ tip = Rugged::Branch.lookup(@repo, "master").tip
40
+
41
+ assert_kind_of Rugged::Commit, tip
42
+ assert_equal "36060c58702ed4c2a40832c51758d5344201d89a", tip.oid
43
+ end
44
+ end
45
+
46
+ context "Rugged::Branch.lookup" do
47
+ setup do
48
+ @path = temp_repo("testrepo.git")
49
+ @repo = Rugged::Repository.new(@path)
50
+ end
51
+
52
+ test "can look up local branches" do
53
+ branch = Rugged::Branch.lookup(@repo, "master")
54
+ refute_nil branch
55
+
56
+ assert_equal "master", branch.name
57
+ assert_equal "refs/heads/master", branch.canonical_name
58
+ assert_equal "36060c58702ed4c2a40832c51758d5344201d89a", branch.tip.oid
59
+ end
60
+
61
+ test "can look up remote branches" do
62
+ branch = Rugged::Branch.lookup(@repo, "origin/packed", :remote)
63
+ refute_nil branch
64
+
65
+ assert_equal "origin/packed", branch.name
66
+ assert_equal "refs/remotes/origin/packed", branch.canonical_name
67
+ assert_equal "41bc8c69075bbdb46c5c6f0566cc8cc5b46e8bd9", branch.tip.oid
68
+ end
69
+
70
+ test "can look up branches with non 7-bit ASCII characters" do
71
+ new_branch = @repo.create_branch("Ångström", "5b5b025afb0b4c913b4c338a42934a3863bf3644")
72
+ refute_nil new_branch
73
+
74
+ retrieved_branch = Rugged::Branch.lookup(@repo, "Ångström")
75
+ refute_nil retrieved_branch
76
+
77
+ assert_equal new_branch, retrieved_branch
78
+ end
79
+ end
80
+
81
+ context "Rugged::Repository.delete" do
82
+ setup do
83
+ @path = temp_repo("testrepo.git")
84
+ @repo = Rugged::Repository.new(@path)
85
+ end
86
+
87
+ test "deletes a branch from the repository" do
88
+ branch = @repo.create_branch("test_branch")
89
+ branch.delete!
90
+ assert_nil Rugged::Branch.lookup(@repo, "test_branch")
91
+ end
92
+ end
93
+
94
+ context "Rugged::Repository.move" do
95
+ setup do
96
+ @path = temp_repo("testrepo.git")
97
+ @repo = Rugged::Repository.new(@path)
98
+ end
99
+
100
+ test "renames a branch" do
101
+ branch = @repo.create_branch("test_branch")
102
+
103
+ branch.move('other_branch')
104
+
105
+ assert_nil Rugged::Branch.lookup(@repo, "test_branch")
106
+ refute_nil Rugged::Branch.lookup(@repo, "other_branch")
107
+ end
108
+ end
109
+
110
+ context "Rugged::Repository#create_branch" do
111
+ setup do
112
+ @path = temp_repo("testrepo.git")
113
+ @repo = Rugged::Repository.new(@path)
114
+ end
115
+
116
+ test "can create a new branch" do
117
+ new_branch = @repo.create_branch("test_branch", "5b5b025afb0b4c913b4c338a42934a3863bf3644")
118
+
119
+ refute_nil new_branch
120
+ assert_equal "test_branch", new_branch.name
121
+ assert_equal "refs/heads/test_branch", new_branch.canonical_name
122
+
123
+ refute_nil new_branch.tip
124
+ assert_equal "5b5b025afb0b4c913b4c338a42934a3863bf3644", new_branch.tip.oid
125
+
126
+ refute_nil @repo.branches.find { |p| p.name == "test_branch" }
127
+ end
128
+
129
+ test "can create branches with non 7-bit ASCII names" do
130
+ branch_name = "A\314\212ngstro\314\210m"
131
+ new_branch = @repo.create_branch(branch_name, "5b5b025afb0b4c913b4c338a42934a3863bf3644")
132
+
133
+ refute_nil new_branch
134
+ assert_equal branch_name, new_branch.name
135
+ assert_equal "refs/heads/#{branch_name}", new_branch.canonical_name
136
+
137
+ refute_nil new_branch.tip
138
+ assert_equal "5b5b025afb0b4c913b4c338a42934a3863bf3644", new_branch.tip.oid
139
+
140
+ refute_nil @repo.branches.find { |p| p.name == branch_name }
141
+ end
142
+
143
+ test "can create a new branch with an abbreviated sha" do
144
+ new_branch = @repo.create_branch("test_branch", "5b5b025")
145
+
146
+ refute_nil new_branch
147
+ assert_equal "test_branch", new_branch.name
148
+ assert_equal "refs/heads/test_branch", new_branch.canonical_name
149
+
150
+ refute_nil new_branch.tip
151
+ assert_equal "5b5b025afb0b4c913b4c338a42934a3863bf3644", new_branch.tip.oid
152
+ end
153
+
154
+ test "can create a new branch from a tag name" do
155
+ new_branch = @repo.create_branch("test_branch", "refs/tags/v0.9")
156
+
157
+ refute_nil new_branch
158
+ assert_equal "test_branch", new_branch.name
159
+ assert_equal "refs/heads/test_branch", new_branch.canonical_name
160
+
161
+ refute_nil new_branch.tip
162
+ assert_equal "5b5b025afb0b4c913b4c338a42934a3863bf3644", new_branch.tip.oid
163
+ end
164
+
165
+ test "can create a new branch from implicit head" do
166
+ new_branch = @repo.create_branch("test_branch")
167
+
168
+ refute_nil new_branch
169
+ assert_equal "test_branch", new_branch.name
170
+ assert_equal "refs/heads/test_branch", new_branch.canonical_name
171
+
172
+ refute_nil new_branch.tip
173
+ assert_equal "36060c58702ed4c2a40832c51758d5344201d89a", new_branch.tip.oid
174
+ end
175
+
176
+ test "can create a new branch from explicit head" do
177
+ new_branch = @repo.create_branch("test_branch", "HEAD")
178
+
179
+ refute_nil new_branch
180
+ assert_equal "test_branch", new_branch.name
181
+ assert_equal "refs/heads/test_branch", new_branch.canonical_name
182
+
183
+ refute_nil new_branch.tip
184
+ assert_equal "36060c58702ed4c2a40832c51758d5344201d89a", new_branch.tip.oid
185
+ end
186
+
187
+ test "can create a new branch from a commit object" do
188
+ new_branch = @repo.create_branch("test_branch", Rugged::Commit.lookup(@repo, "5b5b025afb0b4c913b4c338a42934a3863bf3644"))
189
+
190
+ refute_nil new_branch
191
+ assert_equal "test_branch", new_branch.name
192
+ assert_equal "refs/heads/test_branch", new_branch.canonical_name
193
+
194
+ refute_nil new_branch.tip
195
+ assert_equal "5b5b025afb0b4c913b4c338a42934a3863bf3644", new_branch.tip.oid
196
+ end
197
+
198
+ test "can not create a new branch from a tree" do
199
+ assert_raises Rugged::InvalidError do
200
+ @repo.create_branch("test_branch", Rugged::Tree.lookup(@repo, "f60079018b664e4e79329a7ef9559c8d9e0378d1"))
201
+ end
202
+ end
203
+
204
+ test "can not create a new branch from a blob" do
205
+ assert_raises Rugged::InvalidError do
206
+ @repo.create_branch("test_branch", Rugged::Blob.lookup(@repo, "1385f264afb75a56a5bec74243be9b367ba4ca08"))
207
+ end
208
+ end
209
+
210
+ test "can not create a new branch from an unknown branch" do
211
+ assert_raises Rugged::ReferenceError do
212
+ @repo.create_branch("test_branch", "i_do_not_exist")
213
+ end
214
+ end
215
+
216
+ test "can not create a new branch from an unknown commit" do
217
+ assert_raises Rugged::ReferenceError do
218
+ @repo.create_branch("test_branch", "dd15de908706711b51b7acb24faab726d2b3cb16")
219
+ end
220
+ end
221
+
222
+ test "can not create a new branch from a non canonical branch name" do
223
+ assert_raises Rugged::ReferenceError do
224
+ @repo.create_branch("test_branch", "packed")
225
+ end
226
+ end
227
+ end