gjp 0.11.2 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,6 +15,7 @@ tmp
15
15
  # SPEC generated files
16
16
  spec/data/nailgun/com.martiansoftware\:nailgun-all\:0.9.1
17
17
  spec/data/struts-apps/org.apache.struts\:struts2-apps\:
18
+ spec/data/test-project
18
19
 
19
20
  # YARD artifacts
20
21
  .yardoc
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Silvio Moioli and Duncan Mac-Vicar Prett.
1
+ Copyright (c) 2013 SUSE
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
data/README.md CHANGED
@@ -24,6 +24,7 @@ Currently available tools:
24
24
  * `gjp finish` marks the end of a phase;
25
25
  * `gjp dry-run` starts a new dry-run phase, where you attempt to build your package. Any change to src/ will be reverted after you call `gjp finish`;
26
26
  * `gjp mvn` locates and runs Maven from any directory in kit/, using options to force repository in kit/m2 and settings in kit/m2/settings.xml;
27
+ * `gjp scaffold-kit-spec` creates or refreshes a spec file for the kit package;
27
28
  * `gjp set-up-nonet-user` sets up a user named `nonet` without Internet access using `iptables`, needs superuser privileges. You can then use it for networkless dry-runs;
28
29
  * `gjp tear-down-nonet-user` removes a user previously created by gjp;
29
30
  * `gjp scaffold-jar-table DIRECTORY` looks for jars in the project's DIRECTORY and classifies them as build-time dependencies (b), run-time dependencies (r) or products (p);
@@ -0,0 +1,49 @@
1
+ # encoding: UTF-8
2
+
3
+ module Gjp
4
+ # generates file archives that accompany spec files
5
+ class Archiver
6
+ include Logger
7
+
8
+ def initialize(project)
9
+ @project = project
10
+ end
11
+
12
+ # generates an archive for the project's kit package based on
13
+ # its file list
14
+ def archive_kit
15
+ list_file = File.join(@project.full_path, "file_lists/kit")
16
+ if not File.exist? list_file
17
+ return false
18
+ end
19
+ destination_file = File.join(@project.full_path, "archives/#{@project.name}-kit.tar.xz")
20
+
21
+ @project.from_directory "kit" do
22
+ archive list_file, destination_file
23
+ end
24
+
25
+ true
26
+ end
27
+
28
+ # generates an archive for a project's source package based on
29
+ # its file list
30
+ def archive_src(name)
31
+ list_file = File.join(@project.full_path, "file_lists/#{name}_input")
32
+ if not File.exist? list_file
33
+ return false
34
+ end
35
+ destination_file = File.join(@project.full_path, "archives/#{@project.name}-#{name}.tar.xz")
36
+
37
+ @project.from_directory File.join("src", name) do
38
+ archive list_file, destination_file
39
+ end
40
+
41
+ true
42
+ end
43
+
44
+ # compresses files specified in the list file to the destination file
45
+ def archive(list_file, destination_file)
46
+ `tar --files-from=#{list_file} -cJf #{destination_file}`
47
+ end
48
+ end
49
+ end
data/lib/gjp/cli.rb CHANGED
@@ -82,8 +82,12 @@ module Gjp
82
82
  end
83
83
 
84
84
  def execute
85
- project = Gjp::Project.new(".")
86
- Gjp::MavenRunner.new(project).mvn(@maven_options)
85
+ begin
86
+ project = Gjp::Project.new(".")
87
+ Gjp::MavenRunner.new(project).mvn(@maven_options)
88
+ rescue Gjp::MavenNotFoundException
89
+ puts "mvn executable not found in kit/ or any of its subdirectories, gather it"
90
+ end
87
91
  end
88
92
  end
89
93
 
@@ -105,6 +109,41 @@ module Gjp
105
109
  end
106
110
  end
107
111
 
112
+ subcommand "scaffold-kit-spec", "Scaffolds or refreshes a spec file for the kit package" do
113
+ def execute
114
+ project = Gjp::Project.new(".")
115
+ success = Gjp::Scaffolder.new(project).scaffold_kit_spec
116
+ if not success
117
+ puts "You must be gathering before scaffolding."
118
+ puts "Use \"gjp gather\" to start a new gathering."
119
+ end
120
+ end
121
+ end
122
+
123
+ subcommand "generate-kit-archive", "Archives contents of the kit package in a tarball" do
124
+ def execute
125
+ project = Gjp::Project.new(".")
126
+ success = Gjp::Archiver.new(project).archive_kit
127
+ if not success
128
+ "The file_list/kit file was not found. Ensure you already added content to kit/ " +
129
+ "during a gathering and/or dry-running phase, and ensure you ended that phase " +
130
+ "with \"gjp finish\"."
131
+ end
132
+ end
133
+ end
134
+
135
+ subcommand "generate-src-archive", "Archives contents of one src package in a tarball" do
136
+ parameter "NAME", "name of a package in src/"
137
+ def execute
138
+ project = Gjp::Project.new(".")
139
+ success = Gjp::Archiver.new(project).archive_src name
140
+ if not success
141
+ "The file_list/#{name}_input file was not found. Ensure you already added content to " +
142
+ "src/#{name} during a gathering phase, and ensure you ended that phase with \"gjp finish\"."
143
+ end
144
+ end
145
+ end
146
+
108
147
  subcommand "set-up-nonet-user", "Sets up a \"nonet\" user that cannot access the network" do
109
148
  def execute
110
149
  user = Gjp::LimitedNetworkUser.new("nonet")
@@ -23,6 +23,7 @@ module Gjp
23
23
  end
24
24
  end
25
25
 
26
+ log.debug("Maven executable not found")
26
27
  nil
27
28
  end
28
29
 
@@ -31,11 +32,13 @@ module Gjp
31
32
  prefix = path_from running_full_path, kit_full_path
32
33
  maven_executable = find_maven_executable
33
34
 
34
- mvn_path = File.join(prefix, maven_executable)
35
- repo_path = File.join(prefix, "kit", "m2")
36
- config_path = File.join(prefix, "kit", "m2", "settings.xml")
35
+ if maven_executable != nil
36
+ mvn_path = File.join(prefix, maven_executable)
37
+ repo_path = File.join(prefix, "kit", "m2")
38
+ config_path = File.join(prefix, "kit", "m2", "settings.xml")
37
39
 
38
- "#{mvn_path} -Dmaven.repo.local=`readlink -e #{repo_path}` -s`readlink -e #{config_path}`"
40
+ "#{mvn_path} -Dmaven.repo.local=`readlink -e #{repo_path}` -s`readlink -e #{config_path}`"
41
+ end
39
42
  end
40
43
 
41
44
  # returns a path from origin to destination, provided they are both absolute
@@ -47,7 +50,14 @@ module Gjp
47
50
  def mvn(options)
48
51
  kit_full_path = File.join(@project.full_path, "kit")
49
52
  running_full_path = File.expand_path(".")
50
- Process.wait(Process.spawn("#{get_maven_commandline(kit_full_path, running_full_path)} #{options.join(' ')}"))
53
+ maven_commandline = get_maven_commandline(kit_full_path, running_full_path)
54
+ if maven_commandline == nil
55
+ raise MavenNotFoundException
56
+ end
57
+ Process.wait(Process.spawn("#{maven_commandline} #{options.join(' ')}"))
51
58
  end
52
59
  end
60
+
61
+ class MavenNotFoundException < Exception
62
+ end
53
63
  end
data/lib/gjp/project.rb CHANGED
@@ -42,9 +42,12 @@ module Gjp
42
42
  `git init`
43
43
  end
44
44
 
45
- copy_from_template "file_lists", "."
46
- copy_from_template "src", "."
47
- copy_from_template "kit", "."
45
+ template_manager = Gjp::TemplateManager.new
46
+ template_manager.copy "archives", "."
47
+ template_manager.copy "file_lists", "."
48
+ template_manager.copy "kit", "."
49
+ template_manager.copy "specs", "."
50
+ template_manager.copy "src", "."
48
51
 
49
52
  `git add .`
50
53
  `git commit -m "Project initialized"`
@@ -54,11 +57,6 @@ module Gjp
54
57
  end
55
58
  end
56
59
 
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
-
62
60
  # starts a gathering phase, all files added to the project
63
61
  # will be added to packages (including kit)
64
62
  def gather
@@ -71,7 +69,7 @@ module Gjp
71
69
  end
72
70
 
73
71
  set_status :gathering
74
- take_snapshot "Gathering started", :revertable
72
+ take_snapshot "Gathering started", :gathering_started
75
73
  end
76
74
 
77
75
  true
@@ -90,7 +88,7 @@ module Gjp
90
88
  end
91
89
 
92
90
  set_status :dry_running
93
- take_snapshot "Dry-run started", :revertable
91
+ take_snapshot "Dry-run started", :dry_run_started
94
92
  end
95
93
 
96
94
  true
@@ -104,41 +102,45 @@ module Gjp
104
102
  if status == :gathering
105
103
  take_snapshot "Changes during gathering"
106
104
 
107
- update_changed_file_list("kit", "kit")
108
- update_changed_src_file_list(:input)
105
+ update_changed_file_list "kit", "kit", :gathering_started
106
+ update_changed_src_file_list :input, :gathering_started
109
107
  take_snapshot "File list updates"
110
108
 
111
109
  set_status nil
112
- take_snapshot "Gathering finished", :revertable
110
+ take_snapshot "Gathering finished", :gathering_finished
113
111
 
114
112
  :gathering
115
113
  elsif status == :dry_running
116
114
  take_snapshot "Changes during dry-run"
117
115
 
118
- update_changed_file_list("kit", "kit")
119
- update_changed_src_file_list(:output)
116
+ update_changed_file_list "kit", "kit", :dry_run_started
117
+ update_changed_src_file_list :output, :dry_run_started
120
118
  take_snapshot "File list updates"
121
119
 
122
- revert("src")
120
+ revert "src", :dry_run_started
123
121
  take_snapshot "Sources reverted as before dry-run"
124
122
 
125
123
  set_status nil
126
- take_snapshot "Dry run finished", :revertable
124
+ take_snapshot "Dry run finished", :dry_run_finished
127
125
 
128
126
  :dry_running
129
127
  end
130
128
  end
131
129
  end
132
130
 
133
- def update_changed_src_file_list(list_name)
131
+ # updates one of the files that tracks changes in src/ directories form a certain tag
132
+ # list_name is the name of the list of files to update, there will be one for each
133
+ # package in src/
134
+ def update_changed_src_file_list(list_name, tag)
134
135
  Dir.foreach("src") do |entry|
135
136
  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}")
137
+ update_changed_file_list(File.join("src", entry), "#{$1}_#{list_name.to_s}", tag)
137
138
  end
138
139
  end
139
140
  end
140
141
 
141
- def update_changed_file_list(directory, file_name)
142
+ # updates file_name with the file names changed in directory since tag
143
+ def update_changed_file_list(directory, file_name, tag)
142
144
  list_file = File.join("file_lists", file_name)
143
145
  tracked_files = if File.exists?(list_file)
144
146
  File.readlines(list_file)
@@ -147,7 +149,7 @@ module Gjp
147
149
  end
148
150
 
149
151
  new_tracked_files = (
150
- `git diff-tree --no-commit-id --name-only -r HEAD`.split("\n")
152
+ `git diff-tree --no-commit-id --name-only -r #{latest_tag(tag)} HEAD`.split("\n")
151
153
  .select { |file| file.start_with?(directory) }
152
154
  .map { |file|file[directory.length + 1, file.length] }
153
155
  .concat(tracked_files)
@@ -157,7 +159,6 @@ module Gjp
157
159
 
158
160
  log.debug("writing file list for #{directory}: #{new_tracked_files.to_s}")
159
161
 
160
-
161
162
  File.open(list_file, "w+") do |file_list|
162
163
  new_tracked_files.each do |file|
163
164
  file_list.puts file
@@ -167,34 +168,34 @@ module Gjp
167
168
 
168
169
  # adds the project's whole contents to git
169
170
  # if tag is given, commit is tagged
170
- def take_snapshot(message, revertability = :not_revertable)
171
+ def take_snapshot(message, tag = nil)
171
172
  log.debug "committing with message: #{message}"
172
173
 
173
174
  `git rm -r --cached .`
174
175
  `git add .`
175
176
  `git commit -m "#{message}"`
176
177
 
177
- if revertability == :revertable
178
- latest_count = if latest_snapshot_name =~ /^gjp_revertable_snapshot_([0-9]+)$/
178
+ if tag != nil
179
+ latest_count = if latest_tag(tag) =~ /^gjp_.*_([0-9]+)$/
179
180
  $1
180
181
  else
181
182
  0
182
183
  end
183
- `git tag gjp_revertable_snapshot_#{$1.to_i + 1}`
184
+ `git tag gjp_#{tag}_#{latest_count.to_i + 1}`
184
185
  end
185
186
  end
186
187
 
187
- # returns the last snapshot git tag name
188
- def latest_snapshot_name
189
- `git describe --abbrev=0 --tags --match=gjp_revertable_snapshot_*`.strip
188
+ # returns the last tag given in a gjp snapshot
189
+ def latest_tag(tag)
190
+ `git describe --abbrev=0 --tags --match=gjp_#{tag}_*`.strip
190
191
  end
191
192
 
192
- # reverts dir contents as commit_count commits ago
193
- def revert(dir)
194
- `git rm -rf --ignore-unmatch #{dir}`
195
- `git checkout -f #{latest_snapshot_name} -- #{dir}`
193
+ # reverts path contents as per latest tag
194
+ def revert(path, tag)
195
+ `git rm -rf --ignore-unmatch #{path}`
196
+ `git checkout -f #{latest_tag(tag)} -- #{path}`
196
197
 
197
- `git clean -f -d #{dir}`
198
+ `git clean -f -d #{path}`
198
199
  end
199
200
 
200
201
  # returns a symbol with the current status
@@ -233,11 +234,25 @@ module Gjp
233
234
  ".#{status.to_s}"
234
235
  end
235
236
 
236
- # runs a block from the project directory
237
- def from_directory
238
- Dir.chdir(@full_path) do
237
+ # runs a block from the project directory or a subdirectory
238
+ def from_directory(subdirectory = "")
239
+ Dir.chdir(File.join(@full_path, subdirectory)) do
239
240
  yield
240
241
  end
241
242
  end
243
+
244
+ # helpers for ERB
245
+
246
+ def name
247
+ File.basename(@full_path)
248
+ end
249
+
250
+ def version
251
+ `git rev-parse --short #{latest_tag(:dry_run_finished)}`.strip
252
+ end
253
+
254
+ def get_binding
255
+ binding
256
+ end
242
257
  end
243
258
  end
@@ -0,0 +1,42 @@
1
+ # encoding: UTF-8
2
+
3
+ module Gjp
4
+ # creates and updates spec files
5
+ class Scaffolder
6
+ include Logger
7
+
8
+ def initialize(project)
9
+ @project = project
10
+ end
11
+
12
+ def scaffold_kit_spec
13
+ if @project.get_status != :gathering
14
+ return false
15
+ end
16
+
17
+ @project.from_directory do
18
+ spec_path = File.join("specs", "#{@project.name}-kit.spec")
19
+
20
+ TemplateManager.new.generate "kit.spec", @project.get_binding, "#{spec_path}.new_scaffold"
21
+
22
+ already_scaffolded = @project.latest_tag(:scaffold_kit_spec) != ""
23
+ already_existing = File.exist? spec_path
24
+
25
+ if already_scaffolded and already_existing
26
+ # 3-way merge
27
+ `git show #{@project.latest_tag(:scaffold_kit_spec)}:#{spec_path} > #{spec_path}.old_scaffold`
28
+ `git merge-file --ours #{spec_path} #{spec_path}.old_scaffold #{spec_path}.new_scaffold`
29
+ File.delete "#{spec_path}.new_scaffold"
30
+ File.delete "#{spec_path}.old_scaffold"
31
+ else
32
+ # just replace
33
+ File.rename "#{spec_path}.new_scaffold", spec_path
34
+ end
35
+
36
+ @project.take_snapshot "Kit spec scaffolded", :scaffold_kit_spec
37
+
38
+ true
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: UTF-8
2
+
3
+ require "erb"
4
+
5
+ module Gjp
6
+ # operates on files in template/
7
+ class TemplateManager
8
+ include Logger
9
+
10
+ attr_reader :template_path
11
+
12
+ def initialize
13
+ @template_path = File.join(File.dirname(__FILE__), "..", "template")
14
+ end
15
+
16
+ def copy(template_name, destination_dir)
17
+ FileUtils.cp_r(File.join(template_path, template_name), destination_dir)
18
+ end
19
+
20
+ def generate(template_name, object_binding, destination_path)
21
+ erb = ERB.new File.read(File.join(template_path, template_name))
22
+ File.open(destination_path, "w") { |io| io.write erb.result(object_binding) }
23
+ end
24
+ end
25
+ end
data/lib/gjp/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Gjp
4
- VERSION = "0.11.2"
4
+ VERSION = "0.13.1"
5
5
  end
data/lib/gjp.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "gjp/version"
2
2
  require "gjp/logger"
3
+ require "gjp/template_manager"
3
4
  require "gjp/project"
4
5
  require "gjp/pom"
5
6
  require "gjp/version_matcher"
@@ -11,5 +12,7 @@ require "gjp/source_address_getter"
11
12
  require "gjp/source_getter"
12
13
  require "gjp/parent_pom_getter"
13
14
  require "gjp/maven_runner"
15
+ require "gjp/scaffolder"
16
+ require "gjp/archiver"
14
17
 
15
18
  require "gjp/cli"
@@ -0,0 +1,3 @@
1
+ gjp will generate source archives for packages here.
2
+
3
+ Those should not be edited by hand, rather you can edit which files get included by editing contents of the file_lists/ direcotry, and the files themselves from the kit and src/<package name> folders.
@@ -0,0 +1,51 @@
1
+ #
2
+ # spec file for gjp kit for project "<%= name %>"
3
+ #
4
+ # Copyright (c) <%= Time.now.year %> <%= Etc.getlogin %>
5
+ #
6
+ # All modifications and additions to the file contributed by third parties
7
+ # remain the property of their copyright owners, unless otherwise agreed
8
+ # upon. The license for this file, and modifications and additions to the
9
+ # file, is the same license as for the pristine package itself (unless the
10
+ # license for the pristine package is not an Open Source License, in which
11
+ # case the license is the MIT License). An "Open Source License" is a
12
+ # license that conforms to the Open Source Definition (Version 1.9)
13
+ # published by the Open Source Initiative.
14
+
15
+ # Please submit bugfixes or comments via http://bugs.opensuse.org/
16
+ #
17
+
18
+ Name: <%= name %>-kit
19
+ Version: <%= version %>
20
+ Release: 1
21
+ License: Apache-2.0
22
+ Summary: Build-time dependencies for %{name}
23
+ Url: https://github.com/SilvioMoioli/gjp
24
+ Group: Develompent/Libraries/Java
25
+ Source0: %{name}.tar.xz
26
+ BuildRoot: %{_tmppath}/%{name}-%{version}-build
27
+ Provides: gjp(kit)
28
+ # no two kits should ever be installed at any given time
29
+ Conflicts: otherproviders(gjp(kit))
30
+
31
+ %description
32
+ This package has been automatically created by gjp in order to
33
+ satisfy build time dependencies of some Java packages. It should
34
+ not be used except for rebuilding those packages and it should never
35
+ be installed on end users' systems.
36
+
37
+ %prep
38
+ %setup -q
39
+
40
+ %build
41
+ # nothing to do, gjp kits are precompiled by design
42
+
43
+ %install
44
+ install -d -m 0755 %{buildroot}%{_datadir}/gjp/%{name}/
45
+ cp -a * %{buildroot}%{_datadir}/gjp/%{name}/
46
+
47
+ %files
48
+ %defattr(-,root,root)
49
+ %{_datadir}/gjp/%{name}/
50
+
51
+ %changelog
@@ -0,0 +1,3 @@
1
+ gjp will generate spec files for all packages here.
2
+
3
+ You can edit them manually, if you wish, and also let gjp regenerate them later. If you do that, gjp will use three-way merge if possible (prompting in case any conflict arise).
@@ -0,0 +1,60 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Gjp::Archiver do
6
+ before(:each) do
7
+ @project_path = File.join("spec", "data", "test-project")
8
+ Dir.mkdir(@project_path)
9
+
10
+ Gjp::Project.init(@project_path)
11
+ @project = Gjp::Project.new(@project_path)
12
+ end
13
+
14
+ after(:each) do
15
+ FileUtils.rm_rf(@project_path)
16
+ end
17
+
18
+ let(:archiver) { Gjp::Archiver.new(@project) }
19
+
20
+ describe "#archive" do
21
+ it "archives a list of files" do
22
+ @project.from_directory do
23
+ File.open("test", "w") { |io| io.puts "test content" }
24
+ File.open("test_list", "w") { |io| io.puts "test" }
25
+
26
+ archiver.archive "test_list", "test.tar.xz"
27
+ `tar -Jtf test.tar.xz`.split.should include("test")
28
+ end
29
+ end
30
+ end
31
+
32
+ describe "#archive_kit" do
33
+ it "archives a kit package files" do
34
+ @project.from_directory do
35
+ File.open(File.join("kit","kit_test"), "w") { |io| io.puts "test content" }
36
+ end
37
+ @project.finish
38
+
39
+ archiver.archive_kit
40
+ @project.from_directory do
41
+ `tar -Jtf archives/test-project-kit.tar.xz`.split.should include("kit_test")
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#archive_src" do
47
+ it "archives a source package files" do
48
+ @project.from_directory do
49
+ Dir.mkdir(File.join("src", "a:b:c"))
50
+ File.open(File.join("src", "a:b:c", "src_test"), "w") { |io| io.puts "test content" }
51
+ end
52
+ @project.finish
53
+
54
+ archiver.archive_src "a:b:c"
55
+ @project.from_directory do
56
+ `tar -Jtf archives/test-project-a:b:c.tar.xz`.split.should include("src_test")
57
+ end
58
+ end
59
+ end
60
+ end
@@ -10,19 +10,6 @@ describe Gjp::MavenRunner do
10
10
 
11
11
  Gjp::Project.init(@project_path)
12
12
  @project = Gjp::Project.new(@project_path)
13
- @project.gather
14
-
15
- # mock a Maven executable
16
- Dir.chdir(@project_path) do
17
- @bin_dir = File.join("kit", "mvn", "bin")
18
- FileUtils.mkdir_p(@bin_dir)
19
- @maven_executable = File.join(@bin_dir, "mvn")
20
- File.open(@maven_executable, "w") { |io| io.puts "echo $0 $*>test_out" }
21
- File.chmod(0777, @maven_executable)
22
- end
23
-
24
- @project.finish
25
-
26
13
  @maven_runner = Gjp::MavenRunner.new(@project)
27
14
  end
28
15
 
@@ -31,26 +18,56 @@ describe Gjp::MavenRunner do
31
18
  end
32
19
 
33
20
  describe "#find_maven_executable" do
34
- it "looks for Maven in kit" do
21
+ it "finds a Maven executable in kit" do
22
+ mock_maven_executable
35
23
  @maven_runner.find_maven_executable.should eq @maven_executable
36
24
  end
25
+ it "doesn't find a Maven executable in kit" do
26
+ @maven_runner.find_maven_executable.should be_nil
27
+ end
37
28
  end
38
29
 
39
30
  describe "#get_maven_commandline" do
40
31
  it "returns commandline options for running maven" do
32
+ mock_maven_executable
41
33
  kit_full_path = File.join(@project.full_path, "kit")
42
34
  commandline = @maven_runner.get_maven_commandline(kit_full_path, @project.full_path)
43
35
 
44
36
  commandline.should eq "./#{@maven_executable} -Dmaven.repo.local=`readlink -e ./kit/m2` -s`readlink -e ./kit/m2/settings.xml`"
45
37
  end
38
+ it "doesn't return commandline options if Maven is not available" do
39
+ kit_full_path = File.join(@project.full_path, "kit")
40
+ commandline = @maven_runner.get_maven_commandline(kit_full_path, @project.full_path)
41
+
42
+ commandline.should be_nil
43
+ end
46
44
  end
47
45
 
48
46
  describe "#mvn" do
49
47
  it "runs maven" do
48
+ mock_maven_executable
50
49
  @project.from_directory do
51
50
  @maven_runner.mvn(["extra-option"])
52
51
  File.read("test_out").strip.should match /extra-option$/
53
52
  end
54
53
  end
54
+ it "doesn't run Maven if it is not available" do
55
+ @project.from_directory do
56
+ expect { @maven_runner.mvn []}.to raise_error(Gjp::MavenNotFoundException)
57
+ end
58
+ end
59
+ end
60
+
61
+ def mock_maven_executable
62
+ @project.gather
63
+ Dir.chdir(@project_path) do
64
+ @bin_dir = File.join("kit", "mvn", "bin")
65
+ FileUtils.mkdir_p(@bin_dir)
66
+ @maven_executable = File.join(@bin_dir, "mvn")
67
+ File.open(@maven_executable, "w") { |io| io.puts "echo $0 $*>test_out" }
68
+ File.chmod(0777, @maven_executable)
69
+ end
70
+
71
+ @project.finish
55
72
  end
56
73
  end
@@ -50,7 +50,7 @@ describe Gjp::Project do
50
50
  Dir.exists?(src_path).should be_true
51
51
 
52
52
  @project.from_directory do
53
- @project.latest_snapshot_name.should eq "gjp_revertable_snapshot_1"
53
+ @project.latest_tag(:gathering_started).should eq "gjp_gathering_started_1"
54
54
  `git rev-list --all`.split("\n").length.should eq 2
55
55
  end
56
56
 
@@ -85,7 +85,7 @@ describe Gjp::Project do
85
85
  @project.take_snapshot "test", :revertable
86
86
 
87
87
  `git rev-list --all`.split("\n").length.should eq 3
88
- @project.latest_snapshot_name.should eq "gjp_revertable_snapshot_2"
88
+ @project.latest_tag(:revertable).should eq "gjp_revertable_1"
89
89
  end
90
90
  end
91
91
  end
@@ -0,0 +1,94 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Gjp::Scaffolder do
6
+ before(:each) do
7
+ @project_path = File.join("spec", "data", "test-project")
8
+ Dir.mkdir(@project_path)
9
+
10
+ Gjp::Project.init(@project_path)
11
+ @project = Gjp::Project.new(@project_path)
12
+
13
+ @project.dry_run
14
+ Dir.chdir(@project_path) do
15
+ test_file = File.join("kit", "test")
16
+ File.open(test_file, "w") { |io| io.puts "kit content test file" }
17
+ end
18
+ @project.gather
19
+
20
+ @scaffolder = Gjp::Scaffolder.new(@project)
21
+ end
22
+
23
+ after(:each) do
24
+ FileUtils.rm_rf(@project_path)
25
+ end
26
+
27
+ describe "#scaffold_kit_spec" do
28
+ it "scaffolds the first version" do
29
+ @scaffolder.scaffold_kit_spec.should be_true
30
+
31
+ @project.from_directory do
32
+ spec_lines = File.readlines(File.join("specs", "test-project-kit.spec"))
33
+ spec_lines.should include("Name: test-project-kit\n")
34
+ spec_lines.should include("Version: #{`git rev-parse --short #{@project.latest_tag(:dry_run_finished)}`}")
35
+ spec_lines.should include("Source0: %{name}.tar.xz\n")
36
+ end
37
+ end
38
+ it "scaffolds a second version" do
39
+ @scaffolder.scaffold_kit_spec.should be_true
40
+ @project.dry_run
41
+ Dir.chdir(@project_path) do
42
+ test_file = File.join("kit", "test")
43
+ File.open(test_file, "w") { |io| io.puts "changed kit content test file" }
44
+
45
+ File.open(File.join("specs", "test-project-kit.spec"), "a") do |io|
46
+ io.write("nonconflicting line")
47
+ end
48
+ end
49
+ @project.gather
50
+
51
+ @scaffolder.scaffold_kit_spec.should be_true
52
+
53
+ @project.from_directory do
54
+ spec_lines = File.readlines(File.join("specs", "test-project-kit.spec"))
55
+ spec_lines.should include("Name: test-project-kit\n")
56
+ spec_lines.should include("Version: #{`git rev-parse --short #{@project.latest_tag(:dry_run_finished)}`}")
57
+ spec_lines.should include("Source0: %{name}.tar.xz\n")
58
+ spec_lines.should include("nonconflicting line\n")
59
+ end
60
+ end
61
+ it "scaffolds a conflicting version" do
62
+ @scaffolder.scaffold_kit_spec.should be_true
63
+ @project.dry_run
64
+ Dir.chdir(@project_path) do
65
+ test_file = File.join("kit", "test")
66
+ File.open(test_file, "w") { |io| io.puts "changed kit content test file" }
67
+
68
+ spec_path = File.join("specs", "test-project-kit.spec")
69
+ spec_contents = File.read spec_path
70
+
71
+ spec_contents.gsub! /^Version:.*$/, "CONFLICTING!"
72
+
73
+ File.open(spec_path, "w+") do |io|
74
+ io.write(spec_contents)
75
+ end
76
+ end
77
+ @project.gather
78
+
79
+ @scaffolder.scaffold_kit_spec.should be_true
80
+
81
+ @project.from_directory do
82
+ spec_lines = File.readlines(File.join("specs", "test-project-kit.spec"))
83
+ spec_lines.should include("Name: test-project-kit\n")
84
+ spec_lines.should include("Source0: %{name}.tar.xz\n")
85
+ spec_lines.should include("CONFLICTING!\n")
86
+ spec_lines.should_not include("Version: #{`git rev-parse --short #{@project.latest_tag(:dry_run_finished)}`}")
87
+ end
88
+ end
89
+ it "returns error if the phase is incorrect" do
90
+ @project.dry_run
91
+ @scaffolder.scaffold_kit_spec.should be_false
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Gjp::TemplateManager do
6
+ let(:template_manager) { Gjp::TemplateManager.new }
7
+
8
+ describe "#template_path" do
9
+ it "returns the pathname where all templates are stored" do
10
+ relative_path = template_manager.template_path
11
+
12
+ File.expand_path(relative_path).should eq File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "template"))
13
+ end
14
+ end
15
+
16
+ describe "#copy" do
17
+ it "copies a file from template to another dir" do
18
+ destination = Tempfile.new("TemplateManager spec")
19
+ destination_path = destination.path
20
+ destination.unlink
21
+
22
+ template_manager.copy(File.join("src", "CONTENTS"), destination_path)
23
+
24
+ File.exist?(destination_path)
25
+ end
26
+ end
27
+
28
+ describe "#generate" do
29
+ it "compiles a file from a template and a value objects file" do
30
+ template_path = File.join(template_manager.template_path, "test.erb")
31
+ File.open(template_path, "w") { |io| io.puts "Hello <%= world_property %>" }
32
+
33
+ destination = Tempfile.new("TemplateManager spec")
34
+ destination_path = destination.path
35
+ destination.unlink
36
+
37
+ class WorldClass
38
+ def world_property
39
+ "World!"
40
+ end
41
+
42
+ def get_binding
43
+ binding
44
+ end
45
+ end
46
+
47
+ template_manager.generate("test.erb", WorldClass.new.get_binding, destination_path)
48
+ File.unlink(template_path)
49
+
50
+ File.read(destination_path).should eq "Hello World!\n"
51
+ end
52
+ end
53
+ 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.11.2
4
+ version: 0.13.1
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-08-12 00:00:00.000000000 Z
12
+ date: 2013-08-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -156,6 +156,7 @@ files:
156
156
  - bin/gjp
157
157
  - gjp.gemspec
158
158
  - lib/gjp.rb
159
+ - lib/gjp/archiver.rb
159
160
  - lib/gjp/cli.rb
160
161
  - lib/gjp/jar_table.rb
161
162
  - lib/gjp/limited_network_user.rb
@@ -166,13 +167,18 @@ files:
166
167
  - lib/gjp/pom.rb
167
168
  - lib/gjp/pom_getter.rb
168
169
  - lib/gjp/project.rb
170
+ - lib/gjp/scaffolder.rb
169
171
  - lib/gjp/source_address_getter.rb
170
172
  - lib/gjp/source_getter.rb
173
+ - lib/gjp/template_manager.rb
171
174
  - lib/gjp/version.rb
172
175
  - lib/gjp/version_matcher.rb
176
+ - lib/template/archives/CONTENTS
173
177
  - lib/template/file_lists/CONTENTS
178
+ - lib/template/kit.spec
174
179
  - lib/template/kit/CONTENTS
175
180
  - lib/template/kit/m2/settings.xml
181
+ - lib/template/specs/CONTENTS
176
182
  - lib/template/src/CONTENTS
177
183
  - spec/data/ant-super-simple-code/build.xml
178
184
  - spec/data/ant-super-simple-code/build/HW.class
@@ -190,6 +196,7 @@ files:
190
196
  - spec/data/nailgun/pom.xml
191
197
  - spec/data/struts-apps/pom.xml
192
198
  - spec/data/tomcat/pom.xml
199
+ - spec/lib/archiver_spec.rb
193
200
  - spec/lib/jar_table_spec.rb
194
201
  - spec/lib/limited_network_user_spec_interactive.rb
195
202
  - spec/lib/maven_runner_spec.rb
@@ -198,8 +205,10 @@ files:
198
205
  - spec/lib/pom_getter_spec.rb
199
206
  - spec/lib/pom_spec.rb
200
207
  - spec/lib/project_spec.rb
208
+ - spec/lib/scaffolder_spec.rb
201
209
  - spec/lib/source_address_getter_spec.rb
202
210
  - spec/lib/source_getter_spec.rb
211
+ - spec/lib/template_manager_spec.rb
203
212
  - spec/lib/version_matcher_spec.rb
204
213
  - spec/spec_helper.rb
205
214
  homepage: https://github.com/SilvioMoioli/gjp
@@ -243,6 +252,7 @@ test_files:
243
252
  - spec/data/nailgun/pom.xml
244
253
  - spec/data/struts-apps/pom.xml
245
254
  - spec/data/tomcat/pom.xml
255
+ - spec/lib/archiver_spec.rb
246
256
  - spec/lib/jar_table_spec.rb
247
257
  - spec/lib/limited_network_user_spec_interactive.rb
248
258
  - spec/lib/maven_runner_spec.rb
@@ -251,7 +261,9 @@ test_files:
251
261
  - spec/lib/pom_getter_spec.rb
252
262
  - spec/lib/pom_spec.rb
253
263
  - spec/lib/project_spec.rb
264
+ - spec/lib/scaffolder_spec.rb
254
265
  - spec/lib/source_address_getter_spec.rb
255
266
  - spec/lib/source_getter_spec.rb
267
+ - spec/lib/template_manager_spec.rb
256
268
  - spec/lib/version_matcher_spec.rb
257
269
  - spec/spec_helper.rb