gjp 0.10.0 → 0.11.1
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 +4 -2
- data/README.md +7 -0
- data/lib/gjp.rb +9 -6
- data/lib/gjp/cli.rb +90 -0
- data/lib/gjp/jar_table.rb +22 -8
- data/lib/gjp/limited_network_user.rb +66 -0
- data/lib/gjp/maven_runner.rb +55 -0
- data/lib/gjp/{get_parent_pom.rb → parent_pom_getter.rb} +1 -1
- data/lib/gjp/{get_pom.rb → pom_getter.rb} +1 -1
- data/lib/gjp/project.rb +216 -0
- data/lib/gjp/{get_source_address.rb → source_address_getter.rb} +1 -1
- data/lib/gjp/{get_source.rb → source_getter.rb} +1 -1
- data/lib/gjp/version.rb +1 -1
- data/spec/lib/limited_network_user_spec_interactive.rb +40 -0
- data/spec/lib/maven_runner_spec.rb +56 -0
- data/spec/lib/maven_website_spec.rb +2 -2
- data/spec/lib/{get_parent_pom_spec.rb → parent_pom_getter_spec.rb} +0 -0
- data/spec/lib/{get_pom_spec.rb → pom_getter_spec.rb} +0 -0
- data/spec/lib/project_spec.rb +190 -0
- data/spec/lib/{get_source_address_spec.rb → source_address_getter_spec.rb} +0 -0
- data/spec/lib/{get_source_spec.rb → source_getter_spec.rb} +0 -0
- metadata +23 -14
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
gjp (0.
|
4
|
+
gjp (0.10.2)
|
5
5
|
clamp
|
6
6
|
json
|
7
7
|
nokogiri
|
@@ -16,7 +16,9 @@ GEM
|
|
16
16
|
diff-lcs (1.2.4)
|
17
17
|
json (1.8.0)
|
18
18
|
mime-types (1.23)
|
19
|
-
|
19
|
+
mini_portile (0.5.1)
|
20
|
+
nokogiri (1.6.0)
|
21
|
+
mini_portile (~> 0.5.0)
|
20
22
|
rake (10.0.4)
|
21
23
|
rest-client (1.6.7)
|
22
24
|
mime-types (>= 1.16)
|
data/README.md
CHANGED
@@ -15,10 +15,17 @@ Easiest install is via RubyGems:
|
|
15
15
|
## Usage
|
16
16
|
|
17
17
|
Currently available tools:
|
18
|
+
* `gjp init` inits a new gjp project in the current directory, generating minimal directories and files;
|
19
|
+
* `gjp gather` starts a new gathering phase, to add files to the packages you want to create. You should place source files in src/<orgId_artifactId_version>, and binary dependency files in kit/;
|
18
20
|
* `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;
|
19
21
|
* `gjp get-parent-pom POM` will attempt to download a pom's parent from search.maven.org, where `POM` is a filename or URI;
|
20
22
|
* `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;
|
21
23
|
* `gjp get-source POM ADDRESS` downloads the source of a pom.xml's project from its SCM at ADDRESS;
|
24
|
+
* `gjp finish` marks the end of a phase;
|
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
|
+
* `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 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
|
+
* `gjp tear-down-nonet-user` removes a user previously created by gjp;
|
22
29
|
* `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);
|
23
30
|
|
24
31
|
## Source
|
data/lib/gjp.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
-
require "gjp/logger"
|
2
1
|
require "gjp/version"
|
3
2
|
require "gjp/logger"
|
4
|
-
require "gjp/
|
3
|
+
require "gjp/project"
|
5
4
|
require "gjp/pom"
|
6
5
|
require "gjp/version_matcher"
|
7
6
|
require "gjp/maven_website"
|
8
|
-
require "gjp/get_pom"
|
9
|
-
require "gjp/get_parent_pom"
|
10
|
-
require "gjp/get_source_address"
|
11
|
-
require "gjp/get_source"
|
12
7
|
require "gjp/jar_table"
|
8
|
+
require "gjp/limited_network_user"
|
9
|
+
require "gjp/pom_getter"
|
10
|
+
require "gjp/source_address_getter"
|
11
|
+
require "gjp/source_getter"
|
12
|
+
require "gjp/parent_pom_getter"
|
13
|
+
require "gjp/maven_runner"
|
14
|
+
|
15
|
+
require "gjp/cli"
|
data/lib/gjp/cli.rb
CHANGED
@@ -43,6 +43,96 @@ module Gjp
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# Subcommands
|
46
|
+
subcommand "init", "Inits a gjp project in the current directory" do
|
47
|
+
def execute
|
48
|
+
Gjp::Project.init(".")
|
49
|
+
puts "Project inited."
|
50
|
+
puts "Use \"gjp gather\" before adding files to have gjp track them."
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
subcommand "gather", "Starts a gathering phase, add source and kit files to project" do
|
55
|
+
def execute
|
56
|
+
result = Gjp::Project.new(".").gather
|
57
|
+
if result == :done
|
58
|
+
puts "Now gathering."
|
59
|
+
puts "Any file added to kit/ will be added to the kit package."
|
60
|
+
puts "Any file added to src/<orgId_artifactId_version> will be added to the corresponding package."
|
61
|
+
puts "Note that .gitignore files are honored!"
|
62
|
+
puts "To finalize this gathering, use \"gjp finish\"."
|
63
|
+
else
|
64
|
+
puts "Cannot begin gathering while #{result}, use \"gjp finish\" first."
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
subcommand "dry-run", "Starts a dry-run phase, attempt build to add dependencies to kit." do
|
70
|
+
def execute
|
71
|
+
result = Gjp::Project.new(".").dry_run
|
72
|
+
if result == :done
|
73
|
+
puts "Now dry-running, please start your build."
|
74
|
+
puts "Any file added to kit/, presumably downloaded dependencies, will be added to the kit package."
|
75
|
+
puts "The src/ directory and all files in it will be brought back to the current state when finished."
|
76
|
+
puts "Note that .gitignore files are honored!"
|
77
|
+
puts "To run a Maven from the kit, use \"gjp mvn\"."
|
78
|
+
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
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
subcommand "mvn", "Runs Maven from the kit" do
|
86
|
+
parameter "[MAVEN OPTIONS] ...", "mvn options", :attribute_name => "dummy"
|
87
|
+
|
88
|
+
# override parsing in order to pipe everything to mvn
|
89
|
+
def parse(args)
|
90
|
+
@maven_options = args
|
91
|
+
end
|
92
|
+
|
93
|
+
def execute
|
94
|
+
project = Gjp::Project.new(".")
|
95
|
+
Gjp::MavenRunner.new(project).mvn(@maven_options)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
subcommand "finish", "Finishes the current phase" do
|
101
|
+
def execute
|
102
|
+
result = Gjp::Project.new(".").finish
|
103
|
+
if result == :gathering
|
104
|
+
puts "Gathering finished."
|
105
|
+
puts "New files have been added to gjp_file_list files in respective directories."
|
106
|
+
puts "Feel free to edit them if needed."
|
107
|
+
puts "You can start a dry run build with \"gjp dry-run\" or add more files with \"gjp gather\"."
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
subcommand "set-up-nonet-user", "Sets up a \"nonet\" user that cannot access the network" do
|
113
|
+
def execute
|
114
|
+
user = Gjp::LimitedNetworkUser.new("nonet")
|
115
|
+
user.set_up
|
116
|
+
|
117
|
+
"sudo #{user.get_path("useradd")} nonet\n" +
|
118
|
+
"sudo #{user.get_path("iptables")} -A OUTPUT -m owner --uid-owner nonet -j DROP\n" +
|
119
|
+
"User \"nonet\" set up, you can use \"sudo nonet\" to dry-run your build with no network access.\n" +
|
120
|
+
"Note that the above iptables rule will be cleared at next reboot, you can use your distribution " +
|
121
|
+
"tools to make it persistent or run \"gjp set-up-limited-nertwork-user\" again next time."
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
subcommand "tear-down-nonet-user", "Deletes a user previously created by gjp" do
|
126
|
+
def execute
|
127
|
+
user = Gjp::LimitedNetworkUser.new("nonet")
|
128
|
+
|
129
|
+
user.tear_down
|
130
|
+
|
131
|
+
"sudo #{user.get_path("iptables")} -D OUTPUT -m owner --uid-owner nonet -j DROP\n" +
|
132
|
+
"sudo #{user.get_path("userdel")} nonet\n"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
46
136
|
subcommand "get-pom", "Retrieves a pom corresponding to a filename" do
|
47
137
|
parameter "NAME", "a jar file path, a project directory path or a non-existing filename in the `project-version` form"
|
48
138
|
def execute
|
data/lib/gjp/jar_table.rb
CHANGED
@@ -32,14 +32,28 @@ module Gjp
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def to_s
|
35
|
-
"#
|
36
|
-
"#b - jar is required for building the project"
|
37
|
-
"#r - jar is required runtime by the project"
|
38
|
-
"#p - jar is produced by the project"
|
39
|
-
"#i - jar is ignored"
|
40
|
-
|
41
|
-
|
42
|
-
|
35
|
+
"# Key: \n" +
|
36
|
+
"# b - jar is required for building the project\n" +
|
37
|
+
"# r - jar is required runtime by the project\n" +
|
38
|
+
"# p - jar is produced by the project\n" +
|
39
|
+
"# i - jar is ignored\n" +
|
40
|
+
|
41
|
+
(
|
42
|
+
rows = @rows.map do |key, value|
|
43
|
+
pathname = Pathname.new(key)
|
44
|
+
[value.to_s[0], pathname.basename.to_s, pathname.dirname.to_s]
|
45
|
+
end
|
46
|
+
|
47
|
+
max_field_lengths = (0..2).map do |i|
|
48
|
+
rows.map { |row| row[i].length }.max
|
49
|
+
end
|
50
|
+
|
51
|
+
rows.map do |row|
|
52
|
+
row.each_with_index.map do |element, i|
|
53
|
+
"%-#{max_field_lengths[i]+1}s" % element
|
54
|
+
end.join
|
55
|
+
end.sort.join("\n")
|
56
|
+
)
|
43
57
|
end
|
44
58
|
|
45
59
|
# jar files in the project's directory
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'find'
|
4
|
+
|
5
|
+
module Gjp
|
6
|
+
# encapsulates a Linux user that cannot access the Internet
|
7
|
+
# assumes root access (sudo) and iptables are available
|
8
|
+
class LimitedNetworkUser
|
9
|
+
def log
|
10
|
+
Gjp.logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(name)
|
14
|
+
@name = name
|
15
|
+
end
|
16
|
+
|
17
|
+
# creates a new Linux user without Internet access,
|
18
|
+
# if it does not exists
|
19
|
+
def set_up
|
20
|
+
log.debug "checking #{@name} user existence..."
|
21
|
+
if not user_exists?
|
22
|
+
log.debug "...not found. Setting up..."
|
23
|
+
`sudo #{get_path("useradd")} #{@name}`
|
24
|
+
`sudo #{get_path("passwd")} #{@name}`
|
25
|
+
log.debug "...set up"
|
26
|
+
end
|
27
|
+
|
28
|
+
if not firewall_rule_exists?
|
29
|
+
log.debug "...not found. Setting up..."
|
30
|
+
`sudo #{get_path("iptables")} -A OUTPUT -m owner --uid-owner #{@name} -j DROP`
|
31
|
+
log.debug "...set up"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# deletes a Linux user previously created by this class
|
36
|
+
def tear_down
|
37
|
+
if firewall_rule_exists?
|
38
|
+
`sudo #{get_path("iptables")} -D OUTPUT -m owner --uid-owner #{@name} -j DROP`
|
39
|
+
end
|
40
|
+
|
41
|
+
if user_exists?
|
42
|
+
`sudo #{get_path("userdel")} #{@name}`
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# determines if a user without Internet access exists
|
47
|
+
def set_up?
|
48
|
+
user_exists? and firewall_rule_exists?
|
49
|
+
end
|
50
|
+
|
51
|
+
# checks user existence
|
52
|
+
def user_exists?
|
53
|
+
`id #{@name} 2>&1`.match(/no such user$/) == nil
|
54
|
+
end
|
55
|
+
|
56
|
+
# checks firewall rule existence
|
57
|
+
def firewall_rule_exists?
|
58
|
+
`sudo #{get_path("iptables")} -L`.match(/owner UID match #{@name}/) != nil
|
59
|
+
end
|
60
|
+
|
61
|
+
# returns a command's full path
|
62
|
+
def get_path(command)
|
63
|
+
`sudo which #{command}`.strip
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'find'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
module Gjp
|
7
|
+
# runs Maven from a gjp kit with gjp-specific options
|
8
|
+
class MavenRunner
|
9
|
+
def log
|
10
|
+
Gjp.logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(project)
|
14
|
+
@project = project
|
15
|
+
end
|
16
|
+
|
17
|
+
# finds mvn in kit
|
18
|
+
def find_maven_executable
|
19
|
+
@project.from_directory do
|
20
|
+
Find.find("kit") do |path|
|
21
|
+
if path =~ /bin\/mvn$/
|
22
|
+
log.debug("found Maven executable: #{path}")
|
23
|
+
return path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
nil
|
29
|
+
end
|
30
|
+
|
31
|
+
# returns a command line for running Maven
|
32
|
+
def get_maven_commandline(kit_full_path, running_full_path)
|
33
|
+
prefix = path_from running_full_path, kit_full_path
|
34
|
+
maven_executable = find_maven_executable
|
35
|
+
|
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")
|
39
|
+
|
40
|
+
"#{mvn_path} -Dmaven.repo.local=`readlink -e #{repo_path}` -s`readlink -e #{config_path}`"
|
41
|
+
end
|
42
|
+
|
43
|
+
# returns a path from origin to destination, provided they are both absolute
|
44
|
+
def path_from(origin, destination)
|
45
|
+
(Pathname.new(destination).relative_path_from Pathname.new(origin)).split.first
|
46
|
+
end
|
47
|
+
|
48
|
+
# runs mvn in a subprocess
|
49
|
+
def mvn(options)
|
50
|
+
kit_full_path = File.join(@project.full_path, "kit")
|
51
|
+
running_full_path = File.expand_path(".")
|
52
|
+
Process.wait(Process.spawn("#{get_maven_commandline(kit_full_path, running_full_path)} #{options.join(' ')}"))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/gjp/project.rb
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'find'
|
4
|
+
|
5
|
+
module Gjp
|
6
|
+
# encapsulates a Gjp project directory
|
7
|
+
class Project
|
8
|
+
def log
|
9
|
+
Gjp.logger
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_accessor :full_path
|
13
|
+
|
14
|
+
def initialize(path)
|
15
|
+
@full_path = Gjp::Project.find_project_dir(File.expand_path(path))
|
16
|
+
end
|
17
|
+
|
18
|
+
# finds the project directory up in the tree, like git does
|
19
|
+
def self.find_project_dir(starting_dir)
|
20
|
+
result = starting_dir
|
21
|
+
while is_project(result) == false and result != "/"
|
22
|
+
result = File.expand_path("..", result)
|
23
|
+
end
|
24
|
+
|
25
|
+
raise ArgumentError, "This is not a gjp project directory" if result == "/"
|
26
|
+
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
# returns true if the specified directory is a valid gjp project
|
31
|
+
def self.is_project(dir)
|
32
|
+
File.directory?(File.join(dir, "src")) and
|
33
|
+
File.directory?(File.join(dir, "kit")) and
|
34
|
+
File.directory?(File.join(dir, ".git"))
|
35
|
+
end
|
36
|
+
|
37
|
+
# inits a new project directory structure
|
38
|
+
def self.init(dir)
|
39
|
+
Dir.chdir(dir) do
|
40
|
+
`git init`
|
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"
|
49
|
+
end
|
50
|
+
|
51
|
+
`git add .`
|
52
|
+
`git commit -m "Project initialized"`
|
53
|
+
`git tag init`
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# starts a gathering phase, all files added to the project
|
58
|
+
# will be added to packages (including kit)
|
59
|
+
def gather
|
60
|
+
from_directory do
|
61
|
+
if get_status(:gathering)
|
62
|
+
return :gathering
|
63
|
+
elsif get_status(:dry_running)
|
64
|
+
return :dry_running
|
65
|
+
end
|
66
|
+
|
67
|
+
set_status(:gathering)
|
68
|
+
commit_all("Gathering started")
|
69
|
+
end
|
70
|
+
|
71
|
+
:done
|
72
|
+
end
|
73
|
+
|
74
|
+
# starts a dry running phase: files added to the kit will
|
75
|
+
# be added to packages, while sources will be reset at the
|
76
|
+
# end
|
77
|
+
def dry_run
|
78
|
+
from_directory do
|
79
|
+
if get_status(:gathering)
|
80
|
+
return :gathering
|
81
|
+
elsif get_status(:dry_running)
|
82
|
+
return :dry_running
|
83
|
+
end
|
84
|
+
|
85
|
+
set_status(:dry_running)
|
86
|
+
commit_all("Dry-run started")
|
87
|
+
end
|
88
|
+
|
89
|
+
:done
|
90
|
+
end
|
91
|
+
|
92
|
+
# ends any phase that was previously started,
|
93
|
+
# generating file lists
|
94
|
+
def finish
|
95
|
+
from_directory do
|
96
|
+
if get_status(:gathering)
|
97
|
+
commit_all("Changes during gathering")
|
98
|
+
|
99
|
+
update_changed_file_list("kit", "gjp_kit_file_list")
|
100
|
+
update_changed_src_file_list(:file_list)
|
101
|
+
commit_all("File list updates")
|
102
|
+
|
103
|
+
clear_status(:gathering)
|
104
|
+
commit_all("Gathering finished")
|
105
|
+
|
106
|
+
:gathering
|
107
|
+
elsif get_status(:dry_running)
|
108
|
+
commit_all("Changes during dry-run")
|
109
|
+
|
110
|
+
update_changed_file_list("kit", "gjp_kit_file_list")
|
111
|
+
update_changed_src_file_list(:produced_file_list)
|
112
|
+
commit_all("File list updates")
|
113
|
+
|
114
|
+
revert("src", 2)
|
115
|
+
commit_all("Sources reverted as before dry-run")
|
116
|
+
|
117
|
+
clear_status(:dry_running)
|
118
|
+
commit_all("Dry run finished")
|
119
|
+
|
120
|
+
:dry_running
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def update_changed_src_file_list(list_name)
|
126
|
+
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), "gjp_#{$1}_#{list_name.to_s}")
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def update_changed_file_list(directory, list_file)
|
134
|
+
existing_files = if File.exists?(list_file)
|
135
|
+
File.readlines(list_file)
|
136
|
+
else
|
137
|
+
[]
|
138
|
+
end
|
139
|
+
|
140
|
+
files = (
|
141
|
+
`git diff-tree --no-commit-id --name-only -r HEAD`.split("\n")
|
142
|
+
.select { |file| file.start_with?(directory) }
|
143
|
+
.map { |file|file[directory.length + 1, file.length] }
|
144
|
+
.concat(existing_files)
|
145
|
+
.sort
|
146
|
+
.uniq
|
147
|
+
)
|
148
|
+
|
149
|
+
log.debug("writing file list for #{directory}: #{files.to_s}")
|
150
|
+
|
151
|
+
|
152
|
+
File.open(list_file, "w+") do |file_list|
|
153
|
+
files.each do |file|
|
154
|
+
file_list.puts file
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# adds the project's whole contents to git
|
160
|
+
def commit_all(message)
|
161
|
+
Find.find(".") do |path|
|
162
|
+
if path =~ /.gitignore$/
|
163
|
+
puts "Deleting #{path} to preserve all files..."
|
164
|
+
File.delete(path)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
log.debug "committing with message: #{message}"
|
169
|
+
|
170
|
+
`git rm -r --cached .`
|
171
|
+
`git add .`
|
172
|
+
`git commit -m "#{message}"`
|
173
|
+
end
|
174
|
+
|
175
|
+
# reverts dir contents as commit_count commits ago
|
176
|
+
def revert(dir, commit_count)
|
177
|
+
`git rm -rf --ignore-unmatch #{dir}`
|
178
|
+
`git checkout -f HEAD~#{commit_count} -- #{dir}`
|
179
|
+
|
180
|
+
`git clean -f -d #{dir}`
|
181
|
+
end
|
182
|
+
|
183
|
+
# gets a project status flag
|
184
|
+
def get_status(status)
|
185
|
+
file_name = status_file_name(status)
|
186
|
+
File.exists?(file_name)
|
187
|
+
end
|
188
|
+
|
189
|
+
# sets a project status flag
|
190
|
+
def set_status(status)
|
191
|
+
file_name = status_file_name(status)
|
192
|
+
if File.exists?(file_name) == false
|
193
|
+
FileUtils.touch(file_name)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
# sets a project status flag
|
198
|
+
def clear_status(status)
|
199
|
+
file_name = status_file_name(status)
|
200
|
+
if File.exists?(file_name)
|
201
|
+
File.delete(file_name)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def status_file_name(status)
|
206
|
+
".#{status.to_s}"
|
207
|
+
end
|
208
|
+
|
209
|
+
# runs a block from the project directory
|
210
|
+
def from_directory
|
211
|
+
Dir.chdir(@full_path) do
|
212
|
+
yield
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
data/lib/gjp/version.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Gjp::LimitedNetworkUser do
|
6
|
+
|
7
|
+
let(:user) { Gjp::LimitedNetworkUser.new("nonet_test") }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
user.set_up
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
if user.set_up?
|
15
|
+
user.tear_down
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".set_up" do
|
20
|
+
it "set_ups a limited network user" do
|
21
|
+
user.set_up?.should be_true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".tear_down" do
|
26
|
+
it "tears down a limited network user" do
|
27
|
+
user.tear_down
|
28
|
+
user.set_up?.should be_false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".set_up?" do
|
33
|
+
it "checks if a limited network user has been set up" do
|
34
|
+
user.set_up?.should be_true
|
35
|
+
|
36
|
+
user.tear_down
|
37
|
+
user.set_up?.should be_false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Gjp::MavenRunner do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@project_path = File.join("spec", "data", "test-project")
|
9
|
+
Dir.mkdir(@project_path)
|
10
|
+
|
11
|
+
Gjp::Project.init(@project_path)
|
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
|
+
@maven_runner = Gjp::MavenRunner.new(@project)
|
27
|
+
end
|
28
|
+
|
29
|
+
after(:each) do
|
30
|
+
FileUtils.rm_rf(@project_path)
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#find_maven_executable" do
|
34
|
+
it "looks for Maven in kit" do
|
35
|
+
@maven_runner.find_maven_executable.should eq @maven_executable
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#get_maven_commandline" do
|
40
|
+
it "returns commandline options for running maven" do
|
41
|
+
kit_full_path = File.join(@project.full_path, "kit")
|
42
|
+
commandline = @maven_runner.get_maven_commandline(kit_full_path, @project.full_path)
|
43
|
+
|
44
|
+
commandline.should eq "./#{@maven_executable} -Dmaven.repo.local=`readlink -e ./kit/m2` -s`readlink -e ./kit/m2/settings.xml`"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#mvn" do
|
49
|
+
it "runs maven" do
|
50
|
+
@project.from_directory do
|
51
|
+
@maven_runner.mvn(["extra-option"])
|
52
|
+
File.read("test_out").strip.should match /extra-option$/
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -27,9 +27,9 @@ describe Gjp::MavenWebsite do
|
|
27
27
|
|
28
28
|
describe "#search_by_group_id_and_artifact_id" do
|
29
29
|
it "uses search.maven.org to look for poms by group and artifact id" do
|
30
|
-
|
30
|
+
results = site.search_by_group_id_and_artifact_id("antlr", "antlrall")
|
31
31
|
|
32
|
-
|
32
|
+
results.any? { |result| result["id"] == "antlr:antlrall:2.7.2" }.should be_true
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
File without changes
|
File without changes
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Gjp::Project 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
|
+
describe "#is_project" do
|
19
|
+
it "checks if a directory is a gjp project or not" do
|
20
|
+
Gjp::Project.is_project(@project_path).should be_true
|
21
|
+
Gjp::Project.is_project(File.join(@project_path, "..")).should be_false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#find_project_dir" do
|
26
|
+
it "recursively the parent project directory" do
|
27
|
+
expanded_path = File.expand_path(@project_path)
|
28
|
+
Gjp::Project.find_project_dir(expanded_path).should eq expanded_path
|
29
|
+
Gjp::Project.find_project_dir(File.expand_path("src", @project_path)).should eq expanded_path
|
30
|
+
Gjp::Project.find_project_dir(File.expand_path("kit", @project_path)).should eq expanded_path
|
31
|
+
|
32
|
+
expect {
|
33
|
+
Gjp::Project.find_project_dir(File.expand_path("..", @project_path)).should raise_error
|
34
|
+
}.to raise_error(ArgumentError)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "full_path" do
|
39
|
+
it "returns the project's full path" do
|
40
|
+
@project.full_path.should eq File.expand_path(@project_path)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#init" do
|
45
|
+
it "inits a new project" do
|
46
|
+
kit_path = File.join(@project_path, "kit")
|
47
|
+
Dir.exists?(kit_path).should be_true
|
48
|
+
|
49
|
+
src_path = File.join(@project_path, "src")
|
50
|
+
Dir.exists?(src_path).should be_true
|
51
|
+
|
52
|
+
@project.from_directory do
|
53
|
+
`git tag`.strip.should eq("init")
|
54
|
+
`git rev-list --all`.split("\n").length.should eq 1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe ".set_status" do
|
60
|
+
it "stores a project's status flag" do
|
61
|
+
@project.from_directory do
|
62
|
+
@project.set_status(:gathering)
|
63
|
+
File.exists?(".gathering").should be_true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe ".get_status" do
|
69
|
+
it "gets a project's status flag" do
|
70
|
+
@project.from_directory do
|
71
|
+
@project.get_status(:gathering).should be_false
|
72
|
+
`touch .gathering`
|
73
|
+
@project.get_status(:gathering).should be_true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe ".clear_status" do
|
79
|
+
it "clears a project's status flag" do
|
80
|
+
@project.from_directory do
|
81
|
+
`touch .gathering`
|
82
|
+
@project.get_status(:gathering).should be_true
|
83
|
+
|
84
|
+
@project.clear_status(:gathering)
|
85
|
+
@project.get_status(:gathering).should be_false
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe ".commit_all" do
|
91
|
+
it "commits the project contents to git for later use" do
|
92
|
+
@project.from_directory do
|
93
|
+
`touch kit/test`
|
94
|
+
|
95
|
+
@project.commit_all "test"
|
96
|
+
|
97
|
+
`git rev-list --all`.split("\n").length.should eq 2
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe ".gather" do
|
103
|
+
it "starts a gathering phase" do
|
104
|
+
|
105
|
+
@project.from_directory do
|
106
|
+
`touch src/test`
|
107
|
+
end
|
108
|
+
|
109
|
+
@project.gather.should eq :done
|
110
|
+
|
111
|
+
@project.from_directory do
|
112
|
+
@project.get_status(:gathering).should be_true
|
113
|
+
`git rev-list --all`.split("\n").length.should eq 2
|
114
|
+
`git diff-tree --no-commit-id --name-only -r HEAD`.split("\n").should include("src/test")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe ".finish" do
|
120
|
+
it "ends the current gathering phase" do
|
121
|
+
@project.gather.should eq :done
|
122
|
+
|
123
|
+
@project.from_directory do
|
124
|
+
Dir.mkdir("src/a_b_c")
|
125
|
+
`touch src/a_b_c/test`
|
126
|
+
`touch kit/test`
|
127
|
+
end
|
128
|
+
|
129
|
+
@project.finish.should eq :gathering
|
130
|
+
@project.get_status(:gathering).should be_false
|
131
|
+
|
132
|
+
@project.from_directory do
|
133
|
+
`git rev-list --all`.split("\n").length.should eq 5
|
134
|
+
`git diff-tree --no-commit-id --name-only -r HEAD~2`.split("\n").should include("src/a_b_c/test")
|
135
|
+
File.readlines("gjp_a_b_c_file_list").should include("test\n")
|
136
|
+
File.readlines("gjp_kit_file_list").should include("test\n")
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
it "ends the current dry-run phase" do
|
141
|
+
@project.gather.should eq :done
|
142
|
+
|
143
|
+
@project.from_directory do
|
144
|
+
Dir.mkdir("src/a_b_c")
|
145
|
+
`echo A > src/a_b_c/test`
|
146
|
+
end
|
147
|
+
|
148
|
+
@project.finish.should eq :gathering
|
149
|
+
|
150
|
+
@project.dry_run.should eq :done
|
151
|
+
|
152
|
+
@project.from_directory do
|
153
|
+
`echo B > src/a_b_c/test`
|
154
|
+
`touch src/a_b_c/test2`
|
155
|
+
`touch kit/test`
|
156
|
+
end
|
157
|
+
|
158
|
+
@project.finish.should eq :dry_running
|
159
|
+
@project.get_status(:dry_running).should be_false
|
160
|
+
|
161
|
+
@project.from_directory do
|
162
|
+
`git rev-list --all`.split("\n").length.should eq 10
|
163
|
+
File.read("src/a_b_c/test").should eq "A\n"
|
164
|
+
File.readlines("gjp_a_b_c_produced_file_list").should include("test2\n")
|
165
|
+
File.readlines("gjp_a_b_c_file_list").should_not include("test2\n")
|
166
|
+
|
167
|
+
`git diff-tree --no-commit-id --name-only -r HEAD~2`.split("\n").should_not include("src/a_b_c/test2")
|
168
|
+
File.exists?("src/a_b_c/test2").should be_false
|
169
|
+
File.readlines("gjp_kit_file_list").should include("test\n")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
describe ".dry_run" do
|
175
|
+
it "starts a dry running phase" do
|
176
|
+
|
177
|
+
@project.from_directory do
|
178
|
+
`touch src/test`
|
179
|
+
end
|
180
|
+
|
181
|
+
@project.dry_run.should eq :done
|
182
|
+
|
183
|
+
@project.from_directory do
|
184
|
+
@project.get_status(:dry_running).should be_true
|
185
|
+
`git rev-list --all`.split("\n").length.should eq 2
|
186
|
+
`git diff-tree --no-commit-id --name-only -r HEAD`.split("\n").should include("src/test")
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
File without changes
|
File without changes
|
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.11.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-
|
12
|
+
date: 2013-08-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -157,14 +157,17 @@ files:
|
|
157
157
|
- gjp.gemspec
|
158
158
|
- lib/gjp.rb
|
159
159
|
- lib/gjp/cli.rb
|
160
|
-
- lib/gjp/get_parent_pom.rb
|
161
|
-
- lib/gjp/get_pom.rb
|
162
|
-
- lib/gjp/get_source.rb
|
163
|
-
- lib/gjp/get_source_address.rb
|
164
160
|
- lib/gjp/jar_table.rb
|
161
|
+
- lib/gjp/limited_network_user.rb
|
165
162
|
- lib/gjp/logger.rb
|
163
|
+
- lib/gjp/maven_runner.rb
|
166
164
|
- lib/gjp/maven_website.rb
|
165
|
+
- lib/gjp/parent_pom_getter.rb
|
167
166
|
- lib/gjp/pom.rb
|
167
|
+
- lib/gjp/pom_getter.rb
|
168
|
+
- lib/gjp/project.rb
|
169
|
+
- lib/gjp/source_address_getter.rb
|
170
|
+
- lib/gjp/source_getter.rb
|
168
171
|
- lib/gjp/version.rb
|
169
172
|
- lib/gjp/version_matcher.rb
|
170
173
|
- spec/data/ant-super-simple-code/build.xml
|
@@ -183,13 +186,16 @@ files:
|
|
183
186
|
- spec/data/nailgun/pom.xml
|
184
187
|
- spec/data/struts-apps/pom.xml
|
185
188
|
- spec/data/tomcat/pom.xml
|
186
|
-
- spec/lib/get_parent_pom_spec.rb
|
187
|
-
- spec/lib/get_pom_spec.rb
|
188
|
-
- spec/lib/get_source_address_spec.rb
|
189
|
-
- spec/lib/get_source_spec.rb
|
190
189
|
- spec/lib/jar_table_spec.rb
|
190
|
+
- spec/lib/limited_network_user_spec_interactive.rb
|
191
|
+
- spec/lib/maven_runner_spec.rb
|
191
192
|
- spec/lib/maven_website_spec.rb
|
193
|
+
- spec/lib/parent_pom_getter_spec.rb
|
194
|
+
- spec/lib/pom_getter_spec.rb
|
192
195
|
- spec/lib/pom_spec.rb
|
196
|
+
- spec/lib/project_spec.rb
|
197
|
+
- spec/lib/source_address_getter_spec.rb
|
198
|
+
- spec/lib/source_getter_spec.rb
|
193
199
|
- spec/lib/version_matcher_spec.rb
|
194
200
|
- spec/spec_helper.rb
|
195
201
|
homepage: https://github.com/SilvioMoioli/gjp
|
@@ -233,12 +239,15 @@ test_files:
|
|
233
239
|
- spec/data/nailgun/pom.xml
|
234
240
|
- spec/data/struts-apps/pom.xml
|
235
241
|
- spec/data/tomcat/pom.xml
|
236
|
-
- spec/lib/get_parent_pom_spec.rb
|
237
|
-
- spec/lib/get_pom_spec.rb
|
238
|
-
- spec/lib/get_source_address_spec.rb
|
239
|
-
- spec/lib/get_source_spec.rb
|
240
242
|
- spec/lib/jar_table_spec.rb
|
243
|
+
- spec/lib/limited_network_user_spec_interactive.rb
|
244
|
+
- spec/lib/maven_runner_spec.rb
|
241
245
|
- spec/lib/maven_website_spec.rb
|
246
|
+
- spec/lib/parent_pom_getter_spec.rb
|
247
|
+
- spec/lib/pom_getter_spec.rb
|
242
248
|
- spec/lib/pom_spec.rb
|
249
|
+
- spec/lib/project_spec.rb
|
250
|
+
- spec/lib/source_address_getter_spec.rb
|
251
|
+
- spec/lib/source_getter_spec.rb
|
243
252
|
- spec/lib/version_matcher_spec.rb
|
244
253
|
- spec/spec_helper.rb
|