git_dump 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.rubocop.yml +61 -19
- data/.travis.yml +34 -31
- data/.travis_check_rubies.yml +1 -0
- data/Gemfile +7 -1
- data/LICENSE.txt +1 -1
- data/README.markdown +6 -6
- data/git_dump.gemspec +8 -4
- data/lib/git_dump.rb +2 -0
- data/lib/git_dump/cmd.rb +23 -7
- data/lib/git_dump/entry.rb +8 -1
- data/lib/git_dump/path_object.rb +4 -0
- data/lib/git_dump/repo.rb +2 -0
- data/lib/git_dump/repo/git.rb +31 -35
- data/lib/git_dump/repo/rugged.rb +9 -2
- data/lib/git_dump/tree.rb +2 -0
- data/lib/git_dump/tree/base.rb +8 -3
- data/lib/git_dump/tree/builder.rb +3 -1
- data/lib/git_dump/version.rb +4 -0
- data/lib/git_dump/version/base.rb +2 -0
- data/lib/git_dump/version/builder.rb +5 -1
- data/script/benchmark +3 -2
- data/spec/git_dump_spec.rb +31 -11
- metadata +19 -17
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MThmYjAxMzY5NGI3Yzg4YjU5ODg3ZDQwOTBlYTQ1MTJmOGYwZDk0Yw==
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 68a7d19a624eb19faef3d2cfee530421b2f95e7eb2712cbc0495db02abf8faf9
|
4
|
+
data.tar.gz: 330a3e791b620109a7695fa2fced5c4d14b67b65d44326154041055a4f1d52ee
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
Zjk2OGI3YzYxZTQ4NWY1NTFmYzRiNzgxNmQ0NzZiYTE3ZGNkZjgxOWE0ODMw
|
11
|
-
ZDgyMDhkZGFjNWFhM2IyNWE5MDVmMTI2MmE3OGUzMDMxZGQ3N2Q=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
N2RiOTIxY2Y3ZTgxOWM2MTYzOTMyNWNlNDhiMGNiYjBhNzNlYzM3ZDk2NGFk
|
14
|
-
MzdiN2RmODBjZmE2NGU2Nzk3MThmYzJlYjM4NWU2NDEyNWE1ZjcwMDdmZDMz
|
15
|
-
NWQ2YzJiMzUzNzg5OTRhYjMyNmQ4NzEwMTlmMWVkNGRlZGVkYzA=
|
6
|
+
metadata.gz: 3ee4d7241b044160c50eefdefd1dd98809edea36422f33cb3c0f7a9c1bd71b41e30dfe67b27e339d46079c9f849246c9d96868d1cd4cbb65686b32b8a543a448
|
7
|
+
data.tar.gz: ce5aadd0694dc570940760624d3fd75b46a1bc2a4561ee5ee82b38200bcf53da46d6f8086ad7537bab35c91fbd744348afc0b1e1829b6ebd407d098e03519050
|
data/.rubocop.yml
CHANGED
@@ -2,61 +2,103 @@ AllCops:
|
|
2
2
|
Exclude:
|
3
3
|
- '*.gemspec'
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
Layout/AccessModifierIndentation:
|
6
|
+
EnforcedStyle: outdent
|
7
|
+
|
8
|
+
Layout/CaseIndentation:
|
9
|
+
EnforcedStyle: end
|
10
|
+
|
11
|
+
Layout/DotPosition:
|
12
|
+
EnforcedStyle: trailing
|
13
|
+
|
14
|
+
Layout/EndAlignment:
|
15
|
+
EnforcedStyleAlignWith: variable
|
16
|
+
|
17
|
+
Layout/IndentFirstArrayElement:
|
18
|
+
EnforcedStyle: consistent
|
19
|
+
|
20
|
+
Layout/IndentFirstHashElement:
|
21
|
+
EnforcedStyle: consistent
|
22
|
+
|
23
|
+
Layout/SpaceBeforeBlockBraces:
|
24
|
+
EnforcedStyle: no_space
|
25
|
+
EnforcedStyleForEmptyBraces: no_space
|
26
|
+
|
27
|
+
Layout/SpaceInsideHashLiteralBraces:
|
28
|
+
EnforcedStyle: no_space
|
29
|
+
|
30
|
+
Lint/NestedPercentLiteral:
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
Lint/UnneededSplatExpansion:
|
34
|
+
Enabled: false
|
7
35
|
|
8
36
|
Metrics/AbcSize:
|
9
37
|
Max: 25
|
10
38
|
|
39
|
+
Metrics/BlockLength:
|
40
|
+
Exclude:
|
41
|
+
- 'script/benchmark'
|
42
|
+
- 'spec/**/*.rb'
|
43
|
+
|
11
44
|
Metrics/CyclomaticComplexity:
|
12
45
|
Max: 10
|
13
46
|
|
14
47
|
Metrics/MethodLength:
|
15
48
|
Max: 20
|
16
49
|
|
50
|
+
Metrics/ModuleLength:
|
51
|
+
Max: 300
|
52
|
+
|
17
53
|
Metrics/PerceivedComplexity:
|
18
54
|
Max: 8
|
19
55
|
|
20
|
-
Style/
|
21
|
-
EnforcedStyle:
|
56
|
+
Style/Alias:
|
57
|
+
EnforcedStyle: prefer_alias_method
|
22
58
|
|
23
59
|
Style/BracesAroundHashParameters:
|
24
60
|
Enabled: false
|
25
61
|
|
26
|
-
Style/CaseIndentation:
|
27
|
-
IndentWhenRelativeTo: end
|
28
|
-
|
29
|
-
Style/DotPosition:
|
30
|
-
EnforcedStyle: trailing
|
31
|
-
|
32
62
|
Style/DoubleNegation:
|
33
63
|
Enabled: false
|
34
64
|
|
35
65
|
Style/Encoding:
|
36
|
-
|
66
|
+
Enabled: false
|
67
|
+
|
68
|
+
Style/FormatStringToken:
|
69
|
+
Enabled: false
|
37
70
|
|
38
71
|
Style/HashSyntax:
|
39
72
|
EnforcedStyle: hash_rockets
|
40
73
|
|
41
74
|
Style/IfUnlessModifier:
|
42
|
-
|
75
|
+
Enabled: false
|
43
76
|
|
44
|
-
Style/
|
45
|
-
EnforcedStyle:
|
77
|
+
Style/NumericPredicate:
|
78
|
+
EnforcedStyle: comparison
|
79
|
+
|
80
|
+
Style/ParallelAssignment:
|
81
|
+
Enabled: false
|
46
82
|
|
47
83
|
Style/PercentLiteralDelimiters:
|
48
84
|
PreferredDelimiters:
|
49
85
|
'%w': '[]'
|
50
86
|
'%W': '[]'
|
51
87
|
|
88
|
+
Style/SafeNavigation:
|
89
|
+
Enabled: false
|
90
|
+
|
52
91
|
Style/Semicolon:
|
53
92
|
AllowAsExpressionSeparator: true
|
54
93
|
|
55
|
-
Style/
|
56
|
-
EnforcedStyle:
|
94
|
+
Style/SignalException:
|
95
|
+
EnforcedStyle: semantic
|
57
96
|
|
58
|
-
Style/
|
59
|
-
|
97
|
+
Style/TrailingCommaInArguments:
|
98
|
+
EnforcedStyleForMultiline: no_comma
|
99
|
+
|
100
|
+
Style/TrailingCommaInArrayLiteral:
|
101
|
+
EnforcedStyleForMultiline: comma
|
60
102
|
|
61
|
-
Style/
|
103
|
+
Style/TrailingCommaInHashLiteral:
|
62
104
|
EnforcedStyleForMultiline: comma
|
data/.travis.yml
CHANGED
@@ -1,37 +1,40 @@
|
|
1
|
+
sudo: false
|
1
2
|
language: ruby
|
2
3
|
rvm:
|
3
|
-
- 1.
|
4
|
-
-
|
5
|
-
- '2.
|
6
|
-
- '2.
|
7
|
-
- '2.
|
8
|
-
-
|
9
|
-
- jruby-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
RUGGED=0 bundle exec script/benchmark; RUGGED=1 bundle exec script/benchmark
|
16
|
-
; else
|
17
|
-
bundle exec rspec
|
18
|
-
; fi
|
4
|
+
- '1.9.3-p551'
|
5
|
+
- '2.2.10'
|
6
|
+
- '2.3.8'
|
7
|
+
- '2.4.6'
|
8
|
+
- '2.5.5'
|
9
|
+
- '2.6.3'
|
10
|
+
- 'jruby-9.1.9.0'
|
11
|
+
script: bundle exec rspec
|
12
|
+
before_install:
|
13
|
+
- gem install rubygems-update || gem install rubygems-update --version '< 3'
|
14
|
+
- gem update --system
|
15
|
+
- gem install bundler || gem install bundler --version '< 2'
|
19
16
|
env:
|
20
|
-
-
|
21
|
-
-
|
17
|
+
- DRIVER=git
|
18
|
+
- DRIVER=rugged
|
22
19
|
matrix:
|
23
|
-
fast_finish: true
|
24
20
|
include:
|
25
|
-
- env: RUBOCOP
|
26
|
-
rvm:
|
27
|
-
|
28
|
-
|
21
|
+
- env: RUBOCOP=✓
|
22
|
+
rvm: '2.6.3'
|
23
|
+
script: bundle exec rubocop
|
24
|
+
- env: BENCHMARK=✓
|
25
|
+
rvm: '2.6.3'
|
26
|
+
install: DRIVER=rugged bundle install --jobs=3 --retry=3
|
27
|
+
script:
|
28
|
+
- DRIVER=git bundle exec script/benchmark
|
29
|
+
- DRIVER=rugged bundle exec script/benchmark
|
30
|
+
- env: CHECK_RUBIES=✓
|
31
|
+
rvm: '2.6.3'
|
32
|
+
script: bundle exec travis_check_rubies
|
29
33
|
exclude:
|
30
|
-
- rvm: 1.
|
31
|
-
env:
|
32
|
-
- rvm: jruby-
|
33
|
-
env:
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
env: RUGGED=1
|
34
|
+
- rvm: '1.9.3-p551'
|
35
|
+
env: DRIVER=rugged
|
36
|
+
- rvm: 'jruby-9.1.9.0'
|
37
|
+
env: DRIVER=rugged
|
38
|
+
allow_failures:
|
39
|
+
- rvm: 'jruby-9.1.9.0'
|
40
|
+
env: DRIVER=git
|
@@ -0,0 +1 @@
|
|
1
|
+
exclude: [2.0, 2.1]
|
data/Gemfile
CHANGED
@@ -1,5 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
gemspec
|
4
6
|
|
5
|
-
gem 'rugged' if ENV['
|
7
|
+
gem 'rugged', '>= 0.22' if ENV['DRIVER'] == 'rugged'
|
8
|
+
|
9
|
+
if RUBY_VERSION >= '2.0'
|
10
|
+
gem 'travis_check_rubies', '~> 0.2', '>= 0.2.3'
|
11
|
+
end
|
data/LICENSE.txt
CHANGED
data/README.markdown
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
[![Gem Version](https://img.shields.io/gem/v/git_dump.svg?style=flat)](https://rubygems.org/gems/git_dump)
|
2
2
|
[![Build Status](https://img.shields.io/travis/toy/git_dump/master.svg?style=flat)](https://travis-ci.org/toy/git_dump)
|
3
|
-
[![Code Climate](https://img.shields.io/codeclimate/
|
4
|
-
[![
|
5
|
-
[![Inch CI](
|
3
|
+
[![Code Climate](https://img.shields.io/codeclimate/maintainability/toy/git_dump.svg?style=flat)](https://codeclimate.com/github/toy/git_dump)
|
4
|
+
[![Depfu](https://badges.depfu.com/badges/d6fc5f97912d1efe42933171f333ff16/overview.svg)](https://depfu.com/github/toy/git_dump)
|
5
|
+
[![Inch CI](https://inch-ci.org/github/toy/git_dump.svg?branch=master&style=flat)](https://inch-ci.org/github/toy/git_dump)
|
6
6
|
|
7
7
|
# git_dump
|
8
8
|
|
@@ -27,8 +27,8 @@ Create version:
|
|
27
27
|
```rb
|
28
28
|
version = dump.new_version
|
29
29
|
version['a/b/c'] = 'string'
|
30
|
-
version.store('b/c/d', StringIO.new('string'),
|
31
|
-
version.store('d/e', File.open('path'),
|
30
|
+
version.store('b/c/d', StringIO.new('string'), 0o644)
|
31
|
+
version.store('d/e', File.open('path'), 0o755)
|
32
32
|
version.store_from('e/f', 'path')
|
33
33
|
version.commit(:tags => 'test')
|
34
34
|
```
|
@@ -72,4 +72,4 @@ dump.fetch(url, ids.first)
|
|
72
72
|
|
73
73
|
## Copyright
|
74
74
|
|
75
|
-
Copyright (c) 2012-
|
75
|
+
Copyright (c) 2012-2019 Ivan Kuchin. See LICENSE.txt for details.
|
data/git_dump.gemspec
CHANGED
@@ -2,13 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'git_dump'
|
5
|
-
s.version = '0.1.
|
5
|
+
s.version = '0.1.1'
|
6
6
|
s.summary = %q{Distributed versioned store using git}
|
7
7
|
s.homepage = "http://github.com/toy/#{s.name}"
|
8
8
|
s.authors = ['Ivan Kuchin']
|
9
9
|
s.license = 'MIT'
|
10
10
|
|
11
|
-
s.
|
11
|
+
s.metadata = {
|
12
|
+
'bug_tracker_uri' => "https://github.com/toy/#{s.name}/issues",
|
13
|
+
'documentation_uri' => "https://www.rubydoc.info/gems/#{s.name}/#{s.version}",
|
14
|
+
'source_code_uri' => "https://github.com/toy/#{s.name}",
|
15
|
+
}
|
12
16
|
|
13
17
|
s.files = `git ls-files`.split("\n")
|
14
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -16,7 +20,7 @@ Gem::Specification.new do |s|
|
|
16
20
|
s.require_paths = %w[lib]
|
17
21
|
|
18
22
|
s.add_development_dependency 'rspec', '~> 3.0'
|
19
|
-
if
|
20
|
-
s.add_development_dependency 'rubocop', '~> 0.
|
23
|
+
if RUBY_VERSION >= '2.1'
|
24
|
+
s.add_development_dependency 'rubocop', '~> 0.52'
|
21
25
|
end
|
22
26
|
end
|
data/lib/git_dump.rb
CHANGED
data/lib/git_dump/cmd.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'shellwords'
|
2
4
|
require 'English'
|
3
5
|
|
@@ -46,22 +48,23 @@ class GitDump
|
|
46
48
|
|
47
49
|
# Construct command string
|
48
50
|
def to_s
|
49
|
-
|
51
|
+
parts = [args.shelljoin]
|
50
52
|
if env
|
51
53
|
env_str = env.map{ |k, v| "#{k}=#{v}" }.shelljoin
|
52
|
-
|
54
|
+
parts.unshift "export #{env_str};"
|
53
55
|
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
parts.unshift "cd #{chdir};" if chdir
|
57
|
+
parts.push '< /dev/null' if no_stdin
|
58
|
+
parts.push '> /dev/null' if no_stdout
|
59
|
+
parts.push '2> /dev/null' if no_stderr
|
60
|
+
parts.join(' ')
|
59
61
|
end
|
60
62
|
|
61
63
|
# Run using system
|
62
64
|
def run
|
63
65
|
success = system(*arguments)
|
64
66
|
return true if success
|
67
|
+
|
65
68
|
fail Failure, "`#{self}` failed with #{$CHILD_STATUS.exitstatus}"
|
66
69
|
end
|
67
70
|
|
@@ -70,12 +73,24 @@ class GitDump
|
|
70
73
|
if block
|
71
74
|
result = IO.popen(arguments, mode, &block)
|
72
75
|
return result if $CHILD_STATUS.success?
|
76
|
+
|
73
77
|
fail Failure, "`#{self}` failed with #{$CHILD_STATUS.exitstatus}"
|
74
78
|
else
|
75
79
|
IO.popen(arguments, mode)
|
76
80
|
end
|
77
81
|
end
|
78
82
|
|
83
|
+
# Write input to pipe and return output
|
84
|
+
def pipe(input)
|
85
|
+
popen(input ? 'r+' : 'r') do |f|
|
86
|
+
if input
|
87
|
+
f.write input
|
88
|
+
f.close_write
|
89
|
+
end
|
90
|
+
f.read
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
79
94
|
# Capture output
|
80
95
|
def capture
|
81
96
|
popen(&:read)
|
@@ -107,6 +122,7 @@ class GitDump
|
|
107
122
|
# prepanded and options hash appended
|
108
123
|
def arguments
|
109
124
|
return to_s if RUBY_VERSION < '1.9' || defined?(JRUBY_VERSION)
|
125
|
+
|
110
126
|
options = {}
|
111
127
|
options[:chdir] = chdir if chdir
|
112
128
|
options[:in] = '/dev/null' if no_stdin
|
data/lib/git_dump/entry.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'git_dump/path_object'
|
2
4
|
|
3
5
|
class GitDump
|
@@ -6,7 +8,12 @@ class GitDump
|
|
6
8
|
attr_reader :sha, :mode
|
7
9
|
def initialize(repo, dir, name, sha, mode)
|
8
10
|
super(repo, dir, name)
|
9
|
-
@sha, @mode = sha, (mode &
|
11
|
+
@sha, @mode = sha, (mode & 0o100) == 0 ? 0o644 : 0o755
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get size
|
15
|
+
def size
|
16
|
+
@size ||= repo.size(sha)
|
10
17
|
end
|
11
18
|
|
12
19
|
# Pipe for reading data
|
data/lib/git_dump/path_object.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class GitDump
|
2
4
|
# Base class for Tree, Tree::Builder and Entry
|
3
5
|
class PathObject
|
4
6
|
attr_reader :repo, :path, :name
|
5
7
|
def initialize(repo, dir, name)
|
8
|
+
fail ArgumentError, 'Expected Repo' unless repo.is_a?(Repo)
|
9
|
+
|
6
10
|
@repo = repo
|
7
11
|
@path = dir ? "#{dir}/#{name}" : name if name
|
8
12
|
@name = name
|
data/lib/git_dump/repo.rb
CHANGED
data/lib/git_dump/repo/git.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tempfile'
|
2
4
|
require 'time'
|
3
5
|
|
@@ -17,11 +19,10 @@ class GitDump
|
|
17
19
|
# List remote tag names
|
18
20
|
def remote_tag_names(url)
|
19
21
|
Cmd.git('ls-remote', '--tags', url).stripped_lines.map do |line|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
22
|
+
m = %r!^[0-9a-f]{40}\trefs/tags/(.*)$!.match(line)
|
23
|
+
fail "Unexpected: #{line}" unless m
|
24
|
+
|
25
|
+
m[1]
|
25
26
|
end
|
26
27
|
end
|
27
28
|
end
|
@@ -29,7 +30,7 @@ class GitDump
|
|
29
30
|
# Add blob for content to repository, return sha
|
30
31
|
def data_sha(content)
|
31
32
|
@data_sha_command ||= git(*%w[hash-object -w --no-filters --stdin])
|
32
|
-
@data_sha_command.popen('
|
33
|
+
@data_sha_command.popen('rb+') do |f|
|
33
34
|
if content.respond_to?(:read)
|
34
35
|
f.write(content.read(4096)) until content.eof?
|
35
36
|
else
|
@@ -82,13 +83,7 @@ class GitDump
|
|
82
83
|
args << '-F' << '-' if options[:message]
|
83
84
|
args << tree_sha << {:env => env, :no_stdin => !options[:message]}
|
84
85
|
|
85
|
-
git(*args).
|
86
|
-
if options[:message]
|
87
|
-
f.write options[:message]
|
88
|
-
f.close_write
|
89
|
-
end
|
90
|
-
f.read.chomp
|
91
|
-
end
|
86
|
+
git(*args).pipe(options[:message]).chomp
|
92
87
|
end
|
93
88
|
|
94
89
|
# Create tag for commit_sha with name constructed from name_parts, return
|
@@ -109,17 +104,18 @@ class GitDump
|
|
109
104
|
args << '-F' << '-' << '--cleanup=verbatim' if options[:message]
|
110
105
|
args << name << commit_sha << {:env => env}
|
111
106
|
|
112
|
-
git(*args).
|
113
|
-
if options[:message]
|
114
|
-
f.write options[:message]
|
115
|
-
f.close_write
|
116
|
-
end
|
117
|
-
f.read.chomp
|
118
|
-
end
|
107
|
+
git(*args).pipe(options[:message])
|
119
108
|
|
120
109
|
name
|
121
110
|
end
|
122
111
|
|
112
|
+
# Return size of object identified by sha
|
113
|
+
def size(sha)
|
114
|
+
@size_pipe ||= git(*%w[cat-file --batch-check]).popen('r+')
|
115
|
+
@size_pipe.puts(sha)
|
116
|
+
@size_pipe.gets.split(' ')[2].to_i
|
117
|
+
end
|
118
|
+
|
123
119
|
# Return pipe with contents of blob identified by sha
|
124
120
|
def blob_pipe(sha, &block)
|
125
121
|
git('cat-file', 'blob', sha).popen('rb', &block)
|
@@ -161,16 +157,15 @@ class GitDump
|
|
161
157
|
# Each entry is a hash like one for treeify
|
162
158
|
def tree_entries(sha)
|
163
159
|
git('ls-tree', sha).stripped_lines.map do |line|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
end
|
160
|
+
m = /^(\d{6}) (blob|tree) ([0-9a-f]{40})\t(.*)$/.match(line)
|
161
|
+
fail "Unexpected: #{line}" unless m
|
162
|
+
|
163
|
+
{
|
164
|
+
:mode => m[1].to_i(8),
|
165
|
+
:type => m[2].to_sym,
|
166
|
+
:sha => m[3],
|
167
|
+
:name => m[4],
|
168
|
+
}
|
174
169
|
end
|
175
170
|
end
|
176
171
|
|
@@ -182,7 +177,7 @@ class GitDump
|
|
182
177
|
%(committerdate:rfc2822)%(*committerdate:rfc2822)%00
|
183
178
|
%(contents)%00
|
184
179
|
%(*contents)%00
|
185
|
-
]
|
180
|
+
].freeze
|
186
181
|
|
187
182
|
# Return list of entries per tag ref
|
188
183
|
# Each entry is a hash with following keys:
|
@@ -239,11 +234,12 @@ class GitDump
|
|
239
234
|
|
240
235
|
def git_env(options)
|
241
236
|
env = {}
|
242
|
-
[
|
243
|
-
[
|
237
|
+
%w[author committer].each do |role|
|
238
|
+
%w[name email date].each do |part|
|
244
239
|
value = options[:"#{role}_#{part}"]
|
245
240
|
next unless value
|
246
|
-
|
241
|
+
|
242
|
+
value = value.strftime('%s %z') if part == 'date'
|
247
243
|
env["GIT_#{role}_#{part}".upcase] = value
|
248
244
|
end
|
249
245
|
end
|
@@ -260,7 +256,7 @@ class GitDump
|
|
260
256
|
out[:mode] = if out[:type] == :tree
|
261
257
|
0o040_000
|
262
258
|
else
|
263
|
-
(entry[:mode] &
|
259
|
+
(entry[:mode] & 0o100) == 0 ? 0o100_644 : 0o100_755
|
264
260
|
end
|
265
261
|
|
266
262
|
unless out[:sha] =~ /\A[0-9a-f]{40}\z/
|
data/lib/git_dump/repo/rugged.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rugged'
|
2
4
|
require 'git_dump/repo/git'
|
3
5
|
|
@@ -32,7 +34,7 @@ class GitDump
|
|
32
34
|
# :sha => sha of content
|
33
35
|
# :mode => last three octets of mode
|
34
36
|
def treeify(entries)
|
35
|
-
builder = ::Rugged::Tree::Builder.new
|
37
|
+
builder = ::Rugged::Tree::Builder.new(repo)
|
36
38
|
entries.map do |entry|
|
37
39
|
entry = normalize_entry(entry)
|
38
40
|
builder << {
|
@@ -42,7 +44,12 @@ class GitDump
|
|
42
44
|
:filemode => entry[:mode],
|
43
45
|
}
|
44
46
|
end
|
45
|
-
builder.write
|
47
|
+
builder.write
|
48
|
+
end
|
49
|
+
|
50
|
+
# Return size of object identified by sha
|
51
|
+
def size(sha)
|
52
|
+
::Rugged::Object.new(repo, sha).size
|
46
53
|
end
|
47
54
|
|
48
55
|
# Return contents of blob identified by sha
|
data/lib/git_dump/tree.rb
CHANGED
data/lib/git_dump/tree/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'git_dump/path_object'
|
2
4
|
require 'git_dump/entry'
|
3
5
|
|
@@ -14,7 +16,8 @@ class GitDump
|
|
14
16
|
# block given
|
15
17
|
def each(&block)
|
16
18
|
return to_enum(:each) unless block
|
17
|
-
|
19
|
+
|
20
|
+
@entries.each_value do |entry|
|
18
21
|
block[entry]
|
19
22
|
end
|
20
23
|
end
|
@@ -23,7 +26,8 @@ class GitDump
|
|
23
26
|
# given
|
24
27
|
def each_recursive(&block)
|
25
28
|
return to_enum(:each_recursive) unless block
|
26
|
-
|
29
|
+
|
30
|
+
@entries.each_value do |entry|
|
27
31
|
if entry.is_a?(Entry)
|
28
32
|
block[entry]
|
29
33
|
else
|
@@ -36,6 +40,7 @@ class GitDump
|
|
36
40
|
|
37
41
|
def get_at(parts)
|
38
42
|
return unless (entry = @entries[parts.first])
|
43
|
+
|
39
44
|
if parts.length == 1
|
40
45
|
entry
|
41
46
|
elsif entry.is_a?(self.class)
|
@@ -47,7 +52,7 @@ class GitDump
|
|
47
52
|
|
48
53
|
def parse_path(path)
|
49
54
|
path = Array(path).join('/') unless path.is_a?(String)
|
50
|
-
path.scan(
|
55
|
+
path.scan(%r{[^/]+})
|
51
56
|
end
|
52
57
|
end
|
53
58
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'git_dump/path_object'
|
2
4
|
require 'git_dump/entry'
|
3
5
|
|
@@ -14,7 +16,7 @@ class GitDump
|
|
14
16
|
|
15
17
|
# Store data `content` with mode `mode` at `path`
|
16
18
|
# Pass `nil` as content to remove
|
17
|
-
def store(path, content, mode =
|
19
|
+
def store(path, content, mode = 0o644)
|
18
20
|
put_at(parse_path(path), content && repo.data_sha(content), mode)
|
19
21
|
end
|
20
22
|
alias_method :[]=, :store
|
data/lib/git_dump/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'git_dump/version/base'
|
2
4
|
require 'git_dump/tree'
|
3
5
|
|
@@ -24,6 +26,8 @@ class GitDump
|
|
24
26
|
attr_reader :repo, :id, :sha, :time
|
25
27
|
attr_reader :commit_time, :annotation, :description
|
26
28
|
def initialize(repo, id, sha, attributes = {})
|
29
|
+
fail ArgumentError, 'Expected Repo' unless repo.is_a?(Repo)
|
30
|
+
|
27
31
|
@repo, @id, @sha = repo, id, sha
|
28
32
|
@time = attributes[:time]
|
29
33
|
@commit_time = attributes[:commit_time]
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'git_dump/version'
|
2
4
|
require 'git_dump/version/base'
|
3
5
|
require 'git_dump/tree/builder'
|
@@ -10,13 +12,15 @@ class GitDump
|
|
10
12
|
|
11
13
|
attr_reader :repo
|
12
14
|
def initialize(repo)
|
15
|
+
fail ArgumentError, 'Expected Repo' unless repo.is_a?(Repo)
|
16
|
+
|
13
17
|
@repo = repo
|
14
18
|
@tree = Tree::Builder.new(repo, nil, nil)
|
15
19
|
end
|
16
20
|
|
17
21
|
# Store data `content` with mode `mode` at `path`
|
18
22
|
# Pass `nil` as content to remove
|
19
|
-
def store(path, content, mode =
|
23
|
+
def store(path, content, mode = 0o644)
|
20
24
|
tree.store(path, content, mode)
|
21
25
|
end
|
22
26
|
alias_method :[]=, :store
|
data/script/benchmark
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'bundler/setup'
|
@@ -8,7 +9,7 @@ require 'git_dump'
|
|
8
9
|
require 'benchmark'
|
9
10
|
require 'tmpdir'
|
10
11
|
|
11
|
-
def measure(label, number = nil
|
12
|
+
def measure(label, number = nil)
|
12
13
|
label = "#{label} x#{number}" if number
|
13
14
|
label = "#{label}:"
|
14
15
|
|
@@ -16,7 +17,7 @@ def measure(label, number = nil, &block)
|
|
16
17
|
print label.ljust(30)
|
17
18
|
times = Benchmark.measure do
|
18
19
|
(number || 1).times do |n|
|
19
|
-
result =
|
20
|
+
result = yield n
|
20
21
|
end
|
21
22
|
end
|
22
23
|
puts " #{times}"
|
data/spec/git_dump_spec.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require 'spec_helper'
|
2
5
|
require 'git_dump'
|
3
6
|
require 'tmpdir'
|
@@ -14,7 +17,7 @@ describe GitDump do
|
|
14
17
|
DATAS = {
|
15
18
|
:text => "\r\n\r\nline\nline\rline\r\nline\n\rline\r\n\r\n",
|
16
19
|
:binary => 256.times.sort_by{ rand }.pack('C*'),
|
17
|
-
}
|
20
|
+
}.freeze
|
18
21
|
|
19
22
|
describe :new do
|
20
23
|
let(:path){ File.join(tmp_dir, 'dump') }
|
@@ -156,8 +159,8 @@ describe GitDump do
|
|
156
159
|
it 'creates and reads version' do
|
157
160
|
builder = dump.new_version
|
158
161
|
builder['string/x'] = 'test a'
|
159
|
-
builder.store('stringio/x', StringIO.new('test b'),
|
160
|
-
builder.store('io/x', File.open(__FILE__),
|
162
|
+
builder.store('stringio/x', StringIO.new('test b'), 0o644)
|
163
|
+
builder.store('io/x', File.open(__FILE__), 0o755)
|
161
164
|
builder.store_from('path/x', __FILE__)
|
162
165
|
built = builder.commit
|
163
166
|
|
@@ -171,8 +174,8 @@ describe GitDump do
|
|
171
174
|
|
172
175
|
expect(version['string/x'].read).to eq('test a')
|
173
176
|
expect(version['stringio/x'].read).to eq('test b')
|
174
|
-
expect(version['io/x'].read).to eq(File.
|
175
|
-
expect(version['path/x'].read).to eq(File.
|
177
|
+
expect(version['io/x'].read).to eq(File.open(__FILE__, 'rb', &:read))
|
178
|
+
expect(version['path/x'].read).to eq(File.open(__FILE__, 'rb', &:read))
|
176
179
|
expect(version['should/not/be/there']).to be_nil
|
177
180
|
end
|
178
181
|
|
@@ -202,6 +205,23 @@ describe GitDump do
|
|
202
205
|
end
|
203
206
|
end
|
204
207
|
|
208
|
+
it 'returns size for entries' do
|
209
|
+
datas = [
|
210
|
+
'',
|
211
|
+
'1',
|
212
|
+
'᚛᚛ᚉᚑᚅᚔᚉᚉᚔᚋ ᚔᚈᚔ ᚍᚂᚐᚅᚑ ᚅᚔᚋᚌᚓᚅᚐ᚜',
|
213
|
+
] + DATAS.values
|
214
|
+
|
215
|
+
builder = dump.new_version
|
216
|
+
datas.each_with_index do |data, i|
|
217
|
+
builder["a/path/#{i}"] = data
|
218
|
+
end
|
219
|
+
|
220
|
+
datas.each_with_index do |data, i|
|
221
|
+
expect(builder["a/path/#{i}"].size).to eq(data.bytesize)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
205
225
|
it 'cleans paths' do
|
206
226
|
builder = dump.new_version
|
207
227
|
builder['//aa//fa//'] = 'test a'
|
@@ -272,8 +292,8 @@ describe GitDump do
|
|
272
292
|
builder
|
273
293
|
end
|
274
294
|
|
275
|
-
def recursive_path_n_read(
|
276
|
-
|
295
|
+
def recursive_path_n_read(obj)
|
296
|
+
obj.each_recursive.map do |entry|
|
277
297
|
[entry.path, entry.read]
|
278
298
|
end
|
279
299
|
end
|
@@ -324,7 +344,7 @@ describe GitDump do
|
|
324
344
|
end
|
325
345
|
end
|
326
346
|
|
327
|
-
[
|
347
|
+
[0o644, 0o755].each do |mode|
|
328
348
|
it "sets mode to #{mode.to_s(8)}" do
|
329
349
|
builder = dump.new_version
|
330
350
|
builder.store('a', 'test', mode)
|
@@ -332,17 +352,17 @@ describe GitDump do
|
|
332
352
|
path = File.join(tmp_dir, 'file')
|
333
353
|
builder['a'].write_to(path)
|
334
354
|
|
335
|
-
expect(File.stat(path).mode &
|
355
|
+
expect(File.stat(path).mode & 0o777).to eq(mode)
|
336
356
|
end
|
337
357
|
|
338
358
|
it "fixes mode to #{mode.to_s(8)}" do
|
339
359
|
builder = dump.new_version
|
340
|
-
builder.store('a', 'test', mode &
|
360
|
+
builder.store('a', 'test', mode & 0o100)
|
341
361
|
|
342
362
|
path = File.join(tmp_dir, 'file')
|
343
363
|
builder['a'].write_to(path)
|
344
364
|
|
345
|
-
expect(File.stat(path).mode &
|
365
|
+
expect(File.stat(path).mode & 0o777).to eq(mode)
|
346
366
|
end
|
347
367
|
end
|
348
368
|
end
|
metadata
CHANGED
@@ -1,52 +1,53 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git_dump
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Kuchin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rubocop
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.52'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.52'
|
41
41
|
description:
|
42
42
|
email:
|
43
43
|
executables: []
|
44
44
|
extensions: []
|
45
45
|
extra_rdoc_files: []
|
46
46
|
files:
|
47
|
-
- .gitignore
|
48
|
-
- .rubocop.yml
|
49
|
-
- .travis.yml
|
47
|
+
- ".gitignore"
|
48
|
+
- ".rubocop.yml"
|
49
|
+
- ".travis.yml"
|
50
|
+
- ".travis_check_rubies.yml"
|
50
51
|
- Gemfile
|
51
52
|
- LICENSE.txt
|
52
53
|
- README.markdown
|
@@ -70,28 +71,29 @@ files:
|
|
70
71
|
homepage: http://github.com/toy/git_dump
|
71
72
|
licenses:
|
72
73
|
- MIT
|
73
|
-
metadata:
|
74
|
+
metadata:
|
75
|
+
bug_tracker_uri: https://github.com/toy/git_dump/issues
|
76
|
+
documentation_uri: https://www.rubydoc.info/gems/git_dump/0.1.1
|
77
|
+
source_code_uri: https://github.com/toy/git_dump
|
74
78
|
post_install_message:
|
75
79
|
rdoc_options: []
|
76
80
|
require_paths:
|
77
81
|
- lib
|
78
82
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
83
|
requirements:
|
80
|
-
- -
|
84
|
+
- - ">="
|
81
85
|
- !ruby/object:Gem::Version
|
82
86
|
version: '0'
|
83
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
88
|
requirements:
|
85
|
-
- -
|
89
|
+
- - ">="
|
86
90
|
- !ruby/object:Gem::Version
|
87
91
|
version: '0'
|
88
92
|
requirements: []
|
89
|
-
|
90
|
-
rubygems_version: 2.4.4
|
93
|
+
rubygems_version: 3.0.3
|
91
94
|
signing_key:
|
92
95
|
specification_version: 4
|
93
96
|
summary: Distributed versioned store using git
|
94
97
|
test_files:
|
95
98
|
- spec/git_dump_spec.rb
|
96
99
|
- spec/spec_helper.rb
|
97
|
-
has_rdoc:
|