rugged 0.17.0.b6 → 0.17.0.b7

Sign up to get free protection for your applications and to get access to all the features.
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