rdavila-rugged 0.24.0b13

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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +619 -0
  4. data/ext/rugged/extconf.rb +105 -0
  5. data/ext/rugged/rugged.c +527 -0
  6. data/ext/rugged/rugged.h +185 -0
  7. data/ext/rugged/rugged_backend.c +34 -0
  8. data/ext/rugged/rugged_blame.c +292 -0
  9. data/ext/rugged/rugged_blob.c +638 -0
  10. data/ext/rugged/rugged_branch.c +195 -0
  11. data/ext/rugged/rugged_branch_collection.c +408 -0
  12. data/ext/rugged/rugged_commit.c +691 -0
  13. data/ext/rugged/rugged_config.c +404 -0
  14. data/ext/rugged/rugged_cred.c +148 -0
  15. data/ext/rugged/rugged_diff.c +686 -0
  16. data/ext/rugged/rugged_diff_delta.c +105 -0
  17. data/ext/rugged/rugged_diff_hunk.c +103 -0
  18. data/ext/rugged/rugged_diff_line.c +83 -0
  19. data/ext/rugged/rugged_index.c +1255 -0
  20. data/ext/rugged/rugged_note.c +376 -0
  21. data/ext/rugged/rugged_object.c +383 -0
  22. data/ext/rugged/rugged_patch.c +245 -0
  23. data/ext/rugged/rugged_reference.c +396 -0
  24. data/ext/rugged/rugged_reference_collection.c +446 -0
  25. data/ext/rugged/rugged_remote.c +691 -0
  26. data/ext/rugged/rugged_remote_collection.c +457 -0
  27. data/ext/rugged/rugged_repo.c +2669 -0
  28. data/ext/rugged/rugged_revwalk.c +495 -0
  29. data/ext/rugged/rugged_settings.c +155 -0
  30. data/ext/rugged/rugged_signature.c +106 -0
  31. data/ext/rugged/rugged_submodule.c +852 -0
  32. data/ext/rugged/rugged_submodule_collection.c +384 -0
  33. data/ext/rugged/rugged_tag.c +251 -0
  34. data/ext/rugged/rugged_tag_collection.c +347 -0
  35. data/ext/rugged/rugged_tree.c +919 -0
  36. data/lib/rugged.rb +23 -0
  37. data/lib/rugged/attributes.rb +41 -0
  38. data/lib/rugged/blob.rb +28 -0
  39. data/lib/rugged/branch.rb +19 -0
  40. data/lib/rugged/commit.rb +54 -0
  41. data/lib/rugged/console.rb +9 -0
  42. data/lib/rugged/credentials.rb +43 -0
  43. data/lib/rugged/diff.rb +20 -0
  44. data/lib/rugged/diff/delta.rb +53 -0
  45. data/lib/rugged/diff/hunk.rb +18 -0
  46. data/lib/rugged/diff/line.rb +47 -0
  47. data/lib/rugged/index.rb +13 -0
  48. data/lib/rugged/object.rb +7 -0
  49. data/lib/rugged/patch.rb +36 -0
  50. data/lib/rugged/reference.rb +7 -0
  51. data/lib/rugged/remote.rb +4 -0
  52. data/lib/rugged/repository.rb +227 -0
  53. data/lib/rugged/submodule_collection.rb +48 -0
  54. data/lib/rugged/tag.rb +50 -0
  55. data/lib/rugged/tree.rb +38 -0
  56. data/lib/rugged/version.rb +3 -0
  57. data/lib/rugged/walker.rb +5 -0
  58. metadata +146 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 13b0e41bb437817471d90635aa64acc108c5f061
4
+ data.tar.gz: b8d6955478d409db23e83b0711e9889db9e4b435
5
+ SHA512:
6
+ metadata.gz: c3fea886e3c30e4cb90e498d6095ae1ac042487d89594f5fcbd68423d61ea8e62b32f08d1a1b4f5e47169c5b68b3884a3e9ebd712252f2255d032ac3968d246a
7
+ data.tar.gz: fe37765778cbf8b6bcd00754cec7f62092f73ee975951556dcb1c80461cf926f572761c83cec1efe2e127b8d4d107e6d30320e650a15e6010e2a21b462363b24
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2015 GitHub, Inc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,619 @@
1
+ # Rugged
2
+ **libgit2 bindings in Ruby**
3
+
4
+ Rugged is a library for accessing [libgit2](https://github.com/libgit2/libgit2) in Ruby. It gives you the speed and
5
+ portability of libgit2 with the beauty of the Ruby language.
6
+
7
+ ### libgit2
8
+
9
+ libgit2 is a pure C implementation of the Git core methods. It's designed to be
10
+ fast and portable. For more information about libgit2,
11
+ [check out libgit2's website](http://libgit2.github.com) or browse the
12
+ [libgit2 organization](https://github.com/libgit2) on GitHub.
13
+
14
+ ## Install
15
+
16
+ Rugged is a self-contained gem. You can install it by running:
17
+
18
+ $ gem install rugged
19
+
20
+ You need to have CMake and `pkg-config` installed on your system to be able to build the included version of `libgit2`. On OS X, after installing [Homebrew](http://brew.sh/), you can get CMake with:
21
+ ```bash
22
+ $ brew install cmake
23
+ ```
24
+
25
+ If you want to build Rugged with HTTPS and SSH support, check out the list of optional [libgit2 dependencies](https://github.com/libgit2/libgit2#optional-dependencies).
26
+
27
+ If you're using bundler and want to bundle `libgit2` with Rugged, you can use the `:submodules` option:
28
+
29
+ ```ruby
30
+ gem 'rugged', git: 'git://github.com/libgit2/rugged.git', submodules: true
31
+ ```
32
+
33
+ To load Rugged, you'll usually want to add something like this:
34
+
35
+ ```ruby
36
+ require 'rugged'
37
+ ```
38
+
39
+ ### Use the system provided libgit2
40
+
41
+ By default, Rugged builds and uses a bundled version of libgit2. If you
42
+ want to use the system library instead, you can install rugged as follows:
43
+
44
+ ```
45
+ gem install rugged -- --use-system-libraries
46
+ ```
47
+
48
+ Or if you are using bundler:
49
+
50
+ ```
51
+ bundle config build.rugged --use-system-libraries
52
+ bundle install
53
+ ```
54
+
55
+ However, note that Rugged does only support specific versions of libgit2.
56
+
57
+ ## Usage
58
+
59
+ Rugged gives you access to the many parts of a Git repository. You can read and
60
+ write objects, walk a tree, access the staging area, and lots more. Let's look
61
+ at each area individually.
62
+
63
+ ### Repositories
64
+
65
+ #### Instantiation
66
+
67
+ The repository is naturally central to Git. Rugged has a `Repository` class that
68
+ you can instantiate with a path to open an existing repository :
69
+
70
+ ```ruby
71
+ repo = Rugged::Repository.new('path/to/my/repository')
72
+ # => #<Rugged::Repository:2228536260 {path: "path/to/my/repository/.git/"}>
73
+ ```
74
+
75
+ You can create a new repository with `init_at`. Add a second parameter `:bare` to make a bare repository:
76
+
77
+ ```ruby
78
+ Rugged::Repository.init_at('.', :bare)
79
+ ```
80
+
81
+ You can also let Rugged discover the path to the .git directory if you give it a
82
+ subdirectory.
83
+
84
+ ```ruby
85
+ Rugged::Repository.discover("/Users/me/projects/repo/lib/subdir/")
86
+ # => "/Users/me/projects/repo/.git/"
87
+ ```
88
+
89
+ Once your Repository instantiated (in the following examples, as `repo`), you
90
+ can access or modify it.
91
+
92
+ #### Accessing a Repository
93
+
94
+ ```ruby
95
+ # Does the given SHA1 exist in this repository?
96
+ repo.exists?('07b44cbda23b726e5d54e2ef383495922c024202')
97
+ # => true
98
+
99
+ # Boolean repository state values:
100
+ repo.bare?
101
+ # => false
102
+ repo.empty?
103
+ # => true
104
+ repo.head_unborn?
105
+ # => false
106
+ repo.head_detached?
107
+ # => false
108
+
109
+ # Path accessors
110
+ repo.path
111
+ # => "path/to/my/repository/.git/"
112
+ repo.workdir
113
+ # => "path/to/my/repository/"
114
+
115
+ # The HEAD of the repository.
116
+ ref = repo.head
117
+ # => #<Rugged::Reference:2228467240 {name: "refs/heads/master", target: #<Rugged::Commit:2228467250 {message: "helpful message", tree: #<Rugged::Tree:2228467260 {oid: 5d6f29220a0783b8085134df14ec4d960b6c3bf2}>}>
118
+
119
+ # From the returned ref, you can also access the `name`, `target`, and target SHA:
120
+ ref.name
121
+ # => "refs/heads/master"
122
+ ref.target
123
+ # => #<Rugged::Commit:2228467250 {message: "helpful message", tree: #<Rugged::Tree:2228467260 {oid: 5d6f29220a0783b8085134df14ec4d960b6c3bf2}>}>
124
+ ref.target_id
125
+ # => "2bc6a70483369f33f641ca44873497f13a15cde5"
126
+
127
+ # Reading an object
128
+ object = repo.read('a0ae5566e3c8a3bddffab21022056f0b5e03ef07')
129
+ # => #<Rugged::OdbObject:0x109a64780>
130
+ object.len
131
+ # => 237
132
+ object.data
133
+ # => "tree 76f23f186076fc291742816721ea8c3e95567241\nparent 8e3c5c52b8f29da0adc7e8be8a037cbeaea6de6b\nauthor Vicent Mart\303\255 <tanoku@gmail.com> 1333859005 +0200\ncommitter Vicent Mart\303\255 <tanoku@gmail.com> 1333859005 +0200\n\nAdd `Repository#blob_at`\n"
134
+ object.type
135
+ # => :commit
136
+ ```
137
+
138
+ #### Writing to a Repository
139
+
140
+ There's a few ways to write to a repository. To write directly from your
141
+ instantiated repository object:
142
+
143
+ ```ruby
144
+ sha = repo.write(content, type)
145
+ ```
146
+
147
+ You can also use the `Commit` object directly to craft a commit; this is a bit
148
+ more high-level, so it may be preferable:
149
+
150
+ ```ruby
151
+ oid = repo.write("This is a blob.", :blob)
152
+ index = repo.index
153
+ index.read_tree(repo.head.target.tree)
154
+ index.add(:path => "README.md", :oid => oid, :mode => 0100644)
155
+
156
+ options = {}
157
+ options[:tree] = index.write_tree(repo)
158
+
159
+ options[:author] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
160
+ options[:committer] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
161
+ options[:message] ||= "Making a commit via Rugged!"
162
+ options[:parents] = repo.empty? ? [] : [ repo.head.target ].compact
163
+ options[:update_ref] = 'HEAD'
164
+
165
+ Rugged::Commit.create(repo, options)
166
+ ```
167
+
168
+ ---
169
+
170
+ ### Objects
171
+
172
+ `Object` is the main object class - it shouldn't be created directly, but all of
173
+ these methods should be useful in their derived classes.
174
+
175
+ ```ruby
176
+ obj = repo.lookup(sha)
177
+ obj.oid # object sha
178
+ obj.type # One of :commit, :tree, :blob or :tag
179
+
180
+ robj = obj.read_raw
181
+ str = robj.data
182
+ int = robj.len
183
+ ```
184
+
185
+ There are four base object types in Git: **blobs**, **commits**, **tags**, and
186
+ **trees**. Each of these object types have a corresponding class within Rugged.
187
+
188
+ ### Commit Objects
189
+
190
+ ```ruby
191
+ commit = repo.lookup('a0ae5566e3c8a3bddffab21022056f0b5e03ef07')
192
+ # => #<Rugged::Commit:2245304380>
193
+
194
+ commit.message
195
+ # => "Add `Repository#blob_at`\n"
196
+
197
+ commit.time
198
+ # => Sat Apr 07 21:23:25 -0700 2012
199
+
200
+ commit.author
201
+ # => {:email=>"tanoku@gmail.com", :name=>"Vicent Mart\303\255", :time=>Sun Apr 08 04:23:25 UTC 2012}
202
+
203
+ commit.tree
204
+ # => #<Rugged::Tree:2245269740>
205
+
206
+ commit.parents
207
+ # => [#<Rugged::Commit:2245264600 {message: "Merge pull request #47 from isaac/remotes\n\nAdd Rugged::Repository#remotes", tree: #<Rugged::Tree:2245264240 {oid: 6a2aee58a41fa007d07aa55565e2231f9b39b4a9}>]
208
+ ```
209
+
210
+ You can also write new objects to the database this way:
211
+
212
+ ```ruby
213
+ author = {:email=>"tanoku@gmail.com", :time=>Time.now, :name=>"Vicent Mart\303\255"}
214
+
215
+ Rugged::Commit.create(r,
216
+ :author => author,
217
+ :message => "Hello world\n\n",
218
+ :committer => author,
219
+ :parents => ["2cb831a8aea28b2c1b9c63385585b864e4d3bad1"],
220
+ :tree => some_tree,
221
+ :update_ref => "HEAD") #=> "f148106ca58764adc93ad4e2d6b1d168422b9796"
222
+ ```
223
+
224
+ ### Tag Objects
225
+
226
+ ```ruby
227
+ tag = repo.lookup(tag_sha)
228
+
229
+ object = tag.target
230
+ sha = tag.target.oid
231
+ str = tag.target_type # :commit, :tag, :blob
232
+ str = tag.name # "v1.0"
233
+ str = tag.message
234
+ person = tag.tagger
235
+ ```
236
+
237
+ ### Tree Objects
238
+
239
+ ```ruby
240
+ tree = repo.lookup('779fbb1e17e666832773a9825875300ea736c2da')
241
+ # => #<Rugged::Tree:2245194360>
242
+
243
+ # number of tree entries
244
+ tree.count
245
+
246
+ tree[0] # or...
247
+ tree.first # or...
248
+ tree.get_entry(0)
249
+ # => {:type=>:blob, :oid=>"99e7edb53db9355f10c6f2dfaa5a183f205d93bf", :filemode=>33188, :name=>".gitignore"}
250
+ ```
251
+
252
+ The tree object is an Enumerable, so you can also do stuff like this:
253
+
254
+ ```ruby
255
+ tree.each { |e| puts e[:oid] }
256
+ tree.sort { |a, b| a[:oid] <=> b[:oid] }.map { |e| e[:name] }.join(':')
257
+ ```
258
+
259
+ And there are some Rugged-specific methods, too:
260
+
261
+ ```ruby
262
+ tree.each_tree { |entry| puts entry[:name] } # list subdirs
263
+ tree.each_blob { |entry| puts entry[:name] } # list only files
264
+ ```
265
+
266
+ You can also write trees with the `TreeBuilder`:
267
+
268
+ ```ruby
269
+ oid = repo.write("This is a blob.", :blob)
270
+ builder = Rugged::Tree::Builder.new(repo)
271
+ builder << { :type => :blob, :name => "README.md", :oid => oid, :filemode => 0100644 }
272
+
273
+ options = {}
274
+ options[:tree] = builder.write
275
+
276
+ options[:author] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
277
+ options[:committer] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
278
+ options[:message] ||= "Making a commit via Rugged!"
279
+ options[:parents] = repo.empty? ? [] : [ repo.head.target ].compact
280
+ options[:update_ref] = 'HEAD'
281
+
282
+ Rugged::Commit.create(repo, options)
283
+ ```
284
+
285
+ ### Blob Objects
286
+
287
+ Blob objects represent the data in the files of a Tree Object.
288
+
289
+ ```ruby
290
+ blob = repo.lookup('e1253910439ea902cf49be8a9f02f3c08d89ac73')
291
+ blob.content # => Gives you the content of the blob.
292
+ ```
293
+
294
+ #### Streaming Blob Objects
295
+
296
+ There is currently no way to stream data from a blob, because `libgit2` itself does not (yet) support
297
+ streaming blobs out of the git object database. While there are hooks and interfaces for supporting it,
298
+ the default file system backend always loads the entire blob contents into memory.
299
+
300
+ If you need to access a Blob object through an IO-like API, you can wrap it with the `StringIO` class.
301
+ Note that the only advantage here is a stream-compatible interface, the complete blob object will still
302
+ be loaded into memory. Below is an example for streaming a Blob using the Sinatra framework:
303
+
304
+ ```ruby
305
+ # Sinatra endpoint
306
+ get "/blobs/:sha" do
307
+ repo = Rugged::Repository.new(my_repo_path)
308
+ blob = repo.lookup params[:sha]
309
+
310
+ headers({
311
+ "Vary" => "Accept",
312
+ "Connection" => "keep-alive",
313
+ "Transfer-Encoding" => "chunked",
314
+ "Content-Type" => "application/octet-stream",
315
+ })
316
+
317
+ stream do |out|
318
+ StringIO.new(blob.content).each(8000) do |chunk|
319
+ out << chunk
320
+ end
321
+ end
322
+ end
323
+ ```
324
+
325
+ ---
326
+
327
+ ### Commit Walker
328
+
329
+ `Rugged::Walker` is a class designed to help you traverse a set of commits over
330
+ a repository.
331
+
332
+ You first push head SHAs onto the walker, and then call next to get a list of
333
+ the reachable commit objects one at a time. You can also `hide()` commits if you
334
+ are not interested in anything beneath them (useful in situations like when
335
+ you're running something like `git log master ^origin/master`).
336
+
337
+ ```ruby
338
+ walker = Rugged::Walker.new(repo)
339
+ walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE) # optional
340
+ walker.push(hex_sha_interesting)
341
+ walker.hide(hex_sha_uninteresting)
342
+ walker.each { |c| puts c.inspect }
343
+ walker.reset
344
+ ```
345
+
346
+ ---
347
+
348
+ ### Index ("staging") area
349
+
350
+ We can inspect and manipulate the Git Index as well. To work with the index
351
+ inside an existing repository, instantiate it by using the `Repository.index`
352
+ method instead of manually opening the Index by its path.
353
+
354
+ ```ruby
355
+ index = Rugged::Index.new(path)
356
+
357
+ # Re-read the index file from disk.
358
+ index.reload
359
+
360
+ # Count up index entries.
361
+ count = index.count
362
+
363
+ # The collection of index entries.
364
+ index.entries
365
+
366
+ # Iterating over index entries.
367
+ index.each { |i| puts i.inspect }
368
+
369
+ # Get a particular entry in the index.
370
+ index[path]
371
+
372
+ # Unstage.
373
+ index.remove(path)
374
+
375
+ # Stage. Also updates existing entry if there is one.
376
+ index.add(ientry)
377
+
378
+ # Stage. Create ientry from file in path, updates the index.
379
+ index.add(path)
380
+ ```
381
+
382
+ ---
383
+
384
+ ### Refs
385
+
386
+ You can access references through the `Rugged::ReferenceCollection` object returned by `Repository#references`.
387
+
388
+ ```ruby
389
+ ref = repo.references["refs/heads/master"]
390
+
391
+ sha = ref.target_id
392
+ str = ref.type # :direct
393
+ str = ref.name # "refs/heads/master"
394
+ ```
395
+
396
+ You can also easily iterate over all references:
397
+
398
+ ```ruby
399
+ repo.references.each do |ref|
400
+ puts ref.name
401
+ end
402
+ ```
403
+
404
+ Or only over references that match the given pattern (glob):
405
+
406
+ ```ruby
407
+ repo.references.each("refs/tags/*") do |ref|
408
+ puts ref.name
409
+ end
410
+ ```
411
+
412
+ It is also easy to create, update, rename or delete a reference:
413
+
414
+ ```ruby
415
+ ref = repo.references.create("refs/heads/unit_test", some_commit_sha)
416
+
417
+ repo.references.update(ref, new_sha) # or...
418
+ repo.references.update("refs/heads/unit_test", new_sha)
419
+
420
+ repo.references.rename(ref, "refs/heads/blead") # or...
421
+ repo.references.rename("refs/heads/unit_test", "refs/heads/blead")
422
+
423
+ repo.references.delete(ref) # or...
424
+ repo.references.delete("refs/heads/unit_test") # or...
425
+ ```
426
+
427
+ Finally, you can access the reflog for any branch:
428
+
429
+ ```ruby
430
+ ref = repo.references["refs/heads/master"]
431
+ entry = ref.log.first
432
+ sha = entry[:id_old]
433
+ sha = entry[:id_new]
434
+ str = entry[:message]
435
+ prsn = entry[:committer]
436
+ ```
437
+
438
+ ---
439
+
440
+ ### Branches
441
+
442
+ The `Rugged::BranchCollection` object returned by `Repository#branches` will help
443
+ you with all of your branch-related needs.
444
+
445
+ Iterate over all branches:
446
+
447
+ ```ruby
448
+ repo.branches.each_name().sort
449
+ # => ["master", "origin/HEAD", "origin/master", "origin/packed"]
450
+
451
+ repo.branches.each_name(:local).sort
452
+ # => ["master"]
453
+
454
+ repo.branches.each_name(:remote).sort
455
+ # => ["origin/HEAD", "origin/master", "origin/packed"]
456
+ ```
457
+
458
+ Look up branches and get attributes:
459
+
460
+ ```ruby
461
+ branch = repo.branches["master"]
462
+ branch.name # => 'master'
463
+ branch.canonical_name # => 'refs/heads/master'
464
+ ```
465
+
466
+ Look up the id for the target of a branch:
467
+
468
+ ```ruby
469
+ repo.branches["master"].target_id
470
+ # => "36060c58702ed4c2a40832c51758d5344201d89a"
471
+ ```
472
+
473
+ Creation and deletion:
474
+
475
+ ```ruby
476
+ branch = repo.branches.create("test_branch", "HEAD")
477
+
478
+ repo.branches.rename("test_branch", "new_branch") # or...
479
+ repo.branches.rename("refs/heads/test_branch", "new_branch") # or...
480
+ repo.branches.rename(ref, "new_branch") # or...
481
+
482
+ repo.branches.delete("test_branch") # or...
483
+ repo.branches.delete("refs/heads/test_branch") # or...
484
+ repo.branches.delete(ref) # or...
485
+ ```
486
+
487
+ ---
488
+
489
+ ### Diffs
490
+
491
+ There are various ways to get hands on diffs:
492
+
493
+ ```ruby
494
+ # Diff between two subsequent commits
495
+ diff_commits = commit_object.parents[0].diff(commit_object)
496
+
497
+ # Diff between two tree objects
498
+ diff_trees = tree_object_a.diff(tree_object_b)
499
+
500
+ # Diff between index/staging and current working directory
501
+ diff_index = repository.index.diff
502
+
503
+ # Diff between index/staging and another diffable (commit/tree/index)
504
+ diff_index_diffable = repository.index.diff(some_diffable)
505
+ ```
506
+
507
+ When you already have a diff object, you can examine it:
508
+
509
+ ```ruby
510
+ # Get patch
511
+ diff.patch
512
+ => "diff --git a/foo1 b/foo1\nnew file mode 100644\nindex 0000000..81b68f0\n--- /dev/null\n+++ b/foo1\n@@ -0,0 +1,2 @@\n+abc\n+add line1\ndiff --git a/txt1 b/txt1\ndeleted file mode 100644\nindex 81b68f0..0000000\n--- a/txt1\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-abc\n-add line1\ndiff --git a/txt2 b/txt2\nindex a7bb42f..a357de7 100644\n--- a/txt2\n+++ b/txt2\n@@ -1,2 +1,3 @@\n abc2\n add line2-1\n+add line2-2\n"
513
+
514
+ # Get delta (faster, if you only need information on what files changed)
515
+ diff.each_delta{ |d| puts d.inspect }
516
+ #<Rugged::Diff::Delta:70144372137380 {old_file: {:oid=>"0000000000000000000000000000000000000000", :path=>"foo1", :size=>0, :flags=>6, :mode=>0}, new_file: {:oid=>"81b68f040b120c9627518213f7fc317d1ed18e1c", :path=>"foo1", :size=>14, :flags=>6, :mode=>33188}, similarity: 0, status: :added>
517
+ #<Rugged::Diff::Delta:70144372136540 {old_file: {:oid=>"81b68f040b120c9627518213f7fc317d1ed18e1c", :path=>"txt1", :size=>14, :flags=>6, :mode=>33188}, new_file: {:oid=>"0000000000000000000000000000000000000000", :path=>"txt1", :size=>0, :flags=>6, :mode=>0}, similarity: 0, status: :deleted>
518
+ #<Rugged::Diff::Delta:70144372135780 {old_file: {:oid=>"a7bb42f71183c162efea5e4c80597437d716c62b", :path=>"txt2", :size=>17, :flags=>6, :mode=>33188}, new_file: {:oid=>"a357de7d870823acc3953f1b2471f9c18d0d56ea", :path=>"txt2", :size=>29, :flags=>6, :mode=>33188}, similarity: 0, status: :modified>
519
+
520
+ # Detect renamed files
521
+ # Note that the status field changed from :added/:deleted to :renamed
522
+ diff.find_similar!
523
+ diff.each_delta{ |d| puts d.inspect }
524
+ #<Rugged::Diff::Delta:70144372230920 {old_file: {:oid=>"81b68f040b120c9627518213f7fc317d1ed18e1c", :path=>"txt1", :size=>14, :flags=>6, :mode=>33188}, new_file: {:oid=>"81b68f040b120c9627518213f7fc317d1ed18e1c", :path=>"foo1", :size=>14, :flags=>6, :mode=>33188}, similarity: 100, status: :renamed>
525
+ #<Rugged::Diff::Delta:70144372230140 {old_file: {:oid=>"a7bb42f71183c162efea5e4c80597437d716c62b", :path=>"txt2", :size=>17, :flags=>6, :mode=>33188}, new_file: {:oid=>"a357de7d870823acc3953f1b2471f9c18d0d56ea", :path=>"txt2", :size=>29, :flags=>6, :mode=>33188}, similarity: 0, status: :modified>
526
+
527
+ # Merge one diff into another (mutating the first one)
528
+ diff1.merge!(diff2)
529
+
530
+ # Write a patch into a file (or any other object responding to write)
531
+ # Note that the patch as in diff.patch will be written, it won't be applied
532
+ file = File.open('/some/file', 'w')
533
+ diff.write_patch(file)
534
+ file.close
535
+ ```
536
+
537
+ ---
538
+
539
+ ### Config files
540
+
541
+ It's also easy to read and manipulate the Git config file data with Rugged.
542
+
543
+ ```ruby
544
+ # Read values
545
+ repo.config['core.bare']
546
+
547
+ # Set values
548
+ repo.config['user.name'] = true
549
+
550
+ # Delete values
551
+ repo.config.delete('user.name')
552
+ ```
553
+
554
+ ---
555
+
556
+ ### General methods
557
+
558
+ Rugged also includes a general library for handling basic Git operations. One of
559
+ these is converting a raw sha (20 bytes) into a readable hex sha (40
560
+ characters).
561
+
562
+ ```ruby
563
+ Rugged.hex_to_raw('bfde59cdd0dfac1d892814f66a95641abd8a1faf')
564
+ # => "\277\336Y\315\320\337\254\035\211(\024\366j\225d\032\275\212\037\257"
565
+
566
+ Rugged.raw_to_hex("\277\336Y\315\320\337\254\035\211(\024\366j\225d\032\275\212\037\257")
567
+ => "bfde59cdd0dfac1d892814f66a95641abd8a1faf"
568
+ ```
569
+
570
+ ---
571
+
572
+ ### Alternative backends
573
+
574
+ You can store bare repositories in alternative backends instead of storing on disk. (see
575
+ `redbadger/rugged-redis` for an example of how a rugged backend works).
576
+
577
+ ```ruby
578
+ a_backend = Rugged::InMemory::Backend.new(opt1: 'setting', opt2: 'setting')
579
+
580
+ repo = Rugged::Repository.init_at('repo_name', :bare, backend: a_backend)
581
+
582
+ # or
583
+
584
+ repo = Rugged::Repository.bare('repo_name', backend: a_backend)
585
+ ```
586
+ ---
587
+
588
+ ## Contributing
589
+
590
+ Fork libgit2/rugged on GitHub, make it awesomer (preferably in a branch named
591
+ for the topic), send a pull request.
592
+
593
+
594
+ ## Development
595
+
596
+ Simply clone and install:
597
+
598
+ $ git clone https://github.com/libgit2/rugged.git
599
+ $ cd rugged
600
+ $ bundle install
601
+ $ rake compile
602
+ $ rake test
603
+
604
+ ## Support
605
+
606
+ We encourage you to use StackOverflow for any questions or concerns regarding Rugged. Please tag your questions with the [rugged](http://stackoverflow.com/questions/tagged/rugged) keyword.
607
+
608
+ For bug reports, please open a ticket on the GitHub [issue tracker](https://github.com/libgit2/rugged/issues).
609
+
610
+ ## Authors
611
+
612
+ * Vicent Marti <tanoku@gmail.com>
613
+ * Scott Chacon <schacon@gmail.com>
614
+ * Arthur Schreiber <schreiber.arthur@gmail.com>
615
+
616
+
617
+ ## License
618
+
619
+ MIT. See LICENSE file.