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
@@ -17,7 +17,7 @@ context "Rugged::Config tests" do
17
17
  end
18
18
 
19
19
  test "can read the global config file" do
20
- config = Rugged::Config.open_global
20
+ config = Rugged::Config.global
21
21
  assert_not_nil config['user.name']
22
22
  assert_nil config['core.bare']
23
23
  end
@@ -184,3 +184,34 @@ context "Rugged::Index with working directory" do
184
184
  assert_equal e[:mode], 33199
185
185
  end
186
186
  end
187
+
188
+
189
+ context "Rugged::Index with Rugged::Repository" do
190
+ setup do
191
+ @path = temp_repo("testrepo.git")
192
+ @repo = Rugged::Repository.new(@path)
193
+ @index = @repo.index
194
+ end
195
+
196
+ test "idempotent read_tree/write_tree" do
197
+ head_sha = Rugged::Reference.lookup(@repo,'HEAD').resolve.target
198
+ tree = @repo.lookup(head_sha).tree
199
+ @index.read_tree(tree)
200
+
201
+ index_tree_sha = @index.write_tree
202
+ index_tree = @repo.lookup(index_tree_sha)
203
+ assert_equal tree.oid, index_tree.oid
204
+ end
205
+
206
+
207
+ test "build tree from index on non-HEAD branch" do
208
+ head_sha = Rugged::Reference.lookup(@repo,'refs/remotes/origin/packed').resolve.target
209
+ tree = @repo.lookup(head_sha).tree
210
+ @index.read_tree(tree)
211
+ @index.remove('second.txt')
212
+
213
+ new_tree_sha = @index.write_tree
214
+ assert head_sha != new_tree_sha
215
+ assert_nil @repo.lookup(new_tree_sha)['second.txt']
216
+ end
217
+ end
@@ -0,0 +1,218 @@
1
+ require "test_helper"
2
+ require 'base64'
3
+ require 'tempfile'
4
+ require 'fileutils'
5
+
6
+ def new_index_entry
7
+ now = Time.now
8
+ {
9
+ :path => "new_path",
10
+ :oid => "d385f264afb75a56a5bec74243be9b367ba4ca08",
11
+ :mtime => now,
12
+ :ctime => now,
13
+ :file_size => 1000,
14
+ :dev => 234881027,
15
+ :ino => 88888,
16
+ :mode => 33199,
17
+ :uid => 502,
18
+ :gid => 502,
19
+ :stage => 3,
20
+ }
21
+ end
22
+
23
+ context "Rugged::Index reading stuff" do
24
+ setup do
25
+ path = File.dirname(__FILE__) + '/fixtures/testrepo.git/index'
26
+ @index = Rugged::Index.new(path)
27
+ end
28
+
29
+ test "can iterate through the index" do
30
+ enum = @index.each
31
+ assert enum.kind_of? Enumerable
32
+
33
+ i = 0
34
+ @index.each { |e| i += 1 }
35
+ assert_equal @index.count, i
36
+ end
37
+
38
+ test "can count index entries" do
39
+ assert_equal 2, @index.count
40
+ end
41
+
42
+ test "can clear the in-memory index" do
43
+ @index.clear
44
+ assert_equal 0, @index.count
45
+ end
46
+
47
+ test "can remove entries from the index" do
48
+ @index.remove 0
49
+ assert_equal 1, @index.count
50
+ end
51
+
52
+ test "can get all data from an entry" do
53
+ e = @index.get_entry(0)
54
+ assert_equal 'README', e[:path]
55
+ assert_equal '1385f264afb75a56a5bec74243be9b367ba4ca08', e[:oid]
56
+ assert_equal 1273360380, e[:mtime].to_i
57
+ assert_equal 1273360380, e[:ctime].to_i
58
+ assert_equal 4, e[:file_size]
59
+ assert_equal 234881026, e[:dev]
60
+ assert_equal 6674088, e[:ino]
61
+ assert_equal 33188, e[:mode]
62
+ assert_equal 501, e[:uid]
63
+ assert_equal 0, e[:gid]
64
+ assert_equal false, e[:valid]
65
+ assert_equal 0, e[:stage]
66
+
67
+ e = @index.get_entry(1)
68
+ assert_equal 'new.txt', e[:path]
69
+ assert_equal 'fa49b077972391ad58037050f2a75f74e3671e92', e[:oid]
70
+ end
71
+
72
+ test "can iterate over the entries" do
73
+ itr_test = @index.sort { |a, b| a[:oid] <=> b[:oid] }.map { |e| e[:path] }.join(':')
74
+ assert_equal "README:new.txt", itr_test
75
+ end
76
+
77
+ test "can update entries" do
78
+ now = Time.at Time.now.to_i
79
+ e = @index.get_entry(0)
80
+
81
+ e[:oid] = "12ea3153a78002a988bb92f4123e7e831fd1138a"
82
+ e[:mtime] = now
83
+ e[:ctime] = now
84
+ e[:file_size] = 1000
85
+ e[:dev] = 234881027
86
+ e[:ino] = 88888
87
+ e[:mode] = 33199
88
+ e[:uid] = 502
89
+ e[:gid] = 502
90
+ e[:stage] = 3
91
+
92
+ @index.add(e)
93
+ new_e = @index[e[:path]]
94
+
95
+ # git only sets executable bit based on owner
96
+ e[:mode] = 33188
97
+ assert_equal e, new_e
98
+ end
99
+
100
+ test "can add new entries" do
101
+ e = new_index_entry
102
+ @index << e
103
+ assert_equal 3, @index.count
104
+ itr_test = @index.sort { |a, b| a[:oid] <=> b[:oid] }.map { |x| x[:path] }.join(':')
105
+ assert_equal "README:new_path:new.txt", itr_test
106
+ end
107
+ end
108
+
109
+ context "Rugged::Index writing stuff" do
110
+ setup do
111
+ path = File.dirname(__FILE__) + '/fixtures/testrepo.git/index'
112
+ @tmppath = Tempfile.new('index').path
113
+ FileUtils.copy(path, @tmppath)
114
+ @index = Rugged::Index.new(@tmppath)
115
+ end
116
+
117
+ test "add raises if it gets something weird" do
118
+ assert_raise TypeError do
119
+ @index.add(21)
120
+ end
121
+ end
122
+
123
+ test "can write a new index" do
124
+ e = new_index_entry
125
+ @index << e
126
+
127
+ e[:path] = "else.txt"
128
+ @index << e
129
+
130
+ @index.write
131
+
132
+ index2 = Rugged::Index.new(@tmppath)
133
+
134
+ itr_test = index2.sort { |a, b| a[:oid] <=> b[:oid] }.map { |x| x[:path] }.join(':')
135
+ assert_equal "README:else.txt:new_path:new.txt", itr_test
136
+ assert_equal 4, index2.count
137
+ end
138
+ end
139
+
140
+ context "Rugged::Index with working directory" do
141
+ setup do
142
+ @tmppath = Dir.mktmpdir
143
+ @repo = Rugged::Repository.init_at(@tmppath, false)
144
+ @index = @repo.index
145
+ end
146
+
147
+ teardown do
148
+ FileUtils.remove_entry_secure(@tmppath)
149
+ end
150
+
151
+ test "can add from a path" do
152
+ File.open(File.join(@tmppath, 'test.txt'), 'w') do |f|
153
+ f.puts "test content"
154
+ end
155
+ @index.add('test.txt')
156
+ @index.write
157
+
158
+ index2 = Rugged::Index.new(@tmppath + '/.git/index')
159
+ assert_equal index2.get_entry(0)[:path], 'test.txt'
160
+ end
161
+
162
+ test "can reload the index" do
163
+ File.open(File.join(@tmppath, 'test.txt'), 'w') do |f|
164
+ f.puts "test content"
165
+ end
166
+ @index.add('test.txt', 2)
167
+ @index.write
168
+
169
+ sleep(1) # we need this sleep to sync at the FS level
170
+ # most FSs have 1s granularity on mtimes
171
+
172
+ rindex = Rugged::Index.new(File.join(@tmppath, '/.git/index'))
173
+ e = rindex['test.txt']
174
+ assert_equal 2, e[:stage]
175
+
176
+ rindex << new_index_entry
177
+ rindex.write
178
+
179
+ assert_equal 1, @index.count
180
+ @index.reload
181
+ assert_equal 2, @index.count
182
+
183
+ e = @index['new_path']
184
+ assert_equal e[:mode], 33199
185
+ end
186
+ end
187
+
188
+
189
+ context "Rugged::Index with Rugged::Repository" do
190
+ setup do
191
+ @path = temp_repo("testrepo.git")
192
+ @repo = Rugged::Repository.new(@path)
193
+ @index = @repo.index
194
+ end
195
+
196
+ test "idempotent read_tree/write_tree" do
197
+ head_sha = Rugged::Reference.lookup(@repo,'HEAD').resolve.target
198
+ tree = @repo.lookup(head_sha).tree
199
+ @index.read_tree(tree)
200
+
201
+ index_tree_sha = @index.write_tree
202
+ index_tree = @repo.lookup(index_tree_sha)
203
+ assert_equal tree.oid, index_tree.oid
204
+ end
205
+
206
+
207
+ test "build tree from index on non-HEAD branch" do
208
+ head_sha = Rugged::Reference.lookup(@repo,'refs/remotes/origin/packed').resolve.target
209
+ tree = @repo.lookup(head_sha).tree
210
+ @index.read_tree(tree)
211
+ @index.remove('second.txt')
212
+
213
+ new_tree_sha = @index.write_tree
214
+ assert head_sha != new_tree_sha
215
+ pp @repo.lookup(new_tree_sha)
216
+ assert_nil @repo.lookup(new_tree_sha)['second.txt']
217
+ end
218
+ end
@@ -37,4 +37,26 @@ context "Rugged::Lib stuff" do
37
37
  hex2 = raw.unpack("H*")[0]
38
38
  assert_equal hex1, hex2
39
39
  end
40
+
41
+ test "prettifies commit messages properly" do
42
+ message = <<-MESSAGE
43
+ Testing this whole prettify business
44
+
45
+ with newlines and stuff
46
+ # take out this line haha
47
+ # and this one
48
+
49
+ not this one
50
+ MESSAGE
51
+
52
+ clean_message = <<-MESSAGE
53
+ Testing this whole prettify business
54
+
55
+ with newlines and stuff
56
+
57
+ not this one
58
+ MESSAGE
59
+
60
+ assert_equal clean_message, Rugged::prettify_message(message, true)
61
+ end
40
62
  end
@@ -2,6 +2,8 @@
2
2
  require File.expand_path "../test_helper", __FILE__
3
3
 
4
4
  context "Rugged::Reference stuff" do
5
+ UNICODE_REF_NAME = "A\314\212ngstro\314\210m"
6
+
5
7
  setup do
6
8
  @path = File.dirname(__FILE__) + '/fixtures/testrepo.git'
7
9
  @repo = Rugged::Repository.new(@path)
@@ -9,7 +11,7 @@ context "Rugged::Reference stuff" do
9
11
 
10
12
  teardown do
11
13
  FileUtils.remove_entry_secure(@path + '/refs/heads/unit_test', true)
12
- FileUtils.remove_entry_secure(@path + '/refs/heads/Ångström', true)
14
+ FileUtils.remove_entry_secure(@path + "/refs/heads/#{UNICODE_REF_NAME}", true)
13
15
  end
14
16
 
15
17
  test "can list references" do
@@ -18,9 +20,9 @@ context "Rugged::Reference stuff" do
18
20
  end
19
21
 
20
22
  test "can list references with non 7-bit ASCII characters" do
21
- Rugged::Reference.create(@repo, "refs/heads/Ångström", "refs/heads/master")
23
+ Rugged::Reference.create(@repo, "refs/heads/#{UNICODE_REF_NAME}", "refs/heads/master")
22
24
  refs = @repo.refs.map { |r| r.name.gsub("refs/", '') }.sort.join(':')
23
- assert_equal "heads/master:heads/packed:heads/Ångström:tags/v0.9:tags/v1.0", refs
25
+ assert_equal "heads/#{UNICODE_REF_NAME}:heads/master:heads/packed:tags/v0.9:tags/v1.0", refs
24
26
  end
25
27
 
26
28
  test "can list filtered references from regex" do
@@ -15,7 +15,7 @@ INCLUDES= -I. -Isrc -Iinclude -Ideps/http-parser -Ideps/zlib
15
15
  DEFINES= $(INCLUDES) -DNO_VIZ -DSTDC -DNO_GZIP -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $(EXTRA_DEFINES)
16
16
  CFLAGS= -g $(DEFINES) -Wall -Wextra -O2 $(EXTRA_CFLAGS)
17
17
 
18
- SRCS = $(wildcard src/*.c) $(wildcard src/transports/*.c) $(wildcard src/xdiff/*.c) $(wildcard deps/http-parser/*.c) $(wildcard deps/zlib/*.c)
18
+ SRCS = $(wildcard src/*.c) $(wildcard src/transports/*.c) $(wildcard src/xdiff/*.c) $(wildcard deps/http-parser/*.c) $(wildcard deps/zlib/*.c) $(wildcard src/sha1/*.c)
19
19
 
20
20
  ifeq ($(PLATFORM),Msys)
21
21
  SRCS += $(wildcard src/win32/*.c) $(wildcard src/compat/*.c) deps/regex/regex.c
@@ -51,5 +51,6 @@
51
51
  #include "git2/notes.h"
52
52
  #include "git2/reset.h"
53
53
  #include "git2/message.h"
54
+ #include "git2/pack.h"
54
55
 
55
56
  #endif
@@ -8,6 +8,7 @@
8
8
  #define INCLUDE_git_branch_h__
9
9
 
10
10
  #include "common.h"
11
+ #include "oid.h"
11
12
  #include "types.h"
12
13
 
13
14
  /**
@@ -55,21 +56,13 @@ GIT_EXTERN(int) git_branch_create(
55
56
  /**
56
57
  * Delete an existing branch reference.
57
58
  *
58
- * @param repo Repository where lives the branch.
59
+ * If the branch is successfully deleted, the passed reference
60
+ * object will be freed and invalidated.
59
61
  *
60
- * @param branch_name Name of the branch to be deleted;
61
- * this name is validated for consistency.
62
- *
63
- * @param branch_type Type of the considered branch. This should
64
- * be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE.
65
- *
66
- * @return 0 on success, GIT_ENOTFOUND if the branch
67
- * doesn't exist or an error code.
62
+ * @param branch A valid reference representing a branch
63
+ * @return 0 on success, or an error code.
68
64
  */
69
- GIT_EXTERN(int) git_branch_delete(
70
- git_repository *repo,
71
- const char *branch_name,
72
- git_branch_t branch_type);
65
+ GIT_EXTERN(int) git_branch_delete(git_reference *branch);
73
66
 
74
67
  /**
75
68
  * Loop over all the branches and issue a callback for each one.
@@ -155,6 +148,17 @@ GIT_EXTERN(int) git_branch_tracking(
155
148
  git_reference **tracking_out,
156
149
  git_reference *branch);
157
150
 
151
+ /**
152
+ * Determine if the current local branch is pointed at by HEAD.
153
+ *
154
+ * @param branch Current underlying reference of the branch.
155
+ *
156
+ * @return 1 if HEAD points at the branch, 0 if it isn't,
157
+ * error code otherwise.
158
+ */
159
+ GIT_EXTERN(int) git_branch_is_head(
160
+ git_reference *branch);
161
+
158
162
  /** @} */
159
163
  GIT_END_DECL
160
164
  #endif
@@ -10,7 +10,7 @@
10
10
  #include "common.h"
11
11
  #include "types.h"
12
12
  #include "indexer.h"
13
-
13
+ #include "strarray.h"
14
14
 
15
15
  /**
16
16
  * @file git2/checkout.h
@@ -21,45 +21,106 @@
21
21
  */
22
22
  GIT_BEGIN_DECL
23
23
 
24
+ /**
25
+ * Checkout behavior flags
26
+ *
27
+ * These flags control what checkout does with files. Pass in a
28
+ * combination of these values OR'ed together.
29
+ */
30
+ typedef enum {
31
+ /** Checkout does not update any files in the working directory. */
32
+ GIT_CHECKOUT_DEFAULT = (1 << 0),
33
+
34
+ /** When a file exists and is modified, replace it with new version. */
35
+ GIT_CHECKOUT_OVERWRITE_MODIFIED = (1 << 1),
36
+
37
+ /** When a file does not exist in the working directory, create it. */
38
+ GIT_CHECKOUT_CREATE_MISSING = (1 << 2),
24
39
 
25
- #define GIT_CHECKOUT_OVERWRITE_EXISTING 0 /* default */
26
- #define GIT_CHECKOUT_SKIP_EXISTING 1
40
+ /** If an untracked file in found in the working dir, delete it. */
41
+ GIT_CHECKOUT_REMOVE_UNTRACKED = (1 << 3),
42
+ } git_checkout_strategy_t;
27
43
 
28
- /* Use zeros to indicate default settings */
44
+ /**
45
+ * Checkout options structure
46
+ *
47
+ * Use zeros to indicate default settings.
48
+ */
29
49
  typedef struct git_checkout_opts {
30
- int existing_file_action; /* default: GIT_CHECKOUT_OVERWRITE_EXISTING */
31
- int disable_filters;
32
- int dir_mode; /* default is 0755 */
33
- int file_mode; /* default is 0644 */
34
- int file_open_flags; /* default is O_CREAT | O_TRUNC | O_WRONLY */
50
+ unsigned int checkout_strategy; /** default: GIT_CHECKOUT_DEFAULT */
51
+ int disable_filters; /** don't apply filters like CRLF conversion */
52
+ int dir_mode; /** default is 0755 */
53
+ int file_mode; /** default is 0644 or 0755 as dictated by blob */
54
+ int file_open_flags; /** default is O_CREAT | O_TRUNC | O_WRONLY */
55
+
56
+ /** Optional callback to notify the consumer of files that
57
+ * haven't be checked out because a modified version of them
58
+ * exist in the working directory.
59
+ *
60
+ * When provided, this callback will be invoked when the flag
61
+ * GIT_CHECKOUT_OVERWRITE_MODIFIED isn't part of the checkout strategy.
62
+ */
63
+ int (* skipped_notify_cb)(
64
+ const char *skipped_file,
65
+ const git_oid *blob_oid,
66
+ int file_mode,
67
+ void *payload);
68
+
69
+ void *notify_payload;
70
+
71
+ /** When not NULL, array of fnmatch patterns specifying
72
+ * which paths should be taken into account
73
+ */
74
+ git_strarray paths;
35
75
  } git_checkout_opts;
36
76
 
37
77
  /**
38
- * Updates files in the working tree to match the commit pointed to by HEAD.
78
+ * Updates files in the index and the working tree to match the content of the
79
+ * commit pointed at by HEAD.
39
80
  *
40
81
  * @param repo repository to check out (must be non-bare)
41
82
  * @param opts specifies checkout options (may be NULL)
42
83
  * @param stats structure through which progress information is reported
43
- * @return 0 on success, GIT_ERROR otherwise (use giterr_last for information about the error)
84
+ * @return 0 on success, GIT_EORPHANEDHEAD when HEAD points to a non existing
85
+ * branch, GIT_ERROR otherwise (use giterr_last for information
86
+ * about the error)
44
87
  */
45
- GIT_EXTERN(int) git_checkout_head(git_repository *repo,
46
- git_checkout_opts *opts,
47
- git_indexer_stats *stats);
48
-
49
-
88
+ GIT_EXTERN(int) git_checkout_head(
89
+ git_repository *repo,
90
+ git_checkout_opts *opts,
91
+ git_indexer_stats *stats);
50
92
 
51
93
  /**
52
- * Updates files in the working tree to match a commit pointed to by a ref.
94
+ * Updates files in the working tree to match the content of the index.
53
95
  *
54
- * @param ref reference to follow to a commit
96
+ * @param repo repository to check out (must be non-bare)
55
97
  * @param opts specifies checkout options (may be NULL)
56
98
  * @param stats structure through which progress information is reported
57
- * @return 0 on success, GIT_ERROR otherwise (use giterr_last for information about the error)
99
+ * @return 0 on success, GIT_ERROR otherwise (use giterr_last for information
100
+ * about the error)
58
101
  */
59
- GIT_EXTERN(int) git_checkout_reference(git_reference *ref,
60
- git_checkout_opts *opts,
61
- git_indexer_stats *stats);
102
+ GIT_EXTERN(int) git_checkout_index(
103
+ git_repository *repo,
104
+ git_checkout_opts *opts,
105
+ git_indexer_stats *stats);
62
106
 
107
+ /**
108
+ * Updates files in the index and working tree to match the content of the
109
+ * tree pointed at by the treeish.
110
+ *
111
+ * @param repo repository to check out (must be non-bare)
112
+ * @param treeish a commit, tag or tree which content will be used to update
113
+ * the working directory
114
+ * @param opts specifies checkout options (may be NULL)
115
+ * @param stats structure through which progress information is reported
116
+ * @return 0 on success, GIT_ERROR otherwise (use giterr_last for information
117
+ * about the error)
118
+ */
119
+ GIT_EXTERN(int) git_checkout_tree(
120
+ git_repository *repo,
121
+ git_object *treeish,
122
+ git_checkout_opts *opts,
123
+ git_indexer_stats *stats);
63
124
 
64
125
  /** @} */
65
126
  GIT_END_DECL