kit 0.0.1 → 0.0.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.
- data/actions.sql +16 -0
- data/actions/clones/otr.rb +17 -0
- data/actions/commits/otr.rb +7 -0
- data/actions/upgrades/otr.rb +8 -0
- data/config.rb +16 -0
- data/db_sqlite3.rb +111 -0
- data/info.sql +15 -0
- data/info/devel.rb +35 -0
- data/site.rb +80 -0
- metadata +15 -2
data/actions.sql
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
CREATE TABLE clones (
|
2
|
+
"site" INTEGER NOT NULL,
|
3
|
+
"status" TEXT NOT NULL DEFAULT ('pending'),
|
4
|
+
"src" INTEGER NOT NULL
|
5
|
+
);
|
6
|
+
CREATE TABLE upgrades (
|
7
|
+
"site" INTEGER NOT NULL,
|
8
|
+
"status" TEXT NOT NULL DEFAULT ('pending'),
|
9
|
+
"component" TEXT NOT NULL,
|
10
|
+
"file" TEXT NOT NULL
|
11
|
+
);
|
12
|
+
CREATE TABLE commits (
|
13
|
+
"site" INTEGER NOT NULL,
|
14
|
+
"status" TEXT NOT NULL DEFAULT ('pending'),
|
15
|
+
"requested_commit" TEXT
|
16
|
+
);
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Actions
|
2
|
+
|
3
|
+
private
|
4
|
+
def rsync
|
5
|
+
# puts "rsync go!"
|
6
|
+
end
|
7
|
+
|
8
|
+
def clones options
|
9
|
+
src = Site.new options[:src]
|
10
|
+
# fail ProjectMismatch unless @project_id == src.project_id
|
11
|
+
|
12
|
+
puts "cloning #{src.project_name}.#{src.name} to #{@project_name}.#{@name}"
|
13
|
+
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/config.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
DB_BACKEND = :sqlite3
|
2
|
+
DB_CONFIG = {
|
3
|
+
:info => "info.db",
|
4
|
+
:actions => "actions.db"
|
5
|
+
}
|
6
|
+
INFO = {
|
7
|
+
:sites => [ :rowid, :name, :project, :root, :commit, :commit_time ],
|
8
|
+
:projects => [ :rowid, :name, :git ]
|
9
|
+
}
|
10
|
+
ACTIONS = {
|
11
|
+
:clones => [ :rowid, :status, :src, :site ],
|
12
|
+
:upgrades => [ :rowid, :status, :site, :component, :file ],
|
13
|
+
:commits => [ :rowid, :status, :site, :requested_commit ]
|
14
|
+
}
|
15
|
+
ACTIONS_PATH = "./actions"
|
16
|
+
NAME = "devel"
|
data/db_sqlite3.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
|
3
|
+
module SQLite3Tools
|
4
|
+
class ::Array
|
5
|
+
def sqlite3_to_str
|
6
|
+
self.map { |sym| "`" + sym.to_s + "`" }.join(", ")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class ::Array
|
11
|
+
def to_hash other
|
12
|
+
Hash[ *( 0...self.size() ).inject( [] ) { |arr, ix| arr.push( other[ix], self[ix] ) } ]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class SQLite3::Database
|
17
|
+
def select columns, query
|
18
|
+
result = [];
|
19
|
+
self.execute "SELECT #{columns.sqlite3_to_str} #{query}" do |row|
|
20
|
+
result.push ( row.to_hash columns )
|
21
|
+
end
|
22
|
+
result
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Backend < SiteManager
|
28
|
+
|
29
|
+
include SQLite3Tools
|
30
|
+
|
31
|
+
def initialize db_paths
|
32
|
+
dbs = db_prepare db_paths
|
33
|
+
@info_db = dbs[:info]
|
34
|
+
@action_db = dbs[:actions]
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def db_prepare db_paths
|
39
|
+
|
40
|
+
def db_initialize type, db
|
41
|
+
sql = File.read "#{type}.sql"
|
42
|
+
db.execute_batch sql
|
43
|
+
end
|
44
|
+
|
45
|
+
dbs = {}
|
46
|
+
db_paths.each do |type, path|
|
47
|
+
dbs[type] = [ ( File.exists? path ), ( SQLite3::Database.new path ) ]
|
48
|
+
end
|
49
|
+
|
50
|
+
# Set sqlite3 options here
|
51
|
+
dbs.each do |type, db|
|
52
|
+
db[1].type_translation = true
|
53
|
+
end
|
54
|
+
|
55
|
+
dbs.each do |type, db|
|
56
|
+
begin
|
57
|
+
( db_initialize type, db[1] ) unless db[0]
|
58
|
+
rescue
|
59
|
+
File.delete db_paths[type]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
dbs.each do |type, db|
|
64
|
+
dbs[type] = db[1]
|
65
|
+
end
|
66
|
+
|
67
|
+
return dbs
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
def make_placeholders n
|
73
|
+
n = n - 1
|
74
|
+
placeholders = "?"
|
75
|
+
n.times { placeholders << ", ?" }
|
76
|
+
placeholders
|
77
|
+
end
|
78
|
+
|
79
|
+
public
|
80
|
+
def select_all_actions_by_status action, fields, status
|
81
|
+
query = "FROM `#{action}` WHERE `status` = '#{status}'"
|
82
|
+
rows = @action_db.select fields, query
|
83
|
+
|
84
|
+
h = { :action => action }
|
85
|
+
rows.map { |t| t.merge h }
|
86
|
+
end
|
87
|
+
|
88
|
+
def insert_action table, data
|
89
|
+
@action_db.execute "INSERT INTO #{table} VALUES ( ?, #{make_placeholders data.length} )", ( data.values.insert 1, "pending" )
|
90
|
+
@action_db.last_insert_row_id
|
91
|
+
end
|
92
|
+
|
93
|
+
def delete_action_by_id action, id
|
94
|
+
# puts "DELETE FROM `#{action}` WHERE `rowid` = #{id}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def select_info_by_id table, fields, id
|
98
|
+
info = @info_db.select fields, "FROM `#{table}` WHERE `rowid` = '#{id}'"
|
99
|
+
info.first
|
100
|
+
end
|
101
|
+
|
102
|
+
def select_info_by_name table, fields, name
|
103
|
+
info = @info_db.select fields, "FROM `#{table}` WHERE `name` = '#{name}'"
|
104
|
+
info.first
|
105
|
+
end
|
106
|
+
|
107
|
+
def insert_info table, data
|
108
|
+
@info_db.execute "INSERT INTO #{table} VALUES ( #{make_placeholders data.length} )", data.values
|
109
|
+
@info_db.last_insert_row_id
|
110
|
+
end
|
111
|
+
end
|
data/info.sql
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
CREATE TABLE "permissions" (
|
2
|
+
"name" INTEGER NOT NULL,
|
3
|
+
"site" INTEGER NOT NULL
|
4
|
+
);
|
5
|
+
CREATE TABLE projects (
|
6
|
+
"name" TEXT NOT NULL,
|
7
|
+
"git" TEXT NOT NULL
|
8
|
+
);
|
9
|
+
CREATE TABLE sites (
|
10
|
+
"name" TEXT NOT NULL,
|
11
|
+
"project" INTEGER NOT NULL,
|
12
|
+
"root" TEXT NOT NULL,
|
13
|
+
"commit" TEXT,
|
14
|
+
"commit_time" INTEGER
|
15
|
+
);
|
data/info/devel.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
class Site
|
2
|
+
|
3
|
+
def insert_new
|
4
|
+
@project_id = insert_new_project unless @project_id
|
5
|
+
|
6
|
+
data = { :name => @name, :project => @project_id, :root => @root, :commit => nil, :commit_time => nil }
|
7
|
+
@@db.insert_info :sites, data
|
8
|
+
end
|
9
|
+
|
10
|
+
def insert_new_project
|
11
|
+
|
12
|
+
fail DuplicateAttr if @@db.select_info_by_name :projects, [ :name ], @project_name
|
13
|
+
|
14
|
+
data = { :project => @project_name, :git => @git }
|
15
|
+
@@db.insert_info :projects, data
|
16
|
+
end
|
17
|
+
|
18
|
+
def load_info
|
19
|
+
|
20
|
+
info = @@db.select_info_by_id :sites, @@info[:sites], @id
|
21
|
+
|
22
|
+
@name = info[:name]
|
23
|
+
@project_id = info[:project]
|
24
|
+
|
25
|
+
project_info = @@db.select_info_by_id :projects, @@info[:projects], @project_id
|
26
|
+
info.merge! project_info
|
27
|
+
|
28
|
+
@project_name = info[:name]
|
29
|
+
@root = info[:root]
|
30
|
+
@git = info[:git_path]
|
31
|
+
@commit = { :name => info[:commit], :time => info[:commit_time] }
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/site.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
class Site < SiteManager
|
2
|
+
|
3
|
+
attr_reader :id
|
4
|
+
|
5
|
+
def initialize info
|
6
|
+
|
7
|
+
if info.is_a? Integer
|
8
|
+
@id = info
|
9
|
+
else
|
10
|
+
make_ivars info
|
11
|
+
@id = insert_new
|
12
|
+
end
|
13
|
+
|
14
|
+
load_info
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def make_ivars hash
|
19
|
+
hash.each do |ivar, val|
|
20
|
+
self.class.send :attr_accessor, ivar unless respond_to? ivar
|
21
|
+
send "#{ivar}=", val
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Add a task to the array of pending tasks in @tasks.
|
26
|
+
#
|
27
|
+
# ==== Attributes
|
28
|
+
#
|
29
|
+
# * +task+ - Hash that describes the task. Must contain the keys :rowid and :action.
|
30
|
+
#
|
31
|
+
# ==== Examples
|
32
|
+
#
|
33
|
+
# Adding a task to clone site 2 from site 1
|
34
|
+
#
|
35
|
+
# s = Site.new 42
|
36
|
+
# t = {:rowid=>1, :src=>1, :site=>2, :action=>:clones}
|
37
|
+
# s.add_task t
|
38
|
+
def add_task task
|
39
|
+
@tasks = [] unless @tasks
|
40
|
+
@tasks << task
|
41
|
+
end
|
42
|
+
|
43
|
+
# Removes a task from list of pending tasks in @tasks
|
44
|
+
#
|
45
|
+
# ==== Attributes
|
46
|
+
#
|
47
|
+
# * +task+ - Hash that describes the task. Must contain the keys :rowid and :action.
|
48
|
+
#
|
49
|
+
# ==== Examples
|
50
|
+
#
|
51
|
+
# Removing a task to clone site 2 from site 1
|
52
|
+
#
|
53
|
+
# s = Site.new 42
|
54
|
+
# t = {:rowid=>1, :src=>1, :site=>2, :action=>:clones}
|
55
|
+
# s.clear_task t
|
56
|
+
def clear_task task
|
57
|
+
|
58
|
+
action = task[:action]
|
59
|
+
id = task[:rowid]
|
60
|
+
|
61
|
+
@@db.delete_action_by_id action, id
|
62
|
+
end
|
63
|
+
|
64
|
+
# Runs all tasks in the list of pending tasks in @tasks. Removes the task on sucess or BadTask.
|
65
|
+
def run_all
|
66
|
+
|
67
|
+
tasks = @tasks
|
68
|
+
|
69
|
+
|
70
|
+
tasks.each do |t|
|
71
|
+
self.send t[:action], t
|
72
|
+
clear_task t
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class DuplicateAttr < RuntimeError
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Evan Boyd Sosenko
|
@@ -27,7 +27,20 @@ extensions: []
|
|
27
27
|
extra_rdoc_files: []
|
28
28
|
|
29
29
|
files:
|
30
|
+
- info.sql
|
31
|
+
- actions.sql
|
32
|
+
- ./info/devel.rb
|
33
|
+
- ./site_manager.rb
|
34
|
+
- ./actions/commits/otr.rb
|
35
|
+
- ./actions/clones/otr.rb
|
36
|
+
- ./actions/upgrades/otr.rb
|
37
|
+
- ./config.rb
|
38
|
+
- ./db_sqlite3.rb
|
39
|
+
- ./site.rb
|
30
40
|
- site_manager.rb
|
41
|
+
- config.rb
|
42
|
+
- db_sqlite3.rb
|
43
|
+
- site.rb
|
31
44
|
has_rdoc: true
|
32
45
|
homepage:
|
33
46
|
licenses:
|