gjp 0.11.1 → 0.11.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/Gemfile.lock +1 -1
- data/lib/gjp/cli.rb +23 -27
- data/lib/gjp/jar_table.rb +1 -3
- data/lib/gjp/limited_network_user.rb +1 -3
- data/lib/gjp/logger.rb +18 -8
- data/lib/gjp/maven_runner.rb +1 -3
- data/lib/gjp/maven_website.rb +1 -3
- data/lib/gjp/parent_pom_getter.rb +2 -5
- data/lib/gjp/pom_getter.rb +9 -11
- data/lib/gjp/project.rb +104 -77
- data/lib/gjp/source_address_getter.rb +5 -7
- data/lib/gjp/source_getter.rb +11 -11
- data/lib/gjp/version.rb +1 -1
- data/lib/gjp/version_matcher.rb +4 -6
- data/lib/template/file_lists/CONTENTS +3 -0
- data/lib/template/kit/CONTENTS +9 -0
- data/lib/template/kit/m2/settings.xml +257 -0
- data/lib/template/src/CONTENTS +13 -0
- data/spec/lib/limited_network_user_spec_interactive.rb +3 -4
- data/spec/lib/maven_website_spec.rb +0 -1
- data/spec/lib/parent_pom_getter_spec.rb +4 -2
- data/spec/lib/pom_getter_spec.rb +7 -5
- data/spec/lib/project_spec.rb +43 -54
- data/spec/lib/source_address_getter_spec.rb +5 -3
- data/spec/lib/source_getter_spec.rb +6 -4
- data/spec/lib/version_matcher_spec.rb +58 -51
- data/spec/spec_helper.rb +2 -6
- metadata +6 -2
data/Gemfile.lock
CHANGED
data/lib/gjp/cli.rb
CHANGED
@@ -2,16 +2,9 @@
|
|
2
2
|
require "gjp/logger"
|
3
3
|
require "clamp"
|
4
4
|
|
5
|
-
# Initialize global logger for CLI
|
6
|
-
Gjp.logger = ::Logger.new(STDERR)
|
7
|
-
Gjp.logger.datetime_format = "%Y-%m-%d %H:%M "
|
8
|
-
Gjp.logger.level = ::Logger::ERROR
|
9
|
-
Gjp.logger.formatter = proc do |severity, datetime, progname, msg|
|
10
|
-
"#{severity.chars.first}: #{msg}\n"
|
11
|
-
end
|
12
|
-
|
13
5
|
module Gjp
|
14
6
|
class MainCommand < Clamp::Command
|
7
|
+
include Logger
|
15
8
|
|
16
9
|
# Common logging options
|
17
10
|
option ["-v", "--verbose"], :flag, "verbose output"
|
@@ -32,13 +25,13 @@ module Gjp
|
|
32
25
|
|
33
26
|
def configure_log_level(v, vv, vvv)
|
34
27
|
if vvv
|
35
|
-
|
28
|
+
log.level = ::Logger::DEBUG
|
36
29
|
elsif vv
|
37
|
-
|
30
|
+
log.level = ::Logger::INFO
|
38
31
|
elsif v
|
39
|
-
|
32
|
+
log.level = ::Logger::WARN
|
40
33
|
else
|
41
|
-
|
34
|
+
log.level = ::Logger::ERROR
|
42
35
|
end
|
43
36
|
end
|
44
37
|
|
@@ -46,38 +39,36 @@ module Gjp
|
|
46
39
|
subcommand "init", "Inits a gjp project in the current directory" do
|
47
40
|
def execute
|
48
41
|
Gjp::Project.init(".")
|
49
|
-
puts "Project inited."
|
50
|
-
puts "
|
42
|
+
puts "Project inited, now gathering."
|
43
|
+
puts "Any file added to kit/ will be added to the kit package."
|
44
|
+
puts "Any file added to src/<orgId_artifactId_version> will be added to the corresponding package."
|
45
|
+
puts "Note that .gitignore files are honored!"
|
46
|
+
puts "When you are ready to test a dry-run build, use \"gjp dry-run\"."
|
51
47
|
end
|
52
48
|
end
|
53
49
|
|
54
50
|
subcommand "gather", "Starts a gathering phase, add source and kit files to project" do
|
55
51
|
def execute
|
56
|
-
|
57
|
-
if result == :done
|
52
|
+
if Gjp::Project.new(".").gather
|
58
53
|
puts "Now gathering."
|
59
54
|
puts "Any file added to kit/ will be added to the kit package."
|
60
55
|
puts "Any file added to src/<orgId_artifactId_version> will be added to the corresponding package."
|
61
56
|
puts "Note that .gitignore files are honored!"
|
62
|
-
puts "
|
63
|
-
else
|
64
|
-
puts "Cannot begin gathering while #{result}, use \"gjp finish\" first."
|
57
|
+
puts "When you are ready to test a dry-run build, use \"gjp dry-run\"."
|
65
58
|
end
|
66
59
|
end
|
67
60
|
end
|
68
61
|
|
69
62
|
subcommand "dry-run", "Starts a dry-run phase, attempt build to add dependencies to kit." do
|
70
63
|
def execute
|
71
|
-
|
72
|
-
if result == :done
|
64
|
+
if Gjp::Project.new(".").dry_run
|
73
65
|
puts "Now dry-running, please start your build."
|
74
66
|
puts "Any file added to kit/, presumably downloaded dependencies, will be added to the kit package."
|
75
67
|
puts "The src/ directory and all files in it will be brought back to the current state when finished."
|
76
68
|
puts "Note that .gitignore files are honored!"
|
77
69
|
puts "To run a Maven from the kit, use \"gjp mvn\"."
|
70
|
+
puts "To add or remove files, use \"gjp gather\"."
|
78
71
|
puts "To finalize this dry run, use \"gjp finish\"."
|
79
|
-
else
|
80
|
-
puts "Cannot begin a dry run while #{result}, use \"gjp finish\" first."
|
81
72
|
end
|
82
73
|
end
|
83
74
|
end
|
@@ -96,6 +87,11 @@ module Gjp
|
|
96
87
|
end
|
97
88
|
end
|
98
89
|
|
90
|
+
subcommand "status", "Prints the current phase" do
|
91
|
+
def execute
|
92
|
+
puts "Now #{Gjp::Project.new(".").get_status.to_s}"
|
93
|
+
end
|
94
|
+
end
|
99
95
|
|
100
96
|
subcommand "finish", "Finishes the current phase" do
|
101
97
|
def execute
|
@@ -136,14 +132,14 @@ module Gjp
|
|
136
132
|
subcommand "get-pom", "Retrieves a pom corresponding to a filename" do
|
137
133
|
parameter "NAME", "a jar file path, a project directory path or a non-existing filename in the `project-version` form"
|
138
134
|
def execute
|
139
|
-
puts Gjp::PomGetter.get_pom(name)
|
135
|
+
puts Gjp::PomGetter.new.get_pom(name)
|
140
136
|
end
|
141
137
|
end
|
142
138
|
|
143
139
|
subcommand "get-parent-pom", "Retrieves a pom that is the parent of an existing pom" do
|
144
140
|
parameter "POM", "a pom file path or URI"
|
145
141
|
def execute
|
146
|
-
puts Gjp::ParentPomGetter.get_parent_pom(pom)
|
142
|
+
puts Gjp::ParentPomGetter.new.get_parent_pom(pom)
|
147
143
|
end
|
148
144
|
end
|
149
145
|
|
@@ -151,7 +147,7 @@ module Gjp
|
|
151
147
|
parameter "POM", "a pom file path or URI"
|
152
148
|
|
153
149
|
def execute
|
154
|
-
puts Gjp::SourceAddressGetter.get_source_address(pom)
|
150
|
+
puts Gjp::SourceAddressGetter.new.get_source_address(pom)
|
155
151
|
end
|
156
152
|
end
|
157
153
|
|
@@ -161,7 +157,7 @@ module Gjp
|
|
161
157
|
parameter "[DIRECTORY]", "directory in which to save the source code", :default => "."
|
162
158
|
|
163
159
|
def execute
|
164
|
-
puts Gjp::SourceGetter.get_source(address, pom, directory)
|
160
|
+
puts Gjp::SourceGetter.new.get_source(address, pom, directory)
|
165
161
|
end
|
166
162
|
end
|
167
163
|
|
data/lib/gjp/jar_table.rb
CHANGED
data/lib/gjp/logger.rb
CHANGED
@@ -3,15 +3,25 @@
|
|
3
3
|
require "logger"
|
4
4
|
|
5
5
|
module Gjp
|
6
|
-
|
7
|
-
|
8
|
-
end
|
6
|
+
module Logger
|
7
|
+
@@logger = nil
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
# returns a logger instance
|
10
|
+
def self.log
|
11
|
+
if @@logger == nil
|
12
|
+
@@logger = ::Logger.new(STDERR)
|
13
|
+
@@logger.datetime_format = "%Y-%m-%d %H:%M "
|
14
|
+
@@logger.level = ::Logger::ERROR
|
15
|
+
@@logger.formatter = proc do |severity, datetime, progname, msg|
|
16
|
+
"#{severity.chars.first}: #{msg}\n"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
@@logger
|
20
|
+
end
|
13
21
|
|
14
|
-
|
15
|
-
|
22
|
+
# convenience instance method
|
23
|
+
def log
|
24
|
+
Gjp::Logger.log
|
25
|
+
end
|
16
26
|
end
|
17
27
|
end
|
data/lib/gjp/maven_runner.rb
CHANGED
data/lib/gjp/maven_website.rb
CHANGED
@@ -5,13 +5,10 @@ require "pathname"
|
|
5
5
|
module Gjp
|
6
6
|
# attempts to get a pom's parent pom
|
7
7
|
class ParentPomGetter
|
8
|
-
|
9
|
-
def self.log
|
10
|
-
Gjp.logger
|
11
|
-
end
|
8
|
+
include Logger
|
12
9
|
|
13
10
|
# returns the pom's parent, if any
|
14
|
-
def
|
11
|
+
def get_parent_pom(filename)
|
15
12
|
begin
|
16
13
|
pom = Pom.new(filename)
|
17
14
|
site = MavenWebsite.new
|
data/lib/gjp/pom_getter.rb
CHANGED
@@ -11,18 +11,15 @@ require "gjp/version_matcher"
|
|
11
11
|
module Gjp
|
12
12
|
# attempts to get java projects' pom file
|
13
13
|
class PomGetter
|
14
|
-
|
15
|
-
def self.log
|
16
|
-
Gjp.logger
|
17
|
-
end
|
14
|
+
include Logger
|
18
15
|
|
19
16
|
# returns the pom corresponding to a filename
|
20
|
-
def
|
17
|
+
def get_pom(filename)
|
21
18
|
(get_pom_from_dir(filename) or get_pom_from_jar(filename) or get_pom_from_sha1(filename) or get_pom_from_heuristic(filename))
|
22
19
|
end
|
23
20
|
|
24
21
|
# returns the pom in a project directory
|
25
|
-
def
|
22
|
+
def get_pom_from_dir(dir)
|
26
23
|
if File.directory?(dir)
|
27
24
|
pom_path = File.join(dir, "pom.xml")
|
28
25
|
if File.file?(pom_path)
|
@@ -33,7 +30,7 @@ module Gjp
|
|
33
30
|
end
|
34
31
|
|
35
32
|
# returns a pom embedded in a jar file
|
36
|
-
def
|
33
|
+
def get_pom_from_jar(file)
|
37
34
|
begin
|
38
35
|
Zip::ZipFile.foreach(file) do |entry|
|
39
36
|
if entry.name =~ /\/pom.xml$/
|
@@ -50,7 +47,7 @@ module Gjp
|
|
50
47
|
end
|
51
48
|
|
52
49
|
# returns a pom from search.maven.org with a jar sha1 search
|
53
|
-
def
|
50
|
+
def get_pom_from_sha1(file)
|
54
51
|
begin
|
55
52
|
if File.file?(file)
|
56
53
|
site = MavenWebsite.new
|
@@ -70,18 +67,19 @@ module Gjp
|
|
70
67
|
end
|
71
68
|
|
72
69
|
# returns a pom from search.maven.org with a heuristic name search
|
73
|
-
def
|
70
|
+
def get_pom_from_heuristic(filename)
|
74
71
|
begin
|
75
72
|
site = MavenWebsite.new
|
76
73
|
filename = Pathname.new(filename).basename.to_s.sub(/.jar$/, "")
|
77
|
-
|
74
|
+
version_matcher = VersionMatcher.new
|
75
|
+
my_artifact_id, my_version = version_matcher.split_version(filename)
|
78
76
|
|
79
77
|
result = site.search_by_name(my_artifact_id).first
|
80
78
|
if result != nil
|
81
79
|
group_id, artifact_id, version = site.get_maven_id_from result
|
82
80
|
results = site.search_by_group_id_and_artifact_id(group_id, artifact_id)
|
83
81
|
their_versions = results.map {|doc| doc["v"]}
|
84
|
-
best_matched_version = if my_version != nil then
|
82
|
+
best_matched_version = if my_version != nil then version_matcher.best_match(my_version, their_versions) else their_versions.max end
|
85
83
|
best_matched_result = (results.select{|result| result["v"] == best_matched_version}).first
|
86
84
|
|
87
85
|
group_id, artifact_id, version = site.get_maven_id_from(best_matched_result)
|
data/lib/gjp/project.rb
CHANGED
@@ -5,9 +5,10 @@ require 'find'
|
|
5
5
|
module Gjp
|
6
6
|
# encapsulates a Gjp project directory
|
7
7
|
class Project
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
include Logger
|
9
|
+
|
10
|
+
# list of possible statuses
|
11
|
+
@@statuses = [:gathering, :dry_running]
|
11
12
|
|
12
13
|
attr_accessor :full_path
|
13
14
|
|
@@ -37,38 +38,43 @@ module Gjp
|
|
37
38
|
# inits a new project directory structure
|
38
39
|
def self.init(dir)
|
39
40
|
Dir.chdir(dir) do
|
40
|
-
|
41
|
-
|
42
|
-
Dir.mkdir("src")
|
43
|
-
File.open(File.join("src", "README"), "w") do |file|
|
44
|
-
file.puts "Sources are to be placed in subdirectories named after Maven names: orgId_artifactId_version"
|
45
|
-
end
|
46
|
-
Dir.mkdir("kit")
|
47
|
-
File.open(File.join("kit", "README"), "w") do |file|
|
48
|
-
file.puts "Build tool binaries are to be placed here"
|
41
|
+
if Dir.exists?(".git") == false
|
42
|
+
`git init`
|
49
43
|
end
|
50
44
|
|
45
|
+
copy_from_template "file_lists", "."
|
46
|
+
copy_from_template "src", "."
|
47
|
+
copy_from_template "kit", "."
|
48
|
+
|
51
49
|
`git add .`
|
52
50
|
`git commit -m "Project initialized"`
|
53
|
-
|
51
|
+
|
52
|
+
# automatically begin a gathering phase
|
53
|
+
Project.new(".").gather
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
# copies a file/dir from the template directory to the destination directory
|
58
|
+
def self.copy_from_template(template_file, destination_dir)
|
59
|
+
FileUtils.cp_r(File.join(File.dirname(__FILE__), "..", "template", template_file), destination_dir)
|
60
|
+
end
|
61
|
+
|
57
62
|
# starts a gathering phase, all files added to the project
|
58
63
|
# will be added to packages (including kit)
|
59
64
|
def gather
|
60
65
|
from_directory do
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
66
|
+
status = get_status
|
67
|
+
if status == :gathering
|
68
|
+
return false
|
69
|
+
elsif status == :dry_running
|
70
|
+
finish
|
65
71
|
end
|
66
72
|
|
67
|
-
set_status
|
68
|
-
|
73
|
+
set_status :gathering
|
74
|
+
take_snapshot "Gathering started", :revertable
|
69
75
|
end
|
70
76
|
|
71
|
-
|
77
|
+
true
|
72
78
|
end
|
73
79
|
|
74
80
|
# starts a dry running phase: files added to the kit will
|
@@ -76,46 +82,48 @@ module Gjp
|
|
76
82
|
# end
|
77
83
|
def dry_run
|
78
84
|
from_directory do
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
85
|
+
status = get_status
|
86
|
+
if status == :dry_running
|
87
|
+
return false
|
88
|
+
elsif status == :gathering
|
89
|
+
finish
|
83
90
|
end
|
84
91
|
|
85
|
-
set_status
|
86
|
-
|
92
|
+
set_status :dry_running
|
93
|
+
take_snapshot "Dry-run started", :revertable
|
87
94
|
end
|
88
95
|
|
89
|
-
|
96
|
+
true
|
90
97
|
end
|
91
98
|
|
92
99
|
# ends any phase that was previously started,
|
93
100
|
# generating file lists
|
94
101
|
def finish
|
95
102
|
from_directory do
|
96
|
-
|
97
|
-
|
103
|
+
status = get_status
|
104
|
+
if status == :gathering
|
105
|
+
take_snapshot "Changes during gathering"
|
98
106
|
|
99
|
-
update_changed_file_list("kit", "
|
100
|
-
update_changed_src_file_list(:
|
101
|
-
|
107
|
+
update_changed_file_list("kit", "kit")
|
108
|
+
update_changed_src_file_list(:input)
|
109
|
+
take_snapshot "File list updates"
|
102
110
|
|
103
|
-
|
104
|
-
|
111
|
+
set_status nil
|
112
|
+
take_snapshot "Gathering finished", :revertable
|
105
113
|
|
106
114
|
:gathering
|
107
|
-
elsif
|
108
|
-
|
115
|
+
elsif status == :dry_running
|
116
|
+
take_snapshot "Changes during dry-run"
|
109
117
|
|
110
|
-
update_changed_file_list("kit", "
|
111
|
-
update_changed_src_file_list(:
|
112
|
-
|
118
|
+
update_changed_file_list("kit", "kit")
|
119
|
+
update_changed_src_file_list(:output)
|
120
|
+
take_snapshot "File list updates"
|
113
121
|
|
114
|
-
revert("src"
|
115
|
-
|
122
|
+
revert("src")
|
123
|
+
take_snapshot "Sources reverted as before dry-run"
|
116
124
|
|
117
|
-
|
118
|
-
|
125
|
+
set_status nil
|
126
|
+
take_snapshot "Dry run finished", :revertable
|
119
127
|
|
120
128
|
:dry_running
|
121
129
|
end
|
@@ -124,84 +132,103 @@ module Gjp
|
|
124
132
|
|
125
133
|
def update_changed_src_file_list(list_name)
|
126
134
|
Dir.foreach("src") do |entry|
|
127
|
-
if File.directory?(File.join(Dir.getwd, "src", entry)) and entry =~ /([
|
128
|
-
update_changed_file_list(File.join("src", entry), "
|
135
|
+
if File.directory?(File.join(Dir.getwd, "src", entry)) and entry =~ /([^:\/]+:[^:]+:[^:]+)$/
|
136
|
+
update_changed_file_list(File.join("src", entry), "#{$1}_#{list_name.to_s}")
|
129
137
|
end
|
130
138
|
end
|
131
139
|
end
|
132
140
|
|
133
|
-
def update_changed_file_list(directory,
|
134
|
-
|
141
|
+
def update_changed_file_list(directory, file_name)
|
142
|
+
list_file = File.join("file_lists", file_name)
|
143
|
+
tracked_files = if File.exists?(list_file)
|
135
144
|
File.readlines(list_file)
|
136
145
|
else
|
137
146
|
[]
|
138
147
|
end
|
139
148
|
|
140
|
-
|
149
|
+
new_tracked_files = (
|
141
150
|
`git diff-tree --no-commit-id --name-only -r HEAD`.split("\n")
|
142
151
|
.select { |file| file.start_with?(directory) }
|
143
152
|
.map { |file|file[directory.length + 1, file.length] }
|
144
|
-
.concat(
|
153
|
+
.concat(tracked_files)
|
145
154
|
.sort
|
146
155
|
.uniq
|
147
156
|
)
|
148
157
|
|
149
|
-
log.debug("writing file list for #{directory}: #{
|
158
|
+
log.debug("writing file list for #{directory}: #{new_tracked_files.to_s}")
|
150
159
|
|
151
160
|
|
152
161
|
File.open(list_file, "w+") do |file_list|
|
153
|
-
|
162
|
+
new_tracked_files.each do |file|
|
154
163
|
file_list.puts file
|
155
164
|
end
|
156
165
|
end
|
157
166
|
end
|
158
167
|
|
159
168
|
# adds the project's whole contents to git
|
160
|
-
|
161
|
-
|
162
|
-
if path =~ /.gitignore$/
|
163
|
-
puts "Deleting #{path} to preserve all files..."
|
164
|
-
File.delete(path)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
169
|
+
# if tag is given, commit is tagged
|
170
|
+
def take_snapshot(message, revertability = :not_revertable)
|
168
171
|
log.debug "committing with message: #{message}"
|
169
172
|
|
170
173
|
`git rm -r --cached .`
|
171
174
|
`git add .`
|
172
175
|
`git commit -m "#{message}"`
|
176
|
+
|
177
|
+
if revertability == :revertable
|
178
|
+
latest_count = if latest_snapshot_name =~ /^gjp_revertable_snapshot_([0-9]+)$/
|
179
|
+
$1
|
180
|
+
else
|
181
|
+
0
|
182
|
+
end
|
183
|
+
`git tag gjp_revertable_snapshot_#{$1.to_i + 1}`
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
# returns the last snapshot git tag name
|
188
|
+
def latest_snapshot_name
|
189
|
+
`git describe --abbrev=0 --tags --match=gjp_revertable_snapshot_*`.strip
|
173
190
|
end
|
174
191
|
|
175
192
|
# reverts dir contents as commit_count commits ago
|
176
|
-
def revert(dir
|
193
|
+
def revert(dir)
|
177
194
|
`git rm -rf --ignore-unmatch #{dir}`
|
178
|
-
`git checkout -f
|
195
|
+
`git checkout -f #{latest_snapshot_name} -- #{dir}`
|
179
196
|
|
180
197
|
`git clean -f -d #{dir}`
|
181
198
|
end
|
182
199
|
|
183
|
-
#
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
if File.exists?(file_name) == false
|
193
|
-
FileUtils.touch(file_name)
|
200
|
+
# returns a symbol with the current status
|
201
|
+
# flag
|
202
|
+
def get_status
|
203
|
+
from_directory do
|
204
|
+
@@statuses.each do |status|
|
205
|
+
if File.exists?(status_file_name(status))
|
206
|
+
return status
|
207
|
+
end
|
208
|
+
end
|
194
209
|
end
|
210
|
+
|
211
|
+
nil
|
195
212
|
end
|
196
213
|
|
197
|
-
# sets a project status flag
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
214
|
+
# sets a project status flag. if status = nil,
|
215
|
+
# clears all status flags
|
216
|
+
def set_status(status)
|
217
|
+
from_directory do
|
218
|
+
@@statuses.each do |a_status|
|
219
|
+
file_name = status_file_name(a_status)
|
220
|
+
if File.exists?(file_name)
|
221
|
+
File.delete(file_name)
|
222
|
+
end
|
223
|
+
|
224
|
+
if a_status == status
|
225
|
+
FileUtils.touch(file_name)
|
226
|
+
end
|
227
|
+
end
|
202
228
|
end
|
203
229
|
end
|
204
230
|
|
231
|
+
# returns a file name that represents a status
|
205
232
|
def status_file_name(status)
|
206
233
|
".#{status.to_s}"
|
207
234
|
end
|