gjp 0.18.0 → 0.19.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.
- data/integration-tests/{commons-io.sh → commons-collections.sh} +1 -1
- data/lib/gjp.rb +2 -1
- data/lib/gjp/cli.rb +96 -54
- data/lib/gjp/git.rb +68 -0
- data/lib/gjp/package_spec_adapter.rb +2 -0
- data/lib/gjp/pom.rb +10 -10
- data/lib/gjp/project.rb +31 -84
- data/lib/gjp/{scaffolder.rb → spec_generator.rb} +12 -15
- data/lib/gjp/version.rb +1 -1
- data/lib/template/kit.spec +0 -2
- data/lib/template/kit/CONTENTS +5 -6
- data/lib/template/package.spec +1 -1
- data/lib/template/src/CONTENTS +3 -10
- data/spec/lib/project_spec.rb +13 -20
- data/spec/lib/{scaffolder_spec.rb → spec_generator_spec.rb} +17 -18
- metadata +6 -6
- data/lib/template/kit/README.SUSE +0 -4
data/lib/gjp.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "gjp/version"
|
2
2
|
require "gjp/logger"
|
3
3
|
require "gjp/template_manager"
|
4
|
+
require "gjp/git"
|
4
5
|
require "gjp/project"
|
5
6
|
require "gjp/pom"
|
6
7
|
require "gjp/version_matcher"
|
@@ -12,7 +13,7 @@ require "gjp/source_getter"
|
|
12
13
|
require "gjp/parent_pom_getter"
|
13
14
|
require "gjp/maven_runner"
|
14
15
|
require "gjp/package_spec_adapter"
|
15
|
-
require "gjp/
|
16
|
+
require "gjp/spec_generator"
|
16
17
|
require "gjp/archiver"
|
17
18
|
|
18
19
|
require "gjp/cli"
|
data/lib/gjp/cli.rb
CHANGED
@@ -38,23 +38,26 @@ module Gjp
|
|
38
38
|
# Subcommands
|
39
39
|
subcommand "init", "Inits a gjp project in the current directory" do
|
40
40
|
def execute
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
checking_exceptions do
|
42
|
+
Gjp::Project.init(".")
|
43
|
+
puts "Project inited."
|
44
|
+
puts "Any file added to kit/ will be added to the kit package."
|
45
|
+
puts "Any file added to src/<name> will be added to the corresponding package."
|
46
|
+
puts "When you are ready to test a build, use \"gjp dry-run\"."
|
47
|
+
end
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
49
51
|
subcommand "dry-run", "Starts a dry-run build" do
|
50
52
|
def execute
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
checking_exceptions do
|
54
|
+
if Gjp::Project.new(".").dry_run
|
55
|
+
puts "Now dry-running, please start your build."
|
56
|
+
puts "Any file added to kit/, presumably downloaded dependencies, will be added to the kit."
|
57
|
+
puts "The src/ directory and all files in it will be brought back to the current state when finished."
|
58
|
+
puts "To run Maven from the kit, use \"gjp mvn\"."
|
59
|
+
puts "To end this dry run, use \"gjp finish\"."
|
60
|
+
end
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
@@ -68,55 +71,61 @@ module Gjp
|
|
68
71
|
end
|
69
72
|
|
70
73
|
def execute
|
71
|
-
|
74
|
+
checking_exceptions do
|
72
75
|
project = Gjp::Project.new(".")
|
73
76
|
result = Gjp::MavenRunner.new(project).mvn(@maven_options)
|
74
77
|
puts "Real commandline was:"
|
75
78
|
puts "#{result}"
|
76
|
-
rescue Gjp::MavenNotFoundException
|
77
|
-
puts "mvn executable not found in kit/ or any of its subdirectories"
|
78
79
|
end
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
82
83
|
subcommand "finish", "Ends the current dry-run" do
|
83
84
|
def execute
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
85
|
+
checking_exceptions do
|
86
|
+
if Gjp::Project.new(".").finish
|
87
|
+
puts "Dry-run finished."
|
88
|
+
else
|
89
|
+
puts "No dry-run is in progress."
|
90
|
+
end
|
88
91
|
end
|
89
92
|
end
|
90
93
|
end
|
91
94
|
|
92
|
-
subcommand "generate-kit-spec", "
|
95
|
+
subcommand "generate-kit-spec", "Creates or refreshes a spec file for the kit" do
|
93
96
|
def execute
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
+
checking_exceptions do
|
98
|
+
project = Gjp::Project.new(".")
|
99
|
+
result_path = Gjp::SpecGenerator.new(project).generate_kit_spec
|
100
|
+
puts "#{result_path} generated"
|
101
|
+
end
|
97
102
|
end
|
98
103
|
end
|
99
104
|
|
100
105
|
subcommand "generate-kit-archive", "Archives contents of kit in archives/" do
|
101
106
|
def execute
|
102
|
-
|
103
|
-
|
104
|
-
|
107
|
+
checking_exceptions do
|
108
|
+
project = Gjp::Project.new(".")
|
109
|
+
result_path = Gjp::Archiver.new(project).archive_kit
|
110
|
+
puts "#{result_path} generated"
|
111
|
+
end
|
105
112
|
end
|
106
113
|
end
|
107
114
|
|
108
|
-
subcommand "generate-package-spec", "
|
115
|
+
subcommand "generate-package-spec", "Creates or refreshes a spec file for a package" do
|
109
116
|
option ["-f", "--filter"], "FILTER", "filter files to be installed by this spec", :default => "*.jar"
|
110
117
|
parameter "NAME", "name of a package, that is, an src/ subdirectory name"
|
111
118
|
parameter "POM", "a pom file path or URI"
|
112
119
|
def execute
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
+
checking_exceptions do
|
121
|
+
project = Gjp::Project.new(".")
|
122
|
+
result_path = Gjp::SpecGenerator.new(project).generate_package_spec name, pom, filter
|
123
|
+
if result_path != nil
|
124
|
+
puts "#{result_path} generated"
|
125
|
+
else
|
126
|
+
$stderr.puts "file_list/#{name}_output not found. Ensure you have already run a" +
|
127
|
+
"\"gjp dry run\" and \"gjp finish\"."
|
128
|
+
end
|
120
129
|
end
|
121
130
|
end
|
122
131
|
end
|
@@ -124,47 +133,57 @@ module Gjp
|
|
124
133
|
subcommand "generate-package-archive", "Archives contents of a package in archives/" do
|
125
134
|
parameter "NAME", "name of a package, that is, an src/ subdirectory name"
|
126
135
|
def execute
|
127
|
-
|
128
|
-
|
129
|
-
|
136
|
+
checking_exceptions do
|
137
|
+
project = Gjp::Project.new(".")
|
138
|
+
result_path = Gjp::Archiver.new(project).archive_package name
|
139
|
+
puts "#{result_path} generated"
|
140
|
+
end
|
130
141
|
end
|
131
142
|
end
|
132
143
|
|
133
144
|
subcommand "set-up-nonet-user", "Sets up a \"nonet\" user that cannot access the network" do
|
134
145
|
def execute
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
146
|
+
checking_exceptions do
|
147
|
+
user = Gjp::LimitedNetworkUser.new("nonet")
|
148
|
+
user.set_up
|
149
|
+
|
150
|
+
"sudo #{user.get_path("useradd")} nonet\n" +
|
151
|
+
"sudo #{user.get_path("iptables")} -A OUTPUT -m owner --uid-owner nonet -j DROP\n" +
|
152
|
+
"User \"nonet\" set up, you can use \"sudo nonet\" to dry-run your build with no network access.\n" +
|
153
|
+
"Note that the above iptables rule will be cleared at next reboot, you can use your distribution " +
|
154
|
+
"tools to make it persistent or run \"gjp set-up-limited-nertwork-user\" again next time."
|
155
|
+
end
|
143
156
|
end
|
144
157
|
end
|
145
158
|
|
146
159
|
subcommand "tear-down-nonet-user", "Deletes a user previously created by gjp" do
|
147
160
|
def execute
|
148
|
-
|
161
|
+
checking_exceptions do
|
162
|
+
user = Gjp::LimitedNetworkUser.new("nonet")
|
149
163
|
|
150
|
-
|
164
|
+
user.tear_down
|
151
165
|
|
152
|
-
|
153
|
-
|
166
|
+
"sudo #{user.get_path("iptables")} -D OUTPUT -m owner --uid-owner nonet -j DROP\n" +
|
167
|
+
"sudo #{user.get_path("userdel")} nonet\n"
|
168
|
+
end
|
154
169
|
end
|
155
170
|
end
|
156
171
|
|
157
172
|
subcommand "get-pom", "Retrieves a pom corresponding to a filename" do
|
158
173
|
parameter "NAME", "a jar file path, a project directory path or a non-existing filename in the `project-version` form"
|
159
174
|
def execute
|
160
|
-
|
175
|
+
checking_exceptions do
|
176
|
+
puts Gjp::PomGetter.new.get_pom(name)
|
177
|
+
end
|
161
178
|
end
|
162
179
|
end
|
163
180
|
|
164
181
|
subcommand "get-parent-pom", "Retrieves a pom that is the parent of an existing pom" do
|
165
182
|
parameter "POM", "a pom file path or URI"
|
166
183
|
def execute
|
167
|
-
|
184
|
+
checking_exceptions do
|
185
|
+
puts Gjp::ParentPomGetter.new.get_parent_pom(pom)
|
186
|
+
end
|
168
187
|
end
|
169
188
|
end
|
170
189
|
|
@@ -172,8 +191,10 @@ module Gjp
|
|
172
191
|
parameter "POM", "a pom file path or URI"
|
173
192
|
|
174
193
|
def execute
|
175
|
-
|
176
|
-
|
194
|
+
checking_exceptions do
|
195
|
+
puts Gjp::SourceAddressGetter.new.get_source_address(pom)
|
196
|
+
end
|
197
|
+
end
|
177
198
|
end
|
178
199
|
|
179
200
|
subcommand "get-source", "Retrieves a project's source code directory" do
|
@@ -182,8 +203,29 @@ module Gjp
|
|
182
203
|
parameter "[DIRECTORY]", "directory in which to save the source code", :default => "."
|
183
204
|
|
184
205
|
def execute
|
185
|
-
|
206
|
+
checking_exceptions do
|
207
|
+
puts Gjp::SourceGetter.new.get_source(address, pom, directory)
|
208
|
+
end
|
186
209
|
end
|
187
210
|
end
|
211
|
+
|
212
|
+
# handles most fatal exceptions
|
213
|
+
def checking_exceptions
|
214
|
+
begin
|
215
|
+
yield
|
216
|
+
rescue Errno::EACCES => e
|
217
|
+
$stderr.puts e
|
218
|
+
rescue Errno::ENOENT => e
|
219
|
+
$stderr.puts e
|
220
|
+
rescue Errno::EEXIST => e
|
221
|
+
$stderr.puts e
|
222
|
+
rescue NotGjpDirectoryException
|
223
|
+
$stderr.puts "This is not a gjp project directory, see gjp init"
|
224
|
+
rescue GitAlreadyInitedException
|
225
|
+
$stderr.puts "This directory is already a gjp project"
|
226
|
+
rescue Gjp::MavenNotFoundException
|
227
|
+
$stderr.puts "mvn executable not found in kit/ or any of its subdirectories"
|
228
|
+
end
|
229
|
+
end
|
188
230
|
end
|
189
231
|
end
|
data/lib/gjp/git.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Gjp
|
4
|
+
# encapsulates git, all methods refer to the current directory
|
5
|
+
class Git
|
6
|
+
include Logger
|
7
|
+
|
8
|
+
# inits a repo
|
9
|
+
def self.init
|
10
|
+
if Dir.exists?(".git") == false
|
11
|
+
`git init`
|
12
|
+
else
|
13
|
+
raise GitAlreadyInitedException
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# returns a list of filenames that changed in the repo
|
18
|
+
# since the specified tag
|
19
|
+
def changed_files_since(tag)
|
20
|
+
`git diff-tree --no-commit-id --name-only -r gjp_#{tag} HEAD`.split("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
# adds all files in the current directory and removes
|
24
|
+
# all files not in the current directory.
|
25
|
+
# if tag is given, commit is also tagged
|
26
|
+
def commit_whole_directory(message, tag = nil)
|
27
|
+
log.debug "committing with message: #{message}"
|
28
|
+
|
29
|
+
`git rm -r --cached --ignore-unmatch .`
|
30
|
+
`git add .`
|
31
|
+
`git commit -m "#{message}"`
|
32
|
+
|
33
|
+
if tag != nil
|
34
|
+
`git tag gjp_#{tag}`
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# returns the highest suffix found in tags with the given prefix
|
39
|
+
def get_tag_maximum_suffix(prefix)
|
40
|
+
`git tag`.split.map do |tag|
|
41
|
+
if tag =~ /^gjp_#{prefix}_([0-9]+)$/
|
42
|
+
$1.to_i
|
43
|
+
else
|
44
|
+
0
|
45
|
+
end
|
46
|
+
end.max or 0
|
47
|
+
end
|
48
|
+
|
49
|
+
# reverts path contents as per specified tag
|
50
|
+
def revert_whole_directory(path, tag)
|
51
|
+
`git rm -rf --ignore-unmatch #{path}`
|
52
|
+
`git checkout -f gjp_#{tag} -- #{path}`
|
53
|
+
|
54
|
+
`git clean -f -d #{path}`
|
55
|
+
end
|
56
|
+
|
57
|
+
# 3-way merges the git file at path with the one in new_path
|
58
|
+
# assuming they have a common ancestor at the specified tag
|
59
|
+
def merge_with_tag(path, new_path, tag)
|
60
|
+
`git show gjp_#{tag}:#{path} > #{path}.old_version`
|
61
|
+
`git merge-file --ours #{path} #{path}.old_version #{new_path}`
|
62
|
+
File.delete "#{path}.old_version"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class GitAlreadyInitedException < Exception
|
67
|
+
end
|
68
|
+
end
|
@@ -10,6 +10,7 @@ module Gjp
|
|
10
10
|
attr_reader :summary
|
11
11
|
attr_reader :url
|
12
12
|
attr_reader :project_name
|
13
|
+
attr_reader :project_version
|
13
14
|
attr_reader :group_id
|
14
15
|
attr_reader :artifact_id
|
15
16
|
attr_reader :version
|
@@ -28,6 +29,7 @@ module Gjp
|
|
28
29
|
@summary = cleanup_description(pom.description, 60)
|
29
30
|
@url = pom.url
|
30
31
|
@project_name = project.name
|
32
|
+
@project_version = project.version
|
31
33
|
@group_id = pom.group_id
|
32
34
|
@artifact_id = pom.artifact_id
|
33
35
|
@version = pom.version
|
data/lib/gjp/pom.rb
CHANGED
@@ -19,45 +19,45 @@ module Gjp
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def group_id
|
22
|
-
@doc.xpath("project/groupId
|
22
|
+
@doc.xpath("project/groupId").text
|
23
23
|
end
|
24
24
|
|
25
25
|
def artifact_id
|
26
|
-
@doc.xpath("project/artifactId
|
26
|
+
@doc.xpath("project/artifactId").text
|
27
27
|
end
|
28
28
|
|
29
29
|
def version
|
30
|
-
@doc.xpath("project/version
|
30
|
+
@doc.xpath("project/version").text
|
31
31
|
end
|
32
32
|
|
33
33
|
def description
|
34
|
-
@doc.xpath("project/description
|
34
|
+
@doc.xpath("project/description").text
|
35
35
|
end
|
36
36
|
|
37
37
|
def url
|
38
|
-
@doc.xpath("project/url
|
38
|
+
@doc.xpath("project/url").text
|
39
39
|
end
|
40
40
|
|
41
41
|
def license_name
|
42
|
-
@doc.xpath("project/licenses/license/name
|
42
|
+
@doc.xpath("project/licenses/license/name").text
|
43
43
|
end
|
44
44
|
|
45
45
|
def runtime_dependency_ids
|
46
46
|
result = @doc.xpath("project/dependencies/dependency[not(optional='true') and not(scope='provided') and not(scope='test') and not(scope='system')]").map do |element|
|
47
|
-
[element.xpath("groupId
|
47
|
+
[element.xpath("groupId").text, element.xpath("artifactId").text, element.xpath("version").text]
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
def parent_group_id
|
52
|
-
@doc.xpath("project/parent/groupId
|
52
|
+
@doc.xpath("project/parent/groupId").text
|
53
53
|
end
|
54
54
|
|
55
55
|
def parent_artifact_id
|
56
|
-
@doc.xpath("project/parent/artifactId
|
56
|
+
@doc.xpath("project/parent/artifactId").text
|
57
57
|
end
|
58
58
|
|
59
59
|
def parent_version
|
60
|
-
@doc.xpath("project/parent/version
|
60
|
+
@doc.xpath("project/parent/version").text
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
data/lib/gjp/project.rb
CHANGED
@@ -7,13 +7,11 @@ module Gjp
|
|
7
7
|
class Project
|
8
8
|
include Logger
|
9
9
|
|
10
|
-
# list of possible statuses
|
11
|
-
@@statuses = [:dry_running]
|
12
|
-
|
13
10
|
attr_accessor :full_path
|
14
11
|
|
15
12
|
def initialize(path)
|
16
13
|
@full_path = Gjp::Project.find_project_dir(File.expand_path(path))
|
14
|
+
@git = Gjp::Git.new
|
17
15
|
end
|
18
16
|
|
19
17
|
# finds the project directory up in the tree, like git does
|
@@ -23,7 +21,7 @@ module Gjp
|
|
23
21
|
result = File.expand_path("..", result)
|
24
22
|
end
|
25
23
|
|
26
|
-
raise
|
24
|
+
raise NotGjpDirectoryException if result == "/"
|
27
25
|
|
28
26
|
result
|
29
27
|
end
|
@@ -38,9 +36,7 @@ module Gjp
|
|
38
36
|
# inits a new project directory structure
|
39
37
|
def self.init(dir)
|
40
38
|
Dir.chdir(dir) do
|
41
|
-
|
42
|
-
`git init`
|
43
|
-
end
|
39
|
+
Gjp::Git.init
|
44
40
|
|
45
41
|
Dir.mkdir "src"
|
46
42
|
Dir.mkdir "kit"
|
@@ -64,33 +60,34 @@ module Gjp
|
|
64
60
|
# when finished
|
65
61
|
def dry_run
|
66
62
|
from_directory do
|
67
|
-
|
68
|
-
if status == :dry_running
|
63
|
+
if is_dry_running
|
69
64
|
return false
|
70
65
|
end
|
71
66
|
|
72
|
-
set_status :dry_running
|
73
67
|
take_snapshot "Dry-run started", :dry_run_started
|
74
68
|
end
|
75
69
|
|
76
70
|
true
|
77
71
|
end
|
78
72
|
|
73
|
+
# returns true iff we are currently dry-running
|
74
|
+
def is_dry_running
|
75
|
+
latest_tag_count(:dry_run_started) > latest_tag_count(:dry_run_finished)
|
76
|
+
end
|
77
|
+
|
79
78
|
# ends any phase that was previously started,
|
80
79
|
# generating file lists
|
81
80
|
def finish
|
82
81
|
from_directory do
|
83
|
-
|
84
|
-
if status == :dry_running
|
82
|
+
if is_dry_running
|
85
83
|
take_snapshot "Changes during dry-run"
|
86
84
|
|
87
85
|
update_output_file_lists
|
88
86
|
take_snapshot "File list updates"
|
89
87
|
|
90
|
-
|
88
|
+
@git.revert_whole_directory("src", latest_tag(:dry_run_started))
|
91
89
|
take_snapshot "Sources reverted as before dry-run"
|
92
90
|
|
93
|
-
set_status nil
|
94
91
|
take_snapshot "Dry run finished", :dry_run_finished
|
95
92
|
|
96
93
|
return true
|
@@ -114,12 +111,12 @@ module Gjp
|
|
114
111
|
end
|
115
112
|
|
116
113
|
new_tracked_files = (
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
114
|
+
@git.changed_files_since(latest_tag(:dry_run_started))
|
115
|
+
.select { |file| file.start_with?(directory) }
|
116
|
+
.map { |file|file[directory.length + 1, file.length] }
|
117
|
+
.concat(tracked_files)
|
118
|
+
.uniq
|
119
|
+
.sort
|
123
120
|
)
|
124
121
|
|
125
122
|
log.debug("writing file list for #{directory}: #{new_tracked_files.to_s}")
|
@@ -133,80 +130,27 @@ module Gjp
|
|
133
130
|
end
|
134
131
|
end
|
135
132
|
|
136
|
-
#
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
`git add .`
|
143
|
-
`git commit -m "#{message}"`
|
144
|
-
|
145
|
-
if tag != nil
|
146
|
-
`git tag gjp_#{tag}_#{latest_tag_count(tag) + 1}`
|
133
|
+
# takes a revertable snapshot of this project
|
134
|
+
def take_snapshot(message, prefix = nil)
|
135
|
+
tag = if prefix
|
136
|
+
"#{prefix}_#{latest_tag_count(prefix) + 1}"
|
137
|
+
else
|
138
|
+
nil
|
147
139
|
end
|
140
|
+
|
141
|
+
@git.commit_whole_directory(message, tag)
|
148
142
|
end
|
149
143
|
|
150
144
|
# returns the last tag of its type corresponding to a
|
151
145
|
# gjp snapshot
|
152
146
|
def latest_tag(tag_type)
|
153
|
-
"
|
147
|
+
"#{tag_type}_#{latest_tag_count(tag_type)}"
|
154
148
|
end
|
155
149
|
|
156
150
|
# returns the last tag count of its type corresponding
|
157
151
|
# to a gjp snapshot
|
158
152
|
def latest_tag_count(tag_type)
|
159
|
-
|
160
|
-
if tag =~ /^gjp_#{tag_type}_([0-9]+)$/
|
161
|
-
$1.to_i
|
162
|
-
else
|
163
|
-
0
|
164
|
-
end
|
165
|
-
end.max or 0
|
166
|
-
end
|
167
|
-
|
168
|
-
# reverts path contents as per latest tag
|
169
|
-
def revert(path, tag)
|
170
|
-
`git rm -rf --ignore-unmatch #{path}`
|
171
|
-
`git checkout -f #{latest_tag(tag)} -- #{path}`
|
172
|
-
|
173
|
-
`git clean -f -d #{path}`
|
174
|
-
end
|
175
|
-
|
176
|
-
# returns a symbol with the current status
|
177
|
-
# flag
|
178
|
-
def get_status
|
179
|
-
from_directory do
|
180
|
-
@@statuses.each do |status|
|
181
|
-
if File.exists?(status_file_name(status))
|
182
|
-
return status
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
nil
|
188
|
-
end
|
189
|
-
|
190
|
-
# sets a project status flag. if status = nil,
|
191
|
-
# clears all status flags
|
192
|
-
def set_status(status)
|
193
|
-
from_directory do
|
194
|
-
@@statuses.each do |a_status|
|
195
|
-
file_name = status_file_name(a_status)
|
196
|
-
if File.exists?(file_name)
|
197
|
-
File.delete(file_name)
|
198
|
-
end
|
199
|
-
|
200
|
-
if a_status == status
|
201
|
-
FileUtils.touch(file_name)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
# returns a file name that represents a status
|
208
|
-
def status_file_name(status)
|
209
|
-
".#{status.to_s}"
|
153
|
+
@git.get_tag_maximum_suffix(tag_type)
|
210
154
|
end
|
211
155
|
|
212
156
|
# runs a block from the project directory or a subdirectory
|
@@ -223,11 +167,14 @@ module Gjp
|
|
223
167
|
end
|
224
168
|
|
225
169
|
def version
|
226
|
-
|
170
|
+
latest_tag_count(:dry_run_finished)
|
227
171
|
end
|
228
172
|
|
229
173
|
def get_binding
|
230
174
|
binding
|
231
175
|
end
|
232
176
|
end
|
177
|
+
|
178
|
+
class NotGjpDirectoryException < Exception
|
179
|
+
end
|
233
180
|
end
|
@@ -2,11 +2,12 @@
|
|
2
2
|
|
3
3
|
module Gjp
|
4
4
|
# creates and updates spec files
|
5
|
-
class
|
5
|
+
class SpecGenerator
|
6
6
|
include Logger
|
7
7
|
|
8
8
|
def initialize(project)
|
9
9
|
@project = project
|
10
|
+
@git = Gjp::Git.new
|
10
11
|
end
|
11
12
|
|
12
13
|
def generate_kit_spec
|
@@ -25,36 +26,32 @@ module Gjp
|
|
25
26
|
|
26
27
|
adapter = Gjp::PackageSpecAdapter.new(@project, name, Gjp::Pom.new(pom), filter)
|
27
28
|
|
28
|
-
generate_merging "package.spec", adapter.get_binding, spec_path, "
|
29
|
+
generate_merging "package.spec", adapter.get_binding, spec_path, "generate_#{name}_spec"
|
29
30
|
|
30
31
|
spec_path
|
31
32
|
end
|
32
33
|
|
33
34
|
# generates a file in result_path from template together with binding.
|
34
35
|
# if a file already exists at that position, 3-way merge it with the
|
35
|
-
#
|
36
|
-
|
37
|
-
def generate_merging(template, binding, result_path, tag)
|
36
|
+
# common ancestor. Takes a snapshot in the end for future merges
|
37
|
+
def generate_merging(template, binding, result_path, tag_prefix)
|
38
38
|
@project.from_directory do
|
39
|
-
TemplateManager.new.generate template, binding, "#{result_path}.
|
39
|
+
TemplateManager.new.generate template, binding, "#{result_path}.new_version"
|
40
40
|
|
41
|
-
|
41
|
+
already_generated = @project.latest_tag(tag_prefix) != ""
|
42
42
|
already_existing = File.exist? result_path
|
43
43
|
|
44
|
-
if
|
44
|
+
if already_generated and already_existing
|
45
45
|
# 3-way merge
|
46
|
-
|
47
|
-
|
48
|
-
File.delete "#{result_path}.new_scaffold"
|
49
|
-
File.delete "#{result_path}.old_scaffold"
|
46
|
+
@git.merge_with_tag("#{result_path}", "#{result_path}.new_version", @project.latest_tag(tag_prefix))
|
47
|
+
File.delete "#{result_path}.new_version"
|
50
48
|
else
|
51
49
|
# just replace
|
52
|
-
File.rename "#{result_path}.
|
50
|
+
File.rename "#{result_path}.new_version", result_path
|
53
51
|
end
|
54
52
|
|
55
|
-
@project.take_snapshot
|
53
|
+
@project.take_snapshot("Spec generated", tag_prefix)
|
56
54
|
end
|
57
55
|
end
|
58
|
-
|
59
56
|
end
|
60
57
|
end
|
data/lib/gjp/version.rb
CHANGED
data/lib/template/kit.spec
CHANGED
@@ -44,12 +44,10 @@ be installed on end users' systems.
|
|
44
44
|
|
45
45
|
%install
|
46
46
|
install -d -m 0755 %{buildroot}%{_datadir}/gjp/%{name}/
|
47
|
-
mv README.SUSE ../
|
48
47
|
cp -a * %{buildroot}%{_datadir}/gjp/%{name}/
|
49
48
|
|
50
49
|
%files
|
51
50
|
%defattr(-,root,root)
|
52
|
-
%doc ../README.SUSE
|
53
51
|
%{_datadir}/gjp/
|
54
52
|
|
55
53
|
%changelog
|
data/lib/template/kit/CONTENTS
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
|
1
|
+
This directory contains all binary files needed to build a gjp project's
|
2
|
+
packages.
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
gjp will recognise Maven, Ant and other popular build tool binaries in here.
|
4
|
+
These files should only be used during build and should not be installed
|
5
|
+
on users' systems.
|
7
6
|
|
8
7
|
Some generally useful configuration files are also placed here (eg.
|
9
|
-
m2/settings.xml for Maven builds.
|
8
|
+
m2/settings.xml for Maven builds).
|
data/lib/template/package.spec
CHANGED
@@ -26,7 +26,7 @@ Source0: %{name}.tar.xz
|
|
26
26
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
27
27
|
BuildRequires: xz
|
28
28
|
BuildRequires: java-devel
|
29
|
-
BuildRequires: <%= project_name %>-kit
|
29
|
+
BuildRequires: <%= project_name %>-kit == <%= project_version %>
|
30
30
|
BuildArch: noarch
|
31
31
|
Provides: mvn(<%= group_id %>:<%= artifact_id %>) == <%= version %>
|
32
32
|
<% runtime_dependency_ids.each do |dependency_id| %>
|
data/lib/template/src/CONTENTS
CHANGED
@@ -1,13 +1,6 @@
|
|
1
1
|
For each package you want to create, you should create a subdirectory here
|
2
|
-
named after the package
|
3
|
-
|
4
|
-
./commons-collections:commons-collections:3.2/
|
2
|
+
named after the package name itself.
|
5
3
|
|
6
4
|
In that directory, place all the source files "verbatim" (as checked out from
|
7
|
-
the original source repository)
|
8
|
-
|
9
|
-
You can create any other directory for your convenience here. In case of git-
|
10
|
-
tracked projects, for example, you can clone the whole repository and copy the
|
11
|
-
version you want to build in orgId_artifactId_version.
|
12
|
-
|
13
|
-
Please note that .gitignore files are honored!
|
5
|
+
the original source repository, ideally in a different subdirectory)
|
6
|
+
plus any additional files you might need for the build.
|
data/spec/lib/project_spec.rb
CHANGED
@@ -31,7 +31,7 @@ describe Gjp::Project do
|
|
31
31
|
|
32
32
|
expect {
|
33
33
|
Gjp::Project.find_project_dir(File.expand_path("..", @project_path)).should raise_error
|
34
|
-
}.to raise_error(
|
34
|
+
}.to raise_error(Gjp::NotGjpDirectoryException)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -51,21 +51,14 @@ describe Gjp::Project do
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
describe "#
|
55
|
-
it "
|
54
|
+
describe "#is_dry_running" do
|
55
|
+
it "checks if a project is dry running" do
|
56
56
|
@project.from_directory do
|
57
|
-
@project.
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
describe "#get_status" do
|
64
|
-
it "gets a project's status flag" do
|
65
|
-
@project.from_directory do
|
66
|
-
@project.get_status.should be_nil
|
67
|
-
@project.set_status :dry_running
|
68
|
-
@project.get_status.should eq :dry_running
|
57
|
+
@project.is_dry_running.should be_false
|
58
|
+
@project.dry_run
|
59
|
+
@project.is_dry_running.should be_true
|
60
|
+
@project.finish
|
61
|
+
@project.is_dry_running.should be_false
|
69
62
|
end
|
70
63
|
end
|
71
64
|
end
|
@@ -78,7 +71,7 @@ describe Gjp::Project do
|
|
78
71
|
@project.take_snapshot "test", :revertable
|
79
72
|
|
80
73
|
`git rev-list --all`.split("\n").length.should eq 2
|
81
|
-
@project.latest_tag(:revertable).should eq "
|
74
|
+
@project.latest_tag(:revertable).should eq "revertable_1"
|
82
75
|
end
|
83
76
|
end
|
84
77
|
end
|
@@ -100,14 +93,14 @@ describe Gjp::Project do
|
|
100
93
|
end
|
101
94
|
|
102
95
|
@project.finish.should be_true
|
103
|
-
@project.
|
96
|
+
@project.is_dry_running.should be_false
|
104
97
|
|
105
98
|
@project.from_directory do
|
106
|
-
`git rev-list --all`.split("\n").length.should eq
|
99
|
+
`git rev-list --all`.split("\n").length.should eq 5
|
107
100
|
File.read("src/abc/test").should eq "A\n"
|
108
101
|
File.readlines(File.join("file_lists", "abc_output")).should include("test2\n")
|
109
102
|
|
110
|
-
`git diff-tree --no-commit-id --name-only -r HEAD
|
103
|
+
`git diff-tree --no-commit-id --name-only -r HEAD~`.split("\n").should_not include("src/abc/test2")
|
111
104
|
File.exists?("src/abc/test2").should be_false
|
112
105
|
end
|
113
106
|
end
|
@@ -124,7 +117,7 @@ describe Gjp::Project do
|
|
124
117
|
@project.dry_run.should be_true
|
125
118
|
|
126
119
|
@project.from_directory do
|
127
|
-
@project.
|
120
|
+
@project.is_dry_running.should be_true
|
128
121
|
`git rev-list --all`.split("\n").length.should eq 2
|
129
122
|
`git diff-tree --no-commit-id --name-only -r HEAD`.split("\n").should include("src/test")
|
130
123
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Gjp::
|
5
|
+
describe Gjp::SpecGenerator do
|
6
6
|
before(:each) do
|
7
7
|
@project_path = File.join("spec", "data", "test-project")
|
8
8
|
Dir.mkdir(@project_path)
|
@@ -15,8 +15,9 @@ describe Gjp::Scaffolder do
|
|
15
15
|
test_file = File.join("kit", "test")
|
16
16
|
File.open(test_file, "w") { |io| io.puts "kit content test file" }
|
17
17
|
end
|
18
|
+
@project.finish
|
18
19
|
|
19
|
-
@
|
20
|
+
@spec_generator = Gjp::SpecGenerator.new(@project)
|
20
21
|
end
|
21
22
|
|
22
23
|
after(:each) do
|
@@ -24,21 +25,18 @@ describe Gjp::Scaffolder do
|
|
24
25
|
end
|
25
26
|
|
26
27
|
describe "#generate_kit_spec" do
|
27
|
-
it "
|
28
|
-
@
|
29
|
-
@project.finish
|
30
|
-
|
31
|
-
@scaffolder.generate_kit_spec.should be_true
|
28
|
+
it "generates the first version" do
|
29
|
+
@spec_generator.generate_kit_spec.should be_true
|
32
30
|
|
33
31
|
@project.from_directory do
|
34
32
|
spec_lines = File.readlines(File.join("specs", "test-project-kit.spec"))
|
35
33
|
spec_lines.should include("Name: test-project-kit\n")
|
36
|
-
spec_lines.should include("Version:
|
34
|
+
spec_lines.should include("Version: 1\n")
|
37
35
|
spec_lines.should include("Source0: %{name}.tar.xz\n")
|
38
36
|
end
|
39
37
|
end
|
40
|
-
it "
|
41
|
-
@
|
38
|
+
it "generates a second version" do
|
39
|
+
@spec_generator.generate_kit_spec.should be_true
|
42
40
|
@project.dry_run
|
43
41
|
Dir.chdir(@project_path) do
|
44
42
|
test_file = File.join("kit", "test")
|
@@ -50,18 +48,18 @@ describe Gjp::Scaffolder do
|
|
50
48
|
end
|
51
49
|
@project.finish
|
52
50
|
|
53
|
-
@
|
51
|
+
@spec_generator.generate_kit_spec.should be_true
|
54
52
|
|
55
53
|
@project.from_directory do
|
56
54
|
spec_lines = File.readlines(File.join("specs", "test-project-kit.spec"))
|
57
55
|
spec_lines.should include("Name: test-project-kit\n")
|
58
|
-
spec_lines.should include("Version:
|
56
|
+
spec_lines.should include("Version: 2\n")
|
59
57
|
spec_lines.should include("Source0: %{name}.tar.xz\n")
|
60
58
|
spec_lines.should include("nonconflicting line\n")
|
61
59
|
end
|
62
60
|
end
|
63
|
-
it "
|
64
|
-
@
|
61
|
+
it "generates a conflicting version" do
|
62
|
+
@spec_generator.generate_kit_spec.should be_true
|
65
63
|
@project.dry_run
|
66
64
|
Dir.chdir(@project_path) do
|
67
65
|
test_file = File.join("kit", "test")
|
@@ -76,21 +74,22 @@ describe Gjp::Scaffolder do
|
|
76
74
|
io.write(spec_contents)
|
77
75
|
end
|
78
76
|
end
|
77
|
+
@project.finish
|
79
78
|
|
80
|
-
@
|
79
|
+
@spec_generator.generate_kit_spec.should be_true
|
81
80
|
|
82
81
|
@project.from_directory do
|
83
82
|
spec_lines = File.readlines(File.join("specs", "test-project-kit.spec"))
|
84
83
|
spec_lines.should include("Name: test-project-kit\n")
|
85
84
|
spec_lines.should include("Source0: %{name}.tar.xz\n")
|
86
85
|
spec_lines.should include("CONFLICTING!\n")
|
87
|
-
spec_lines.should_not include("Version:
|
86
|
+
spec_lines.should_not include("Version: 2\n")
|
88
87
|
end
|
89
88
|
end
|
90
89
|
end
|
91
90
|
|
92
91
|
describe "#generate_package_spec" do
|
93
|
-
it "
|
92
|
+
it "generates the first version" do
|
94
93
|
|
95
94
|
@project.from_directory do
|
96
95
|
FileUtils.mkdir_p File.join("src", "test", "out")
|
@@ -110,7 +109,7 @@ describe Gjp::Scaffolder do
|
|
110
109
|
@project.finish
|
111
110
|
end
|
112
111
|
|
113
|
-
@
|
112
|
+
@spec_generator.generate_package_spec "test", File.join("spec", "data", "nailgun", "pom.xml"), "*.jar"
|
114
113
|
|
115
114
|
@project.from_directory do
|
116
115
|
spec_lines = File.readlines(File.join("specs", "test.spec"))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gjp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.19.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -155,10 +155,11 @@ files:
|
|
155
155
|
- Rakefile
|
156
156
|
- bin/gjp
|
157
157
|
- gjp.gemspec
|
158
|
-
- integration-tests/commons-
|
158
|
+
- integration-tests/commons-collections.sh
|
159
159
|
- lib/gjp.rb
|
160
160
|
- lib/gjp/archiver.rb
|
161
161
|
- lib/gjp/cli.rb
|
162
|
+
- lib/gjp/git.rb
|
162
163
|
- lib/gjp/limited_network_user.rb
|
163
164
|
- lib/gjp/logger.rb
|
164
165
|
- lib/gjp/maven_runner.rb
|
@@ -168,9 +169,9 @@ files:
|
|
168
169
|
- lib/gjp/pom.rb
|
169
170
|
- lib/gjp/pom_getter.rb
|
170
171
|
- lib/gjp/project.rb
|
171
|
-
- lib/gjp/scaffolder.rb
|
172
172
|
- lib/gjp/source_address_getter.rb
|
173
173
|
- lib/gjp/source_getter.rb
|
174
|
+
- lib/gjp/spec_generator.rb
|
174
175
|
- lib/gjp/template_manager.rb
|
175
176
|
- lib/gjp/version.rb
|
176
177
|
- lib/gjp/version_matcher.rb
|
@@ -178,7 +179,6 @@ files:
|
|
178
179
|
- lib/template/file_lists/CONTENTS
|
179
180
|
- lib/template/kit.spec
|
180
181
|
- lib/template/kit/CONTENTS
|
181
|
-
- lib/template/kit/README.SUSE
|
182
182
|
- lib/template/kit/m2/settings.xml
|
183
183
|
- lib/template/package.spec
|
184
184
|
- lib/template/specs/CONTENTS
|
@@ -207,9 +207,9 @@ files:
|
|
207
207
|
- spec/lib/pom_getter_spec.rb
|
208
208
|
- spec/lib/pom_spec.rb
|
209
209
|
- spec/lib/project_spec.rb
|
210
|
-
- spec/lib/scaffolder_spec.rb
|
211
210
|
- spec/lib/source_address_getter_spec.rb
|
212
211
|
- spec/lib/source_getter_spec.rb
|
212
|
+
- spec/lib/spec_generator_spec.rb
|
213
213
|
- spec/lib/template_manager_spec.rb
|
214
214
|
- spec/lib/version_matcher_spec.rb
|
215
215
|
- spec/spec_helper.rb
|
@@ -263,9 +263,9 @@ test_files:
|
|
263
263
|
- spec/lib/pom_getter_spec.rb
|
264
264
|
- spec/lib/pom_spec.rb
|
265
265
|
- spec/lib/project_spec.rb
|
266
|
-
- spec/lib/scaffolder_spec.rb
|
267
266
|
- spec/lib/source_address_getter_spec.rb
|
268
267
|
- spec/lib/source_getter_spec.rb
|
268
|
+
- spec/lib/spec_generator_spec.rb
|
269
269
|
- spec/lib/template_manager_spec.rb
|
270
270
|
- spec/lib/version_matcher_spec.rb
|
271
271
|
- spec/spec_helper.rb
|
@@ -1,4 +0,0 @@
|
|
1
|
-
Contents of this package are automatically packaged by the gjp program in order
|
2
|
-
to build other Java packages from source. They are not needed after rpm files
|
3
|
-
are created, so this package should only be used by the Build Service and
|
4
|
-
should never be installed on end users' systems.
|