gjp 0.27.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -6,7 +6,7 @@ The project objective is to strongly reduce manual packaging efforts by enabling
6
6
 
7
7
  ## Status
8
8
 
9
- `gjp` is a research project currently in alpha state. Basic concepts seem to be viable, packages are currently being built with the new approach to identify problem areas but not all basic features have been coded yet. If you are a packager you can try to use it (any feedback would be **very** welcome!), but be warned that anything can still change at this point.
9
+ `gjp` is a research project currently in beta state. All basic features have been coded, non-essential ones are being planned, packages are currently being built. If you are a packager you can try to use it, any feedback would be **very** welcome!
10
10
 
11
11
  At the moment `gjp` is tested on openSUSE and can only output RPMs for the openSUSE and SLES distributions. Fedora, RHEL and other distros could be supported in the future.
12
12
 
@@ -50,7 +50,7 @@ Note that:
50
50
  * a `gjp` project can be used to build a number of packages that share one binary kit. This can help if the kit becomes big in size;
51
51
  * `gjp` will take advantage of Maven's pom files to generate its specs if they are available. This allows to precompile most spec fields automatically.
52
52
 
53
- ### Sample project (commons-collections)
53
+ ### A sample Maven project (commons-collections)
54
54
 
55
55
  #### Initialization and project setup
56
56
 
@@ -146,7 +146,24 @@ OBS users: note that the output/ directory created by gjp can be submitted or us
146
146
  gjp finish
147
147
  gjp generate-all
148
148
 
149
- #### Ant packages
149
+ #### Kit sources
150
+
151
+ If you want to redistribute your RPMs, chances are that you need source files for kit contents.
152
+
153
+ If you use Maven, most sources for binary jars in your kit can be automatically downloaded:
154
+
155
+ gjp get-maven-source-jars
156
+
157
+ For non-Maven jars, or Maven jars that have no available sources, some extra manual work is needed. At the moment `gjp` can help you with the following utility subcommands:
158
+
159
+ * `gjp get-pom NAME` will attempt to find a pom. `NAME` can be a jar file on your disk, a project directory, or simply a `name-version` string. `gjp` will get the pom either from the package itself or through search.maven.org using heuristic searching;
160
+ * `gjp get-parent-pom POM` will attempt to download a pom's parent from search.maven.org, where `POM` is a filename or URI;
161
+ * `gjp get-source-address POM` will attempt to find the SCM Internet address of a pom.xml from the file itself or through api.github.com. `POM` can either be a filename or a URI;
162
+ * `gjp get-source POM ADDRESS` downloads the source of a pom.xml's project from its SCM at ADDRESS;
163
+
164
+ More comprehensive support is planned in future releases.
165
+
166
+ #### Optional: Ant packages
150
167
 
151
168
  Building Ant packages is not really different from Maven ones, as `gjp ant` will operate exactly like `gjp mvn`.
152
169
 
@@ -170,30 +187,15 @@ Once built, you are advised to grab an "informational" pom.xml (via `gjp get-pom
170
187
 
171
188
  The above is not mandatory, but it can be useful for debugging purposes.
172
189
 
173
- #### Optional: kit sources
174
190
 
175
- If kit sources are needed for license compliance, some extra work is needed. Fortunately, finding jar source files and adding them to the kit is much easier than packaging its contents in proper RPMs!
176
-
177
- If the project you are packaging uses Maven, you can ask Maven itself to find source jars for dependencies. Running the following command will add them to the kit:
178
-
179
- gjp mvn dependency:sources
180
-
181
- Unfortunately this will not take care of Maven itself, Maven's plugins and their dependencies so some extra work might be needed.
182
-
183
- At the moment `gjp`'s supprort to kit source retrieval is limited to the following subcommands:
184
-
185
- * `gjp get-pom NAME` will attempt to find a pom. `NAME` can be a jar file on your disk, a project directory, or simply a `name-version` string. `gjp` will get the pom either from the package itself or through search.maven.org using heuristic searching;
186
- * `gjp get-parent-pom POM` will attempt to download a pom's parent from search.maven.org, where `POM` is a filename or URI;
187
- * `gjp get-source-address POM` will attempt to find the SCM Internet address of a pom.xml from the file itself or through api.github.com. `POM` can either be a filename or a URI;
188
- * `gjp get-source POM ADDRESS` downloads the source of a pom.xml's project from its SCM at ADDRESS;
189
-
190
- More comprehensive support is planned in future releases.
191
+ ### Gotchas
191
192
 
192
- You are advised to use [Maven Central](http://search.maven.org/) to search for sources and other information about projects.
193
+ * `gjp` internally uses `git` to keep track of files, any gjp project is actually also a `git` repo. Feel free to navigate it, you can commit, push and pull as long as the `gjp` tags are preserved. You can also delete commits and tags, effectively rewinding gjp history (just make sure to delete all tags pointing to a certain commit when you discard it);
194
+ * if your sources come from a Git repo, be sure to remove any `.git`/`.gitignore` files, otherwise `gjp` might get confused;
195
+ * if OBS complains that jars in your kit or package are compiled for a JDK version higher than 1.5, add the following line after `%install` to squelch the error:
193
196
 
194
- ### Troubleshooting
197
+ export NO_BRP_CHECK_BYTECODE_VERSION=true
195
198
 
196
- `gjp` internally uses `git` to keep track of files, any gjp project is actually also a `git` repo. Feel free to navigate it, you can commit, push and pull freely as long as the `gjp` tags are preserved. You can also delete commits and tags, effectively rewinding gjp history (just make sure to delete all tags pointing to a certain commit when you discard it).
197
199
 
198
200
  ## Motivation
199
201
 
@@ -216,11 +216,38 @@ module Gjp
216
216
 
217
217
  subcommand "purge-jars", "Locates jars in src/ and moves them to kit/" do
218
218
  def execute
219
- project = Gjp::Project.new(".")
219
+ checking_exceptions do
220
+ project = Gjp::Project.new(".")
221
+
222
+ ensure_dry_running(false, project) do
223
+ project.purge_jars.each do |original, final|
224
+ puts "Replaced #{original} with symlink pointing to to #{final}"
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
220
230
 
221
- ensure_dry_running(false, project) do
222
- project.purge_jars.each do |original, final|
223
- puts "Replaced #{original} with symlink pointing to to #{final}"
231
+ subcommand "get-maven-source-jars", "Attempts to download Maven kit/ sources" do
232
+ def execute
233
+ checking_exceptions do
234
+ project = Gjp::Project.new(".")
235
+ source_getter = Gjp::SourceGetter.new
236
+
237
+ ensure_dry_running(false, project) do
238
+ puts "Getting sources from Maven..."
239
+ succeeded, failed = source_getter.get_maven_source_jars(project)
240
+
241
+ puts "\n**SUMMARY**\n"
242
+ puts "Sources found for:"
243
+ succeeded.each do |path|
244
+ puts " #{format_path(path, project)}"
245
+ end
246
+
247
+ puts "\nSources not found for:"
248
+ failed.each do |path|
249
+ puts " #{format_path(path, project)}"
250
+ end
224
251
  end
225
252
  end
226
253
  end
@@ -337,7 +364,7 @@ module Gjp
337
364
  rescue Errno::EEXIST => e
338
365
  $stderr.puts e
339
366
  rescue NoProjectDirectoryError => e
340
- $stderr.puts "#{e.directory} not a gjp project directory, see gjp init"
367
+ $stderr.puts "#{e.directory} is not a gjp project directory, see gjp init"
341
368
  rescue NoPackageDirectoryError => e
342
369
  $stderr.puts "#{e.directory} is not a gjp package directory, see README"
343
370
  rescue GitAlreadyInitedError => e
@@ -31,6 +31,7 @@ module Gjp
31
31
  def run_executable(full_commandline)
32
32
  log.debug "running #{full_commandline}"
33
33
  Process.wait(Process.spawn(full_commandline))
34
+ $?
34
35
  end
35
36
 
36
37
  # runs mvn in a subprocess
@@ -3,10 +3,29 @@
3
3
  require "rest_client"
4
4
 
5
5
  module Gjp
6
- # attempts to get java projects' sources from scm
6
+ # attempts to get java projects' sources
7
7
  class SourceGetter
8
8
  include Logger
9
9
 
10
+ # looks for jars in maven's local repo and downloads corresponding
11
+ # source jars
12
+ def get_maven_source_jars(project)
13
+ kit_runner = Gjp::KitRunner.new(project)
14
+
15
+ project.from_directory do
16
+ paths = Find.find(".").reject {|path| artifact_from_path(path) == nil}.sort
17
+
18
+ succeded_paths = paths.select.with_index do |path, i|
19
+ artifact = artifact_from_path(path)
20
+ log.info("attempting source download for #{path} (#{artifact})")
21
+ status = kit_runner.mvn(["dependency:get", "-Dartifact=#{artifact}", "-Dtransitive=false"])
22
+ status.exitstatus == 0
23
+ end
24
+
25
+ [succeded_paths, (paths - succeded_paths)]
26
+ end
27
+ end
28
+
10
29
  # downloads a project's source into a specified directory
11
30
  def get_source(address, pomfile, directory)
12
31
  log.info("downloading: #{address} in #{directory}, pomfile: #{pomfile}")
@@ -81,5 +100,15 @@ module Gjp
81
100
  best_version = version_matcher.best_match(version, versions_to_tags.keys)
82
101
  versions_to_tags[best_version]
83
102
  end
103
+
104
+ private
105
+
106
+ # if possible, turn path into a Maven artifact name, otherwise return nil
107
+ def artifact_from_path(path)
108
+ match = path.match(/\.\/kit\/m2\/(.+)\/(.+)\/(.+)\/\2-\3.*\.jar$/)
109
+ if match != nil
110
+ "#{match[1].gsub("/", ".")}:#{match[2]}:#{match[3]}:jar:sources"
111
+ end
112
+ end
84
113
  end
85
114
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
- VERSION = "0.27.0"
4
+ VERSION = "0.28.0"
5
5
  end
@@ -19,8 +19,8 @@ describe Gjp::KitRunner do
19
19
 
20
20
  describe "#find_executable" do
21
21
  it "finds an executable in kit" do
22
- mock_executable("mvn")
23
- @kit_runner.find_executable("mvn").should eq @executable
22
+ executable_path = mock_executable("mvn", @project_path)
23
+ @kit_runner.find_executable("mvn").should eq executable_path
24
24
  end
25
25
  it "doesn't find a Maven executable in kit" do
26
26
  @kit_runner.find_executable("mvn").should be_nil
@@ -29,11 +29,11 @@ describe Gjp::KitRunner do
29
29
 
30
30
  describe "#get_maven_commandline" do
31
31
  it "returns commandline options for running maven" do
32
- mock_executable("mvn")
32
+ executable_path = mock_executable("mvn", @project_path)
33
33
 
34
34
  @project.from_directory do
35
35
  commandline = @kit_runner.get_maven_commandline(".")
36
- commandline.should eq "./#{@executable} -Dmaven.repo.local=./kit/m2 -s./kit/m2/settings.xml"
36
+ commandline.should eq "./#{executable_path} -Dmaven.repo.local=./kit/m2 -s./kit/m2/settings.xml"
37
37
  end
38
38
  end
39
39
  it "doesn't return commandline options if Maven is not available" do
@@ -43,7 +43,7 @@ describe Gjp::KitRunner do
43
43
 
44
44
  describe "#mvn" do
45
45
  it "runs maven" do
46
- mock_executable("mvn")
46
+ mock_executable("mvn", @project_path)
47
47
  @project.from_directory do
48
48
  @kit_runner.mvn(["extra-option"])
49
49
  File.read("test_out").strip.should match /extra-option$/
@@ -59,11 +59,11 @@ describe Gjp::KitRunner do
59
59
 
60
60
  describe "#get_ant_commandline" do
61
61
  it "returns commandline options for running Ant" do
62
- mock_executable("ant")
62
+ executable_path = mock_executable("ant", @project_path)
63
63
 
64
64
  @project.from_directory do
65
65
  commandline = @kit_runner.get_ant_commandline(".")
66
- commandline.should eq "./#{@executable}"
66
+ commandline.should eq "./#{executable_path}"
67
67
  end
68
68
  end
69
69
  it "doesn't return commandline options if Ant is not available" do
@@ -73,7 +73,7 @@ describe Gjp::KitRunner do
73
73
 
74
74
  describe "#ant" do
75
75
  it "runs Ant" do
76
- mock_executable("ant")
76
+ mock_executable("ant", @project_path)
77
77
  @project.from_directory do
78
78
  @kit_runner.ant(["extra-option"])
79
79
  File.read("test_out").strip.should match /extra-option$/
@@ -85,14 +85,4 @@ describe Gjp::KitRunner do
85
85
  end
86
86
  end
87
87
  end
88
-
89
- def mock_executable(executable)
90
- Dir.chdir(@project_path) do
91
- @bin_dir = File.join("kit", executable, "bin")
92
- FileUtils.mkdir_p(@bin_dir)
93
- @executable = File.join(@bin_dir, executable)
94
- File.open(@executable, "w") { |io| io.puts "echo $0 $*>test_out" }
95
- File.chmod(0777, @executable)
96
- end
97
- end
98
88
  end
@@ -6,6 +6,37 @@ require "fileutils"
6
6
  describe Gjp::SourceGetter do
7
7
  let(:source_getter) { Gjp::SourceGetter.new }
8
8
 
9
+ describe "#get_maven_source_jars" do
10
+ before(:each) do
11
+ @project_path = File.join("spec", "data", "test-project")
12
+ Dir.mkdir(@project_path)
13
+
14
+ Gjp::Project.init(@project_path)
15
+ @project = Gjp::Project.new(@project_path)
16
+ end
17
+
18
+ it "gets sources for jars in the Maven repo through Maven itself" do
19
+ mock_executable("mvn", @project_path)
20
+
21
+ @project.from_directory(File.join("kit", "m2")) do
22
+ jar_dir_path = File.join("net", "test", "artifact", "1.0")
23
+ jar_path = File.join(jar_dir_path, "artifact-1.0-blabla.jar")
24
+ FileUtils.mkdir_p(jar_dir_path)
25
+ FileUtils.touch(jar_path)
26
+
27
+ successes, failures = source_getter.get_maven_source_jars(@project)
28
+ commandline = File.read(File.join("..", "..", "test_out")).strip
29
+ commandline.should match /-Dartifact=net.test:artifact:1.0:jar:sources -Dtransitive=false$/
30
+ successes.should include File.join(".", "kit", "m2", jar_path)
31
+ failures.should eq []
32
+ end
33
+ end
34
+
35
+ after(:each) do
36
+ FileUtils.rm_rf(@project_path)
37
+ end
38
+ end
39
+
9
40
  describe "#get_source_from_git" do
10
41
  it "gets the sources from a git repo" do
11
42
  dir_path = File.join("spec", "data", "nailgun")
@@ -4,3 +4,17 @@ require "gjp"
4
4
  require "gjp/logger"
5
5
 
6
6
  Gjp::Logger.log.level = ::Logger::DEBUG
7
+
8
+ # creates an executable in kit that will print its parameters
9
+ # in a test_out file for checking. Returns mocked executable
10
+ # full path
11
+ def mock_executable(executable_name, project_path)
12
+ Dir.chdir(project_path) do
13
+ bin_dir = File.join("kit", executable_name, "bin")
14
+ FileUtils.mkdir_p(bin_dir)
15
+ executable_path = File.join(bin_dir, executable_name)
16
+ File.open(executable_path, "w") { |io| io.puts "echo $0 $*>test_out" }
17
+ File.chmod(0777, executable_path)
18
+ executable_path
19
+ end
20
+ end
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.27.0
4
+ version: 0.28.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-28 00:00:00.000000000 Z
12
+ date: 2013-12-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake