db2fog 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (10) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/CHANGELOG.md +106 -0
  4. data/Gemfile +3 -0
  5. data/README.rdoc +2 -21
  6. data/Rakefile +24 -0
  7. data/db2fog.gemspec +27 -0
  8. data/lib/db2fog.rb +32 -45
  9. metadata +67 -50
  10. data/HISTORY +0 -38
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2287c68e77479e2a698f97cced644c95f9e65b79
4
+ data.tar.gz: 9489832660a2a444117b0e36059eb2cae2089047
5
+ SHA512:
6
+ metadata.gz: 16851ca0b78f024c556d7d8019396660b1c9d72692f0d58bfded373b594fa8aa70a5d024cbc563f7a076b8168113410d106e51eee6f3d5d796da598bfd6dab2b
7
+ data.tar.gz: 3932fadd999da08547aa66fbee515d2deebc96edc7403830acbb925bd0d14a7e5578b8ca2d3cc67a68afc586e2620ae9331730352b26c5862c47608960f519b6
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ Gemfile.lock
3
+ spec/db_config.rb
4
+ spec/storage
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
11
+ /.yardoc
@@ -0,0 +1,106 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [yob](https://github.com/yob/db2fog) and [itbeaver](http://itbeaver.co).
4
+
5
+ ## [0.9.0]
6
+ ### Added
7
+ - Support ruby version >= 2.0 and rails (active_record) verison >=3.2.0 && <5.0
8
+
9
+ ## [0.8.0] - 2012-06-18
10
+ ### Added
11
+ - Support configurable database names when restoring
12
+
13
+ ## [0.7.0] - 2011-11-03
14
+
15
+ ## [0.6.0] - 2011-10-24
16
+ ### Added
17
+ - Support for postgresql 8
18
+
19
+ ## [0.5.4] - 2011-10-17
20
+ ### Fixed
21
+ - Only clean files that were created by db2fog
22
+
23
+ ## [0.5.3] - 2011-10-12
24
+ ### Added
25
+ - Improve robustness of clean task
26
+
27
+ ## [0.5.2] - 2011-09-15
28
+ ### Fixed
29
+ - Fix restoring of postgresql databases (thanks Dan Neighman)
30
+
31
+ ## [0.5.1] - 2011-08-29
32
+ ### Added
33
+ - Relax fog dependency to allow higher versions
34
+
35
+ ## [0.5.0] - 2011-08-06
36
+ ### Added
37
+ - Initial postgresql support
38
+
39
+ ### Fixed
40
+ - Fix an encoding issue under 1.9
41
+
42
+ ### Removed
43
+ - Removed the statistics rake task
44
+
45
+ ## [0.4.2] - 2011-07-24
46
+ ### Fixed
47
+ - Fixed recording of most recent backup
48
+
49
+ ### Removed
50
+ - Remove runtime dependency on mysql2
51
+
52
+ ## [0.4.1] - 2011-07-23
53
+ ### Fixed
54
+ - Fixed cleaning of old backups
55
+
56
+ ## [0.4.0] - 2011-07-22
57
+ ### Added
58
+ - Forked db2s3 into db2fog
59
+
60
+ ## [0.3.1] - 2009-12-07
61
+ ### Fixed
62
+ - Fixed hardcoded DB name in statistics task
63
+
64
+ ## [0.3.0] - 20090-12-06
65
+ ### Added
66
+ - Added db2s3:backup:clean task to delete old backups
67
+ - Added dependency on activesupport for the clean task
68
+
69
+ ## [0.2.6] - 2009-12-06
70
+ ### Added
71
+ - Add statistics task to show you the size of your tables
72
+ - Only add username to mysql command line if provided in database.yml
73
+
74
+ ### Removed
75
+ - Remove metrics task, since it was far too inaccurate
76
+
77
+ ## [0.2.5]
78
+ ### Added
79
+ - Use host provided in database.yml
80
+
81
+ ## [0.2.4] - 2009-10-02
82
+ ### Fixed
83
+ - Fix credentials bug
84
+
85
+ ## 0.2.3
86
+ ### Added
87
+ - Keep old backups around
88
+
89
+ [0.9.0]: https://github.com/itbeaver/db2fog/compare/v0.8.0...0.9.0
90
+ [0.8.0]: https://github.com/itbeaver/db2fog/compare/v0.7.0...0.8.0
91
+ [0.7.0]: https://github.com/itbeaver/db2fog/compare/v0.6.0...0.7.0
92
+ [0.6.0]: https://github.com/itbeaver/db2fog/compare/v0.5.4...0.6.0
93
+ [0.5.4]: https://github.com/itbeaver/db2fog/compare/v0.5.3...0.5.4
94
+ [0.5.3]: https://github.com/itbeaver/db2fog/compare/v0.5.2...0.5.3
95
+ [0.5.2]: https://github.com/itbeaver/db2fog/compare/v0.5.1...0.5.2
96
+ [0.5.1]: https://github.com/itbeaver/db2fog/compare/v0.5.0...0.5.1
97
+ [0.5.0]: https://github.com/itbeaver/db2fog/compare/v0.4.2...0.5.0
98
+ [0.4.2]: https://github.com/itbeaver/db2fog/compare/v0.4.1...0.4.2
99
+ [0.4.1]: https://github.com/itbeaver/db2fog/compare/v0.4.0...0.4.1
100
+ [0.4.0]: https://github.com/itbeaver/db2fog/compare/v0.3.1...0.4.0
101
+ [0.3.1]: https://github.com/itbeaver/db2fog/compare/v0.3.0...0.3.1
102
+ [0.3.0]: https://github.com/itbeaver/db2fog/compare/v0.2.6...0.3.0
103
+ [0.2.6]: https://github.com/itbeaver/db2fog/compare/v0.2.5...0.2.6
104
+ [0.2.5]: https://github.com/itbeaver/db2fog/compare/v0.2.4...0.2.5
105
+ [0.2.4]: https://github.com/itbeaver/db2fog/compare/v0.2.3...0.2.4
106
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -34,6 +34,7 @@ providers they should work with just a config change to Db2Fog.
34
34
  :aws_secret_access_key => 'yoursecretkey',
35
35
  :directory => 'bucket-name',
36
36
  :provider => 'AWS'
37
+ :region => 'region'
37
38
  }
38
39
 
39
40
  === Rackspace Cloudfiles
@@ -74,7 +75,7 @@ pg_version 8 or 9
74
75
  == Usage
75
76
 
76
77
  # Add to your crontab or whatever
77
- rake db2fog:full
78
+ rake db2fog:backup:full
78
79
 
79
80
  # Handy tasks
80
81
  rake db2fog:restore # You should be testing this regularly
@@ -88,26 +89,6 @@ do this:
88
89
  DB2Fog.new.backup
89
90
  DB2Fog.new.clean
90
91
 
91
- === Restoring the production DB to development
92
-
93
- It might be useful to give developers a quick way to restore a production
94
- backup to their local machines. Create a rake task like so:
95
-
96
-
97
- namespace :db do
98
- task :restore => :environment do
99
- DB2Fog.new.restore("production_db_name")
100
- end
101
-
102
- namespace :production do
103
- task :pull => ["db:drop", "db:create", "db:restore", "db:migrate"]
104
- end
105
- end
106
-
107
- .. and then run
108
-
109
- bundle exec rake db:production:pull
110
-
111
92
  == Compatibility
112
93
 
113
94
  This is pure so ruby should run on most ruby VMs. I develop on MRI 1.9.2.
@@ -0,0 +1,24 @@
1
+ require "rubygems"
2
+ require "bundler"
3
+ Bundler.setup
4
+
5
+ require 'rake'
6
+ require 'rspec/core/rake_task'
7
+ require "bundler/gem_tasks"
8
+
9
+ desc "Default Task"
10
+ task :default => [ :spec ]
11
+
12
+ # run all rspecs
13
+ desc "Run all rspec files"
14
+ RSpec::Core::RakeTask.new("spec") do |t|
15
+ t.rspec_opts = ["--color", "--format progress"]
16
+ # turn this off for now. I'd like to leave it on, but thor throws
17
+ # a large amount of noise to my console if I do
18
+ #t.ruby_opts = "-w"
19
+ end
20
+
21
+ desc "Create test database"
22
+ task :create_test_db do
23
+ `mysqladmin -u root create db2s3_unittest`
24
+ end
@@ -0,0 +1,27 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "db2fog"
3
+ s.version = "0.9.0"
4
+ s.licenses = ['MIT']
5
+ s.summary = "db2fog provides rake tasks for backing up and restoring your DB to cloud storage providers"
6
+ s.description = "db2fog provides rake tasks for backing up and restoring your DB to cloud storage providers"
7
+ s.authors = ["James Healy", "Alexander Bobrov", "Denis Erofeev"]
8
+ s.email = ["support@itbeaver.co"]
9
+ s.homepage = "https://github.com/itbeaver/db2fog"
10
+ s.has_rdoc = true
11
+ s.rdoc_options << "--title" << "DB2Fog" << "--line-numbers"
12
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
13
+
14
+ s.required_rubygems_version = ">=1.3.2"
15
+ s.required_ruby_version = ">=2.0.0"
16
+
17
+ s.add_dependency("rails", ['>=3.2.0', '<5.0'])
18
+ s.add_dependency("activerecord", ['>=3.2.0', '<5.0'])
19
+
20
+ s.add_dependency("fog", "~> 1.0")
21
+
22
+ s.add_development_dependency('bundler')
23
+ s.add_development_dependency("rake")
24
+ s.add_development_dependency("mysql2")
25
+ s.add_development_dependency("rspec", "~>2.6")
26
+ s.add_development_dependency("timecop", "~>0.3.5")
27
+ end
@@ -16,19 +16,8 @@ class DB2Fog
16
16
  store.store(most_recent_dump_file_name, file_name)
17
17
  end
18
18
 
19
- # download the latest backup and restore it to the current database.
20
- #
21
- # **** CAUTION **** The database for the current RAILS_ENV will be emptied
22
- # and all tables will be recreated.
23
- #
24
- # The database you're restoring from and restoring to may have a different
25
- # names (ie. restoring mydb_production into mydb_development). If that's
26
- # the case, you should provide the source database name (ie. mydb_production)
27
- # as an argument.
28
- #
29
- def restore(source_database_name = nil)
30
- most_recent_file_name = most_recent_dump_file_name(source_database_name)
31
- dump_file_name = store.fetch(most_recent_file_name).read
19
+ def restore
20
+ dump_file_name = store.fetch(most_recent_dump_file_name).read
32
21
  file = store.fetch(dump_file_name)
33
22
  database.restore(file.path)
34
23
  end
@@ -72,38 +61,55 @@ class DB2Fog
72
61
  @store ||= FogStore.new
73
62
  end
74
63
 
75
- def most_recent_dump_file_name(database_name = nil)
76
- database_name ||= db_credentials[:database]
77
- "most-recent-dump-#{database_name}.txt"
64
+ def most_recent_dump_file_name
65
+ "most-recent-dump-#{db_credentials[:database]}.txt"
78
66
  end
79
67
 
80
68
  def db_credentials
81
- ActiveRecord::Base.connection.instance_eval { @config } # Dodgy!
69
+ if Object.const_defined?(:ActiveRecord)
70
+ ActiveRecord::Base.connection.instance_eval { @config } # Dodgy!
71
+ elsif Object.const_defined?(:DataMapper)
72
+ DataMapper.repository.adapter.options.inject({}){|m,(k,v)| m[k.to_sym] = v;m }
73
+ elsif Object.const_defined?(:Sequel)
74
+ opts = Sequel::DATABASES.first.opts
75
+ opts[:username] = opts[:user]
76
+ opts
77
+ end
82
78
  end
83
79
 
84
80
  def database
85
81
  @database ||= case db_credentials[:adapter]
86
82
  when /mysql/ then MysqlAdaptor.new(db_credentials)
87
- when /postgres/ then PsqlAdaptor.new(db_credentials)
83
+ when /postgres/ || /postgis/ then PsqlAdaptor.new(db_credentials)
88
84
  else
89
85
  raise "database adaptor '#{db_credentials[:adapter]}' not supported"
90
86
  end
91
87
  end
92
88
 
93
- class MysqlAdaptor
89
+ class BaseAdaptor
94
90
 
95
91
  def initialize(credentials)
96
92
  @credentials = credentials
97
93
  end
98
94
 
95
+ def run(command)
96
+ result = system(command)
97
+ raise("error, process exited with status #{$?.exitstatus}") unless result
98
+ end
99
+
99
100
  def dump
100
101
  dump_file = Tempfile.new("dump")
102
+ run(dump_command(dump_file))
103
+ dump_file.path
104
+ end
101
105
 
106
+ end
107
+
108
+ class MysqlAdaptor < BaseAdaptor
109
+
110
+ def dump_command(dump_file)
102
111
  cmd = "mysqldump --quick --single-transaction --create-options #{mysql_options}"
103
112
  cmd += " | gzip -9 > #{dump_file.path}"
104
- run(cmd)
105
-
106
- dump_file.path
107
113
  end
108
114
 
109
115
  def restore(path)
@@ -121,27 +127,13 @@ class DB2Fog
121
127
  cmd += " #{@credentials[:database]}"
122
128
  end
123
129
 
124
- def run(command)
125
- result = system(command)
126
- raise("error, process exited with status #{$?.exitstatus}") unless result
127
- end
128
-
129
130
  end
130
131
 
131
- class PsqlAdaptor
132
-
133
- def initialize(credentials)
134
- @credentials = credentials
135
- end
136
-
137
- def dump
138
- dump_file = Tempfile.new("dump")
139
-
140
- cmd = "pg_dump --clean --format=p #{pg_dump_options}"
141
- cmd += " | gzip -9 > #{dump_file.path}"
142
- run(cmd)
132
+ class PsqlAdaptor < BaseAdaptor
143
133
 
144
- dump_file.path
134
+ def dump_command(dump_file)
135
+ cmd = "pg_dump --clean --format=p --compress=9 #{pg_dump_options}"
136
+ cmd += " > #{dump_file.path}"
145
137
  end
146
138
 
147
139
  def restore(path)
@@ -171,11 +163,6 @@ class DB2Fog
171
163
  opts[:pg_version] || 9
172
164
  end
173
165
 
174
- def run(command)
175
- result = system(command)
176
- raise("error, process exited with status #{$?.exitstatus}") unless result
177
- end
178
-
179
166
  def database_options
180
167
  if DB2Fog.config.respond_to?(:[])
181
168
  DB2Fog.config[:database_options]
metadata CHANGED
@@ -1,167 +1,184 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db2fog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
5
- prerelease:
4
+ version: 0.9.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - James Healy
8
+ - Alexander Bobrov
9
+ - Denis Erofeev
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2012-06-18 00:00:00.000000000 Z
13
+ date: 2016-02-08 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rails
16
17
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '3.0'
21
+ version: 3.2.0
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '5.0'
22
25
  type: :runtime
23
26
  prerelease: false
24
27
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
28
  requirements:
27
- - - ~>
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 3.2.0
32
+ - - "<"
28
33
  - !ruby/object:Gem::Version
29
- version: '3.0'
34
+ version: '5.0'
30
35
  - !ruby/object:Gem::Dependency
31
36
  name: activerecord
32
37
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
38
  requirements:
35
- - - ~>
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 3.2.0
42
+ - - "<"
36
43
  - !ruby/object:Gem::Version
37
- version: '3.0'
44
+ version: '5.0'
38
45
  type: :runtime
39
46
  prerelease: false
40
47
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
48
  requirements:
43
- - - ~>
49
+ - - ">="
44
50
  - !ruby/object:Gem::Version
45
- version: '3.0'
51
+ version: 3.2.0
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
46
55
  - !ruby/object:Gem::Dependency
47
56
  name: fog
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
- - - ~>
59
+ - - "~>"
52
60
  - !ruby/object:Gem::Version
53
61
  version: '1.0'
54
62
  type: :runtime
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
65
  requirements:
59
- - - ~>
66
+ - - "~>"
60
67
  - !ruby/object:Gem::Version
61
68
  version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
62
83
  - !ruby/object:Gem::Dependency
63
84
  name: rake
64
85
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
86
  requirements:
67
- - - ! '>='
87
+ - - ">="
68
88
  - !ruby/object:Gem::Version
69
89
  version: '0'
70
90
  type: :development
71
91
  prerelease: false
72
92
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
93
  requirements:
75
- - - ! '>='
94
+ - - ">="
76
95
  - !ruby/object:Gem::Version
77
96
  version: '0'
78
97
  - !ruby/object:Gem::Dependency
79
98
  name: mysql2
80
99
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
100
  requirements:
83
- - - ! '>='
101
+ - - ">="
84
102
  - !ruby/object:Gem::Version
85
103
  version: '0'
86
104
  type: :development
87
105
  prerelease: false
88
106
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
107
  requirements:
91
- - - ! '>='
108
+ - - ">="
92
109
  - !ruby/object:Gem::Version
93
110
  version: '0'
94
111
  - !ruby/object:Gem::Dependency
95
112
  name: rspec
96
113
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
114
  requirements:
99
- - - ~>
115
+ - - "~>"
100
116
  - !ruby/object:Gem::Version
101
117
  version: '2.6'
102
118
  type: :development
103
119
  prerelease: false
104
120
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
121
  requirements:
107
- - - ~>
122
+ - - "~>"
108
123
  - !ruby/object:Gem::Version
109
124
  version: '2.6'
110
125
  - !ruby/object:Gem::Dependency
111
126
  name: timecop
112
127
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
128
  requirements:
115
- - - ~>
129
+ - - "~>"
116
130
  - !ruby/object:Gem::Version
117
131
  version: 0.3.5
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
135
  requirements:
123
- - - ~>
136
+ - - "~>"
124
137
  - !ruby/object:Gem::Version
125
138
  version: 0.3.5
126
139
  description: db2fog provides rake tasks for backing up and restoring your DB to cloud
127
140
  storage providers
128
141
  email:
129
- - james@yob.id.au
142
+ - support@itbeaver.co
130
143
  executables: []
131
144
  extensions: []
132
145
  extra_rdoc_files: []
133
146
  files:
147
+ - ".gitignore"
148
+ - CHANGELOG.md
149
+ - Gemfile
150
+ - README.rdoc
151
+ - Rakefile
152
+ - db2fog.gemspec
153
+ - lib/db2fog.rb
134
154
  - lib/db2fog/railtie.rb
135
155
  - lib/db2fog/tasks.rb
136
- - lib/db2fog.rb
137
- - README.rdoc
138
- - HISTORY
139
- homepage: http://github.com/yob/db2fog
140
- licenses: []
156
+ homepage: https://github.com/itbeaver/db2fog
157
+ licenses:
158
+ - MIT
159
+ metadata: {}
141
160
  post_install_message:
142
161
  rdoc_options:
143
- - --title
162
+ - "--title"
144
163
  - DB2Fog
145
- - --line-numbers
164
+ - "--line-numbers"
146
165
  require_paths:
147
166
  - lib
148
167
  required_ruby_version: !ruby/object:Gem::Requirement
149
- none: false
150
168
  requirements:
151
- - - ! '>='
169
+ - - ">="
152
170
  - !ruby/object:Gem::Version
153
- version: 1.8.7
171
+ version: 2.0.0
154
172
  required_rubygems_version: !ruby/object:Gem::Requirement
155
- none: false
156
173
  requirements:
157
- - - ! '>='
174
+ - - ">="
158
175
  - !ruby/object:Gem::Version
159
176
  version: 1.3.2
160
177
  requirements: []
161
178
  rubyforge_project:
162
- rubygems_version: 1.8.23
179
+ rubygems_version: 2.4.5.1
163
180
  signing_key:
164
- specification_version: 3
181
+ specification_version: 4
165
182
  summary: db2fog provides rake tasks for backing up and restoring your DB to cloud
166
183
  storage providers
167
184
  test_files: []
data/HISTORY DELETED
@@ -1,38 +0,0 @@
1
- v0.8.0 (18th June 2012)
2
- - Support configurable database names when restoring
3
- v0.6.0 (24th October 2011)
4
- - Support for postgresql 8
5
- v0.5.4 (17th October 2011)
6
- - only clean files that were created by db2fog
7
- v0.5.3 (12th October 2011)
8
- - improve robustness of clean task
9
- v0.5.2 (15th September 2011)
10
- - fix restoring of postgresql databases (thanks Dan Neighman)
11
- v0.5.1 (29th August 2011)
12
- - relax fog dependency to allow higher versions
13
- v0.5.0 (6th August 2011)
14
- - initial postgresql support
15
- - removed the statistics rake task
16
- - fix an encoding issue under 1.9
17
- v0.4.2 (24th July 2011)
18
- - fixed recording of most recent backup
19
- - remove runtime dependency on mysql2
20
- v0.4.1 (23rd July 2011)
21
- - fixed cleaning of old backups
22
- v0.4.0 (22nd July 2011)
23
- - forked db2s3 into db2fog
24
- 0.3.1 (7 Dec 2009)
25
- - Fixed hardcoded DB name in statistics task
26
- 0.3.0 (6 Dec 2009)
27
- - Added db2s3:backup:clean task to delete old backups
28
- - Added dependency on activesupport for the clean task
29
- 0.2.6 (6 Dec 2009)
30
- - Remove metrics task, since it was far too inaccurate
31
- - Add statistics task to show you the size of your tables
32
- - Only add username to mysql command line if provided in database.yml
33
- 0.2.5
34
- - Use host provided in database.yml
35
- 0.2.4 (2 Sep 2009)
36
- - Fix credentials bug
37
- 0.2.3
38
- - Keep old backups around