git_store 0.3.1 → 0.3.3
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.
- data/Rakefile +7 -22
- data/git_store.gemspec +2 -2
- data/lib/git_store.rb +2 -2
- data/lib/git_store/pack.rb +14 -13
- data/lib/git_store/tree.rb +6 -3
- data/lib/git_store/user.rb +22 -13
- data/test/commit_spec.rb +2 -2
- data/test/git_store_spec.rb +4 -3
- metadata +29 -33
data/Rakefile
CHANGED
@@ -1,32 +1,17 @@
|
|
1
1
|
require 'rake'
|
2
|
-
require
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'spec/rake/spectask'
|
6
|
-
rescue LoadError
|
7
|
-
puts <<-EOS
|
8
|
-
To use rspec for testing you must install the rspec gem:
|
9
|
-
gem install rspec
|
10
|
-
EOS
|
11
|
-
exit(0)
|
12
|
-
end
|
2
|
+
require 'rdoc/task'
|
3
|
+
require 'rspec/core/rake_task'
|
13
4
|
|
14
5
|
desc "Run all specs"
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
desc "Print SpecDocs"
|
21
|
-
Spec::Rake::SpecTask.new(:doc) do |t|
|
22
|
-
t.spec_opts = ["--format", "specdoc"]
|
23
|
-
t.spec_files = FileList['test/*_spec.rb']
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
7
|
+
spec.pattern = 'test/**/*_spec.rb'
|
8
|
+
spec.rspec_opts = ['--backtrace']
|
24
9
|
end
|
25
10
|
|
26
11
|
desc "Generate the RDoc"
|
27
|
-
|
12
|
+
RDoc::Task.new do |rdoc|
|
28
13
|
files = ["README.md", "LICENSE", "lib/**/*.rb"]
|
29
|
-
rdoc.rdoc_files.
|
14
|
+
rdoc.rdoc_files.include(files)
|
30
15
|
rdoc.main = "README.md"
|
31
16
|
rdoc.title = "Git Store - using Git as versioned data store in Ruby"
|
32
17
|
end
|
data/git_store.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'git_store'
|
3
|
-
s.version = '0.3.
|
3
|
+
s.version = '0.3.3'
|
4
4
|
s.summary = 'a simple data store based on git'
|
5
5
|
s.author = 'Matthias Georgi'
|
6
6
|
s.email = 'matti.georgi@gmail.com'
|
7
|
-
s.homepage = 'http://
|
7
|
+
s.homepage = 'http://georgi.github.com/git_store'
|
8
8
|
s.description = <<END
|
9
9
|
GitStore implements a versioned data store based on the revision
|
10
10
|
management system Git. You can store object hierarchies as nested
|
data/lib/git_store.rb
CHANGED
@@ -198,10 +198,10 @@ class GitStore
|
|
198
198
|
# Example:
|
199
199
|
# store.transaction { store['a'] = 'b' }
|
200
200
|
#
|
201
|
-
def transaction(message = "")
|
201
|
+
def transaction(message = "", author = User.from_config, committer = author)
|
202
202
|
start_transaction
|
203
203
|
result = yield
|
204
|
-
commit message
|
204
|
+
commit message, author, committer
|
205
205
|
|
206
206
|
result
|
207
207
|
rescue
|
data/lib/git_store/pack.rb
CHANGED
@@ -293,13 +293,13 @@ class GitStore
|
|
293
293
|
obj_offset = offset
|
294
294
|
packfile.seek(offset)
|
295
295
|
|
296
|
-
c = packfile.read(1)[0]
|
296
|
+
c = packfile.read(1)[0].ord
|
297
297
|
size = c & 0xf
|
298
298
|
type = (c >> 4) & 7
|
299
299
|
shift = 4
|
300
300
|
offset += 1
|
301
301
|
while c & 0x80 != 0
|
302
|
-
c = packfile.read(1)[0]
|
302
|
+
c = packfile.read(1)[0].ord
|
303
303
|
size |= ((c & 0x7f) << shift)
|
304
304
|
shift += 7
|
305
305
|
offset += 1
|
@@ -326,10 +326,10 @@ class GitStore
|
|
326
326
|
|
327
327
|
if type == OBJ_OFS_DELTA
|
328
328
|
i = 0
|
329
|
-
c = data[i]
|
329
|
+
c = data[i].ord
|
330
330
|
base_offset = c & 0x7f
|
331
331
|
while c & 0x80 != 0
|
332
|
-
c = data[i += 1]
|
332
|
+
c = data[i += 1].ord
|
333
333
|
base_offset += 1
|
334
334
|
base_offset <<= 7
|
335
335
|
base_offset |= c & 0x7f
|
@@ -380,21 +380,21 @@ class GitStore
|
|
380
380
|
dest_size, pos = patch_delta_header_size(delta, pos)
|
381
381
|
dest = ""
|
382
382
|
while pos < delta.size
|
383
|
-
c = delta[pos]
|
383
|
+
c = delta[pos].ord
|
384
384
|
pos += 1
|
385
385
|
if c & 0x80 != 0
|
386
386
|
pos -= 1
|
387
387
|
cp_off = cp_size = 0
|
388
|
-
cp_off = delta[pos += 1] if c & 0x01 != 0
|
389
|
-
cp_off |= delta[pos += 1] << 8 if c & 0x02 != 0
|
390
|
-
cp_off |= delta[pos += 1] << 16 if c & 0x04 != 0
|
391
|
-
cp_off |= delta[pos += 1] << 24 if c & 0x08 != 0
|
392
|
-
cp_size = delta[pos += 1] if c & 0x10 != 0
|
393
|
-
cp_size |= delta[pos += 1] << 8 if c & 0x20 != 0
|
394
|
-
cp_size |= delta[pos += 1] << 16 if c & 0x40 != 0
|
388
|
+
cp_off = delta[pos += 1].ord if c & 0x01 != 0
|
389
|
+
cp_off |= delta[pos += 1].ord << 8 if c & 0x02 != 0
|
390
|
+
cp_off |= delta[pos += 1].ord << 16 if c & 0x04 != 0
|
391
|
+
cp_off |= delta[pos += 1].ord << 24 if c & 0x08 != 0
|
392
|
+
cp_size = delta[pos += 1].ord if c & 0x10 != 0
|
393
|
+
cp_size |= delta[pos += 1].ord << 8 if c & 0x20 != 0
|
394
|
+
cp_size |= delta[pos += 1].ord << 16 if c & 0x40 != 0
|
395
395
|
cp_size = 0x10000 if cp_size == 0
|
396
396
|
pos += 1
|
397
|
-
dest += base[cp_off,cp_size]
|
397
|
+
dest += base[cp_off, cp_size]
|
398
398
|
elsif c != 0
|
399
399
|
dest += delta[pos,c]
|
400
400
|
pos += c
|
@@ -414,6 +414,7 @@ class GitStore
|
|
414
414
|
if c == nil
|
415
415
|
raise PackFormatError, 'invalid delta header'
|
416
416
|
end
|
417
|
+
c = c.ord
|
417
418
|
pos += 1
|
418
419
|
size |= (c & 0x7f) << shift
|
419
420
|
shift += 7
|
data/lib/git_store/tree.rb
CHANGED
@@ -74,12 +74,15 @@ class GitStore
|
|
74
74
|
|
75
75
|
# Write entry with specified name.
|
76
76
|
def put(name, value)
|
77
|
-
@modified = true
|
78
|
-
|
79
77
|
if value.is_a?(Tree)
|
78
|
+
@modified = true
|
80
79
|
@table[name] = value
|
81
80
|
else
|
82
|
-
|
81
|
+
data = handler_for(name).write(value)
|
82
|
+
if @table[name].nil? or data != @table[name].data
|
83
|
+
@modified = true
|
84
|
+
@table[name] = Blob.new(store, nil, data)
|
85
|
+
end
|
83
86
|
end
|
84
87
|
|
85
88
|
value
|
data/lib/git_store/user.rb
CHANGED
@@ -1,29 +1,38 @@
|
|
1
1
|
class GitStore
|
2
|
-
|
3
|
-
class User
|
4
|
-
attr_accessor :name, :email, :time
|
5
|
-
|
6
|
-
def initialize(name, email, time)
|
7
|
-
@name, @email, @time = name, email, time
|
8
|
-
end
|
9
|
-
|
2
|
+
class User < Struct.new(:name, :email, :time)
|
10
3
|
def dump
|
11
4
|
"#{ name } <#{email}> #{ time.to_i } #{ time.strftime('%z') }"
|
12
5
|
end
|
6
|
+
alias to_s dump
|
13
7
|
|
14
|
-
def
|
15
|
-
name
|
16
|
-
|
8
|
+
def inspect
|
9
|
+
"#<GitStore::User name=%p email=%p time=%p>" % [name, email, time]
|
10
|
+
end
|
17
11
|
|
12
|
+
def self.from_config
|
13
|
+
name, email = config_get('user.name'), config_get('user.email')
|
18
14
|
new name, email, Time.now
|
19
15
|
end
|
20
16
|
|
17
|
+
def self.config_get(key)
|
18
|
+
value = `git config #{key}`.chomp
|
19
|
+
|
20
|
+
if $?.exitstatus == 0
|
21
|
+
return value unless value.empty?
|
22
|
+
raise RuntimError, "#{key} is empty"
|
23
|
+
else
|
24
|
+
raise RuntimError, "No #{key} found in git config"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.config_user_email
|
29
|
+
email = `git config user.email`.chomp
|
30
|
+
end
|
31
|
+
|
21
32
|
def self.parse(user)
|
22
33
|
if match = user.match(/(.*)<(.*)> (\d+) ([+-]\d+)/)
|
23
34
|
new match[1].strip, match[2].strip, Time.at(match[3].to_i + match[4].to_i * 3600)
|
24
35
|
end
|
25
36
|
end
|
26
|
-
|
27
37
|
end
|
28
|
-
|
29
38
|
end
|
data/test/commit_spec.rb
CHANGED
@@ -32,7 +32,7 @@ This is a message"
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should be readable by git binary" do
|
35
|
-
time = Time.
|
35
|
+
time = Time.utc(2009, 4, 20)
|
36
36
|
author = GitStore::User.new("hans", "hans@email.de", time)
|
37
37
|
|
38
38
|
store['a'] = "Yay"
|
@@ -41,7 +41,7 @@ This is a message"
|
|
41
41
|
IO.popen("git log") do |io|
|
42
42
|
io.gets.should == "commit #{commit.id}\n"
|
43
43
|
io.gets.should == "Author: hans <hans@email.de>\n"
|
44
|
-
io.gets.should == "Date: Mon Apr 20 00:00:00 2009
|
44
|
+
io.gets.should == "Date: Mon Apr 20 00:00:00 2009 +0000\n"
|
45
45
|
io.gets.should == "\n"
|
46
46
|
io.gets.should == " Commit Message\n"
|
47
47
|
end
|
data/test/git_store_spec.rb
CHANGED
@@ -14,6 +14,8 @@ describe GitStore do
|
|
14
14
|
Dir.chdir REPO
|
15
15
|
|
16
16
|
`git init`
|
17
|
+
`git config user.name 'User Name'`
|
18
|
+
`git config user.email 'user.name@email.com'`
|
17
19
|
@store = GitStore.new(REPO)
|
18
20
|
end
|
19
21
|
|
@@ -243,14 +245,13 @@ describe GitStore do
|
|
243
245
|
|
244
246
|
store.load
|
245
247
|
|
246
|
-
user = GitStore::User.from_config
|
247
248
|
id = File.read('.git/refs/tags/0.1')
|
248
249
|
tag = store.get(id)
|
249
250
|
|
250
251
|
tag.type.should == 'commit'
|
251
252
|
tag.object.should == store.head
|
252
|
-
tag.tagger.name.should ==
|
253
|
-
tag.tagger.email.should == user.email
|
253
|
+
tag.tagger.name.should == 'User Name'
|
254
|
+
tag.tagger.email.should == 'user.name@email.com'
|
254
255
|
tag.message.should =~ /message/
|
255
256
|
end
|
256
257
|
|
metadata
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: git_store
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.3
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Matthias Georgi
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2010-02-07 00:00:00 +01:00
|
13
|
-
default_executable:
|
12
|
+
date: 2013-01-26 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
14
|
+
description: ! 'GitStore implements a versioned data store based on the revision
|
15
15
|
|
16
|
-
description: |
|
17
|
-
GitStore implements a versioned data store based on the revision
|
18
16
|
management system Git. You can store object hierarchies as nested
|
17
|
+
|
19
18
|
hashes, which will be mapped on the directory structure of a git
|
19
|
+
|
20
20
|
repository. GitStore checks out the repository into a in-memory
|
21
|
+
|
21
22
|
representation, which can be modified and finally committed.
|
22
23
|
|
24
|
+
'
|
23
25
|
email: matti.georgi@gmail.com
|
24
26
|
executables: []
|
25
|
-
|
26
27
|
extensions: []
|
27
|
-
|
28
|
-
extra_rdoc_files:
|
28
|
+
extra_rdoc_files:
|
29
29
|
- README.md
|
30
|
-
files:
|
30
|
+
files:
|
31
31
|
- .gitignore
|
32
32
|
- LICENSE
|
33
33
|
- README.md
|
@@ -47,33 +47,29 @@ files:
|
|
47
47
|
- test/commit_spec.rb
|
48
48
|
- test/git_store_spec.rb
|
49
49
|
- test/tree_spec.rb
|
50
|
-
|
51
|
-
homepage: http://ww.matthias-georgi.de/git_store
|
50
|
+
homepage: http://georgi.github.com/git_store
|
52
51
|
licenses: []
|
53
|
-
|
54
52
|
post_install_message:
|
55
53
|
rdoc_options: []
|
56
|
-
|
57
|
-
require_paths:
|
54
|
+
require_paths:
|
58
55
|
- lib
|
59
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
71
68
|
requirements: []
|
72
|
-
|
73
69
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.
|
70
|
+
rubygems_version: 1.8.24
|
75
71
|
signing_key:
|
76
72
|
specification_version: 3
|
77
73
|
summary: a simple data store based on git
|
78
74
|
test_files: []
|
79
|
-
|
75
|
+
has_rdoc: true
|