prick 0.19.0 → 0.20.1
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/Gemfile +10 -4
- data/README.md +7 -7
- data/Rakefile +3 -1
- data/TODO +13 -11
- data/bin/console +2 -1
- data/doc/build-yml.txt +14 -0
- data/exe/prick +237 -19
- data/lib/builder/batch.rb +147 -0
- data/lib/builder/builder.rb +122 -0
- data/lib/builder/node.rb +189 -0
- data/lib/builder/node_pool.rb +105 -0
- data/lib/builder/parser.rb +120 -0
- data/lib/local/command.rb +193 -0
- data/lib/{prick → local}/git.rb +148 -22
- data/lib/local/timer.rb +98 -0
- data/lib/prick/constants.rb +54 -66
- data/lib/prick/diff.rb +28 -18
- data/lib/prick/prick_version.rb +161 -0
- data/lib/prick/state.rb +80 -165
- data/lib/prick/version.rb +2 -163
- data/lib/prick.rb +38 -24
- data/lib/share/init/.gitignore +10 -0
- data/lib/share/init/.prick-context +2 -0
- data/lib/share/init/.rspec +3 -0
- data/{share/schema/schema/public → lib/share/init/migration}/.keep +0 -0
- data/lib/share/init/prick.yml +6 -0
- data/lib/share/init/schema/.keep +0 -0
- data/lib/share/init/schema/build.yml +2 -0
- data/lib/share/init/schema/prick/.keep +0 -0
- data/lib/share/init/schema/prick/build.yml +5 -0
- data/lib/share/init/schema/prick/data.sql +6 -0
- data/{share/schema → lib/share/init}/schema/prick/tables.sql +2 -3
- data/lib/share/init/schema/public/.keep +0 -0
- data/lib/share/init/spec/prick_helper.rb +1 -0
- data/lib/share/init/spec/prick_spec.rb +6 -0
- data/lib/share/init/spec/spec_helper.rb +50 -0
- data/lib/share/migrate/migration/build.yml +4 -0
- data/lib/share/migrate/migration/diff.after-tables.sql +0 -0
- data/lib/share/migrate/migration/diff.before-tables.sql +0 -0
- data/lib/share/migrate/migration/diff.tables.sql +0 -0
- data/lib/subcommand/prick-build.rb +55 -0
- data/lib/subcommand/prick-create.rb +78 -0
- data/lib/subcommand/prick-drop.rb +25 -0
- data/lib/subcommand/prick-fox.rb +62 -0
- data/lib/subcommand/prick-init.rb +46 -0
- data/lib/subcommand/prick-make.rb +202 -0
- data/lib/subcommand/prick-migrate.rb +37 -0
- data/lib/subcommand/prick-release.rb +23 -0
- data/lib/subcommand/prick-setup.rb +20 -0
- data/lib/subcommand/prick-teardown.rb +18 -0
- data/prick.gemspec +32 -21
- metadata +95 -76
- data/.gitignore +0 -29
- data/.travis.yml +0 -7
- data/doc/create_release.txt +0 -17
- data/doc/flow.txt +0 -98
- data/doc/migra +0 -1
- data/doc/migrations.txt +0 -172
- data/doc/notes.txt +0 -116
- data/doc/prick.txt +0 -114
- data/doc/sh.prick +0 -316
- data/lib/ext/algorithm.rb +0 -14
- data/lib/ext/fileutils.rb +0 -26
- data/lib/ext/forward_method.rb +0 -18
- data/lib/ext/pg.rb +0 -18
- data/lib/ext/shortest_path.rb +0 -44
- data/lib/prick/archive.rb +0 -124
- data/lib/prick/branch.rb +0 -265
- data/lib/prick/builder.rb +0 -246
- data/lib/prick/cache.rb +0 -34
- data/lib/prick/command.rb +0 -104
- data/lib/prick/database.rb +0 -82
- data/lib/prick/dsort.rb +0 -151
- data/lib/prick/ensure.rb +0 -119
- data/lib/prick/exceptions.rb +0 -25
- data/lib/prick/head.rb +0 -189
- data/lib/prick/migration.rb +0 -70
- data/lib/prick/program.rb +0 -287
- data/lib/prick/project.rb +0 -626
- data/lib/prick/rdbms.rb +0 -137
- data/lib/prick/schema.rb +0 -27
- data/lib/prick/share.rb +0 -64
- data/libexec/strip-comments +0 -33
- data/make_releases +0 -72
- data/make_schema +0 -10
- data/share/diff/diff.after-tables.sql +0 -4
- data/share/diff/diff.before-tables.sql +0 -4
- data/share/diff/diff.tables.sql +0 -8
- data/share/features/diff.sql +0 -2
- data/share/features/feature/diff.sql +0 -2
- data/share/features/feature/migrate.sql +0 -2
- data/share/features/features.sql +0 -2
- data/share/features/features.yml +0 -2
- data/share/features/migrations.sql +0 -4
- data/share/gitignore +0 -2
- data/share/migration/diff.tables.sql +0 -8
- data/share/migration/features.yml +0 -6
- data/share/migration/migrate.sql +0 -3
- data/share/migration/migrate.yml +0 -8
- data/share/migration/tables.sql +0 -3
- data/share/schema/build.yml +0 -14
- data/share/schema/schema/build.yml +0 -3
- data/share/schema/schema/prick/build.yml +0 -14
- data/share/schema/schema/prick/data.sql +0 -7
- data/share/schema/schema/prick/schema.sql +0 -3
- data/share/schema/schema/public/build.yml +0 -13
- data/share/schema/schema.sql +0 -3
- data/test_assorted +0 -192
- data/test_feature +0 -112
- data/test_refactor +0 -34
- data/test_single_dev +0 -83
data/doc/prick.txt
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
MIGRATION STATE FILES
|
|
4
|
-
.prick-migration (State file)
|
|
5
|
-
version: Version
|
|
6
|
-
The target version. The result of running the migration on the base
|
|
7
|
-
release
|
|
8
|
-
base_version: Version
|
|
9
|
-
Base version. Running the migration on a base release yields a release
|
|
10
|
-
of with the same version as the `version` property
|
|
11
|
-
|
|
12
|
-
The 0.0.0 version has base_version equal to nil. A Feature has version
|
|
13
|
-
equal to its base version.
|
|
14
|
-
|
|
15
|
-
Note that while a release's .prick-migration file lives in the release
|
|
16
|
-
directory, it's .prick-features file and the migrations lives in the
|
|
17
|
-
directory of the base release. This separation supports the
|
|
18
|
-
single-developer workflow where the next release is not known beforehand
|
|
19
|
-
|
|
20
|
-
.prick-features (State file)
|
|
21
|
-
features: Array
|
|
22
|
-
A list of features versions
|
|
23
|
-
|
|
24
|
-
MIGRATION FILES
|
|
25
|
-
migrate.sql
|
|
26
|
-
features.sql
|
|
27
|
-
diff.sql
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
MIGRATION FILE STRUCTURE
|
|
31
|
-
releases/
|
|
32
|
-
0.0.0/
|
|
33
|
-
.prick-migration -> version: 0.0.0, base_version: nil
|
|
34
|
-
.prick-features -> [feature_a]
|
|
35
|
-
feature_a/
|
|
36
|
-
.prick-migration -> version: nil, base_version: 0.0.0
|
|
37
|
-
.prick-features -> []
|
|
38
|
-
feature_b/ (rebased)
|
|
39
|
-
.prick-migration -> version: 0.2.0, base_version: 0.2.0-pre.1
|
|
40
|
-
.prick-features -> []
|
|
41
|
-
|
|
42
|
-
0.1.0/
|
|
43
|
-
.prick-migration -> version: 0.1.0, base_version: 0.0.0
|
|
44
|
-
feature_b/ symlinks to ../0.0.0/feature_b/
|
|
45
|
-
|
|
46
|
-
0.1.0/ (wip - single developer work flow)
|
|
47
|
-
.prick-migration -> version: 0.1.0, base_version: 0.0.0
|
|
48
|
-
.prick-features -> [feature_c]
|
|
49
|
-
feature_c/
|
|
50
|
-
...
|
|
51
|
-
|
|
52
|
-
0.2.0/ (doing a pre-release)
|
|
53
|
-
.prick-migration -> version: 0.2.0-pre.1, base_version: 0.1.0
|
|
54
|
-
|
|
55
|
-
migrations/
|
|
56
|
-
0.0.0_0.1.0/
|
|
57
|
-
.prick-migration -> version: 0.1.0, base_version: 0.0.0
|
|
58
|
-
.prick-features -> []
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
NOTES
|
|
62
|
-
#
|
|
63
|
-
# Distinguish between running a migration 0.1.0 -> 0.2.0 and running the
|
|
64
|
-
# migration in the 0.2.0 directory in the single-developer workflow
|
|
65
|
-
#
|
|
66
|
-
# prick migrate
|
|
67
|
-
# On a tag: Migrate to that tag
|
|
68
|
-
# On a branch: Run migrations in the release directory
|
|
69
|
-
#
|
|
70
|
-
# prick migrate 0.2.0 <- the version number reflects where to find the migration
|
|
71
|
-
# Runs the migration files in the release directory
|
|
72
|
-
#
|
|
73
|
-
# prick migrate 0.1.0
|
|
74
|
-
# Runs the migration files in the base release directory
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
# prick build
|
|
78
|
-
# Builds the current schema into the project database
|
|
79
|
-
#
|
|
80
|
-
# prick build 0.1.0
|
|
81
|
-
# Builds the given schema into a versioned database
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
######################
|
|
96
|
-
|
|
97
|
-
PRICK FILES
|
|
98
|
-
./prick-version
|
|
99
|
-
Contains just one line with the version of the prick command that should be
|
|
100
|
-
used with this project (eg. 'prick-0.1.0'). Prick checks this file at
|
|
101
|
-
startup and fails if the required version doesn't match the current command
|
|
102
|
-
|
|
103
|
-
./prick
|
|
104
|
-
project_name
|
|
105
|
-
Name of the project
|
|
106
|
-
|
|
107
|
-
./releases/*/.prick
|
|
108
|
-
base_version
|
|
109
|
-
The base version of this release. nil for release 0.0.0
|
|
110
|
-
features
|
|
111
|
-
List of features in a release based on this release. Initially empty
|
|
112
|
-
but filled in when the directory is prepared for a subsequent release.
|
|
113
|
-
To find the set of features in the current release, inspect the prick
|
|
114
|
-
file of the base_version in this branch
|
data/doc/sh.prick
DELETED
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/bash
|
|
2
|
-
|
|
3
|
-
# Name
|
|
4
|
-
# prick - Database project tool
|
|
5
|
-
#
|
|
6
|
-
# Usage
|
|
7
|
-
# prick prepare|migrate|release
|
|
8
|
-
#
|
|
9
|
-
# Commands
|
|
10
|
-
# prepare NEW-RELEASE
|
|
11
|
-
# Stamps NEW-RELEASE into the database
|
|
12
|
-
# migrate [OLD-RELEASE]
|
|
13
|
-
# Create a migration from OLD-RELEASE to the prepared release.
|
|
14
|
-
# OLD-RELEASE defaults to the last registered release
|
|
15
|
-
# release
|
|
16
|
-
# Release the prepared release
|
|
17
|
-
#
|
|
18
|
-
# Files
|
|
19
|
-
# prick use the following sub-directories:
|
|
20
|
-
#
|
|
21
|
-
# releases/
|
|
22
|
-
# <database>-<release>.dump.gz
|
|
23
|
-
# ...
|
|
24
|
-
# migrations/
|
|
25
|
-
# migrate-<from>-<to>[.sql]
|
|
26
|
-
# ...
|
|
27
|
-
#
|
|
28
|
-
# The releases directory contains schema backups that makes it easy to
|
|
29
|
-
# restore a earlier release used to generated migrations. The migrations directory
|
|
30
|
-
# contains migrations from one release to another. 'prick migrate' generates
|
|
31
|
-
# a SQL migration file but you can replace it with an executable if needed
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
# TODO: Schema-only dump of database
|
|
35
|
-
# pg_dump --no-owner --no-privileges --schema-only name_of_database -f schema.dump.sql
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
set -e
|
|
39
|
-
|
|
40
|
-
. bash.include
|
|
41
|
-
|
|
42
|
-
USAGE="prepare NEW-RELEASE
|
|
43
|
-
migrate OLD-RELEASE
|
|
44
|
-
release"
|
|
45
|
-
|
|
46
|
-
DB=mikras
|
|
47
|
-
|
|
48
|
-
function inoa() {
|
|
49
|
-
error "Illegal number of arguments"
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
[ $# -ge 1 ] || inoa
|
|
53
|
-
CMD=$1
|
|
54
|
-
shift
|
|
55
|
-
|
|
56
|
-
trap 'eval rm -rf $ERRFILE $TMPFILE $TMPDIR' EXIT
|
|
57
|
-
ERRFILE=$(mktemp --tmpdir $PROGRAM.XXXXXXXXXX)
|
|
58
|
-
TMPFILE=$(mktemp --tmpdir $PROGRAM.XXXXXXXXXX)
|
|
59
|
-
TMPDIR=$(mktemp --tmpdir --directory $PROGRAM.XXXXXXXXXX)
|
|
60
|
-
#echo $TMPFILE
|
|
61
|
-
#echo $TMPDIR
|
|
62
|
-
|
|
63
|
-
function last_release() {
|
|
64
|
-
local path=$(ls releases/$DB-*.*.*.dump.gz 2>/dev/null | tail -1)
|
|
65
|
-
local release=$(echo $path | sed -e "s/releases\/$DB-//" -e 's/\.dump\.gz$//')
|
|
66
|
-
echo ${release:-0.0.0}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function current_release() {
|
|
70
|
-
psql -qtAX -d $DB -c "select major || '.' || minor || '.' || patch from meta.versions"
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function set_current_release() {
|
|
74
|
-
set -- $(echo $1 | sed 's/\./ /g')
|
|
75
|
-
local major=$1
|
|
76
|
-
local minor=$2
|
|
77
|
-
local patch=$3
|
|
78
|
-
|
|
79
|
-
psql -qtAX -d $DB -c "update meta.versions set major = $major, minor = $minor, patch = $patch"
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function has_release() {
|
|
83
|
-
local release=$1
|
|
84
|
-
local db=$DB-$release
|
|
85
|
-
psql -qtAX -d $DB -l | grep -q "^$db|" &>/dev/null
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function database_load() {
|
|
89
|
-
local release=$1
|
|
90
|
-
local db=$DB-$release
|
|
91
|
-
local dump=releases/$db.dump.gz
|
|
92
|
-
[ -f $dump ] || error "Can't find release dump $dump"
|
|
93
|
-
[ ! has_release ] || error "Release $release is already loaded"
|
|
94
|
-
createdb $db
|
|
95
|
-
gzip --to-stdout $dump | psql -d $db
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function redatabase_load() {
|
|
99
|
-
local release=$1
|
|
100
|
-
local db=$DB-$release
|
|
101
|
-
local dump=releases/$db.dump.gz
|
|
102
|
-
[ -f $dump ] || error "Can't find release dump $dump"
|
|
103
|
-
[ ! has_release ] || dropdb $db
|
|
104
|
-
createdb $db
|
|
105
|
-
gzip --to-stdout $dump | psql -d $db
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
function prepare() {
|
|
110
|
-
local new_release=$1
|
|
111
|
-
mesg "Preparing $new_release"
|
|
112
|
-
|
|
113
|
-
[ ! -f $new_release ] || error "New release already exists: $new_release_dump"
|
|
114
|
-
set_current_release $new_release
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function migrate() {
|
|
118
|
-
local old_release=$1
|
|
119
|
-
local new_release=$(current_release)
|
|
120
|
-
local old_release_dump=releases/$DB-$old_release.dump.gz
|
|
121
|
-
local new_release_dump=releases/$DB-$new_release_dump.gz
|
|
122
|
-
local migration=migrations/migrate-$old_release-$new_release.sql
|
|
123
|
-
|
|
124
|
-
mesg "Migrating $old_release to $new_release"
|
|
125
|
-
|
|
126
|
-
[ -f $old_release_dump ] || error "Can't find old release: $old_release_dump"
|
|
127
|
-
[ ! -f $new_release_dump ] || error "New release already exists: $new_release_dump"
|
|
128
|
-
[ "$old_release" != "$new_release" ] ||
|
|
129
|
-
error "Can't migrate $old_release to itself (did you forget to prepare the release?)"
|
|
130
|
-
[ ! -f $migration ] || error "Won't overwrite migration $migration"
|
|
131
|
-
|
|
132
|
-
has_release $old_release || database_load $old_release
|
|
133
|
-
# migra --unsafe postgresql:///$DB-$old_release postgresql:///$DB || true #>$migration
|
|
134
|
-
migra --unsafe postgresql:///$DB-$old_release postgresql:///$DB >$migration || {
|
|
135
|
-
case $? in
|
|
136
|
-
0)
|
|
137
|
-
mesg "No changes"
|
|
138
|
-
;;
|
|
139
|
-
2)
|
|
140
|
-
mesg "Generated $migration"
|
|
141
|
-
;;
|
|
142
|
-
*)
|
|
143
|
-
rm -f $migration
|
|
144
|
-
fail "migra failed"
|
|
145
|
-
;;
|
|
146
|
-
esac
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
function database() {
|
|
151
|
-
local release=$1
|
|
152
|
-
echo "$DB-$release"
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function dumpfile() {
|
|
156
|
-
local release=$1
|
|
157
|
-
echo "releases/$DB-$release.dump.gz"
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
###
|
|
161
|
-
### R E L E A S E
|
|
162
|
-
###
|
|
163
|
-
|
|
164
|
-
function release_default() {
|
|
165
|
-
psql -qtAX -d $DB -c "select major || '.' || minor || '.' || patch from meta.versions"
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
function release_exist() {
|
|
169
|
-
local release=$1
|
|
170
|
-
local dump=$(dumpfile $release)
|
|
171
|
-
[ -f $dump ]
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
###
|
|
175
|
-
### M I G R A T I O N S
|
|
176
|
-
###
|
|
177
|
-
|
|
178
|
-
function migration_create() {
|
|
179
|
-
local old_release=$1
|
|
180
|
-
local new_release=$(release_default)
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function migration_apply() {
|
|
184
|
-
echo niy
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
###
|
|
189
|
-
### D A T A B A S E
|
|
190
|
-
###
|
|
191
|
-
|
|
192
|
-
function database_loaded() {
|
|
193
|
-
local release=$1
|
|
194
|
-
local db=$(database $release)
|
|
195
|
-
psql -qtAX -d $DB -l | grep -q "^$db|" &>/dev/null
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function database_build() {
|
|
199
|
-
local release=$1
|
|
200
|
-
local db=$(database $release)
|
|
201
|
-
! database_loaded $release || fail "Database $db is already loaded"
|
|
202
|
-
mesg "Checking out release $release"
|
|
203
|
-
git archive --format=tar $release >$TMPFILE
|
|
204
|
-
(
|
|
205
|
-
cd $TMPDIR
|
|
206
|
-
tar xf $TMPFILE
|
|
207
|
-
|
|
208
|
-
# No git access so set spec.files to []
|
|
209
|
-
sed -i -e '/^ *spec.files/,+2d' mikras_db.gemspec -e 's/spec.files/[]/' mikras_db.gemspec
|
|
210
|
-
|
|
211
|
-
mesg "Running bundle"
|
|
212
|
-
bundle &>$ERRFILE || {
|
|
213
|
-
cat $ERRFILE >&2
|
|
214
|
-
fail "bundle failed"
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
# Set databse name
|
|
218
|
-
sed -i "s/^DB=.*/DB=$(database $release)/" exe/build
|
|
219
|
-
|
|
220
|
-
# Quote variables properly
|
|
221
|
-
perl -pi -e 's/:(\w+)/:"\1"/g' schemas/db.sql
|
|
222
|
-
|
|
223
|
-
# Replace schemas/skuffejern/users.sql - it is not possible to drop users because we
|
|
224
|
-
# run several versions of the database
|
|
225
|
-
for file in $(ls schemas/*/users.sql 2>/dev/null); do
|
|
226
|
-
{
|
|
227
|
-
psql -qtAX -d template1 \
|
|
228
|
-
-c "select 1 from pg_user where pg_user.usename = 'anonymous'" \
|
|
229
|
-
| grep -q 1 || psql -qtAX -d template1 -c "create user anonymous"
|
|
230
|
-
|
|
231
|
-
psql -qtAX -d template1 \
|
|
232
|
-
-c "select 1 from pg_roles where pg_roles.rolname = 'skuffejern_access'" \
|
|
233
|
-
| grep -q 1 || psql -qtAX -d template1 -c "create role skuffejern_access"
|
|
234
|
-
} >$file
|
|
235
|
-
done
|
|
236
|
-
|
|
237
|
-
mesg "Running rebuild"
|
|
238
|
-
./rebuild &>$ERRFILE || {
|
|
239
|
-
cat $ERRFILE >&2
|
|
240
|
-
fail "rebuild failed"
|
|
241
|
-
}
|
|
242
|
-
)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function database_save() {
|
|
246
|
-
local release=$1
|
|
247
|
-
local db=$(database $release)
|
|
248
|
-
local dump=releases/$db.dump.gz
|
|
249
|
-
[ ! -f $dump ] || fail "Won't overwrite release file $dump"
|
|
250
|
-
# pg_dump --no-owner --no-privileges --schema-only name_of_database -f schema.dump.sql
|
|
251
|
-
pg_dump --no-owner --schema-only $db | gzip --to-stdout >$dump
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function database_load() {
|
|
255
|
-
local release=$1
|
|
256
|
-
local db=$(database $release)
|
|
257
|
-
local dump=releases/$db.dump.gz
|
|
258
|
-
! database_loaded $db || fail "Database $db is already loaded"
|
|
259
|
-
[ -f $dump ] || fail "Can't find release file $dump"
|
|
260
|
-
createdb $db
|
|
261
|
-
gunzip --to-stdout $dump | psql -d $db &>$ERRFILE || {
|
|
262
|
-
cat $ERRFILE
|
|
263
|
-
fail "psql failed"
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function database_drop() {
|
|
268
|
-
local release=$1
|
|
269
|
-
local db=$(database $release)
|
|
270
|
-
dropdb $db
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
case $CMD in
|
|
275
|
-
list)
|
|
276
|
-
[ $# = 0 ] || inoa
|
|
277
|
-
psql -qtAX -d template1 -l | sed -n "/mikras[-0-9.]*|/s/|.*//p"
|
|
278
|
-
;;
|
|
279
|
-
build)
|
|
280
|
-
[ $# = 1 ] || inoa
|
|
281
|
-
database_build $1
|
|
282
|
-
;;
|
|
283
|
-
save)
|
|
284
|
-
[ $# = 1 ] || inoa
|
|
285
|
-
database_save $1
|
|
286
|
-
;;
|
|
287
|
-
load)
|
|
288
|
-
[ $# = 1 ] || inoa
|
|
289
|
-
database_load $1
|
|
290
|
-
;;
|
|
291
|
-
reload)
|
|
292
|
-
[ $# = 1 ] || inoa
|
|
293
|
-
! database_loaded $1 || database_drop $1
|
|
294
|
-
database_load $1
|
|
295
|
-
;;
|
|
296
|
-
drop)
|
|
297
|
-
[ $# = 1 ] || inoa
|
|
298
|
-
database_drop $1
|
|
299
|
-
;;
|
|
300
|
-
prepare)
|
|
301
|
-
[ $# = 1 ] || inoa
|
|
302
|
-
prepare $1
|
|
303
|
-
;;
|
|
304
|
-
migrate) # TODO: prick migrate from-release to-release
|
|
305
|
-
[ $# -le 1 ] || inoa
|
|
306
|
-
migrate ${1:-$(last_release)}
|
|
307
|
-
;;
|
|
308
|
-
release)
|
|
309
|
-
mesg "Releasing"
|
|
310
|
-
;;
|
|
311
|
-
*)
|
|
312
|
-
error "Illegal command: '$CMD'"
|
|
313
|
-
;;
|
|
314
|
-
esac
|
|
315
|
-
|
|
316
|
-
|
data/lib/ext/algorithm.rb
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
module Algorithm
|
|
3
|
-
def follow(object, sym = nil, &block)
|
|
4
|
-
sym.nil? == block_given? or raise "Can't use both symbol and block"
|
|
5
|
-
a = []
|
|
6
|
-
while object
|
|
7
|
-
a << object
|
|
8
|
-
object = block_given? ? yield(object) : object.send(sym)
|
|
9
|
-
end
|
|
10
|
-
a
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
module_function :follow
|
|
14
|
-
end
|
data/lib/ext/fileutils.rb
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require 'pathname'
|
|
4
|
-
|
|
5
|
-
module FileUtils
|
|
6
|
-
def self.touch_p(file)
|
|
7
|
-
dir = File.dirname(file)
|
|
8
|
-
File.exist?(dir) or FileUtils.mkdir_p(dir)
|
|
9
|
-
touch(file)
|
|
10
|
-
file
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def self.ln_sr(from, to)
|
|
14
|
-
from = Pathname.new(from)
|
|
15
|
-
to_dir = File.dirname(to)
|
|
16
|
-
to_file = File.basename(to)
|
|
17
|
-
relpath = from.relative_path_from(File.dirname(to))
|
|
18
|
-
Dir.chdir(to_dir) { FileUtils.ln_s(relpath, File.basename(to)) }
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def self.empty!(dir)
|
|
22
|
-
Dir.chdir(dir) {
|
|
23
|
-
FileUtils.rm_rf(Dir.children("."))
|
|
24
|
-
}
|
|
25
|
-
end
|
|
26
|
-
end
|
data/lib/ext/forward_method.rb
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
class Class
|
|
3
|
-
# TODO: Check for arity
|
|
4
|
-
def forward_methods(*methods, object)
|
|
5
|
-
for method in Array(methods).flatten
|
|
6
|
-
if method.to_s.end_with?("=")
|
|
7
|
-
src = "def #{method}(args) raise if #{object}.nil?; #{object}.#{method}(args) end"
|
|
8
|
-
else
|
|
9
|
-
src = "def #{method}(*args) #{object}&.#{method}(*args) end"
|
|
10
|
-
end
|
|
11
|
-
class_eval(src)
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def forward_method(*args) forward_methods(*args) end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
|
data/lib/ext/pg.rb
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
require 'pg'
|
|
2
|
-
|
|
3
|
-
class PG::Result
|
|
4
|
-
def value() self.getvalue(0, 0) end
|
|
5
|
-
|
|
6
|
-
def each_value(&block)
|
|
7
|
-
if block_given?
|
|
8
|
-
self.each_row { |r| yield(r.first) }
|
|
9
|
-
else
|
|
10
|
-
self.each_row.map { |r| r.first }
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def empty?() ntuples == 0 end
|
|
15
|
-
|
|
16
|
-
def to_a() self.values end
|
|
17
|
-
end
|
|
18
|
-
|
data/lib/ext/shortest_path.rb
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
module Algorithm
|
|
3
|
-
# Return (one of) the shortest path from `from` to `to` as a list of edges.
|
|
4
|
-
# `edges` is a list of arrays with from-node and to-node as the first two
|
|
5
|
-
# elements. Returns nil if no route was found
|
|
6
|
-
#
|
|
7
|
-
# The algorithm does slightly more work than it needs to because the same node
|
|
8
|
-
# can be inserted more than once into the queue of nodes to be processed
|
|
9
|
-
#
|
|
10
|
-
def self.shortest_path(edges, from, to)
|
|
11
|
-
pool = {} # Map from 'from' to map from 'to' to edge. Eg. pool[from][to] == edge-between-them
|
|
12
|
-
edges.each { |edge| (pool[edge[0]] ||= {})[edge[1]] = edge }
|
|
13
|
-
|
|
14
|
-
visited = {}
|
|
15
|
-
prev = {}
|
|
16
|
-
|
|
17
|
-
todo = [from]
|
|
18
|
-
while true
|
|
19
|
-
return nil if todo.empty?
|
|
20
|
-
|
|
21
|
-
current = todo.shift
|
|
22
|
-
break if current == to
|
|
23
|
-
|
|
24
|
-
next if visited[current]
|
|
25
|
-
visited[current] = true
|
|
26
|
-
|
|
27
|
-
next if pool[current].nil?
|
|
28
|
-
pool[current].each { |node, edge|
|
|
29
|
-
prev[node] ||= edge
|
|
30
|
-
todo << node
|
|
31
|
-
}
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
to_node = to
|
|
35
|
-
route = []
|
|
36
|
-
while edge = prev[to_node]
|
|
37
|
-
to_node = edge.first
|
|
38
|
-
route.unshift edge
|
|
39
|
-
break if from == to_node
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
route
|
|
43
|
-
end
|
|
44
|
-
end
|
data/lib/prick/archive.rb
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
module Prick
|
|
3
|
-
class DumpFile
|
|
4
|
-
attr_reader :project
|
|
5
|
-
attr_reader :name
|
|
6
|
-
attr_reader :file
|
|
7
|
-
attr_reader :path
|
|
8
|
-
|
|
9
|
-
def initialize(project, name)
|
|
10
|
-
@project = project
|
|
11
|
-
@name = name
|
|
12
|
-
@file = "#{project.name}-#{name}.#{DUMP_EXT}"
|
|
13
|
-
@path = File.join(CACHE_DIR, @file)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def exist?() File.exist?(path) end
|
|
17
|
-
|
|
18
|
-
def delete() FileUtils.rm_f(path) end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
__END__
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class Release
|
|
27
|
-
attr_reader :project
|
|
28
|
-
attr_reader :version
|
|
29
|
-
attr_reader :semver
|
|
30
|
-
|
|
31
|
-
# Associated Database object
|
|
32
|
-
attr_reader :database
|
|
33
|
-
|
|
34
|
-
# Name of release (eg. 'project-1.2.3')
|
|
35
|
-
attr_reader :name
|
|
36
|
-
|
|
37
|
-
# Release file (eb. 'project-1.2.3.dump.gz')
|
|
38
|
-
attr_reader :file
|
|
39
|
-
|
|
40
|
-
# Path to release file
|
|
41
|
-
def path() File.join(RELEASE_DIR, file) end
|
|
42
|
-
|
|
43
|
-
def initialize(project, version_or_semver, database: nil)
|
|
44
|
-
@project = project
|
|
45
|
-
@version, @semver = Semver::parse(version_or_semver)
|
|
46
|
-
@name = "#{@project.name}-#{@semver}"
|
|
47
|
-
@file = @name + RELEASE_DOT_EXT
|
|
48
|
-
@database = database || Database.new(@name, @project.user)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def self.glob(project)
|
|
52
|
-
"#{project.name}-*.#{RELEASE_EXT}"
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# $1 matches the version
|
|
56
|
-
def self.re(project)
|
|
57
|
-
/^#{project.name}-(#{VERSION_RE.source})$/
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# True if the release file exists
|
|
61
|
-
def cached?() File.exist?(path) end
|
|
62
|
-
|
|
63
|
-
def build() project.build(version) end
|
|
64
|
-
|
|
65
|
-
def unbuild() FileUtils.rm_f(path) end
|
|
66
|
-
|
|
67
|
-
# True if the database exists and is loaded
|
|
68
|
-
def loaded?() database.loaded? end
|
|
69
|
-
|
|
70
|
-
# Create database and load release
|
|
71
|
-
def load(file = nil)
|
|
72
|
-
file ||= path
|
|
73
|
-
!loaded? or raise Error, "Release #{name} is already loaded"
|
|
74
|
-
database.create
|
|
75
|
-
database.load(file)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Reload release
|
|
79
|
-
def reload(file = path) unload; load(file) end
|
|
80
|
-
|
|
81
|
-
# Delete a database. It is not an error if the database doesn't exists
|
|
82
|
-
def unload() database.drop if loaded? end
|
|
83
|
-
|
|
84
|
-
# Remove the release file
|
|
85
|
-
def remove() FileUtils::rm_f(path) end
|
|
86
|
-
|
|
87
|
-
# Compare two release by semantic version
|
|
88
|
-
def <=>(other) self.semver <=> other.semver end
|
|
89
|
-
|
|
90
|
-
# Render self a the name of the release (eg. 'project-1.2.3')
|
|
91
|
-
def to_s() name end
|
|
92
|
-
|
|
93
|
-
# Returns self so that you can do 'release = lookup(version).ensure(:loaded)'
|
|
94
|
-
def ensure(state, expect: true)
|
|
95
|
-
value = self.send(:"#{state}?")
|
|
96
|
-
if value != expect
|
|
97
|
-
state_methods = STATES[state] or raise Error, "Can't change state to #{state.inspect}"
|
|
98
|
-
index = expect ? 0 : 1
|
|
99
|
-
self.send(state_method[index])
|
|
100
|
-
end
|
|
101
|
-
self
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
STATES = {
|
|
106
|
-
cached: [:build, :unbuild],
|
|
107
|
-
loaded: [:load, :unload]
|
|
108
|
-
}
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|