redmine-installer 1.0.7 → 2.0.0.rc1
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 +4 -0
- data/.travis.yml +7 -0
- data/Gemfile +3 -15
- data/README.md +49 -177
- data/bin/redmine +4 -5
- data/lib/redmine-installer/backup.rb +13 -40
- data/lib/redmine-installer/cli.rb +92 -61
- data/lib/redmine-installer/command.rb +63 -117
- data/lib/redmine-installer/configuration.rb +148 -0
- data/lib/redmine-installer/database.rb +204 -0
- data/lib/redmine-installer/environment.rb +21 -0
- data/lib/redmine-installer/errors.rb +7 -0
- data/lib/redmine-installer/install.rb +37 -42
- data/lib/redmine-installer/logger.rb +83 -0
- data/lib/redmine-installer/package.rb +180 -0
- data/lib/redmine-installer/patches/ruby.rb +35 -0
- data/lib/redmine-installer/patches/tty.rb +16 -0
- data/lib/redmine-installer/profile.rb +24 -55
- data/lib/redmine-installer/redmine.rb +551 -0
- data/lib/redmine-installer/spec/spec.rb +81 -0
- data/lib/redmine-installer/task.rb +18 -77
- data/lib/redmine-installer/task_module.rb +12 -0
- data/lib/redmine-installer/upgrade.rb +51 -59
- data/lib/redmine-installer/utils.rb +46 -233
- data/lib/redmine-installer/version.rb +2 -4
- data/lib/redmine-installer.rb +69 -56
- data/redmine-installer.gemspec +20 -19
- data/spec/custom_matchers.rb +21 -0
- data/spec/installer_helper.rb +107 -0
- data/spec/installer_process.rb +82 -0
- data/spec/lib/backup_restore_spec.rb +81 -0
- data/spec/lib/install_spec.rb +125 -36
- data/spec/lib/upgrade_spec.rb +73 -52
- data/spec/packages/redmine-3.1.0.zip +0 -0
- data/spec/packages/redmine-3.2.0.zip +0 -0
- data/spec/packages/redmine-3.3.0-bad-migration.zip +0 -0
- data/spec/packages/redmine-3.3.0.zip +0 -0
- data/spec/packages/something-else.zip +0 -0
- data/spec/packages_helper.rb +19 -0
- data/spec/shared_contexts.rb +13 -0
- data/spec/spec_helper.rb +34 -18
- metadata +62 -63
- data/lib/redmine-installer/config_param.rb +0 -100
- data/lib/redmine-installer/error.rb +0 -5
- data/lib/redmine-installer/exec.rb +0 -158
- data/lib/redmine-installer/ext/module.rb +0 -7
- data/lib/redmine-installer/ext/string.rb +0 -15
- data/lib/redmine-installer/git.rb +0 -51
- data/lib/redmine-installer/helper.rb +0 -5
- data/lib/redmine-installer/helpers/generate_config.rb +0 -29
- data/lib/redmine-installer/locales/cs.yml +0 -147
- data/lib/redmine-installer/locales/en.yml +0 -154
- data/lib/redmine-installer/plugin.rb +0 -9
- data/lib/redmine-installer/plugins/base.rb +0 -24
- data/lib/redmine-installer/plugins/database.rb +0 -180
- data/lib/redmine-installer/plugins/email_sending.rb +0 -82
- data/lib/redmine-installer/plugins/redmine_plugin.rb +0 -82
- data/lib/redmine-installer/plugins/web_server.rb +0 -26
- data/lib/redmine-installer/step.rb +0 -16
- data/lib/redmine-installer/steps/backup.rb +0 -125
- data/lib/redmine-installer/steps/base.rb +0 -79
- data/lib/redmine-installer/steps/database_config.rb +0 -15
- data/lib/redmine-installer/steps/email_config.rb +0 -11
- data/lib/redmine-installer/steps/env_check.rb +0 -20
- data/lib/redmine-installer/steps/install.rb +0 -23
- data/lib/redmine-installer/steps/load_package.rb +0 -226
- data/lib/redmine-installer/steps/move_redmine.rb +0 -22
- data/lib/redmine-installer/steps/redmine_root.rb +0 -52
- data/lib/redmine-installer/steps/upgrade.rb +0 -57
- data/lib/redmine-installer/steps/validation.rb +0 -38
- data/lib/redmine-installer/steps/webserver_config.rb +0 -22
- data/spec/load_redmine.rb +0 -24
@@ -1,100 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# Class for easyier handle configuration parameters
|
3
|
-
#
|
4
|
-
# == Examples:
|
5
|
-
#
|
6
|
-
# params = Redmine::Installer::ConfigParams.new
|
7
|
-
# params.add('database')
|
8
|
-
# params.add('host').note('this is a host').default('localhost')
|
9
|
-
#
|
10
|
-
module Redmine::Installer
|
11
|
-
class ConfigParams
|
12
|
-
def initialize
|
13
|
-
@params = []
|
14
|
-
end
|
15
|
-
|
16
|
-
def [](key)
|
17
|
-
@params.detect{|p| p.name == key}
|
18
|
-
end
|
19
|
-
|
20
|
-
def for_asking
|
21
|
-
@for_asking ||= @params.select{|p| p.ask}
|
22
|
-
end
|
23
|
-
|
24
|
-
def add(name)
|
25
|
-
param = ConfigParam.new(name)
|
26
|
-
@params << param
|
27
|
-
param
|
28
|
-
end
|
29
|
-
|
30
|
-
def each(&block)
|
31
|
-
@params.each(&block)
|
32
|
-
end
|
33
|
-
|
34
|
-
def map(&block)
|
35
|
-
@params.map(&block)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class ConfigParam
|
40
|
-
|
41
|
-
@@attributes = []
|
42
|
-
|
43
|
-
def self.attribute(name, default=nil)
|
44
|
-
eval <<-EVAL
|
45
|
-
def #{name}(value=nil)
|
46
|
-
return @#{name} if value.nil?
|
47
|
-
self.#{name} = value
|
48
|
-
end
|
49
|
-
|
50
|
-
def #{name}=(value)
|
51
|
-
@#{name} = value
|
52
|
-
end
|
53
|
-
EVAL
|
54
|
-
|
55
|
-
@@attributes << [name, default]
|
56
|
-
end
|
57
|
-
|
58
|
-
attribute :name
|
59
|
-
attribute :note
|
60
|
-
attribute :default
|
61
|
-
attribute :value
|
62
|
-
attribute :ask, true
|
63
|
-
attribute :hide, false
|
64
|
-
|
65
|
-
def initialize(name)
|
66
|
-
# Default
|
67
|
-
@@attributes.each{|(k,v)| set(k,v)}
|
68
|
-
|
69
|
-
set(:name, name)
|
70
|
-
end
|
71
|
-
|
72
|
-
# Return string for print
|
73
|
-
def title
|
74
|
-
out = name.capitalize
|
75
|
-
out << " (#{note})" if note
|
76
|
-
out
|
77
|
-
end
|
78
|
-
|
79
|
-
def set(key, value)
|
80
|
-
self.send("#{key}=", value)
|
81
|
-
self
|
82
|
-
end
|
83
|
-
|
84
|
-
def default(value=nil)
|
85
|
-
return @default if value.nil?
|
86
|
-
|
87
|
-
self.default = value
|
88
|
-
self.value = value if self.value.nil?
|
89
|
-
self
|
90
|
-
end
|
91
|
-
|
92
|
-
def hide(value=nil)
|
93
|
-
return @hide if value.nil?
|
94
|
-
|
95
|
-
self.hide = value
|
96
|
-
self
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
@@ -1,158 +0,0 @@
|
|
1
|
-
require 'open3'
|
2
|
-
|
3
|
-
##
|
4
|
-
# Executions commands with timer and error handling
|
5
|
-
#
|
6
|
-
module Redmine::Installer
|
7
|
-
class Exec
|
8
|
-
|
9
|
-
include Redmine::Installer::Utils
|
10
|
-
|
11
|
-
REFRESH_TIMER = 1 # in s
|
12
|
-
|
13
|
-
attr_reader :stdout, :stderr
|
14
|
-
|
15
|
-
def initialize(command, title=nil, timer=true)
|
16
|
-
@command = command
|
17
|
-
|
18
|
-
with_title(title)
|
19
|
-
with_timer(timer)
|
20
|
-
end
|
21
|
-
|
22
|
-
def with_title(title)
|
23
|
-
if title.is_a?(Symbol)
|
24
|
-
title = I18n.translate(title)
|
25
|
-
end
|
26
|
-
|
27
|
-
@title = title
|
28
|
-
self
|
29
|
-
end
|
30
|
-
|
31
|
-
def with_timer(yes_no)
|
32
|
-
if $stdout.tty?
|
33
|
-
@with_timer = yes_no
|
34
|
-
else
|
35
|
-
@with_timer = false
|
36
|
-
end
|
37
|
-
self
|
38
|
-
end
|
39
|
-
|
40
|
-
def run(repeatable=false)
|
41
|
-
show_title
|
42
|
-
|
43
|
-
Open3.popen3(@command) do |stdin, stdout, stderr, wait_thr|
|
44
|
-
# log = StringIO.new
|
45
|
-
# redirect_stream(stdout, log)
|
46
|
-
# redirect_stream(stderr, log)
|
47
|
-
|
48
|
-
# For example: rake db:create can ask for root login
|
49
|
-
# if current setting does not work
|
50
|
-
# stdin.closes
|
51
|
-
|
52
|
-
exit_status = wait_thr.value
|
53
|
-
@stdout = stdout.read
|
54
|
-
@stderr = stderr.read
|
55
|
-
|
56
|
-
stop_timer
|
57
|
-
if exit_status.success?
|
58
|
-
print_result(true)
|
59
|
-
@return_value = true
|
60
|
-
else
|
61
|
-
print_result(false)
|
62
|
-
@return_value = false
|
63
|
-
# raise Redmine::Installer::Error, stderr.read
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
unless success
|
68
|
-
# print_error
|
69
|
-
if repeatable && repeat?
|
70
|
-
return run(repeatable)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
return success
|
75
|
-
ensure
|
76
|
-
# stop_timer
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
|
81
|
-
def print_error
|
82
|
-
message = '<red>'
|
83
|
-
message << '--------------------------------------------------------------'
|
84
|
-
message << "\n"
|
85
|
-
message << stderr
|
86
|
-
message << '--------------------------------------------------------------'
|
87
|
-
message << '</red>'
|
88
|
-
colorize(message)
|
89
|
-
|
90
|
-
$stderr.puts(message)
|
91
|
-
$stderr.flush
|
92
|
-
end
|
93
|
-
|
94
|
-
def repeat?
|
95
|
-
confirm(:do_you_want_repeat_command, false)
|
96
|
-
end
|
97
|
-
|
98
|
-
def show_title
|
99
|
-
if @with_timer
|
100
|
-
@timer = start_timer
|
101
|
-
else
|
102
|
-
$stdout.print(@title)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def start_timer
|
107
|
-
Thread.new do
|
108
|
-
counter = 0
|
109
|
-
|
110
|
-
loop {
|
111
|
-
hours, seconds = counter.divmod(3600)
|
112
|
-
minutes, seconds = seconds.divmod(60)
|
113
|
-
|
114
|
-
printf "[%02d:%02d:%02d] %s\r", hours, minutes, seconds, @title
|
115
|
-
counter += REFRESH_TIMER
|
116
|
-
sleep(REFRESH_TIMER)
|
117
|
-
}
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def stop_timer
|
122
|
-
if @timer
|
123
|
-
@timer.kill
|
124
|
-
|
125
|
-
# Clean line
|
126
|
-
print ' ' * 100
|
127
|
-
print "\r"
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def print_result(ok=true)
|
132
|
-
if ok
|
133
|
-
out = $stdout
|
134
|
-
message = '... OK'
|
135
|
-
else
|
136
|
-
out = $stderr
|
137
|
-
message = '... FAIL'
|
138
|
-
end
|
139
|
-
|
140
|
-
if @with_timer
|
141
|
-
out.puts("#{@title} #{message}")
|
142
|
-
else
|
143
|
-
out.print(message)
|
144
|
-
end
|
145
|
-
|
146
|
-
out.flush
|
147
|
-
end
|
148
|
-
|
149
|
-
def redirect_stream(stream, out)
|
150
|
-
Thread.new do
|
151
|
-
while (line = stream.gets)
|
152
|
-
out.puts(line)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
end
|
158
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class String
|
2
|
-
unless method_defined?(:camelize)
|
3
|
-
# Base on ActiveSupport method
|
4
|
-
def camelize
|
5
|
-
self.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
unless method_defined?(:underscore)
|
10
|
-
def underscore
|
11
|
-
self.gsub(/\A([A-Z])/){$1.downcase}
|
12
|
-
.gsub(/([A-Z])/){'_'+$1.downcase}
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Redmine::Installer
|
2
|
-
class Git
|
3
|
-
|
4
|
-
# Simple git clone. Create a shallow clone with 1 revision.
|
5
|
-
#
|
6
|
-
# - download specific branch
|
7
|
-
# - single branch
|
8
|
-
# - store repository to target
|
9
|
-
#
|
10
|
-
def self.clone(remote, target, branch='master')
|
11
|
-
success = Kernel.system("git clone --branch #{branch} --single-branch --depth 1 #{remote} #{target}")
|
12
|
-
|
13
|
-
unless success
|
14
|
-
error :git_repository_cannot_be_clonned
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# Git repository is locally clonned to target. On copied git is
|
19
|
-
# executed `git fetch` (for preserve changes)
|
20
|
-
#
|
21
|
-
def self.copy_and_fetch(repository, target)
|
22
|
-
url = ''
|
23
|
-
# Store original remote url because copied repository will
|
24
|
-
# have remote set to local repo
|
25
|
-
Dir.chdir(repository) do
|
26
|
-
url = `git config --get remote.origin.url`.strip
|
27
|
-
end
|
28
|
-
|
29
|
-
success = Kernel.system("git clone --depth 1 --no-local #{repository} #{target}")
|
30
|
-
|
31
|
-
unless success
|
32
|
-
error :git_repository_cannot_be_localy_clonned
|
33
|
-
end
|
34
|
-
|
35
|
-
# Change remote to origin and run fetch
|
36
|
-
Dir.chdir(target) do
|
37
|
-
Kernel.system("git remote set-url origin #{url}")
|
38
|
-
success = Kernel.system('git fetch')
|
39
|
-
end
|
40
|
-
|
41
|
-
unless success
|
42
|
-
error :git_repository_cannot_be_fetched
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.error(message)
|
47
|
-
raise Redmine::Installer::Error, I18n.translate(message)
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Redmine::Installer::Helper
|
2
|
-
module GenerateConfig
|
3
|
-
|
4
|
-
def create_for(type)
|
5
|
-
choices = {}
|
6
|
-
type.all.each do |m|
|
7
|
-
choices[m] = m.title
|
8
|
-
end
|
9
|
-
choices[nil] = t(:skip)
|
10
|
-
|
11
|
-
# answer = choose(:"what_#{type.class_name.downcase}_do_you_want", choices, default: nil)
|
12
|
-
answer = choose(nil, choices, default: nil)
|
13
|
-
|
14
|
-
# Skip
|
15
|
-
return false if answer.nil?
|
16
|
-
|
17
|
-
instance = answer.new
|
18
|
-
|
19
|
-
say("(#{instance.class.title})", 2)
|
20
|
-
instance.params.for_asking.each do |p|
|
21
|
-
p.value = ask(p.title, default: p.default, hide: p.hide)
|
22
|
-
end
|
23
|
-
|
24
|
-
instance.make_config(base.tmp_redmine_root)
|
25
|
-
return true
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
@@ -1,147 +0,0 @@
|
|
1
|
-
cs:
|
2
|
-
redmine_installer_summary: 'Snadný způsob instalace/upgradu redmine.'
|
3
|
-
backup: 'Záloha'
|
4
|
-
backup_is_stored_at: 'Záloha je uložena <bright>%{dir}</bright>'
|
5
|
-
cli_install_desc: 'Instalace'
|
6
|
-
cli_show_verbose_output: 'Zobrazení debug výstupu'
|
7
|
-
cli_upgrade_desc: 'Aktualizace redmine'
|
8
|
-
cli_backup_desc: 'Záloha'
|
9
|
-
cli_flag_source: 'Jaký typ je balíček'
|
10
|
-
cli_flag_branch: 'Jiná větev gitu'
|
11
|
-
cli_flag_environment: 'Prostředí redminu'
|
12
|
-
command_exit_with_error: 'Příkaz skončil s chybou: <bright>%{command}</bright>'
|
13
|
-
dir_not_exist_and_cannot_be_created: 'Složka %{dir} neexistuje a nemůže být vytvořena'
|
14
|
-
dir_is_not_writeable: 'Složka <bright>%{dir}</bright> není zapisovatelná'
|
15
|
-
do_you_want_repeat_command: 'Chcete opakovat příkaz?'
|
16
|
-
do_you_want_full_backup: 'Chcete plnou zálohu?'
|
17
|
-
do_you_want_backup_redmine: 'Chcete zálohovat redmine?'
|
18
|
-
do_you_want_save_step_for_further_use: 'Chcete uložit kroky pro využití v budoucnu'
|
19
|
-
error_redmine_not_contains_all: 'Redmine root neobsahuje tyto záznamy: <bright>%{records}</bright>'
|
20
|
-
error_plugins_should_be_on_plugins: 'Plugin by měl být v plugins složce'
|
21
|
-
error_argument_package_is_missing: 'Chybý argument: redmine package'
|
22
|
-
error_unsupported_source: 'Nepodporovaný zdroj: %{source}'
|
23
|
-
exit: 'exit'
|
24
|
-
file_not_exist: 'Soubor <bright>%{file}</bright> neexistuje'
|
25
|
-
file_must_have_format: 'Soubor <bright>%{file}</bright> musí mít formát: %{formats}'
|
26
|
-
full_backup: 'Plná záloha'
|
27
|
-
git_repository_cannot_be_clonned: 'Repozitář nemůže být klonován'
|
28
|
-
git_repository_cannot_be_localy_clonned: 'Repozitář nemůže být lokálně klonován'
|
29
|
-
git_repository_cannot_be_fetched: 'Repozitář nemůže stáhnout poslední verzi'
|
30
|
-
no_t: 'ne'
|
31
|
-
only_database: 'Pouze databáze'
|
32
|
-
path_for_redmine_root: 'Cesta pro redmine_root'
|
33
|
-
powered_by: 'Powered by EasyRedmine'
|
34
|
-
restoring_database: '... Obnova database'
|
35
|
-
skip: 'Přeskočit'
|
36
|
-
try_again: 'zkusit znova'
|
37
|
-
what_dir_for_backups: 'Jaká složka pro zálohu?'
|
38
|
-
what_database_do_you_want: 'Jakou databázi chcete?'
|
39
|
-
what_web_server_do_you_want: 'Jaký web-server chcete?'
|
40
|
-
yes_t: 'ano'
|
41
|
-
your_profile_can_be_used_as: 'Váš profil je uložen jako #%{id} a může být použit s <bright>--profile %{id}</bright>'
|
42
|
-
|
43
|
-
step:
|
44
|
-
load_package:
|
45
|
-
title: 'Zpracování balíku'
|
46
|
-
database_config:
|
47
|
-
title: 'Konfigurace databáze'
|
48
|
-
email_config:
|
49
|
-
title: 'Konfigurace emailového nastavení'
|
50
|
-
install:
|
51
|
-
title: 'Installace'
|
52
|
-
move_redmine:
|
53
|
-
title: 'Přesun redmine'
|
54
|
-
webserver_config:
|
55
|
-
title: 'Webserver konfigurace'
|
56
|
-
validation:
|
57
|
-
title: 'Validace'
|
58
|
-
backup:
|
59
|
-
title: 'Záloha'
|
60
|
-
upgrade:
|
61
|
-
title: 'Aktualizace'
|
62
|
-
save_profile:
|
63
|
-
title: 'Uložení profilu'
|
64
|
-
redmine_root:
|
65
|
-
title: 'Redmine root'
|
66
|
-
|
67
|
-
plugin:
|
68
|
-
database:
|
69
|
-
mysql:
|
70
|
-
title: 'MySQL'
|
71
|
-
postgresql:
|
72
|
-
title: 'PostgreSQL'
|
73
|
-
emailsending:
|
74
|
-
gmail:
|
75
|
-
title: 'Gmail'
|
76
|
-
sendmail:
|
77
|
-
title: 'Sendmail'
|
78
|
-
smtpfromscratch:
|
79
|
-
title: 'SMTP od základu'
|
80
|
-
webserver:
|
81
|
-
webrick:
|
82
|
-
title: 'Webrick'
|
83
|
-
configuration: |
|
84
|
-
Webrick je výchozí webserver.
|
85
|
-
Server je připravený pro start.
|
86
|
-
thin:
|
87
|
-
title: 'Thin'
|
88
|
-
configuration: |
|
89
|
-
Přidejte:
|
90
|
-
<bright>gem 'thin'</bright>
|
91
|
-
|
92
|
-
do <bright>Gemfile.local</bright>
|
93
|
-
|
94
|
-
a spusťtě: <bright>bundle install</bright>
|
95
|
-
|
96
|
-
(Více informací na http://code.macournoyer.com/thin)
|
97
|
-
apachepassenger:
|
98
|
-
title: 'Passenger (apache)'
|
99
|
-
configuration: |
|
100
|
-
Přidejte toto do konfiguračního souboru.
|
101
|
-
|
102
|
-
<bright><VirtualHost *:80>
|
103
|
-
ServerName www.yourhost.com
|
104
|
-
DocumentRoot %{redmine_root}/public
|
105
|
-
<Directory %{redmine_root}/public>
|
106
|
-
# This relaxes Apache security settings.
|
107
|
-
AllowOverride all
|
108
|
-
# MultiViews must be turned off.
|
109
|
-
Options -MultiViews
|
110
|
-
# Uncomment this if you're on Apache >= 2.4:
|
111
|
-
#Require all granted
|
112
|
-
</Directory>
|
113
|
-
</VirtualHost></bright>
|
114
|
-
|
115
|
-
Více informací na https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html
|
116
|
-
nginxpassenger:
|
117
|
-
title: 'Passenger (nginx)'
|
118
|
-
configuration: |
|
119
|
-
Přidejte toto do konfiguračního souboru.
|
120
|
-
|
121
|
-
<bright>server {
|
122
|
-
listen 80;
|
123
|
-
server_name www.yourhost.com;
|
124
|
-
root %{redmine_root}/public; # <--- be sure to point to 'public'!
|
125
|
-
passenger_enabled on;
|
126
|
-
}</bright>
|
127
|
-
|
128
|
-
Více informací na https://www.phusionpassenger.com/documentation/Users%20guide%20Nginx.html
|
129
|
-
puma:
|
130
|
-
title: 'Puma'
|
131
|
-
configuration: |
|
132
|
-
Přidejte:
|
133
|
-
<bright>gem 'puma'</bright>
|
134
|
-
|
135
|
-
do <bright>Gemfile.local</bright>
|
136
|
-
|
137
|
-
Více informací na http://puma.io
|
138
|
-
redmine_plugin:
|
139
|
-
easyproject:
|
140
|
-
install: 'Easyproject instalace'
|
141
|
-
|
142
|
-
command:
|
143
|
-
bundle_install: 'Bundle install'
|
144
|
-
rake_db_create: 'DB creating'
|
145
|
-
rake_db_migrate: 'DB migrating'
|
146
|
-
rake_redmine_plugin_migrate: 'Plugin migrating'
|
147
|
-
rake_generate_secret_token: 'Generate secret token'
|