This repository has been archived by the owner on Oct 17, 2020. It is now read-only.
forked from apache/buildr
-
Notifications
You must be signed in to change notification settings - Fork 11
/
shell.rb
180 lines (149 loc) · 4.03 KB
/
shell.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with this
# work for additional information regarding copyright ownership. The ASF
# licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
module Buildr
module ShellProviders
class << self
def add(p)
@providers ||= {}
if p.lang == :none
@providers[:none] ||= []
@providers[:none] << p
else
@providers[p.lang] = p
end
end
alias :<< :add
def providers
@providers ||= {}
end
def each
providers.each do |lang, p|
if lang == :none
p.each do |x|
yield x
end
else
yield p
end
end
end
end
end
module Shell
class Base
attr_reader :project
class << self
def lang
:none
end
def to_sym
@symbol ||= name.split('::').last.downcase.to_sym
end
end
def initialize(project)
@project = project
end
def build?
true
end
def launch
fail 'Not implemented'
end
end
module JavaRebel
def rebel_home
unless @rebel_home
@rebel_home = ENV['REBEL_HOME'] or ENV['JAVA_REBEL'] or ENV['JAVAREBEL'] or ENV['JAVAREBEL_HOME']
if @rebel_home and File.directory? @rebel_home
@rebel_home += File::SEPARATOR + 'javarebel.jar'
end
end
if @rebel_home and File.exists? @rebel_home
@rebel_home
else
nil
end
end
def rebel_args
if rebel_home
[
'-noverify',
"-javaagent:#{rebel_home}"
]
else
[]
end
end
def rebel_props(project)
{}
end
end
end
module ShellExtension
include Extension
first_time do
Project.local_task 'shell'
ShellProviders.each { |p| Project.local_task "shell:#{p.to_sym}" } # TODO not working
end
before_define do |project|
ShellProviders.each do |p|
name = p.to_sym
trace "Defining task #{project.name}:shell:#{name}"
p_inst = p.new project
deps = if p_inst.build? then [:compile] else [] end
project.task "shell:#{name}" => deps do
trace "Launching #{name} shell"
p_inst.launch
end
end
end
after_define do |project|
default_shell = project.shell.using
if default_shell
dep = "shell:#{default_shell.to_sym}"
trace "Defining task shell based on #{dep}"
project.task :shell => dep
else
project.task :shell do
fail "No shell provider defined for language '#{project.compile.language}'"
end
end
end
class ShellConfig
def initialize(project)
@project = project
end
def using(*args)
if args.size > 0
@using ||= args.first
else
@using ||= find_shell_task
end
end
private
def find_shell_task
lang = @project.compile.language
ShellProviders.providers[lang]
end
end
# TODO temporary hack
def shell
@shell ||= ShellConfig.new self
end
end
class Project
include ShellExtension
end
end