gjp 0.11.1 → 0.11.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -7,18 +7,16 @@ require "open-uri"
|
|
7
7
|
module Gjp
|
8
8
|
# attempts to get java projects' scm addresses
|
9
9
|
class SourceAddressGetter
|
10
|
-
|
11
|
-
Gjp.logger
|
12
|
-
end
|
10
|
+
include Logger
|
13
11
|
|
14
12
|
# returns the pom corresponding to a file or directory, if it can be found
|
15
|
-
def
|
13
|
+
def get_source_address(file)
|
16
14
|
log.info("looking for source address for: #{file}")
|
17
15
|
(get_source_address_from_pom(file) or get_source_address_from_github(file))
|
18
16
|
end
|
19
17
|
|
20
18
|
# returns an scm address in a pom file
|
21
|
-
def
|
19
|
+
def get_source_address_from_pom(file)
|
22
20
|
pom = Pom.new(file)
|
23
21
|
result = pom.connection_address
|
24
22
|
|
@@ -29,7 +27,7 @@ module Gjp
|
|
29
27
|
end
|
30
28
|
|
31
29
|
# returns an scm address looking for it on github
|
32
|
-
def
|
30
|
+
def get_source_address_from_github(file)
|
33
31
|
pom = Pom.new(file)
|
34
32
|
|
35
33
|
result = (github_search(pom.artifact_id) or github_search(pom.artifact_id.split("-").first) or github_search(pom.group_id))
|
@@ -41,7 +39,7 @@ module Gjp
|
|
41
39
|
end
|
42
40
|
|
43
41
|
# returns a Giuthub repo address based on the keyword
|
44
|
-
def
|
42
|
+
def github_search(keyword)
|
45
43
|
if keyword != "" and keyword != nil
|
46
44
|
response = RestClient.get "https://api.github.com/legacy/repos/search/" + CGI::escape(keyword), :user_agent => "gjp/" + Gjp::VERSION, :language => "java", :sort => "forks"
|
47
45
|
json = JSON.parse(response.to_s)
|
data/lib/gjp/source_getter.rb
CHANGED
@@ -5,12 +5,10 @@ require "rest_client"
|
|
5
5
|
module Gjp
|
6
6
|
# attempts to get java projects' sources from scm
|
7
7
|
class SourceGetter
|
8
|
-
|
9
|
-
Gjp.logger
|
10
|
-
end
|
8
|
+
include Logger
|
11
9
|
|
12
10
|
# downloads a project's source into a specified directory
|
13
|
-
def
|
11
|
+
def get_source(address, pomfile, directory)
|
14
12
|
log.info("downloading: #{address} in #{directory}, pomfile: #{pomfile}")
|
15
13
|
|
16
14
|
dummy, prefix, scm_address = address.split(/^([^:]+):(.*)$/)
|
@@ -20,7 +18,7 @@ module Gjp
|
|
20
18
|
end
|
21
19
|
|
22
20
|
# checks code out from an scm
|
23
|
-
def
|
21
|
+
def get_source_from_scm(prefix, scm_address, pomfile, directory)
|
24
22
|
pom = Pom.new(pomfile)
|
25
23
|
dir = File.join(directory, "#{pom.group_id}:#{pom.artifact_id}:#{pom.version}")
|
26
24
|
begin
|
@@ -37,7 +35,7 @@ module Gjp
|
|
37
35
|
end
|
38
36
|
|
39
37
|
# checks code out of git
|
40
|
-
def
|
38
|
+
def get_source_from_git(scm_address, dir, version)
|
41
39
|
`git clone #{scm_address} #{dir}`
|
42
40
|
|
43
41
|
Dir.chdir(dir) do
|
@@ -53,7 +51,7 @@ module Gjp
|
|
53
51
|
end
|
54
52
|
|
55
53
|
# checks code out of svn
|
56
|
-
def
|
54
|
+
def get_source_from_svn(scm_address, dir, version)
|
57
55
|
`svn checkout #{scm_address} #{dir}`
|
58
56
|
|
59
57
|
Dir.chdir(dir) do
|
@@ -69,16 +67,18 @@ module Gjp
|
|
69
67
|
end
|
70
68
|
|
71
69
|
# return the (heuristically) most similar tag to the specified version
|
72
|
-
def
|
73
|
-
|
70
|
+
def get_best_tag(tags, version)
|
71
|
+
version_matcher = VersionMatcher.new
|
72
|
+
|
73
|
+
versions_to_tags = Hash[
|
74
74
|
*tags.map do |tag|
|
75
|
-
[
|
75
|
+
[version_matcher.split_version(tag)[1], tag]
|
76
76
|
end.flatten
|
77
77
|
]
|
78
78
|
|
79
79
|
log.info("found the following versions and tags: #{versions_to_tags}")
|
80
80
|
|
81
|
-
best_version =
|
81
|
+
best_version = version_matcher.best_match(version, versions_to_tags.keys)
|
82
82
|
versions_to_tags[best_version]
|
83
83
|
end
|
84
84
|
end
|
data/lib/gjp/version.rb
CHANGED
data/lib/gjp/version_matcher.rb
CHANGED
@@ -5,15 +5,13 @@ require "text"
|
|
5
5
|
module Gjp
|
6
6
|
# heuristically matches version strings
|
7
7
|
class VersionMatcher
|
8
|
-
|
9
|
-
Gjp.logger
|
10
|
-
end
|
8
|
+
include Logger
|
11
9
|
|
12
10
|
# heuristically splits a full name into an artifact name and version string
|
13
11
|
# assumes that version strings begin with a numeric character and are separated
|
14
12
|
# by a ., -, _, ~ or space
|
15
13
|
# returns a [name, version] pair
|
16
|
-
def
|
14
|
+
def split_version(full_name)
|
17
15
|
matches = full_name.match(/(.*?)(?:[\.\-\_ ~,]?([0-9].*))?$/)
|
18
16
|
if matches != nil and matches.length > 1
|
19
17
|
[matches[1], matches[2]]
|
@@ -29,7 +27,7 @@ module Gjp
|
|
29
27
|
# - "comparison" is a subtraction if the chunk is an integer, a string distance measure otherwise
|
30
28
|
# - score weighs differently on chunk index (first chunks are most important)
|
31
29
|
# - lowest score wins
|
32
|
-
def
|
30
|
+
def best_match(my_version, their_versions)
|
33
31
|
log.debug("version comparison: #{my_version} vs #{their_versions.join(', ')}")
|
34
32
|
|
35
33
|
my_chunks = my_version.split /[\.\-\_ ~,]/
|
@@ -77,7 +75,7 @@ module Gjp
|
|
77
75
|
# for integers, the score is the difference between their values
|
78
76
|
# for strings, the score is the Levenshtein distance
|
79
77
|
# in any case score is normalized between 0 (identical) and 99 (very different/uncomparable)
|
80
|
-
def
|
78
|
+
def chunk_distance(my_chunk, their_chunk)
|
81
79
|
if my_chunk == nil
|
82
80
|
my_chunk = "0"
|
83
81
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Any files you put here will be copied as is in the "kit" package.
|
2
|
+
|
3
|
+
You should add all dependencies and build tools here, so that they are
|
4
|
+
available at build time.
|
5
|
+
|
6
|
+
gjp will recognise Maven, Ant and other popular build tool binaries in here.
|
7
|
+
|
8
|
+
Some generally useful configuration files are also placed here (eg.
|
9
|
+
m2/settings.xml for Maven builds.
|
@@ -0,0 +1,257 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<!--
|
4
|
+
Licensed to the Apache Software Foundation (ASF) under one
|
5
|
+
or more contributor license agreements. See the NOTICE file
|
6
|
+
distributed with this work for additional information
|
7
|
+
regarding copyright ownership. The ASF licenses this file
|
8
|
+
to you under the Apache License, Version 2.0 (the
|
9
|
+
"License"); you may not use this file except in compliance
|
10
|
+
with the License. You may obtain a copy of the License at
|
11
|
+
|
12
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
|
14
|
+
Unless required by applicable law or agreed to in writing,
|
15
|
+
software distributed under the License is distributed on an
|
16
|
+
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
17
|
+
KIND, either express or implied. See the License for the
|
18
|
+
specific language governing permissions and limitations
|
19
|
+
under the License.
|
20
|
+
-->
|
21
|
+
|
22
|
+
<!--
|
23
|
+
| This is the configuration file for Maven. It can be specified at two levels:
|
24
|
+
|
|
25
|
+
| 1. User Level. This settings.xml file provides configuration for a single user,
|
26
|
+
| and is normally provided in ${user.home}/.m2/settings.xml.
|
27
|
+
|
|
28
|
+
| NOTE: This location can be overridden with the CLI option:
|
29
|
+
|
|
30
|
+
| -s /path/to/user/settings.xml
|
31
|
+
|
|
32
|
+
| 2. Global Level. This settings.xml file provides configuration for all Maven
|
33
|
+
| users on a machine (assuming they're all using the same Maven
|
34
|
+
| installation). It's normally provided in
|
35
|
+
| ${maven.home}/conf/settings.xml.
|
36
|
+
|
|
37
|
+
| NOTE: This location can be overridden with the CLI option:
|
38
|
+
|
|
39
|
+
| -gs /path/to/global/settings.xml
|
40
|
+
|
|
41
|
+
| The sections in this sample file are intended to give you a running start at
|
42
|
+
| getting the most out of your Maven installation. Where appropriate, the default
|
43
|
+
| values (values used when the setting is not specified) are provided.
|
44
|
+
|
|
45
|
+
|-->
|
46
|
+
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
|
47
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
48
|
+
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
|
49
|
+
<!-- localRepository
|
50
|
+
| The path to the local repository maven will use to store artifacts.
|
51
|
+
|
|
52
|
+
| Default: ~/.m2/repository
|
53
|
+
<localRepository>/path/to/local/repo</localRepository>
|
54
|
+
-->
|
55
|
+
|
56
|
+
<!-- interactiveMode
|
57
|
+
| This will determine whether maven prompts you when it needs input. If set to false,
|
58
|
+
| maven will use a sensible default value, perhaps based on some other setting, for
|
59
|
+
| the parameter in question.
|
60
|
+
|
|
61
|
+
| Default: true
|
62
|
+
<interactiveMode>true</interactiveMode>
|
63
|
+
-->
|
64
|
+
|
65
|
+
<!-- offline
|
66
|
+
| Determines whether maven should attempt to connect to the network when executing a build.
|
67
|
+
| This will have an effect on artifact downloads, artifact deployment, and others.
|
68
|
+
|
|
69
|
+
| Default: false
|
70
|
+
<offline>false</offline>
|
71
|
+
-->
|
72
|
+
|
73
|
+
<!-- pluginGroups
|
74
|
+
| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
|
75
|
+
| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
|
76
|
+
| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
|
77
|
+
|-->
|
78
|
+
<pluginGroups>
|
79
|
+
<!-- pluginGroup
|
80
|
+
| Specifies a further group identifier to use for plugin lookup.
|
81
|
+
<pluginGroup>com.your.plugins</pluginGroup>
|
82
|
+
-->
|
83
|
+
</pluginGroups>
|
84
|
+
|
85
|
+
<!-- proxies
|
86
|
+
| This is a list of proxies which can be used on this machine to connect to the network.
|
87
|
+
| Unless otherwise specified (by system property or command-line switch), the first proxy
|
88
|
+
| specification in this list marked as active will be used.
|
89
|
+
|-->
|
90
|
+
<proxies>
|
91
|
+
<!-- proxy
|
92
|
+
| Specification for one proxy, to be used in connecting to the network.
|
93
|
+
|
|
94
|
+
<proxy>
|
95
|
+
<id>optional</id>
|
96
|
+
<active>true</active>
|
97
|
+
<protocol>http</protocol>
|
98
|
+
<username>proxyuser</username>
|
99
|
+
<password>proxypass</password>
|
100
|
+
<host>proxy.host.net</host>
|
101
|
+
<port>80</port>
|
102
|
+
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
|
103
|
+
</proxy>
|
104
|
+
-->
|
105
|
+
</proxies>
|
106
|
+
|
107
|
+
<!-- servers
|
108
|
+
| This is a list of authentication profiles, keyed by the server-id used within the system.
|
109
|
+
| Authentication profiles can be used whenever maven must make a connection to a remote server.
|
110
|
+
|-->
|
111
|
+
<servers>
|
112
|
+
<!-- server
|
113
|
+
| Specifies the authentication information to use when connecting to a particular server, identified by
|
114
|
+
| a unique name within the system (referred to by the 'id' attribute below).
|
115
|
+
|
|
116
|
+
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
|
117
|
+
| used together.
|
118
|
+
|
|
119
|
+
<server>
|
120
|
+
<id>deploymentRepo</id>
|
121
|
+
<username>repouser</username>
|
122
|
+
<password>repopwd</password>
|
123
|
+
</server>
|
124
|
+
-->
|
125
|
+
|
126
|
+
<!-- Another sample, using keys to authenticate.
|
127
|
+
<server>
|
128
|
+
<id>siteServer</id>
|
129
|
+
<privateKey>/path/to/private/key</privateKey>
|
130
|
+
<passphrase>optional; leave empty if not used.</passphrase>
|
131
|
+
</server>
|
132
|
+
-->
|
133
|
+
</servers>
|
134
|
+
|
135
|
+
<!-- mirrors
|
136
|
+
| This is a list of mirrors to be used in downloading artifacts from remote repositories.
|
137
|
+
|
|
138
|
+
| It works like this: a POM may declare a repository to use in resolving certain artifacts.
|
139
|
+
| However, this repository may have problems with heavy traffic at times, so people have mirrored
|
140
|
+
| it to several places.
|
141
|
+
|
|
142
|
+
| That repository definition will have a unique id, so we can create a mirror reference for that
|
143
|
+
| repository, to be used as an alternate download site. The mirror site will be the preferred
|
144
|
+
| server for that repository.
|
145
|
+
|-->
|
146
|
+
<mirrors>
|
147
|
+
<!-- mirror
|
148
|
+
| Specifies a repository mirror site to use instead of a given repository. The repository that
|
149
|
+
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
|
150
|
+
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
151
|
+
|
|
152
|
+
<mirror>
|
153
|
+
<id>mirrorId</id>
|
154
|
+
<mirrorOf>repositoryId</mirrorOf>
|
155
|
+
<name>Human Readable Name for this Mirror.</name>
|
156
|
+
<url>http://my.repository.com/repo/path</url>
|
157
|
+
</mirror>
|
158
|
+
-->
|
159
|
+
</mirrors>
|
160
|
+
|
161
|
+
<!-- profiles
|
162
|
+
| This is a list of profiles which can be activated in a variety of ways, and which can modify
|
163
|
+
| the build process. Profiles provided in the settings.xml are intended to provide local machine-
|
164
|
+
| specific paths and repository locations which allow the build to work in the local environment.
|
165
|
+
|
|
166
|
+
| For example, if you have an integration testing plugin - like cactus - that needs to know where
|
167
|
+
| your Tomcat instance is installed, you can provide a variable here such that the variable is
|
168
|
+
| dereferenced during the build process to configure the cactus plugin.
|
169
|
+
|
|
170
|
+
| As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
|
171
|
+
| section of this document (settings.xml) - will be discussed later. Another way essentially
|
172
|
+
| relies on the detection of a system property, either matching a particular value for the property,
|
173
|
+
| or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
|
174
|
+
| value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
|
175
|
+
| Finally, the list of active profiles can be specified directly from the command line.
|
176
|
+
|
|
177
|
+
| NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
|
178
|
+
| repositories, plugin repositories, and free-form properties to be used as configuration
|
179
|
+
| variables for plugins in the POM.
|
180
|
+
|
|
181
|
+
|-->
|
182
|
+
<profiles>
|
183
|
+
<!-- profile
|
184
|
+
| Specifies a set of introductions to the build process, to be activated using one or more of the
|
185
|
+
| mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/>
|
186
|
+
| or the command line, profiles have to have an ID that is unique.
|
187
|
+
|
|
188
|
+
| An encouraged best practice for profile identification is to use a consistent naming convention
|
189
|
+
| for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.
|
190
|
+
| This will make it more intuitive to understand what the set of introduced profiles is attempting
|
191
|
+
| to accomplish, particularly when you only have a list of profile id's for debug.
|
192
|
+
|
|
193
|
+
| This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.
|
194
|
+
<profile>
|
195
|
+
<id>jdk-1.4</id>
|
196
|
+
|
197
|
+
<activation>
|
198
|
+
<jdk>1.4</jdk>
|
199
|
+
</activation>
|
200
|
+
|
201
|
+
<repositories>
|
202
|
+
<repository>
|
203
|
+
<id>jdk14</id>
|
204
|
+
<name>Repository for JDK 1.4 builds</name>
|
205
|
+
<url>http://www.myhost.com/maven/jdk14</url>
|
206
|
+
<layout>default</layout>
|
207
|
+
<snapshotPolicy>always</snapshotPolicy>
|
208
|
+
</repository>
|
209
|
+
</repositories>
|
210
|
+
</profile>
|
211
|
+
-->
|
212
|
+
|
213
|
+
<!--
|
214
|
+
| Here is another profile, activated by the system property 'target-env' with a value of 'dev',
|
215
|
+
| which provides a specific path to the Tomcat instance. To use this, your plugin configuration
|
216
|
+
| might hypothetically look like:
|
217
|
+
|
|
218
|
+
| ...
|
219
|
+
| <plugin>
|
220
|
+
| <groupId>org.myco.myplugins</groupId>
|
221
|
+
| <artifactId>myplugin</artifactId>
|
222
|
+
|
|
223
|
+
| <configuration>
|
224
|
+
| <tomcatLocation>${tomcatPath}</tomcatLocation>
|
225
|
+
| </configuration>
|
226
|
+
| </plugin>
|
227
|
+
| ...
|
228
|
+
|
|
229
|
+
| NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
|
230
|
+
| anything, you could just leave off the <value/> inside the activation-property.
|
231
|
+
|
|
232
|
+
<profile>
|
233
|
+
<id>env-dev</id>
|
234
|
+
|
235
|
+
<activation>
|
236
|
+
<property>
|
237
|
+
<name>target-env</name>
|
238
|
+
<value>dev</value>
|
239
|
+
</property>
|
240
|
+
</activation>
|
241
|
+
|
242
|
+
<properties>
|
243
|
+
<tomcatPath>/path/to/tomcat/instance</tomcatPath>
|
244
|
+
</properties>
|
245
|
+
</profile>
|
246
|
+
-->
|
247
|
+
</profiles>
|
248
|
+
|
249
|
+
<!-- activeProfiles
|
250
|
+
| List of profiles that are active for all builds.
|
251
|
+
|
|
252
|
+
<activeProfiles>
|
253
|
+
<activeProfile>alwaysActiveProfile</activeProfile>
|
254
|
+
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
|
255
|
+
</activeProfiles>
|
256
|
+
-->
|
257
|
+
</settings>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
For each package you want to create, you should create a subdirectory here
|
2
|
+
named after the package Maven name "orgId:artifactId:version", eg.
|
3
|
+
|
4
|
+
./commons-collections:commons-collections:3.2/
|
5
|
+
|
6
|
+
In that directory, place all the source files "verbatim" (as checked out from
|
7
|
+
the original source repository).
|
8
|
+
|
9
|
+
You can create any other directory for your convenience here. In case of git-
|
10
|
+
tracked projects, for example, you can clone the whole repository and copy the
|
11
|
+
version you want to build in orgId_artifactId_version.
|
12
|
+
|
13
|
+
Please note that .gitignore files are honored!
|
@@ -3,7 +3,6 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe Gjp::LimitedNetworkUser do
|
6
|
-
|
7
6
|
let(:user) { Gjp::LimitedNetworkUser.new("nonet_test") }
|
8
7
|
|
9
8
|
before(:each) do
|
@@ -16,20 +15,20 @@ describe Gjp::LimitedNetworkUser do
|
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
|
-
describe "
|
18
|
+
describe "#set_up" do
|
20
19
|
it "set_ups a limited network user" do
|
21
20
|
user.set_up?.should be_true
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
|
-
describe "
|
24
|
+
describe "#tear_down" do
|
26
25
|
it "tears down a limited network user" do
|
27
26
|
user.tear_down
|
28
27
|
user.set_up?.should be_false
|
29
28
|
end
|
30
29
|
end
|
31
30
|
|
32
|
-
describe "
|
31
|
+
describe "#set_up?" do
|
33
32
|
it "checks if a limited network user has been set up" do
|
34
33
|
user.set_up?.should be_true
|
35
34
|
|