gash 0.1.1 → 0.1.2

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 (5) hide show
  1. data/CHANGELOG +2 -0
  2. data/Rakefile +0 -1
  3. data/gash.gemspec +4 -4
  4. data/lib/gash.rb +87 -19
  5. metadata +3 -3
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.1.2. Working correctly on empty branches.
2
+
1
3
  v0.1.1. Tree got more Hash-methods. Better documentation.
2
4
 
3
5
  v0.1. First version.
data/Rakefile CHANGED
@@ -8,7 +8,6 @@ Echoe.new('gash') do |p|
8
8
  p.summary = "Git + Hash"
9
9
  p.url = "http://dojo.rubyforge.org/gash/"
10
10
  p.rdoc_options += ["--main", "Gash", "--title", "Gash"]
11
- p.rubygems_version = nil
12
11
  end
13
12
 
14
13
  Rake::Task[:publish_docs].instance_eval do
data/gash.gemspec CHANGED
@@ -1,18 +1,18 @@
1
1
 
2
- # Gem::Specification for Gash-0.1.1
2
+ # Gem::Specification for Gash-0.1.2
3
3
  # Originally generated by Echoe
4
4
 
5
5
  --- !ruby/object:Gem::Specification
6
6
  name: gash
7
7
  version: !ruby/object:Gem::Version
8
- version: 0.1.1
8
+ version: 0.1.2
9
9
  platform: ruby
10
10
  authors:
11
11
  - Magnus Holm
12
12
  autorequire:
13
13
  bindir: bin
14
14
 
15
- date: 2008-09-27 00:00:00 +02:00
15
+ date: 2008-09-28 00:00:00 +02:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
@@ -68,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  requirements:
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
- version: "0"
71
+ version: "1.2"
72
72
  version:
73
73
  requirements: []
74
74
 
data/lib/gash.rb CHANGED
@@ -9,6 +9,9 @@ require 'delegate'
9
9
  # * Gash can commit.
10
10
  # * Gash will automatically create branches if they don't exists.
11
11
  # * Gash only loads what it needs, so it handles large repos well.
12
+ # * Gash got {pretty good documentation}[http://dojo.rubyforge.org/gash].
13
+ # * Gash got {a bug tracker}[http://dojo.lighthouseapp.com/projects/17529-gash].
14
+ # * Gash is being {developed at GitHub}[http://github.com/judofyr/gash].
12
15
  #
13
16
  # Some of these "rules" might change it the future.
14
17
  #
@@ -22,6 +25,11 @@ require 'delegate'
22
25
  # also call those methods.
23
26
  #
24
27
  # <b>See also</b>: #new, #commit, Tree
28
+ #
29
+ # == Credits
30
+ #
31
+ # This code is based upon git-shelve[http://www.siebert-wd.de/projects/git-shelve],
32
+ # and is released under the same license; LGPL.
25
33
  class Gash < SimpleDelegator
26
34
  module Errors
27
35
  # This error is raised when the Git-command fails.
@@ -59,14 +67,14 @@ class Gash < SimpleDelegator
59
67
 
60
68
  # Converts the +value+ to a Tree or a Blob, using some rules:
61
69
  #
62
- # == If +value+ is already a Tree or a Blob:
70
+ # ==== If +value+ is already a Tree or a Blob:
63
71
  #
64
72
  # * If +value+ comes from another repo, we load it and return a deep copy.
65
73
  # * If +value+ got no parent, we simply return the same tree.
66
74
  # * If +value+'s parent is +self+, we also return the same tree.
67
75
  # * If +value+'s parent is something else, we return a duplicated tree.
68
76
  #
69
- # == If it's something else:
77
+ # ==== If it's something else:
70
78
  #
71
79
  # * If +value+ is a Hash, we create a Tree from it.
72
80
  # * If it's not any of the former rules, we turn it into a string and create a Blob from it.
@@ -92,6 +100,36 @@ class Gash < SimpleDelegator
92
100
 
93
101
  # A Tree is a Hash which can store other instances of Tree and Blob.
94
102
  #
103
+ # == Special methods
104
+ #
105
+ # Internally, a tree is being stored like this:
106
+ #
107
+ # {
108
+ # "README" => blob,
109
+ # "examples" => {
110
+ # "test.rb" => blob,
111
+ # "yay.rb" => blob
112
+ # }
113
+ # }
114
+ #
115
+ # So you have to do <code>tree["examples"].delete("test.rb")</code> instead
116
+ # of <code>tree.delete("examples/test.rb")</code>. However, there are some
117
+ # methods which supports the slash. All of these will work:
118
+ #
119
+ # tree["examples/test.rb"]
120
+ # tree.fetch("examples/test.rb")
121
+ # tree["examples/another.rb"] = "Content"
122
+ # tree.store("examples/another.rb", "Content") # Exactly the same as above.
123
+ #
124
+ # tree["examples"]["test.rb"] # Or, you could use this
125
+ #
126
+ # == Documentation
127
+ #
128
+ # The point of Tree is that it should be as close to Hash as possible.
129
+ # Therefore, methods which behaves exactly equally in Gash and Hash will
130
+ # not be documentated below. Please see the Ruby documentation if you
131
+ # wonder what you can do.
132
+ #
95
133
  # <b>See also</b>: Helpers, Blob
96
134
  class Tree < Hash
97
135
  include Helpers
@@ -111,14 +149,7 @@ class Gash < SimpleDelegator
111
149
  # # do some other stuff...
112
150
  # blob.load! # Load it now!
113
151
  def [](key, lazy = nil)
114
- ret = if key.include?("/")
115
- key, rest = key.split("/", 2)
116
- value = super(key)
117
- return if value.nil?
118
- value[rest]
119
- else
120
- super(key)
121
- end
152
+ ret = fetch(key, default)
122
153
  ensure
123
154
  ret.load! if ret.respond_to?(:load!) && !lazy
124
155
  end
@@ -158,7 +189,7 @@ class Gash < SimpleDelegator
158
189
  keys = key.split("/")
159
190
  name = keys.pop
160
191
  keys.inject(self) do |memo, i|
161
- memo[i] = Tree.new(:parent => self) unless memo.include?(i)
192
+ memo[i, not_changed] = Tree.new(:parent => self) unless memo.include?(i)
162
193
  memo[i, true]
163
194
  end[name, not_changed] = value
164
195
  else
@@ -169,7 +200,8 @@ class Gash < SimpleDelegator
169
200
  ensure
170
201
  self.changed! unless not_changed
171
202
  end
172
-
203
+ alias store []=
204
+
173
205
  # Converts the tree to a Hash.
174
206
  def to_hash
175
207
  inject({}) do |memo, (key, value)|
@@ -177,17 +209,54 @@ class Gash < SimpleDelegator
177
209
  memo
178
210
  end
179
211
  end
212
+
213
+ # :stopdoc:
214
+ def fetch(*args)
215
+ key = args.first.to_s
216
+
217
+ case args.length
218
+ when 1
219
+ r = true
220
+ when 2
221
+ r = false
222
+ default = args.last
223
+ else
224
+ raise ArgumentError, "wrong number of arguments (#{args.length} for 2)"
225
+ end
226
+
227
+ if key.include?("/")
228
+ key, rest = key.split("/", 2)
229
+ value = super(key)
230
+ value.fetch(rest)
231
+ else
232
+ super(key)
233
+ end
234
+ rescue IndexError => e
235
+ (r && raise(e)) || default
236
+ end
180
237
 
181
- def self.[](*val) # :nodoc:
238
+ def delete(key)
239
+ super && changed!
240
+ end
241
+
242
+ def self.[](*val)
182
243
  new.merge!(Hash[*val])
183
244
  end
245
+
246
+ def ==(other)
247
+ if other.is_a?(Tree) && sha1 && other.sha1
248
+ sha1 == other.sha1
249
+ else
250
+ super
251
+ end
252
+ end
184
253
 
185
- def merge(hash) # :nodoc:
254
+ def merge(hash)
186
255
  tree = self.dup
187
256
  tree.merge!(hash)
188
257
  end
189
258
 
190
- def merge!(hash) # :nodoc:
259
+ def merge!(hash)
191
260
  hash.each do |key, value|
192
261
  self[key] = value
193
262
  end
@@ -195,7 +264,7 @@ class Gash < SimpleDelegator
195
264
  end
196
265
  alias update merge!
197
266
 
198
- def replace(hash) # :nodoc:
267
+ def replace(hash)
199
268
  if hash.is_a?(Gash::Tree)
200
269
  super
201
270
  else
@@ -203,6 +272,7 @@ class Gash < SimpleDelegator
203
272
  merge!(hash)
204
273
  end
205
274
  end
275
+ # :startdoc:
206
276
  end
207
277
 
208
278
  # A Blob represent a string:
@@ -365,9 +435,7 @@ class Gash < SimpleDelegator
365
435
  end
366
436
 
367
437
  def git_tree(&blk)
368
- git('ls-tree', '-r', '-t', @branch, '2>&1') do |f|
369
- f.each_line(&blk)
370
- end
438
+ git('ls-tree', '-r', '-t', @branch, '2>&1').each_line(&blk)
371
439
  rescue Errors::Git
372
440
  ""
373
441
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus Holm
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-27 00:00:00 +02:00
12
+ date: 2008-09-28 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -65,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: "0"
68
+ version: "1.2"
69
69
  version:
70
70
  requirements: []
71
71