chronicler 0.1.0 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +5 -4
- data/VERSION +1 -1
- data/chronicler.gemspec +3 -1
- data/lib/chronicler/cli.rb +45 -19
- data/lib/chronicler/repository.rb +26 -17
- data/lib/chronicler/version.rb +7 -0
- data/lib/chronicler.rb +1 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4601aca82d7b4e20ca7de0be13a4b5f3bc328eee
|
4
|
+
data.tar.gz: e87071d55ee8ff46c2715753dee4c5aca53934ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7303884259d535ed74400f20b57cd9110419e22343f9f97f79a0b17876fd948144c89ca8035aaca03a036a7d961f218df009ccf669e1c155be4d449c7eb96b2
|
7
|
+
data.tar.gz: 2b2a631baec969a1ae3e4c360d91f723e678530b6f4421310f04ecece9cb8263a3a4e8b54e45e607286981d6b26375bd7f49427f9c50ec4d3e25e555d9a7aa33
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
## Chronicler CHANGELOG
|
2
|
+
|
3
|
+
### Version 0.1.2 (March 14, 2016)
|
4
|
+
|
5
|
+
* Fixed creating gzipped database dumps
|
6
|
+
|
7
|
+
### Version 0.1.1 (March 4, 2016)
|
8
|
+
|
9
|
+
* Being able to move a tag during commit
|
10
|
+
* Improved `crn use`
|
11
|
+
* Being able to (Git) reset the current branch using `crn reset`
|
12
|
+
* Dumping tables separately ^^
|
13
|
+
|
14
|
+
### Version 0.1.0 (March 3, 2016)
|
15
|
+
|
16
|
+
* Initial release
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Chronicler
|
1
|
+
# Chronicler [](https://rubygems.org/gems/chronicler) [](https://rubygems.org/gems/chronicler)
|
2
2
|
|
3
3
|
Version control your (development) databases using Git
|
4
4
|
|
@@ -12,19 +12,20 @@ Run the following command to install `Chronicler`:
|
|
12
12
|
|
13
13
|
Chronicler is a command-line-tool so for starters, you can print help instructions:
|
14
14
|
|
15
|
-
$ crn
|
15
|
+
$ crn help
|
16
16
|
Commands:
|
17
17
|
crn branch # List branches
|
18
18
|
crn checkout [IDENTIFIER] # Switch and load the specified branch or commit or tag (IDENTIFIER is optional)
|
19
|
-
crn commit # Commit current state of databases
|
19
|
+
crn commit # Commit current state of selected databases
|
20
20
|
crn destroy # Remove Chronicler entirely
|
21
21
|
crn help [COMMAND] # Describe available commands or one specific command
|
22
22
|
crn init [NAME] # Create a new repository (NAME defaults to current Git repository or current user)
|
23
23
|
crn list # List repositories
|
24
|
+
crn load # Load database(s) of current commit
|
24
25
|
crn log [INTERFACE] # Show commit logs (INTERFACE is optional)
|
25
26
|
crn new [BRANCH] # Create a new branch (BRANCH defaults to current Git branch)
|
26
27
|
crn open # Open current repository
|
27
|
-
crn reset
|
28
|
+
crn reset [COMMIT] # Reset current branch to specified commit
|
28
29
|
crn select # Select which databases to store
|
29
30
|
crn status # Show current status
|
30
31
|
crn tree # Print branch graph tree
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/chronicler.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path("../lib/chronicler/version", __FILE__)
|
2
3
|
|
3
4
|
Gem::Specification.new do |gem|
|
4
5
|
gem.authors = ["Paul Engel"]
|
@@ -12,7 +13,8 @@ Gem::Specification.new do |gem|
|
|
12
13
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
13
14
|
gem.name = "chronicler"
|
14
15
|
gem.require_paths = ["lib"]
|
15
|
-
gem.version =
|
16
|
+
gem.version = Chronicler::VERSION
|
17
|
+
gem.licenses = ["MIT"]
|
16
18
|
|
17
19
|
gem.add_dependency "thor"
|
18
20
|
gem.add_dependency "toml-rb"
|
data/lib/chronicler/cli.rb
CHANGED
@@ -16,17 +16,26 @@ class Chronicler
|
|
16
16
|
|
17
17
|
desc "use [NAME]", "Use existing repository (NAME is optional)"
|
18
18
|
def use(name = nil)
|
19
|
-
|
20
|
-
|
21
|
-
repositories = Chronicler.repositories - [current]
|
19
|
+
current = current_name
|
20
|
+
repositories = Chronicler.repositories - [current]
|
22
21
|
|
23
|
-
|
22
|
+
if name == current
|
23
|
+
puts "Already using Chronicler repository '#{name}'."
|
24
|
+
exit!
|
25
|
+
end
|
24
26
|
|
27
|
+
name ||= begin
|
28
|
+
no_repository_available! if repositories.empty?
|
25
29
|
postfix = " (on #{current})" if repositories.include?(current)
|
26
30
|
repositories[Ask.list("Which repository do you want to use?#{postfix}", repositories)]
|
27
31
|
end
|
28
32
|
|
29
|
-
|
33
|
+
unless repositories.include?(name)
|
34
|
+
puts "fatal: Chronicler repository '#{name}' does not exist."
|
35
|
+
exit!
|
36
|
+
end
|
37
|
+
|
38
|
+
config_use(name)
|
30
39
|
end
|
31
40
|
|
32
41
|
desc "open", "Open current repository"
|
@@ -68,13 +77,13 @@ class Chronicler
|
|
68
77
|
else
|
69
78
|
puts "Changes for commit:"
|
70
79
|
puts
|
71
|
-
|
80
|
+
changes[:added].each do |(table, checksum)|
|
72
81
|
puts " added: #{table}"
|
73
82
|
end
|
74
|
-
|
83
|
+
changes[:modified].each do |(table, checksum)|
|
75
84
|
puts " modified: #{table} (#{checksum})"
|
76
85
|
end
|
77
|
-
|
86
|
+
changes[:deleted].each do |(table, checksum)|
|
78
87
|
puts " deleted: #{table}"
|
79
88
|
end
|
80
89
|
puts
|
@@ -117,30 +126,40 @@ class Chronicler
|
|
117
126
|
end
|
118
127
|
selected = options.collect{|database| repository_databases.include?(database)}
|
119
128
|
|
120
|
-
Ask.checkbox("Which
|
129
|
+
Ask.checkbox("Which database(s) would you like to store?", options, default: selected).each_with_index do |checked, index|
|
121
130
|
databases << options[index] if checked
|
122
131
|
end
|
123
132
|
|
124
133
|
repository.select databases
|
125
134
|
end
|
126
135
|
|
127
|
-
desc "commit", "Commit current state of databases"
|
136
|
+
desc "commit", "Commit current state of selected databases"
|
128
137
|
method_options [:message, "-m"] => :string, [:tag, "-t"] => :string
|
129
138
|
def commit
|
130
139
|
if repository.new?
|
131
140
|
select
|
132
|
-
|
133
|
-
|
134
|
-
|
141
|
+
else
|
142
|
+
unless repository.dirty?
|
143
|
+
puts "Nothing to commit."
|
144
|
+
exit!
|
145
|
+
end
|
146
|
+
|
147
|
+
if (tag = options[:tag]) && !repository.git("rev-parse #{tag}", :verbose).empty?
|
148
|
+
unless Ask.confirm("Tag '#{tag}' already exists. Do you want to move the tag?")
|
149
|
+
puts "fatal: Commit aborted."
|
150
|
+
exit!
|
151
|
+
end
|
152
|
+
end
|
135
153
|
end
|
154
|
+
|
136
155
|
message = options[:message] || "Updated databases"
|
137
|
-
repository.commit message,
|
156
|
+
repository.commit message, tag
|
138
157
|
end
|
139
158
|
|
140
|
-
desc "
|
141
|
-
def
|
142
|
-
if
|
143
|
-
repository.
|
159
|
+
desc "load", "Load database(s) of current commit"
|
160
|
+
def load
|
161
|
+
if Ask.confirm("Are you sure you want to load databases from the #{repository.name.blue}:#{Git.head(repository.path)[0..7].yellow} commit? (Changes will be LOST)")
|
162
|
+
repository.load
|
144
163
|
end
|
145
164
|
end
|
146
165
|
|
@@ -159,6 +178,13 @@ class Chronicler
|
|
159
178
|
puts "Successfully loaded database#{"s" unless repository.databases.size == 1} of '#{identifier}'"
|
160
179
|
end
|
161
180
|
|
181
|
+
desc "reset [COMMIT]", "Reset current branch to specified commit"
|
182
|
+
def reset(commit)
|
183
|
+
if Ask.confirm("Are you sure you want to reset #{repository.name}:#{repository.branch} to #{commit.yellow}?")
|
184
|
+
repository.reset(commit)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
162
188
|
desc "destroy", "Remove Chronicler entirely"
|
163
189
|
def destroy
|
164
190
|
if File.exists?(Chronicler.config_path)
|
@@ -228,7 +254,7 @@ class Chronicler
|
|
228
254
|
end
|
229
255
|
|
230
256
|
def method_missing(method, *args)
|
231
|
-
raise Error, "Unrecognized command \"#{method}\". Please consult `
|
257
|
+
raise Error, "Unrecognized command \"#{method}\". Please consult `crn help`."
|
232
258
|
end
|
233
259
|
|
234
260
|
end
|
@@ -48,11 +48,15 @@ class Chronicler
|
|
48
48
|
config[:"repository.checksums"] = checksums
|
49
49
|
git "add ."
|
50
50
|
git "commit -m #{message.inspect}"
|
51
|
-
git "tag #{tag}" if tag
|
51
|
+
git "tag -f #{tag}" if tag
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
55
|
-
|
54
|
+
def load
|
55
|
+
databases.each do |database|
|
56
|
+
Dir[File.join(path, database, "*.sql.gz")].each do |gzip|
|
57
|
+
run "gunzip < #{gzip} | mysql -u root #{database}"
|
58
|
+
end
|
59
|
+
end
|
56
60
|
end
|
57
61
|
|
58
62
|
def checkout(branch)
|
@@ -60,6 +64,10 @@ class Chronicler
|
|
60
64
|
load
|
61
65
|
end
|
62
66
|
|
67
|
+
def reset(commit)
|
68
|
+
git "reset --hard #{commit}"
|
69
|
+
end
|
70
|
+
|
63
71
|
def git(command, output = :silence)
|
64
72
|
run "git #{command}", output
|
65
73
|
end
|
@@ -95,7 +103,9 @@ class Chronicler
|
|
95
103
|
modified = current.select{|table, checksum| stored.keys.include?(table) && (stored[table] != checksum)}
|
96
104
|
deleted = stored.reject{|table, checksum| current.keys.include?(table)}
|
97
105
|
|
98
|
-
|
106
|
+
Hash.new do |hash, key|
|
107
|
+
hash[key] = {}
|
108
|
+
end.tap do |changes|
|
99
109
|
changes[:added] = added if added.any?
|
100
110
|
changes[:modified] = modified if modified.any?
|
101
111
|
changes[:deleted] = deleted if deleted.any?
|
@@ -121,22 +131,21 @@ class Chronicler
|
|
121
131
|
end
|
122
132
|
|
123
133
|
def dump
|
124
|
-
|
125
|
-
unless databases.include?(File.basename(file, ".sql.gz"))
|
126
|
-
File.delete(file)
|
127
|
-
end
|
128
|
-
end
|
134
|
+
changed = changes
|
129
135
|
|
130
|
-
changed
|
131
|
-
|
132
|
-
|
133
|
-
|
136
|
+
changed[:deleted].each do |table, checksum|
|
137
|
+
File.delete File.join(path, "#{table.gsub("-", File::SEPARATOR)}.sql.gz")
|
138
|
+
end
|
139
|
+
changed[:added].merge(changed[:modified]).each do |table, checksum|
|
140
|
+
database, table = table.split("-")
|
141
|
+
FileUtils.mkdir_p File.join(path, database)
|
142
|
+
run "mysqldump -u root #{database} #{table} | gzip -c | cat > #{File.join(database, table)}.sql.gz", true
|
134
143
|
end
|
135
|
-
end
|
136
144
|
|
137
|
-
|
138
|
-
|
139
|
-
|
145
|
+
Dir[File.join(path, "*")].each do |file|
|
146
|
+
if File.directory?(file) && Dir["#{File.join(file, "*.sql.gz")}"].empty?
|
147
|
+
FileUtils.rm_rf file
|
148
|
+
end
|
140
149
|
end
|
141
150
|
end
|
142
151
|
|
data/lib/chronicler.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chronicler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Engel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -75,6 +75,7 @@ extensions: []
|
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
77
|
- ".gitignore"
|
78
|
+
- CHANGELOG.md
|
78
79
|
- Gemfile
|
79
80
|
- MIT-LICENSE
|
80
81
|
- README.md
|
@@ -89,8 +90,10 @@ files:
|
|
89
90
|
- lib/chronicler/core_ext/string.rb
|
90
91
|
- lib/chronicler/git.rb
|
91
92
|
- lib/chronicler/repository.rb
|
93
|
+
- lib/chronicler/version.rb
|
92
94
|
homepage: https://github.com/archan937/chronicler
|
93
|
-
licenses:
|
95
|
+
licenses:
|
96
|
+
- MIT
|
94
97
|
metadata: {}
|
95
98
|
post_install_message:
|
96
99
|
rdoc_options: []
|