silo 0.1.0

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.
@@ -0,0 +1,11 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2010, Sebastian Staudt
5
+
6
+ module Silo
7
+
8
+ # The current version of the Silo gem
9
+ VERSION = '0.1.0'
10
+
11
+ end
data/test/data/file1 ADDED
File without changes
data/test/data/file2 ADDED
File without changes
File without changes
File without changes
data/test/helper.rb ADDED
@@ -0,0 +1,13 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2010, Sebastian Staudt
5
+
6
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
7
+ $: << File.dirname(__FILE__)
8
+ require 'silo'
9
+ include Silo
10
+
11
+ require 'rubygems'
12
+ require 'shoulda'
13
+
@@ -0,0 +1,204 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2010-2011, Sebastian Staudt
5
+
6
+ require 'tmpdir'
7
+
8
+ require 'helper'
9
+ require 'core_ext/pathname'
10
+
11
+ class TestRepository < Test::Unit::TestCase
12
+
13
+ context 'A new backup repository' do
14
+
15
+ setup do
16
+ @dir = Dir.mktmpdir
17
+ Dir.rmdir @dir
18
+ end
19
+
20
+ should 'contain a bare Git repository prepared for Silo by default' do
21
+ repo = Repository.new @dir
22
+ assert repo.git.is_a? Grit::Repo
23
+ assert repo.prepared?
24
+ assert_equal 1, repo.git.commits.size
25
+ assert_equal 'Enabled Silo for this repository', repo.git.commits.first.message
26
+ end
27
+
28
+ should 'contain a plain Git repository when option :prepare is false' do
29
+ repo = Repository.new @dir, :prepare => false
30
+ assert repo.git.is_a? Grit::Repo
31
+ assert !repo.prepared?
32
+ assert_equal 0, repo.git.commits.size
33
+ end
34
+
35
+ should 'fail when option :create is false and the target directory does not exist' do
36
+ assert_raise Grit::NoSuchPathError do
37
+ Repository.new @dir, :create => false
38
+ end
39
+ end
40
+
41
+ should 'fail if the target directory exists but is not an empty Git repository' do
42
+ assert_raise Grit::InvalidGitRepositoryError do
43
+ Repository.new File.dirname(__FILE__)
44
+ end
45
+
46
+ assert_raise InvalidRepositoryError do
47
+ Repository.new File.join(File.dirname(File.dirname(__FILE__)), '.git')
48
+ end
49
+ end
50
+
51
+ end
52
+
53
+ context 'An existing backup repository' do
54
+
55
+ setup do
56
+ @repo_dir = Dir.mktmpdir
57
+ `git init --bare #{@repo_dir}`
58
+ ENV['GIT_DIR'] = @repo_dir
59
+ ENV['GIT_WORK_TREE'] = File.expand_path '.'
60
+ FileUtils.touch '.silo'
61
+ `git add .silo`
62
+ `git commit -m "Enabled Silo for this repository"`
63
+ ENV['GIT_WORK_TREE'] = nil
64
+ @repo = Repository.new @repo_dir
65
+ end
66
+
67
+ should 'contain a Git repository' do
68
+ assert @repo.git.is_a? Grit::Repo
69
+ end
70
+
71
+ should 'be prepared' do
72
+ assert_equal 1, @repo.git.commits.size
73
+ assert @repo.prepared?
74
+ end
75
+
76
+ should 'not allow re-preparing the repository' do
77
+ assert_raise AlreadyPreparedError do
78
+ @repo.prepare
79
+ end
80
+ end
81
+
82
+ teardown do
83
+ FileUtils.rm_rf [@repo_dir, '.silo'], :secure => true
84
+ end
85
+
86
+ end
87
+
88
+ context 'Backing up and restoring' do
89
+
90
+ setup do
91
+ @data_dir = Pathname.new(File.dirname(__FILE__))/'data'
92
+ @repo = Repository.new Dir.mktmpdir
93
+ @old_pwd = Dir.pwd
94
+ @target_dir = Pathname.new Dir.mktmpdir
95
+ @work_dir = Pathname.new Dir.mktmpdir
96
+ Dir.chdir @work_dir
97
+ end
98
+
99
+ should 'save single files correctly' do
100
+ @repo.add @data_dir/'file1'
101
+ @repo.add @data_dir/'file2'
102
+
103
+ assert_equal 3, @repo.git.commits.size
104
+ assert (@repo.git.tree/('file1')).is_a? Grit::Blob
105
+ assert (@repo.git.tree/('file2')).is_a? Grit::Blob
106
+ assert_equal "Added file #{@data_dir + 'file1'} into '/'", @repo.git.commits[1].message
107
+ assert_equal "Added file #{@data_dir + 'file2'} into '/'", @repo.git.commits[2].message
108
+ end
109
+
110
+ should 'save directory trees correctly' do
111
+ @repo.add @data_dir
112
+
113
+ assert_equal 2, @repo.git.commits.size
114
+ assert_equal "Added directory #{@data_dir} into '/'", @repo.git.commits[1].message
115
+ assert (@repo.git.tree/('data/file1')).is_a? Grit::Blob
116
+ assert (@repo.git.tree/('data/file2')).is_a? Grit::Blob
117
+ assert (@repo.git.tree/('data/subdir1')).is_a? Grit::Tree
118
+ assert (@repo.git.tree/('data/subdir1/file1')).is_a? Grit::Blob
119
+ assert (@repo.git.tree/('data/subdir2')).is_a? Grit::Tree
120
+ assert (@repo.git.tree/('data/subdir2/file2')).is_a? Grit::Blob
121
+ end
122
+
123
+ should 'save single files correctly into a prefix directory' do
124
+ @repo.add @data_dir/'file1', 'prefix'
125
+ @repo.add @data_dir/'file2', 'prefix'
126
+
127
+ assert_equal 3, @repo.git.commits.size
128
+ assert (@repo.git.tree/('prefix/file1')).is_a? Grit::Blob
129
+ assert (@repo.git.tree/('prefix/file2')).is_a? Grit::Blob
130
+ assert_equal "Added file #{@data_dir + 'file1'} into 'prefix'", @repo.git.commits[1].message
131
+ assert_equal "Added file #{@data_dir + 'file2'} into 'prefix'", @repo.git.commits[2].message
132
+ end
133
+
134
+ should 'save directory trees correctly into a prefix directory' do
135
+ @repo.add @data_dir, 'prefix'
136
+
137
+ assert_equal 2, @repo.git.commits.size
138
+ assert_equal "Added directory #{@data_dir} into 'prefix'", @repo.git.commits[1].message
139
+ assert (@repo.git.tree/('prefix/data/file1')).is_a? Grit::Blob
140
+ assert (@repo.git.tree/('prefix/data/file2')).is_a? Grit::Blob
141
+ assert (@repo.git.tree/('prefix/data/subdir1')).is_a? Grit::Tree
142
+ assert (@repo.git.tree/('prefix/data/subdir1/file1')).is_a? Grit::Blob
143
+ assert (@repo.git.tree/('prefix/data/subdir2')).is_a? Grit::Tree
144
+ assert (@repo.git.tree/('prefix/data/subdir2/file2')).is_a? Grit::Blob
145
+ end
146
+
147
+ should 'restore single files correctly' do
148
+ @repo.add @data_dir
149
+ @repo.add @data_dir/'file1'
150
+ @repo.restore 'file1'
151
+ @repo.restore 'data/file2', @target_dir
152
+
153
+ assert File.exist? @work_dir/'file1'
154
+ assert File.exist? @target_dir/'file2'
155
+ end
156
+
157
+ should 'restore directory trees correctly' do
158
+ @repo.add @data_dir
159
+ @repo.restore 'data'
160
+ @repo.restore 'data/subdir1', @target_dir
161
+
162
+ assert File.exist? @work_dir/'data/file1'
163
+ assert File.exist? @work_dir/'data/file2'
164
+ assert File.exist? @work_dir/'data/subdir1/file1'
165
+ assert File.exist? @work_dir/'data/subdir2/file2'
166
+
167
+ assert File.exist? @target_dir/'subdir1'
168
+ assert File.exist? @target_dir/'subdir1/file1'
169
+ end
170
+
171
+ should 'purge files and directories correctly' do
172
+ @repo.add @data_dir
173
+ @repo.add @data_dir/'file1'
174
+
175
+ @repo.purge 'data/file1'
176
+ assert_equal 3, @repo.git.commits.size
177
+ assert (@repo.git.tree/'data/file1').nil?
178
+
179
+ @repo.purge 'data'
180
+ assert_equal 2, @repo.git.commits.size
181
+ assert (@repo.git.tree/'data').nil?
182
+
183
+ @repo.purge 'file1'
184
+ assert_equal 1, @repo.git.commits.size
185
+ assert (@repo.git.tree/'file1').nil?
186
+
187
+ @repo.add @data_dir
188
+ @repo.add @data_dir/'file1'
189
+
190
+ @repo.purge 'data', false
191
+ @repo.purge 'file1', false
192
+ assert_equal 3, @repo.git.commits.size
193
+ assert (@repo.git.tree/'data').nil?
194
+ assert (@repo.git.tree/'file1').nil?
195
+ end
196
+
197
+ teardown do
198
+ Dir.chdir @old_pwd
199
+ FileUtils.rm_rf [@repo.path, @work_dir, @target_dir], :secure => true
200
+ end
201
+
202
+ end
203
+
204
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: silo
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Sebastian Staudt
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-30 00:00:00 +01:00
19
+ default_executable: silo
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rubikon
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 0
32
+ - 6
33
+ - 0
34
+ version: 0.6.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: grit
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 29
46
+ segments:
47
+ - 2
48
+ - 4
49
+ - 1
50
+ version: 2.4.1
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: shoulda
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ hash: 37
62
+ segments:
63
+ - 2
64
+ - 11
65
+ - 3
66
+ version: 2.11.3
67
+ type: :development
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: ore-tasks
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ hash: 19
78
+ segments:
79
+ - 0
80
+ - 3
81
+ - 0
82
+ version: 0.3.0
83
+ type: :development
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: yard
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ hash: 15
94
+ segments:
95
+ - 0
96
+ - 6
97
+ - 4
98
+ version: 0.6.4
99
+ type: :development
100
+ version_requirements: *id005
101
+ description: With Silo you can backup arbitrary files into one or more Git repositories and take advantage of Git's compression, speed and other features. No Git knowledge needed.
102
+ email: koraktor@gmail.com
103
+ executables:
104
+ - silo
105
+ extensions: []
106
+
107
+ extra_rdoc_files:
108
+ - Changelog.md
109
+ - LICENSE
110
+ files:
111
+ - lib/silo/remote/git.rb
112
+ - gemspec.yml
113
+ - lib/silo/repository.rb
114
+ - lib/core_ext/pathname.rb
115
+ - .yardopts
116
+ - test/data/file1
117
+ - test/data/file2
118
+ - bin/silo
119
+ - LICENSE
120
+ - test/data/subdir2/file2
121
+ - test/data/subdir1/file1
122
+ - lib/silo/version.rb
123
+ - Rakefile
124
+ - README.md
125
+ - test/test_repository.rb
126
+ - Changelog.md
127
+ - lib/silo/remote/base.rb
128
+ - lib/silo/errors.rb
129
+ - lib/silo.rb
130
+ - test/helper.rb
131
+ - lib/silo/cli.rb
132
+ has_rdoc: true
133
+ homepage: http://koraktor.de/silo
134
+ licenses:
135
+ - BSD
136
+ post_install_message:
137
+ rdoc_options: []
138
+
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ hash: 3
147
+ segments:
148
+ - 0
149
+ version: "0"
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ hash: 3
156
+ segments:
157
+ - 0
158
+ version: "0"
159
+ requirements:
160
+ - git >= 1.6
161
+ rubyforge_project: silo
162
+ rubygems_version: 1.4.2
163
+ signing_key:
164
+ specification_version: 3
165
+ summary: A command-line utility and API for Git-based backups
166
+ test_files:
167
+ - test/test_repository.rb