prick 0.29.1 → 0.30.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/TODO +2 -0
- data/exe/prick +290 -518
- data/lib/prick/builder/batch.rb +0 -3
- data/lib/prick/builder/builder.rb +19 -13
- data/lib/prick/builder/node.rb +3 -2
- data/lib/prick/builder/node_pool.rb +3 -1
- data/lib/prick/builder/parser.rb +2 -1
- data/lib/prick/constants.rb +12 -12
- data/lib/prick/diff.rb +2 -2
- data/lib/prick/environment.rb +23 -10
- data/lib/prick/local/command.rb +8 -2
- data/lib/prick/local/fmt.rb +56 -0
- data/lib/prick/prick_version.rb +1 -1
- data/lib/prick/share/init/{.gitignore → dot.gitignore} +1 -1
- data/lib/prick/share/init/prick.environment.yml +16 -0
- data/lib/prick/share/init/prick.yml +3 -3
- data/lib/prick/share/init/schema/prick/build.yml +11 -2
- data/lib/prick/share/init/schema/prick/tables.sql +30 -9
- data/lib/prick/share/init/schema/prick/views.sql +6 -0
- data/lib/prick/state.rb +297 -95
- data/lib/prick/subcommand/prick-build.rb +27 -21
- data/lib/prick/subcommand/prick-clean.rb +6 -6
- data/lib/prick/subcommand/prick-create.rb +41 -6
- data/lib/prick/subcommand/prick-drop.rb +58 -15
- data/lib/prick/subcommand/prick-fox.rb +2 -2
- data/lib/prick/subcommand/prick-init.rb +25 -18
- data/lib/prick/subcommand/prick-list.rb +99 -0
- data/lib/prick/subcommand/prick-make.rb +9 -9
- data/lib/prick/subcommand/prick-migrate.rb +8 -7
- data/lib/prick/subcommand/prick-release.rb +4 -2
- data/lib/prick/subcommand/prick-set.rb +52 -0
- data/lib/prick/subcommand/prick-setup.rb +4 -14
- data/lib/prick/subcommand/prick-teardown.rb +14 -10
- data/lib/prick/subcommand/subcommand.rb +12 -0
- data/lib/prick/version.rb +1 -1
- data/lib/prick.rb +54 -15
- metadata +9 -5
- data/lib/prick/share/init/schema/prick/data.sql +0 -6
- data/prick.environments.yml +0 -14
@@ -1,30 +1,73 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../builder/builder.rb'
|
4
4
|
|
5
5
|
module Prick::SubCommand
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
# Drop database owner
|
7
|
+
def self.drop_owner(username)
|
8
|
+
# No database at this point so no session is running and no cascade. A nop
|
9
|
+
# if the user is the current user or owns objects in other databases
|
10
|
+
if username != ENV['USER']
|
11
|
+
super_conn.role.drop(username, fail: false, silent: true)
|
12
|
+
end
|
10
13
|
end
|
11
14
|
|
12
|
-
# Drop all users associated with the given database except the owner
|
15
|
+
# Drop all users associated with the given database except the owner. We
|
16
|
+
# assume that users can only be connected to the project database and that
|
17
|
+
# they don't own objects in other databases
|
13
18
|
def self.drop_users(database)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
19
|
+
constrain database, String
|
20
|
+
conn = super_conn
|
21
|
+
if conn.rdbms.exist? database
|
22
|
+
users = conn.role.list(database: database).reject { _1 == conn.rdbms.owner(database) }
|
23
|
+
conn.session.terminate(database, users)
|
24
|
+
if conn.rdbms.exist?(database)
|
25
|
+
# Connect to database to make cascade work. Run in a block to close connection afterwards
|
26
|
+
PgConn.new(database) { |conn| conn.role.drop(users, cascade: true) }
|
27
|
+
else
|
28
|
+
conn.rdbms.role.drop(users)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
# We don't terminate sessions because we assume one-database-users
|
32
|
+
conn.role.drop(users, cascade: true) # Fails if the users owns objects in other databases
|
33
|
+
end
|
18
34
|
end
|
19
35
|
|
36
|
+
# Drop a database
|
20
37
|
def self.drop_database(database)
|
21
|
-
|
38
|
+
State.connection.session.terminate(database, nil)
|
39
|
+
State.connection { |conn| conn.rdbms.drop database }
|
22
40
|
end
|
23
41
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
42
|
+
# Empty the database
|
43
|
+
def self.drop_schema(database, schemas = [])
|
44
|
+
constrain database, String
|
45
|
+
constrain schemas, [String]
|
46
|
+
if schemas.empty?
|
47
|
+
State.connection { |conn| conn.rdbms.empty!(database) }
|
48
|
+
else
|
49
|
+
Prick.state.connection { |conn|
|
50
|
+
schemas.each { |schema| conn.schema.drop(schema, cascade: true) }
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Drop database and its users including the owner if possible and not the
|
56
|
+
# current user
|
57
|
+
def self.drop_all(database, username = nil)
|
58
|
+
constrain database, String
|
59
|
+
State.connection { |conn|
|
60
|
+
if username.nil? && conn.rdbms.exist?(database)
|
61
|
+
owner = State.connection.rdbms.owner(database)
|
62
|
+
else
|
63
|
+
owner = username || database
|
64
|
+
end
|
65
|
+
if conn.rdbms.exist? database
|
66
|
+
drop_users(database)
|
67
|
+
drop_database(database)
|
68
|
+
end
|
69
|
+
drop_owner(owner) if owner != ENV['USER']
|
70
|
+
}
|
28
71
|
end
|
29
72
|
end
|
30
73
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../builder/builder.rb'
|
4
4
|
|
5
5
|
module Prick::SubCommand
|
6
6
|
def self.fox(database, username, files)
|
@@ -37,7 +37,7 @@ __END__
|
|
37
37
|
when :batches; builder.dump
|
38
38
|
when nil;
|
39
39
|
else
|
40
|
-
|
40
|
+
Prick.error "Illegal dump type: #{dump.inspect}"
|
41
41
|
end && exit
|
42
42
|
|
43
43
|
time "Execute build object" do
|
@@ -1,46 +1,53 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
|
3
3
|
module Prick::SubCommand
|
4
|
-
def self.init(dir, name, title,
|
4
|
+
def self.init(project_file, dir, name, title) # dir, name, and title can be nil
|
5
|
+
cwd = Dir.getwd
|
5
6
|
if dir
|
6
|
-
!File.exist?(dir) or
|
7
|
+
!File.exist?(dir) or Prick.error "Directory #{dir} exists"
|
7
8
|
FileUtils.mkdir_p(dir)
|
8
9
|
Dir.chdir(dir)
|
9
10
|
else
|
10
11
|
dir = "."
|
11
12
|
end
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
username ||= name
|
13
|
+
dirname = File.basename(Dir.getwd)
|
14
|
+
name ||= dirname
|
15
|
+
title ||= name.gsub(/[_-]/, " ").capitalize
|
16
16
|
|
17
|
+
# Note that the initial project file is invalid and is removed again after
|
18
|
+
# the initial commit
|
17
19
|
Command.command %(
|
18
20
|
git init .
|
19
|
-
|
21
|
+
dir=#{SHARE_PATH}/init
|
22
|
+
for path in $dir/*; do
|
23
|
+
source_file=$(basename $path)
|
24
|
+
dest_file=$(sed 's/^dot\././' <<<$source_file)
|
25
|
+
cp -a $dir/$source_file $dest_file
|
26
|
+
done
|
20
27
|
git add .
|
21
28
|
git commit -am "Initial import"
|
29
|
+
rm -f #{project_file}
|
22
30
|
), fail: false
|
31
|
+
Command.status == 0 or Prick.failure "Failed creating initial import"
|
23
32
|
|
24
|
-
|
25
|
-
|
26
|
-
state = State.new
|
33
|
+
# Write (valid) configuration file
|
34
|
+
state = State.new(project_file, nil, nil)
|
27
35
|
state.name = name
|
28
36
|
state.title = title
|
29
37
|
state.prick_version = PrickVersion.new VERSION
|
30
38
|
state.version = PrickVersion.new("0.0.0")
|
31
|
-
state.
|
32
|
-
state.database = database
|
33
|
-
state.username = username
|
34
|
-
state.save
|
39
|
+
state.save_project
|
35
40
|
|
41
|
+
# Commit configuration file and create initial release
|
36
42
|
Command.command %(
|
37
43
|
set -e
|
44
|
+
git add #{project_file}
|
38
45
|
git commit -am "Release 0.0.0"
|
39
|
-
git tag v0.0.0
|
46
|
+
git tag --message "Initial Release" v0.0.0
|
40
47
|
), fail: false
|
48
|
+
Command.status == 0 or Prick.failure "Failed creating initial release"
|
41
49
|
|
42
|
-
|
43
|
-
|
44
|
-
[dir, state]
|
50
|
+
Dir.chdir(cwd)
|
51
|
+
[dir, name]
|
45
52
|
end
|
46
53
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Prick::SubCommand
|
2
|
+
def self.list_environments(format: :long)
|
3
|
+
environments = Environment.environments.select { |env| env.comment }
|
4
|
+
if format == :short
|
5
|
+
puts environments.map(&:name)
|
6
|
+
else
|
7
|
+
headers = %w(Environment Description)
|
8
|
+
rows = environments.map { |env| [env.name, env.comment] }
|
9
|
+
Fmt.puts_table(headers, rows)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.list_variables(format: :long, all: false)
|
14
|
+
if format == :short
|
15
|
+
puts Prick.state.bash_environment.keys
|
16
|
+
else
|
17
|
+
headers = %w(variable value)
|
18
|
+
vars = Prick.state.bash_environment(all: all).reject { |k,v| k == "PATH" }
|
19
|
+
rows = vars.map { |k,v| [k, Array(v).flatten.join(" ")] }
|
20
|
+
Fmt.puts_table(headers, rows)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.list_databases(format: :long)
|
25
|
+
constrain format, :long, :short
|
26
|
+
conn = State.connection
|
27
|
+
# databases = conn.values "select datname from pg_database where datistemplate = false order by datname;"
|
28
|
+
|
29
|
+
if format == :short
|
30
|
+
puts Prick.databases
|
31
|
+
else
|
32
|
+
fs_time = `find . -type f -not -path '*/\.*' -printf '%TF %TT\n' | sort -r | head -n 1`
|
33
|
+
git_branch = Git.branch.current
|
34
|
+
git_rev = Git.id[0...8]
|
35
|
+
|
36
|
+
rows = []
|
37
|
+
Prick.databases { |database, conn|
|
38
|
+
row = conn.record(%(
|
39
|
+
select
|
40
|
+
'#{database}' as "database", name, version, branch, rev, clean, environment,
|
41
|
+
to_char(
|
42
|
+
built_at at time zone 'UTC' at time zone current_setting('TimeZone'),
|
43
|
+
'YYYY-MM-DD HH24:MI') as "built_at",
|
44
|
+
success
|
45
|
+
from prick.versions
|
46
|
+
))
|
47
|
+
|
48
|
+
if row[:success]
|
49
|
+
clean = row[:clean]
|
50
|
+
same_revision = row[:branch] == git_branch && row[:rev] == git_rev
|
51
|
+
up2date = fs_time <= row[:built_at]
|
52
|
+
row[:state] =
|
53
|
+
case [clean, same_revision, up2date]
|
54
|
+
in [true, true, true]; "clean" # Clean repo
|
55
|
+
in [true, true, false]; "dirty" # Clean repo but doesn't include latest changes
|
56
|
+
in [true, false, _]; "detached" # Clean repo but different revision
|
57
|
+
|
58
|
+
in [false, true, true]; "ok" # Dirty repo
|
59
|
+
in [false, true, false]; "dirty" # Dirty repo, but doesn't include latest changes
|
60
|
+
in [false, false, _]; "stale" # Dirty repo, no way back
|
61
|
+
end
|
62
|
+
else
|
63
|
+
row[:state] = "-"
|
64
|
+
end
|
65
|
+
|
66
|
+
last_column = (Prick.state.database == database ? "*" : "")
|
67
|
+
rows << row.values + [last_column]
|
68
|
+
}
|
69
|
+
|
70
|
+
headers = %w(database project version branch rev clean environment built success state) + [" "]
|
71
|
+
Fmt.puts_table(headers, rows)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.list_users
|
76
|
+
puts State.connection.role.list(database: Prick.state.database)
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.list_owners(format: :long)
|
80
|
+
owners = {}
|
81
|
+
Prick.databases.each { |database|
|
82
|
+
# owner = super_conn.rdbms.exist?(d) ? super_conn.rdbms.owner(d) : d
|
83
|
+
owner = super_conn.rdbms.owner(database)
|
84
|
+
(owners[owner] ||= []) << database
|
85
|
+
}
|
86
|
+
if format == :short
|
87
|
+
puts owners.keys
|
88
|
+
else
|
89
|
+
headers = %w(username databases) + [" "]
|
90
|
+
rows = owners.map { |owner, databases|
|
91
|
+
current_user_mark = (Prick.state.username == owner ? '*' : "")
|
92
|
+
[owner, databases.join(","), current_user_mark]
|
93
|
+
}
|
94
|
+
Fmt.puts_table(headers, rows)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
@@ -1,28 +1,28 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../builder/builder.rb'
|
4
4
|
|
5
5
|
module Prick::SubCommand
|
6
6
|
def self.make(database, username, schema, timer: nil, dump: nil)
|
7
7
|
Timer.on! if timer
|
8
8
|
time "Prick::Command#make" do
|
9
9
|
begin
|
10
|
-
super_conn =
|
10
|
+
super_conn = State.connection
|
11
11
|
conn = nil
|
12
12
|
builder = nil
|
13
|
-
|
13
|
+
last_built_at = EPOCH
|
14
14
|
clean = false
|
15
15
|
create_schemas = []
|
16
16
|
|
17
17
|
time "Load build object" do
|
18
18
|
if super_conn.rdbms.exist? database
|
19
|
-
conn =
|
20
|
-
if conn.schema.
|
21
|
-
|
19
|
+
conn = Prick.state.connection
|
20
|
+
if conn.schema.exist_relation?("prick", "versions") && !conn.empty?("prick.versions")
|
21
|
+
last_built_at = conn.value("select built_at from prick.versions")
|
22
22
|
end
|
23
23
|
else
|
24
24
|
super_conn.rdbms.create database, owner: username
|
25
|
-
conn =
|
25
|
+
conn = Prick.state.connection
|
26
26
|
clean = true
|
27
27
|
end
|
28
28
|
|
@@ -43,7 +43,7 @@ module Prick::SubCommand
|
|
43
43
|
after_schemas.each { |delete_schema| builder.pool.delete_schema(delete_schema) }
|
44
44
|
end
|
45
45
|
|
46
|
-
touched_nodes = builder.nodes.select { |node| File.mtime(node.path) >
|
46
|
+
touched_nodes = builder.nodes.select { |node| File.mtime(node.path) > last_built_at }
|
47
47
|
touched_phases = touched_nodes.map(&:phase).uniq.compact
|
48
48
|
touched_kinds = touched_nodes.map(&:kind).uniq.compact
|
49
49
|
touched_schema = touched_nodes.first&.schema
|
@@ -74,7 +74,7 @@ module Prick::SubCommand
|
|
74
74
|
when :batches; builder.dump
|
75
75
|
when nil;
|
76
76
|
else
|
77
|
-
|
77
|
+
Prick.error "Illegal dump type: #{dump.inspect}"
|
78
78
|
end
|
79
79
|
exit if dump
|
80
80
|
|
@@ -3,12 +3,13 @@ module Prick
|
|
3
3
|
module SubCommand
|
4
4
|
# def self.migrate(database, username, file) TODO
|
5
5
|
def self.migrate(database, username, file: nil)
|
6
|
-
|
6
|
+
conn = Prick.state.connection
|
7
|
+
# PgConn.new(database, username) { |conn|
|
7
8
|
conn.schema.exist_relation? "prick", "versions" or
|
8
|
-
|
9
|
+
Prick.failure "Can't read version from database"
|
9
10
|
|
10
11
|
from_version = PrickVersion.new(conn.value "select version from prick.versions") or
|
11
|
-
|
12
|
+
Prick.failure "Illegal version in table prick.versions"
|
12
13
|
|
13
14
|
if file
|
14
15
|
conn.transaction {
|
@@ -16,12 +17,12 @@ module Prick
|
|
16
17
|
}
|
17
18
|
else
|
18
19
|
to_version = Prick.state.version
|
19
|
-
from_version != to_version or
|
20
|
-
from_version < to_version or
|
20
|
+
from_version != to_version or Prick.failure "Already up to date"
|
21
|
+
from_version < to_version or Prick.failure "Can't migrate backwards"
|
21
22
|
|
22
23
|
migration_dir = "#{MIGRATION_DIR}/#{from_version}"
|
23
24
|
File.directory? migration_dir or
|
24
|
-
|
25
|
+
Prick.failure "Can't migrate from #{from_version} to #{to_version}"
|
25
26
|
|
26
27
|
puts "Migrating from #{from_version} to #{to_version}"
|
27
28
|
|
@@ -31,7 +32,7 @@ module Prick
|
|
31
32
|
conn.exec File.read(SCHEMA_VERSION_PATH)
|
32
33
|
}
|
33
34
|
end
|
34
|
-
|
35
|
+
# }
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -8,15 +8,17 @@ module Prick
|
|
8
8
|
Git.synchronized? or raise "Won't release: Repository is not synchronized with origin"
|
9
9
|
|
10
10
|
version = Prick.state.version.increment!(kind).to_s
|
11
|
-
Prick.state.
|
11
|
+
Prick.state.save_project
|
12
12
|
|
13
|
-
Git.add(Prick.state.
|
13
|
+
Git.add(Prick.state.project_file)
|
14
14
|
Git.add(Prick.state.schema_file)
|
15
15
|
Git.commit "Release #{version}"
|
16
16
|
Git.tag.create "v#{version}"
|
17
17
|
Git.branch.create version
|
18
18
|
Git.push
|
19
19
|
|
20
|
+
# TODO TODO TODO
|
21
|
+
|
20
22
|
puts version
|
21
23
|
end
|
22
24
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'time' # For Time#parse
|
2
|
+
|
3
|
+
module Prick::SubCommand
|
4
|
+
def self.set(variable, value = nil, arg = nil)
|
5
|
+
case variable
|
6
|
+
when "database"; set_database(value, arg)
|
7
|
+
when "environment"; set_environment(value)
|
8
|
+
when "duration"; set_duration(value)
|
9
|
+
else
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.set_environment(environment)
|
16
|
+
if environment
|
17
|
+
Prick.state.environment = environment
|
18
|
+
Prick.state.save_state
|
19
|
+
else
|
20
|
+
puts Prick.state.environment
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# If the environment is nil, it is initialized from the database on next build
|
25
|
+
def self.set_database(database, environment = nil)
|
26
|
+
if database
|
27
|
+
conn = State.connection
|
28
|
+
conn.rdbms.exist? database or Prick.error "Database '#{database}' does not exist"
|
29
|
+
username = conn.rdbms.owner database
|
30
|
+
|
31
|
+
Prick.state.database = database
|
32
|
+
Prick.state.username = username
|
33
|
+
|
34
|
+
if environment.nil?
|
35
|
+
Prick.state.connection # Implicitly initialize database enviroment if present
|
36
|
+
environment = Prick.state.database_environment # or Prick.error "Can't find environment"
|
37
|
+
end
|
38
|
+
Prick.state.environment = environment
|
39
|
+
Prick.state.save_state
|
40
|
+
else
|
41
|
+
puts Prick.state.database
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.set_duration(make_start)
|
46
|
+
conn = Prick.state.connection
|
47
|
+
built_at = conn.value "select built_at from prick.versions"
|
48
|
+
duration = Time.now - Time.iso8601(make_start)
|
49
|
+
conn.exec "update prick.versions set make_duration = #{duration}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -1,20 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../builder/builder.rb'
|
4
4
|
|
5
5
|
module Prick::SubCommand
|
6
|
-
def self.setup(database, username)
|
7
|
-
|
8
|
-
|
9
|
-
# FIXME Should not be created as superuser but we can't do that before we
|
10
|
-
# have a super: option in build
|
11
|
-
conn.role.create username, superuser: true, can_login: true, create_role: true
|
12
|
-
end
|
13
|
-
if !conn.rdbms.exist? database
|
14
|
-
conn.rdbms.create database, owner: username
|
15
|
-
end
|
16
|
-
builder = Prick::Build::Builder.new(conn, "schema")
|
17
|
-
# TODO Run builder setup scrips
|
6
|
+
def self.setup(database, username, environment)
|
7
|
+
create_database(database, username, environment)
|
8
|
+
set_database(database, environment)
|
18
9
|
end
|
19
10
|
end
|
20
|
-
|
@@ -1,19 +1,23 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../builder/builder.rb'
|
4
4
|
|
5
5
|
module Prick::SubCommand
|
6
|
-
def self.teardown(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
def self.teardown(*databases, remove_state_file: false)
|
7
|
+
databases = Array(databases).flatten
|
8
|
+
owners = databases.map { |d|
|
9
|
+
super_conn.rdbms.exist?(d) ? super_conn.rdbms.owner(d) : d
|
10
|
+
}.uniq
|
11
|
+
users = databases.map { |d| super_conn.role.list(database: d) }.flatten.uniq
|
12
|
+
|
13
|
+
databases.each { |d| drop_database(d) }
|
14
|
+
super_conn.role.drop(users)
|
15
|
+
super_conn.role.drop(owners, fail: false)
|
16
|
+
owners.each { |o| drop_owner(o) }
|
17
|
+
|
18
|
+
FileUtils.rm_f Prick.state.state_file if remove_state_file
|
14
19
|
|
15
20
|
# TODO Run builder teardown scrips
|
16
|
-
# builder = Prick::Build::Builder.new(conn, "schema")
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
data/lib/prick/version.rb
CHANGED
data/lib/prick.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require 'prick/version.rb'
|
2
2
|
|
3
3
|
require 'pg_conn'
|
4
4
|
|
@@ -8,7 +8,7 @@ require 'constrain'
|
|
8
8
|
|
9
9
|
module Prick
|
10
10
|
class Error < RuntimeError; end
|
11
|
-
class
|
11
|
+
class Failure < RuntimeError; end
|
12
12
|
end
|
13
13
|
|
14
14
|
require_relative 'prick/constants.rb'
|
@@ -18,6 +18,7 @@ require_relative 'prick/local/command.rb'
|
|
18
18
|
require_relative 'prick/local/git.rb'
|
19
19
|
require_relative 'prick/local/timer.rb'
|
20
20
|
require_relative 'prick/local/ansi.rb'
|
21
|
+
require_relative 'prick/local/fmt.rb'
|
21
22
|
|
22
23
|
require_relative 'prick/environment.rb'
|
23
24
|
require_relative 'prick/state.rb'
|
@@ -25,27 +26,65 @@ require_relative 'prick/prick_version.rb'
|
|
25
26
|
require_relative 'prick/diff.rb'
|
26
27
|
|
27
28
|
module Prick
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
29
|
+
def mesg(*msgs) = Prick.mesg(*msgs)
|
30
|
+
def verb(*msgs) = Prick.verb(*msgs)
|
31
|
+
def self.mesg(*msgs) puts msgs.join(" ") if !$quiet end
|
32
|
+
def self.verb(*msgs) puts msgs.join(" ") if $verbose && !$quiet end
|
33
33
|
end
|
34
34
|
|
35
|
-
require_relative 'prick/subcommand/
|
36
|
-
require_relative 'prick/subcommand/prick-
|
37
|
-
require_relative 'prick/subcommand/prick-teardown.rb'
|
35
|
+
require_relative 'prick/subcommand/subcommand.rb'
|
36
|
+
require_relative 'prick/subcommand/prick-build.rb'
|
38
37
|
require_relative 'prick/subcommand/prick-clean.rb'
|
39
38
|
require_relative 'prick/subcommand/prick-create.rb'
|
40
|
-
require_relative 'prick/subcommand/prick-build.rb'
|
41
|
-
require_relative 'prick/subcommand/prick-make.rb'
|
42
|
-
require_relative 'prick/subcommand/prick-fox.rb'
|
43
39
|
require_relative 'prick/subcommand/prick-drop.rb'
|
44
|
-
require_relative 'prick/subcommand/prick-
|
40
|
+
require_relative 'prick/subcommand/prick-set.rb'
|
41
|
+
require_relative 'prick/subcommand/prick-list.rb'
|
42
|
+
require_relative 'prick/subcommand/prick-fox.rb'
|
43
|
+
require_relative 'prick/subcommand/prick-init.rb'
|
44
|
+
require_relative 'prick/subcommand/prick-make.rb'
|
45
45
|
require_relative 'prick/subcommand/prick-migrate.rb'
|
46
|
+
require_relative 'prick/subcommand/prick-release.rb'
|
47
|
+
require_relative 'prick/subcommand/prick-setup.rb'
|
48
|
+
require_relative 'prick/subcommand/prick-teardown.rb'
|
46
49
|
|
47
50
|
module Prick
|
48
51
|
@state = nil
|
49
|
-
def self.state()
|
52
|
+
def self.state?() !@state.nil? end
|
53
|
+
def self.state() @state or raise ArgumentError end
|
50
54
|
def self.state=(state) @state = state end
|
55
|
+
|
56
|
+
def self.error(*args) raise Prick::Error.new *args end
|
57
|
+
def self.failure(*args) raise Prick::Failure.new *args end
|
58
|
+
|
59
|
+
def self.owner_conn = state.connection
|
60
|
+
def self.super_conn = State.connection
|
61
|
+
# def self.conn = owner_conn
|
62
|
+
|
63
|
+
# Return list of prick databases. If a block is given it is called with a
|
64
|
+
# connection to each of the databases
|
65
|
+
def self.databases(&block)
|
66
|
+
databases = super_conn.values %(
|
67
|
+
select datname from pg_database where datistemplate = false order by datname
|
68
|
+
)
|
69
|
+
databases.select! { |database|
|
70
|
+
PgConn.new(database) { |conn|
|
71
|
+
is_prick_database = conn.exist?(%(
|
72
|
+
select 1
|
73
|
+
from information_schema.tables
|
74
|
+
where table_schema = 'prick'
|
75
|
+
and table_name = 'builds'
|
76
|
+
limit 1
|
77
|
+
))
|
78
|
+
yield(database, conn) if is_prick_database && block_given?
|
79
|
+
is_prick_database
|
80
|
+
}
|
81
|
+
}
|
82
|
+
databases
|
83
|
+
end
|
84
|
+
|
85
|
+
module SubCommand
|
86
|
+
def self.owner_conn = Prick.owner_conn
|
87
|
+
def self.super_conn = Prick.super_conn
|
88
|
+
# def self.conn = Prick.conn
|
89
|
+
end
|
51
90
|
end
|