gjp 0.18.0 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|