prick 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/TODO +7 -0
- data/exe/prick +95 -33
- data/lib/ext/fileutils.rb +7 -0
- data/lib/prick.rb +5 -3
- data/lib/prick/builder.rb +31 -8
- data/lib/prick/cache.rb +34 -0
- data/lib/prick/constants.rb +106 -54
- data/lib/prick/database.rb +26 -18
- data/lib/prick/diff.rb +103 -25
- data/lib/prick/git.rb +31 -9
- data/lib/prick/head.rb +183 -0
- data/lib/prick/migration.rb +41 -181
- data/lib/prick/program.rb +199 -0
- data/lib/prick/project.rb +277 -0
- data/lib/prick/rdbms.rb +2 -1
- data/lib/prick/schema.rb +5 -10
- data/lib/prick/state.rb +129 -74
- data/lib/prick/version.rb +41 -28
- data/share/diff/diff.after-tables.sql +4 -0
- data/share/diff/diff.before-tables.sql +4 -0
- data/share/diff/diff.tables.sql +8 -0
- data/share/migration/diff.tables.sql +8 -0
- data/share/{release_migration → migration}/features.yml +0 -0
- data/share/migration/migrate.sql +3 -0
- data/share/{release_migration → migration}/migrate.yml +3 -0
- data/share/migration/tables.sql +3 -0
- data/share/{schemas → schema/schema}/build.yml +0 -0
- data/share/{schemas → schema/schema}/prick/build.yml +0 -0
- data/share/schema/schema/prick/data.sql +7 -0
- data/share/{schemas → schema/schema}/prick/schema.sql +0 -0
- data/share/{schemas → schema/schema}/prick/tables.sql +2 -2
- data/share/{schemas → schema/schema}/public/.keep +0 -0
- data/share/{schemas → schema/schema}/public/build.yml +0 -0
- data/share/{schemas → schema/schema}/public/schema.sql +0 -0
- data/test_refactor +34 -0
- metadata +22 -20
- data/file +0 -0
- data/lib/prick/build.rb +0 -376
- data/lib/prick/migra.rb +0 -22
- data/share/feature_migration/diff.sql +0 -2
- data/share/feature_migration/migrate.sql +0 -2
- data/share/release_migration/diff.sql +0 -3
- data/share/release_migration/migrate.sql +0 -5
- data/share/schemas/prick/data.sql +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67c64dcd2eb2d716544b81a7b17f15c8b42af6b863821f411596fac4b6868edd
|
4
|
+
data.tar.gz: 178c2bd8cd8617fb4a10d6e1f76f15a601bb1341a2c64456a5c83ecc9eeff629
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31fd38814ff54a3b535cabe371f1578abfcd025e749e9a9b1d18cdd454f7c74e5797b9166c4429f1bbda5ece50432bc0ace27d07a97e25591d1bae9648bb4b63
|
7
|
+
data.tar.gz: 8c9bf98db283cb79a11edd4016339c74c84fc02517b9872b476e776ecf21e91ecde490e87689a8ae1a041ecd25836f92d5d145ac6e2452824480a8a9db5c65c5
|
data/.gitignore
CHANGED
data/TODO
CHANGED
@@ -1,3 +1,10 @@
|
|
1
1
|
|
2
|
+
o Check for commits to tags
|
3
|
+
o Accumulate version history in prick.versions instead of just having the newest
|
4
|
+
o Using rc's in migration syntax: fork-version-fork-version.rc1 ?
|
2
5
|
o Make it possible to execute prick in any subdirecty instead of only in the root
|
6
|
+
o Hack migra to create separate file(s) for table changes
|
7
|
+
o Also execute subject/ directory if only a subject.sql is found. subject.yml
|
8
|
+
should still override everything
|
9
|
+
o Track included files - this will make dependency checks much easier
|
3
10
|
|
data/exe/prick
CHANGED
@@ -24,12 +24,20 @@ SPEC = %(
|
|
24
24
|
init! u,user=USER
|
25
25
|
|
26
26
|
info!
|
27
|
-
list!
|
27
|
+
list!
|
28
|
+
list.releases! m,migrations c,cancelled
|
29
|
+
list.migrations!
|
30
|
+
list.upgrades! a,all
|
31
|
+
list.cache!
|
28
32
|
|
29
33
|
build! d,database=DATABASE C,nocache
|
30
|
-
make!
|
34
|
+
make! d,database=DATABASE C,nocache
|
35
|
+
make.clean! a,all
|
31
36
|
load! d,database=DATABASE
|
32
|
-
save!
|
37
|
+
save!
|
38
|
+
drop! a,all
|
39
|
+
|
40
|
+
diff! m,mark t,tables T,notables
|
33
41
|
migrate!
|
34
42
|
|
35
43
|
prepare! prepare.release! prepare.migration! prepare.schema! prepare.diff!
|
@@ -39,6 +47,7 @@ SPEC = %(
|
|
39
47
|
create! create.release! create.prerelease! create.feature!
|
40
48
|
cancel! cancel.release!
|
41
49
|
|
50
|
+
generate! generate.migration! generate.schema!
|
42
51
|
upgrade!
|
43
52
|
backup!
|
44
53
|
restore!
|
@@ -72,7 +81,7 @@ HELP = %(
|
|
72
81
|
|
73
82
|
COMMANDS
|
74
83
|
INITIALIZATION
|
75
|
-
init
|
84
|
+
init --user=USER [DIR]
|
76
85
|
Initialize a project in the given directory. DIR defaults to the
|
77
86
|
current directory. The USER is the postgres user, it defaults to
|
78
87
|
the project name
|
@@ -86,32 +95,45 @@ HELP = %(
|
|
86
95
|
List releases/migrations/upgrades
|
87
96
|
|
88
97
|
BUILDING
|
89
|
-
build -d
|
90
|
-
|
91
|
-
With
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
make
|
96
|
-
|
98
|
+
build -d DATABASE -C --nocache [TAG]
|
99
|
+
Build the current database from the content in the schemas/ directory.
|
100
|
+
With a tag the version is built into the associated versioned database.
|
101
|
+
The result is saved to cache unless the -C option is given. The -d option
|
102
|
+
overrides the default database
|
103
|
+
|
104
|
+
make -d DATABASE -C --nocache [TAG]
|
105
|
+
Loads the current database from cache if present and build it
|
106
|
+
otherwise. With a tag, the version is built into the associated
|
107
|
+
versioned database. The -C option ignores the cache and the -d option
|
108
|
+
overrides the default database
|
109
|
+
|
110
|
+
make clean -a
|
111
|
+
Drop versioned databases and remove cached and other temporary files.
|
112
|
+
Also drop the project database if the -a option is given
|
113
|
+
|
114
|
+
load -d DATABASE VERSION|FILE
|
115
|
+
Load the cached version or the file into the associated versioned
|
116
|
+
database. It is an error if the version hasn't been cached. The
|
117
|
+
--database argument overrides the database
|
118
|
+
|
119
|
+
save VERSION [FILE]
|
120
|
+
Save the versioned database associated with version to the cache or the
|
121
|
+
given file
|
122
|
+
|
123
|
+
drop --all [DATABASE]
|
124
|
+
Drop the given database or all versioned databases. The --all option also drops the project
|
125
|
+
database
|
97
126
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
database is used. This is often used to load a specific version into the
|
103
|
-
project database ('prick load -d <project-name> <version>') or to load into
|
104
|
-
an unrelated database not controlled by prick
|
105
|
-
|
106
|
-
save -d database [file]
|
107
|
-
Save the project database to the given file. Default file name is the
|
108
|
-
username suffixed with project name, custom name, and branch
|
127
|
+
diff [FROM-DATABASE|FROM-VERSION [TO-DATABASE|TO-VERSION]]
|
128
|
+
Create a schema diff between the given databases or versions. Default
|
129
|
+
to-version is the current schema and default from-version is the base
|
130
|
+
version of this branch/tag
|
109
131
|
|
110
132
|
migrate
|
111
133
|
Not yet implemented
|
112
134
|
|
113
135
|
PREPARING RELEASES
|
114
|
-
prepare release
|
136
|
+
prepare release [FORK]
|
115
137
|
Populate the current migration directory with migration files
|
116
138
|
|
117
139
|
prepare feature NAME
|
@@ -152,6 +174,10 @@ HELP = %(
|
|
152
174
|
added a special cancel-tag to the release that makes prick ignore it
|
153
175
|
|
154
176
|
DEPLOYING RELEASES
|
177
|
+
generate migration
|
178
|
+
generate schema
|
179
|
+
Create a PostgreSQL script to migrate or create the database
|
180
|
+
|
155
181
|
upgrade
|
156
182
|
Migrate the database to match the current schema
|
157
183
|
|
@@ -208,7 +234,7 @@ begin
|
|
208
234
|
directory = args.expect(0..1)
|
209
235
|
name = opts.name || directory || File.basename(Dir.getwd)
|
210
236
|
user = opts.init.user || name
|
211
|
-
program.
|
237
|
+
program.init(name, user, directory || ".")
|
212
238
|
exit 0
|
213
239
|
end
|
214
240
|
|
@@ -218,6 +244,8 @@ begin
|
|
218
244
|
VERSION == file.read.to_s or
|
219
245
|
raise Prick::Fail, ".prick-version required prick-#{file.read} but you're using prick-#{VERSION}"
|
220
246
|
|
247
|
+
# TODO: Check for dirty detached head
|
248
|
+
|
221
249
|
# Expect a sub-command
|
222
250
|
opts.subcommand? or raise Prick::Error, "Subcomand expected"
|
223
251
|
|
@@ -230,20 +258,41 @@ begin
|
|
230
258
|
version = args.expect(0..1)
|
231
259
|
program.build(opts.build.database, version, opts.build.nocache)
|
232
260
|
|
233
|
-
when :
|
234
|
-
|
235
|
-
|
261
|
+
when :make
|
262
|
+
command = opts.make
|
263
|
+
case command.subcommand
|
264
|
+
when :clean
|
265
|
+
args.expect(0)
|
266
|
+
program.make_clean(command.clean.all)
|
267
|
+
else
|
268
|
+
version = args.expect(0..1)
|
269
|
+
program.make(opts.make.database, version, opts.make.nocache)
|
270
|
+
end
|
236
271
|
|
237
272
|
when :load
|
238
|
-
|
239
|
-
program.load(opts.load.database,
|
273
|
+
version_or_file = args.expect(1)
|
274
|
+
program.load(opts.load.database, version_or_file)
|
240
275
|
|
241
|
-
when :
|
242
|
-
|
276
|
+
when :save
|
277
|
+
version, file = args.expect(1..2)
|
278
|
+
program.save(version, file)
|
279
|
+
|
280
|
+
when :diff
|
281
|
+
mark = opts.diff.mark
|
282
|
+
tables = opts.diff.tables
|
283
|
+
no_tables = opts.diff.notables
|
284
|
+
tables.nil? && no_tables.nil? || tables ^ no_tables or
|
285
|
+
raise Error, "--tables and --no-tables options are exclusive"
|
286
|
+
select = tables ? :tables : (no_tables ? :no_tables : :all)
|
287
|
+
from, to = args.expect(0..2)
|
288
|
+
program.diff(from, to, mark, select)
|
243
289
|
|
244
290
|
when :migrate
|
245
291
|
raise NotYet
|
246
292
|
|
293
|
+
when :drop
|
294
|
+
program.drop(args.expect(0..1), opts.drop.all)
|
295
|
+
|
247
296
|
when :list
|
248
297
|
command = opts.list
|
249
298
|
case command.subcommand
|
@@ -252,6 +301,9 @@ begin
|
|
252
301
|
program.list_releases(migrations: obj.migrations?, cancelled: obj.cancelled?)
|
253
302
|
when :migrations; program.list_migrations
|
254
303
|
when :upgrades; program.list_upgrades(*args.expect(0..2).compact)
|
304
|
+
when :cache;
|
305
|
+
args.expect(0)
|
306
|
+
program.list_cache
|
255
307
|
when NilClass; raise Prick::Error, "list requires a releases|migrations|upgrades sub-command"
|
256
308
|
else
|
257
309
|
raise Prick::Internal, "Subcommand #{opts.subcommand}.#{command.subcommand} is not matched"
|
@@ -260,7 +312,7 @@ begin
|
|
260
312
|
when :prepare
|
261
313
|
cmd = opts.prepare.subcommand || :release
|
262
314
|
case cmd
|
263
|
-
when :release; args.expect(0)
|
315
|
+
when :release; program.prepare_release(args.expect(0..1))
|
264
316
|
when :feature; raise NotYet
|
265
317
|
when :migration; program.prepare_migration(args.expect(1))
|
266
318
|
when :schema; program.prepare_schema(args.expect(1))
|
@@ -300,6 +352,16 @@ begin
|
|
300
352
|
raise Prick::Internal, "Subcommand #{opts.subcommand}.#{cmd} is not matched"
|
301
353
|
end
|
302
354
|
|
355
|
+
when :generate
|
356
|
+
cmd = opts.generate.subcommand
|
357
|
+
case cmd
|
358
|
+
when :schema; program.generate_schema
|
359
|
+
when :migration; program.generate_migration
|
360
|
+
when nil; raise Prick::Error, "'genrate' subcommand require a 'schema' or 'migration' argument"
|
361
|
+
else
|
362
|
+
raise Prick::Internal, "Subcommand #{opts.subcommand}.#{cmd} is not matched"
|
363
|
+
end
|
364
|
+
|
303
365
|
when :upgrade
|
304
366
|
args.expect(0)
|
305
367
|
program.upgrade
|
data/lib/ext/fileutils.rb
CHANGED
@@ -7,6 +7,7 @@ module FileUtils
|
|
7
7
|
dir = File.dirname(file)
|
8
8
|
File.exist?(dir) or FileUtils.mkdir_p(dir)
|
9
9
|
touch(file)
|
10
|
+
file
|
10
11
|
end
|
11
12
|
|
12
13
|
def self.ln_sr(from, to)
|
@@ -16,4 +17,10 @@ module FileUtils
|
|
16
17
|
relpath = from.relative_path_from(File.dirname(to))
|
17
18
|
Dir.chdir(to_dir) { FileUtils.ln_s(relpath, File.basename(to)) }
|
18
19
|
end
|
20
|
+
|
21
|
+
def self.empty!(dir)
|
22
|
+
Dir.chdir(dir) {
|
23
|
+
FileUtils.rm_rf(Dir.children("."))
|
24
|
+
}
|
25
|
+
end
|
19
26
|
end
|
data/lib/prick.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
# 'semantic' is required here instead of in prick/version.rb to avoid having Gem depend on it
|
3
|
+
require "semantic"
|
2
4
|
|
3
5
|
# Needs to go first because it contains class-level methods that is used by other modules
|
4
6
|
require "ext/forward_method.rb"
|
5
7
|
|
6
|
-
require "prick/branch.rb"
|
7
8
|
require "prick/builder.rb"
|
8
9
|
require "prick/migration.rb"
|
10
|
+
require "prick/cache.rb"
|
9
11
|
require "prick/command.rb"
|
10
12
|
require "prick/constants.rb"
|
11
13
|
require "prick/database.rb"
|
12
14
|
require "prick/diff.rb"
|
13
15
|
require "prick/exceptions.rb"
|
14
16
|
require "prick/git.rb"
|
17
|
+
require "prick/head.rb"
|
15
18
|
require "prick/project.rb"
|
16
19
|
require "prick/rdbms.rb"
|
17
20
|
require "prick/schema.rb"
|
@@ -26,4 +29,3 @@ require "indented_io"
|
|
26
29
|
|
27
30
|
module Prick
|
28
31
|
end
|
29
|
-
|
data/lib/prick/builder.rb
CHANGED
@@ -24,14 +24,19 @@ module Prick
|
|
24
24
|
attr_reader :database
|
25
25
|
attr_reader :directory
|
26
26
|
attr_reader :default # either "build" or "migrate"
|
27
|
+
attr_reader :lines
|
27
28
|
|
28
29
|
def initialize(database, directory, default)
|
29
30
|
@database = database
|
30
31
|
@directory = directory
|
31
32
|
@default = default
|
33
|
+
@execute = true
|
34
|
+
@lines = []
|
32
35
|
end
|
33
36
|
|
34
|
-
def build(subject =
|
37
|
+
def build(subject = default, execute: true)
|
38
|
+
@execute = execute
|
39
|
+
@lines = []
|
35
40
|
# puts "Building #{subject.inspect}"
|
36
41
|
Dir.chdir(directory) {
|
37
42
|
if subject
|
@@ -40,6 +45,8 @@ module Prick
|
|
40
45
|
build_directory(".")
|
41
46
|
end
|
42
47
|
}
|
48
|
+
@lines.reject! { |l| l =~ /^\s*--/ || l =~ /^\s*$/ }
|
49
|
+
self
|
43
50
|
end
|
44
51
|
|
45
52
|
def self.yml_file(directory) raise NotThis end
|
@@ -52,13 +59,26 @@ module Prick
|
|
52
59
|
|
53
60
|
def do_sql(path)
|
54
61
|
# puts "do_sql(#{path})"
|
55
|
-
do_dir(path) { |file|
|
62
|
+
do_dir(path) { |file|
|
63
|
+
if @execute
|
64
|
+
Rdbms.exec_file(database.name, file, user: database.user)
|
65
|
+
else
|
66
|
+
@lines += IO.readlines(file).map(&:chomp)
|
67
|
+
end
|
68
|
+
}
|
56
69
|
true
|
57
70
|
end
|
58
71
|
|
59
72
|
def do_exe(path)
|
60
73
|
# puts "do_exe(#{path})"
|
61
|
-
do_dir(path) { |file|
|
74
|
+
do_dir(path) { |file|
|
75
|
+
lines = Command.command "#{file} #{database.name} #{database.user}" # FIXME Security
|
76
|
+
if @execute
|
77
|
+
Rdbms.exec_sql(database.name, lines.join("\n"), database.user)
|
78
|
+
else
|
79
|
+
@lines += lines
|
80
|
+
end
|
81
|
+
}
|
62
82
|
true
|
63
83
|
end
|
64
84
|
|
@@ -73,9 +93,9 @@ module Prick
|
|
73
93
|
def build_subject(subject)
|
74
94
|
if File.file?(subject) && File.executable?(subject)
|
75
95
|
do_exe(subject)
|
76
|
-
elsif subject.end_with?(".yml")
|
96
|
+
elsif File.file?(subject) && subject.end_with?(".yml")
|
77
97
|
do_yml(subject)
|
78
|
-
elsif subject.end_with?(".sql")
|
98
|
+
elsif File.file?(subject) && subject.end_with?(".sql")
|
79
99
|
do_sql(subject)
|
80
100
|
elsif File.exist?(yml_file = "#{subject}.yml")
|
81
101
|
do_yml(yml_file)
|
@@ -90,7 +110,7 @@ module Prick
|
|
90
110
|
|
91
111
|
def build_directory(path)
|
92
112
|
Dir.chdir(path) {
|
93
|
-
build_subject(File.join(path,
|
113
|
+
build_subject(File.join(path, @default)) || begin
|
94
114
|
if Dir["#{path}/#{default}", "#{path}/#{default}.yml", "#{path}/#{default}.sql"]
|
95
115
|
subjects = [default]
|
96
116
|
else
|
@@ -119,8 +139,10 @@ module Prick
|
|
119
139
|
super(database, directory, "build")
|
120
140
|
end
|
121
141
|
|
122
|
-
def build(subject = nil)
|
142
|
+
def build(subject = nil, execute: true)
|
123
143
|
if subject
|
144
|
+
@execute = execute
|
145
|
+
@lines = []
|
124
146
|
Dir.chdir(directory) {
|
125
147
|
if File.executable?(subject)
|
126
148
|
do_exe(subject)
|
@@ -131,8 +153,9 @@ module Prick
|
|
131
153
|
end
|
132
154
|
}
|
133
155
|
else
|
134
|
-
super()
|
156
|
+
super(execute: execute)
|
135
157
|
end
|
158
|
+
self
|
136
159
|
end
|
137
160
|
|
138
161
|
def self.yml_file(directory) File.join(directory, "build") + ".yml" end
|
data/lib/prick/cache.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
module Prick
|
3
|
+
class Cache
|
4
|
+
def initialize
|
5
|
+
end
|
6
|
+
|
7
|
+
def exist?(version)
|
8
|
+
File.exist?(file(version))
|
9
|
+
end
|
10
|
+
|
11
|
+
def list
|
12
|
+
Dir.glob(File.join(CACHE_DIR, "*.sql.gz"))
|
13
|
+
end
|
14
|
+
|
15
|
+
def load(database, version)
|
16
|
+
Rdbms.load(database, file(version))
|
17
|
+
end
|
18
|
+
|
19
|
+
def save(database, version = database.version)
|
20
|
+
Rdbms.save(database, file(version))
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns list of removed files
|
24
|
+
def clean
|
25
|
+
l = list
|
26
|
+
FileUtils.rm(l)
|
27
|
+
l
|
28
|
+
end
|
29
|
+
|
30
|
+
def file(version)
|
31
|
+
File.join(CACHE_DIR, "#{version}.sql.gz")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/prick/constants.rb
CHANGED
@@ -2,31 +2,16 @@
|
|
2
2
|
module Prick
|
3
3
|
### DIRECTORIES AND FILE NAMES
|
4
4
|
|
5
|
-
# Path to the .prick-version file
|
6
|
-
PRICK_VERSION_FILE = ".prick-version"
|
7
|
-
|
8
|
-
# State files
|
9
|
-
PROJECT_STATE_FILE = ".prick-project"
|
10
|
-
FEATURES_STATE_FILE = ".prick-features"
|
11
|
-
MIGRATION_STATE_FILE = ".prick-migration"
|
12
|
-
MIGRATIONS_FILE = "migrations.sql"
|
13
|
-
|
14
|
-
# Diff file
|
15
|
-
DIFF_FILE = "diff.sql"
|
16
|
-
|
17
5
|
# Shared files (part of the installation)
|
18
6
|
SHARE_PATH = "#{File.dirname(File.dirname(__dir__))}/share"
|
19
7
|
LIBEXEC_PATH = "#{File.dirname(File.dirname(__dir__))}/libexec"
|
20
8
|
|
21
|
-
STRIP_COMMENTS_COMMAND = File.join(LIBEXEC_PATH, "strip-comments")
|
22
|
-
|
23
9
|
# Project directories
|
24
10
|
DIRS = [
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
PUBLIC_DIR = "#{SCHEMAS_DIR}/public",
|
11
|
+
MIGRATION_DIR = "migration",
|
12
|
+
SCHEMA_DIR = "schema",
|
13
|
+
PRICK_DIR = "#{SCHEMA_DIR}/prick",
|
14
|
+
PUBLIC_DIR = "#{SCHEMA_DIR}/public",
|
30
15
|
VAR_DIR = "var",
|
31
16
|
CACHE_DIR = "#{VAR_DIR}/cache",
|
32
17
|
SPOOL_DIR = "#{VAR_DIR}/spool",
|
@@ -35,9 +20,42 @@ module Prick
|
|
35
20
|
SPEC_DIR = "spec"
|
36
21
|
]
|
37
22
|
|
38
|
-
#
|
39
|
-
|
40
|
-
|
23
|
+
# The project state file
|
24
|
+
PROJECT_STATE_FILE = ".prick-project"
|
25
|
+
PROJECT_STATE_PATH = PROJECT_STATE_FILE
|
26
|
+
|
27
|
+
# The .prick-version file
|
28
|
+
PRICK_VERSION_FILE = ".prick-version"
|
29
|
+
PRICK_VERSION_PATH = PRICK_VERSION_FILE
|
30
|
+
|
31
|
+
# The prick.versions data file. This is where the Schema saves its version
|
32
|
+
SCHEMA_VERSION_FILE = "data.sql"
|
33
|
+
SCHEMA_VERSION_PATH = File.join(PRICK_DIR, SCHEMA_VERSION_FILE)
|
34
|
+
|
35
|
+
# The the .prick-migration file
|
36
|
+
PRICK_MIGRATION_FILE = ".prick-migration"
|
37
|
+
PRICK_MIGRATION_PATH = File.join(MIGRATION_DIR, PRICK_MIGRATION_FILE)
|
38
|
+
|
39
|
+
# The the .prick-feature file
|
40
|
+
PRICK_FEATURE_FILE = ".prick-feature"
|
41
|
+
PRICK_FEATURE_PATH = File.join(MIGRATION_DIR, PRICK_FEATURE_FILE)
|
42
|
+
|
43
|
+
# The strip-comments executable
|
44
|
+
STRIP_COMMENTS_NAME = "strip-comments"
|
45
|
+
STRIP_COMMENTS_PATH = File.join(LIBEXEC_PATH, "strip-comments")
|
46
|
+
|
47
|
+
# Diff files
|
48
|
+
DIFF_FILE = "diff.sql"
|
49
|
+
BEFORE_TABLES_DIFF_NAME = "diff.before-tables.sql"
|
50
|
+
TABLES_DIFF_NAME = "diff.tables.sql"
|
51
|
+
AFTER_TABLES_DIFF_NAME = "diff.after-tables.sql"
|
52
|
+
|
53
|
+
BEFORE_TABLES_DIFF_PATH = File.join(MIGRATION_DIR, BEFORE_TABLES_DIFF_NAME)
|
54
|
+
TABLES_DIFF_PATH = File.join(MIGRATION_DIR, TABLES_DIFF_NAME)
|
55
|
+
AFTER_TABLES_DIFF_PATH = File.join(MIGRATION_DIR, AFTER_TABLES_DIFF_NAME)
|
56
|
+
|
57
|
+
TABLES_DIFF_SHARE_PATH = File.join(SHARE_PATH, "diff", TABLES_DIFF_NAME)
|
58
|
+
|
41
59
|
|
42
60
|
# Dump files
|
43
61
|
DUMP_EXT = "dump.gz"
|
@@ -46,33 +64,27 @@ module Prick
|
|
46
64
|
|
47
65
|
### REGULAR EXPRESSIONS
|
48
66
|
|
67
|
+
# Matches a system name. System names are used for objects that are external to prick
|
68
|
+
# (like usernames)
|
69
|
+
NAME_SUB_RE = /[a-z][a-z0-9_-]*/
|
70
|
+
NAME_RE = /^#{NAME_SUB_RE}$/
|
71
|
+
|
49
72
|
# Matches an identifier. Identifiers consist of lower case letters, digits
|
50
73
|
# and underscores but not dashes because they're used as separators
|
51
74
|
IDENT_SUB_RE = /[a-z][a-z0-9_]*/
|
52
75
|
IDENT_RE = /^#{IDENT_SUB_RE}$/
|
53
76
|
|
54
|
-
# Matches an uppercase identifier
|
55
|
-
# UPCASE_IDENT_SUB_RE = /[A-Z][A-Z0-9_]*/
|
56
|
-
# UPCASE_IDENT_RE = /#{UPCASE_IDENT_SUB_RE}/
|
57
|
-
|
58
|
-
# A (system) name. Names are used for projects and usernames that are
|
59
|
-
# external to prick and can include both dashes and underscores but dashes
|
60
|
-
# have to be followed by a character and not a digit so 'ident-1234' is not
|
61
|
-
# allowed but 'ident_1234' and 'ident1234' are
|
62
|
-
NAME_SUB_RE = /#{IDENT_SUB_RE}/
|
63
|
-
NAME_RE = /^#{NAME_SUB_RE}$/
|
64
|
-
|
65
77
|
# Matches a project name
|
66
|
-
PROJECT_NAME_SUB_RE =
|
67
|
-
PROJECT_NAME_RE =
|
78
|
+
PROJECT_NAME_SUB_RE = IDENT_SUB_RE
|
79
|
+
PROJECT_NAME_RE = IDENT_RE
|
68
80
|
|
69
81
|
# Matches a custom name
|
70
|
-
CUSTOM_NAME_SUB_RE =
|
71
|
-
CUSTOM_NAME_RE =
|
82
|
+
CUSTOM_NAME_SUB_RE = IDENT_SUB_RE
|
83
|
+
CUSTOM_NAME_RE = IDENT_RE
|
72
84
|
|
73
85
|
# Matches a feature name
|
74
|
-
FEATURE_NAME_SUB_RE =
|
75
|
-
FEATURE_NAME_RE =
|
86
|
+
FEATURE_NAME_SUB_RE = /(?!initial)#{IDENT_SUB_RE}/
|
87
|
+
FEATURE_NAME_RE = /^#{FEATURE_NAME_SUB_RE}$/
|
76
88
|
|
77
89
|
# Matches a postgres user name
|
78
90
|
USER_NAME_SUB_RE = NAME_SUB_RE
|
@@ -103,15 +115,48 @@ module Prick
|
|
103
115
|
SEMVER_SUB_RE = /#{MMP_SEMVER_SUB_RE}(?:-#{PRE_SEMVER_SUB_RE})?/
|
104
116
|
SEMVER_RE = /^#{SEMVER_SUB_RE}$/
|
105
117
|
|
106
|
-
#
|
118
|
+
# Tag RE. The general syntax for a tag is '<custom>-v<version>_<feature>'
|
119
|
+
#
|
120
|
+
# The RE defines the following captures:
|
121
|
+
# $1 - custom name, can be nil
|
122
|
+
# $2 - semantic version
|
123
|
+
# $3 - feature name, can be nil
|
124
|
+
#
|
125
|
+
TAG_SUB_RE = /
|
126
|
+
(?:(#{CUSTOM_NAME_SUB_RE})-)?
|
127
|
+
v
|
128
|
+
(#{SEMVER_SUB_RE})
|
129
|
+
(?:_(#{FEATURE_NAME_SUB_RE}))?
|
130
|
+
/x
|
131
|
+
TAG_RE = /^#{TAG_SUB_RE}$/
|
132
|
+
|
133
|
+
# TODO: Handle initial branches (0.0.0-initial)
|
134
|
+
|
135
|
+
# Branch RE. The general syntax for a branch is '<custom>-<version>_<feature>'
|
107
136
|
#
|
108
137
|
# The RE defines the following captures:
|
109
138
|
# $1 - custom name, can be nil
|
110
139
|
# $2 - semantic version
|
111
140
|
# $3 - feature name, can be nil
|
112
141
|
#
|
142
|
+
BRANCH_SUB_RE = /
|
143
|
+
(?:(#{CUSTOM_NAME_SUB_RE})-)?
|
144
|
+
(#{SEMVER_SUB_RE})
|
145
|
+
(?:_(#{FEATURE_NAME_SUB_RE}))?
|
146
|
+
/x
|
147
|
+
BRANCH_RE = /^#{BRANCH_SUB_RE}$/
|
148
|
+
|
149
|
+
# Tag or branch RE. The general syntax for a branch is '<custom>-v?<version>_<feature>'
|
150
|
+
#
|
151
|
+
# The RE defines the following captures:
|
152
|
+
# $1 - custom name, can be nil
|
153
|
+
# $2 - tag, nil or 'v'
|
154
|
+
# $3 - semantic version
|
155
|
+
# $4 - feature name, can be nil
|
156
|
+
#
|
113
157
|
VERSION_SUB_RE = /
|
114
158
|
(?:(#{CUSTOM_NAME_SUB_RE})-)?
|
159
|
+
(v)?
|
115
160
|
(#{SEMVER_SUB_RE})
|
116
161
|
(?:_(#{FEATURE_NAME_SUB_RE}))?
|
117
162
|
/x
|
@@ -135,11 +180,11 @@ module Prick
|
|
135
180
|
# $1 - custom name, can be nil
|
136
181
|
# $2 - semantic version
|
137
182
|
#
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
183
|
+
# RELEASE_SUB_RE = /
|
184
|
+
# (?:(#{CUSTOM_NAME_SUB_RE})-)?
|
185
|
+
# (#{MMP_SEMVER_SUB_RE})
|
186
|
+
# /x
|
187
|
+
# RELEASE_RE = /^#{RELEASE_SUB_RE}$/
|
143
188
|
|
144
189
|
# Matches a prerelease branch
|
145
190
|
#
|
@@ -147,11 +192,11 @@ module Prick
|
|
147
192
|
# $1 - custom name, can be nil
|
148
193
|
# $2 - semantic version
|
149
194
|
#
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
195
|
+
# PRERELEASE_SUB_RE = /
|
196
|
+
# (?:(#{CUSTOM_NAME_SUB_RE})-)?
|
197
|
+
# (#{MMP_SEMVER_SUB_RE}-#{PRE_SEMVER_SUB_RE})
|
198
|
+
# /x
|
199
|
+
# PRERELEASE_RE = /^#{PRERELEASE_SUB_RE}$/
|
155
200
|
|
156
201
|
# Matches a feature branch
|
157
202
|
#
|
@@ -160,8 +205,8 @@ module Prick
|
|
160
205
|
# $2 - semantic version
|
161
206
|
# $3 - feature name
|
162
207
|
#
|
163
|
-
|
164
|
-
|
208
|
+
# FEATURE_SUB_RE = /#{ABSTRACT_RELEASE_SUB_RE}_(#{FEATURE_NAME_SUB_RE})/
|
209
|
+
# FEATURE_RE = /^#{FEATURE_SUB_RE}$/
|
165
210
|
|
166
211
|
# Migration RE. The syntax is <version>_<version>
|
167
212
|
#
|
@@ -173,8 +218,8 @@ module Prick
|
|
173
218
|
# $5 - to custom name, can be nil
|
174
219
|
# $6 - to semantic version
|
175
220
|
#
|
176
|
-
|
177
|
-
|
221
|
+
# MIGRATION_SUB_RE = /(#{RELEASE_SUB_RE})_(#{RELEASE_SUB_RE})/
|
222
|
+
# MIGRATION_RE = /^#{MIGRATION_SUB_RE}$/
|
178
223
|
|
179
224
|
# Project release RE. The general syntax is '<project>-<custom>-<version>'
|
180
225
|
#
|
@@ -217,5 +262,12 @@ module Prick
|
|
217
262
|
ALL_DATABASES_RE = /^#{ALL_DATABASES_SUB_RE}$/
|
218
263
|
def self.all_databases_sub_re(project_name) /(#{project_name})(?:-(#{ABSTRACT_RELEASE_SUB_RE}))?/ end
|
219
264
|
def self.all_databases_re(project_name) /^#{all_databases_sub_re(project_name)}$/ end
|
265
|
+
|
266
|
+
# Matches temporary databases. Mostly useful when debugging because temporary databases
|
267
|
+
# should be deleted on exit
|
268
|
+
TMP_DATABASES_SUB_RE = /#{PROJECT_NAME_SUB_RE}-(?:base|next)/
|
269
|
+
TMP_DATABASES_RE = /^#{TMP_DATABASES_SUB_RE}$/
|
270
|
+
def self.tmp_databases_sub_re(project_name) /#{project_name}-(?:base|next)/ end
|
271
|
+
def self.tmp_databases_re(project_name) /^#{tmp_databases_sub_re(project_name)}$/ end
|
220
272
|
end
|
221
273
|
|