iron_hammer 1.0.3 → 1.0.4
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/Rakefile +1 -1
- data/lib/iron_hammer/hammer.rb +3 -1
- data/lib/iron_hammer/projects/dependency.rb +6 -2
- data/lib/iron_hammer/projects/dll_project.rb +3 -2
- data/lib/iron_hammer/projects/generic_project.rb +15 -0
- data/lib/iron_hammer/projects/project_file.rb +9 -0
- data/lib/iron_hammer/tasks/analyze.rb +12 -0
- data/lib/iron_hammer/tasks/ivy.rb +95 -0
- data/lib/iron_hammer/tasks/test.rb +20 -0
- data/lib/iron_hammer/tasks.rb +4 -113
- data/lib/iron_hammer/utils/ivy_builder.rb +11 -4
- data/lib/iron_hammer/utils/topological_sort.rb +31 -0
- metadata +6 -2
data/Rakefile
CHANGED
data/lib/iron_hammer/hammer.rb
CHANGED
@@ -45,7 +45,9 @@ module IronHammer
|
|
45
45
|
return if projects.nil? || projects.empty?
|
46
46
|
fxcop = @code_analyzers_environment.fxcop
|
47
47
|
rules = @code_analyzers_environment.fxcop_rules
|
48
|
-
binaries = projects.collect
|
48
|
+
binaries = projects.collect do |project|
|
49
|
+
project.artifacts.map {|artifact| "/file:#{File.join(project.path_to_binaries, artifact)}"}
|
50
|
+
end.flatten
|
49
51
|
results = @code_analyzers_environment.fxcop_result
|
50
52
|
"\"#{fxcop}\" /rule:\"#{rules}\" /out:\"#{results}\" #{binaries.join ' '}"
|
51
53
|
end
|
@@ -12,11 +12,11 @@ module IronHammer
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def == other
|
15
|
-
@name == other.name && @version == other.version
|
15
|
+
@name == other.name && @version == other.version && @extension == other.extension
|
16
16
|
end
|
17
17
|
|
18
18
|
def to_s
|
19
|
-
"[Dependency name=#{@name} version=#{@version}]"
|
19
|
+
"[Dependency name=#{@name} version=#{@version} extension=#{@extension}]"
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.from_reference reference
|
@@ -29,6 +29,10 @@ module IronHammer
|
|
29
29
|
Dependency.new :name => name, :version => version, :extension => extension
|
30
30
|
end
|
31
31
|
|
32
|
+
def self.from_project project
|
33
|
+
Dependency.new :name => project.assembly_name, :version => project.version,
|
34
|
+
:extension => project.artifacts.first.split('.').last
|
35
|
+
end
|
32
36
|
private
|
33
37
|
def self.get_extension reference
|
34
38
|
hint_path = reference.elements["HintPath"]
|
@@ -9,14 +9,15 @@ module IronHammer
|
|
9
9
|
include IronHammer::DefaultBinariesBehavior
|
10
10
|
include IronHammer::DefaultConfigurationBehavior
|
11
11
|
include IronHammer::DefaultDeliverablesBehavior
|
12
|
-
|
12
|
+
|
13
13
|
def path_to_configuration
|
14
14
|
@path
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def path_to_binaries params={}
|
18
18
|
File.join(@path, 'bin', run_configuration(params))
|
19
19
|
end
|
20
20
|
end unless defined? DllProject
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
@@ -31,6 +31,12 @@ module IronHammer
|
|
31
31
|
[]
|
32
32
|
end
|
33
33
|
|
34
|
+
def artifacts
|
35
|
+
Dir[File.join(path_to_binaries, "#{assembly_name}.{dll,exe}")].map do |file|
|
36
|
+
file.split(/\/|\\/).last
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
34
40
|
def assembly_name
|
35
41
|
@assembly_name ||= file.assembly_name
|
36
42
|
end
|
@@ -43,6 +49,15 @@ module IronHammer
|
|
43
49
|
@dependencies ||= file.dependencies
|
44
50
|
end
|
45
51
|
|
52
|
+
def project_references
|
53
|
+
@project_references ||= file.project_dependencies
|
54
|
+
end
|
55
|
+
|
56
|
+
def dependencies_with_projects projects
|
57
|
+
selected = projects.select {|p| p.is_a?(DllProject) && project_references.include?(p.name)}
|
58
|
+
dependencies + selected.map {|p| Dependency.from_project p}
|
59
|
+
end
|
60
|
+
|
46
61
|
def package params={}
|
47
62
|
package_root(params)
|
48
63
|
Package.new :root => package_root, :deliverables => deliverables(params)
|
@@ -16,6 +16,7 @@ module IronHammer
|
|
16
16
|
GUID_PATH = '//Project/PropertyGroup/ProjectTypeGuids'
|
17
17
|
ASSEMBLY_NAME_PATH = '//Project/PropertyGroup/AssemblyName'
|
18
18
|
REFERENCE_PATH = '//Reference[not(starts_with(@Include, "System"))]'
|
19
|
+
PROJECT_REFERENCE_PATH = '//ProjectReference/Name'
|
19
20
|
|
20
21
|
def self.load_from *path
|
21
22
|
ProjectFile.new path
|
@@ -35,11 +36,19 @@ module IronHammer
|
|
35
36
|
references.collect { |reference| Dependency.from_reference reference }
|
36
37
|
end
|
37
38
|
|
39
|
+
def project_dependencies
|
40
|
+
project_references.collect { |name| name.text }
|
41
|
+
end
|
42
|
+
|
38
43
|
private
|
39
44
|
def references
|
40
45
|
doc && doc.get_elements(REFERENCE_PATH)
|
41
46
|
end
|
42
47
|
|
48
|
+
def project_references
|
49
|
+
doc && doc.get_elements(PROJECT_REFERENCE_PATH)
|
50
|
+
end
|
51
|
+
|
43
52
|
def doc
|
44
53
|
@doc ||= REXML::Document.new xml
|
45
54
|
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'iron_hammer'
|
2
|
+
require 'iron_hammer/utils/topological_sort'
|
3
|
+
|
4
|
+
namespace :iron do
|
5
|
+
namespace :ivy do
|
6
|
+
def all_dependencies
|
7
|
+
unless @all_dependencies
|
8
|
+
@all_dependencies = []
|
9
|
+
@anvil.projects.each do |project|
|
10
|
+
project.dependencies.each do |dependency|
|
11
|
+
@all_dependencies << dependency unless @all_dependencies.include? dependency
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@all_dependencies
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Publishes project dependencies into ivy repository'
|
19
|
+
task :setup, [:binaries_path] do |t, args|
|
20
|
+
|
21
|
+
files = Dir.new(args.binaries_path).entries
|
22
|
+
candidates = all_dependencies.select {|x| files.include? "#{x.name}.#{x.extension}"}
|
23
|
+
|
24
|
+
candidates.each do |dependency|
|
25
|
+
sh "java -jar #{IVY_JAR} -settings #{IVY_SETTINGS} -dependency #{ORGANISATION} #{dependency.name} #{dependency.version}" do |ok, res|
|
26
|
+
unless res.exitstatus == 0
|
27
|
+
dependency_project = DependencyProject.new(
|
28
|
+
:name => dependency.name,
|
29
|
+
:binaries_path => args.binaries_path,
|
30
|
+
:version => dependency.version,
|
31
|
+
:extension => dependency.extension)
|
32
|
+
|
33
|
+
puts "Dependency #{dependency.name}"
|
34
|
+
|
35
|
+
builder = IvyBuilder.new dependency_project
|
36
|
+
|
37
|
+
builder.write_to "ivy-#{dependency.name}.xml"
|
38
|
+
|
39
|
+
sh builder.publish "ivy-#{dependency.name}.xml"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
desc 'Generates ivy-<project_name>.xml for all projects of the solution'
|
46
|
+
task :generate => :update_version do
|
47
|
+
puts "Generating ivy files for projects"
|
48
|
+
@anvil.projects.each do |project|
|
49
|
+
builder = IvyBuilder.new project
|
50
|
+
builder.write_to "ivy-#{project.name}.xml"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'updates version of AssemblyInfo based on build_number environment variable'
|
55
|
+
task :update_version do
|
56
|
+
@anvil.projects.each do |project|
|
57
|
+
old_version = project.version
|
58
|
+
project.version = old_version.gsub /\.\d+$/, ".#{build_number}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def build_number
|
63
|
+
ENV['BUILD_NUMBER'] || '0'
|
64
|
+
end
|
65
|
+
|
66
|
+
desc 'Retrieves all project dependencies from ivy repository and modify project csproj to reference them'
|
67
|
+
task :retrieve do
|
68
|
+
builder = IvyBuilder.new(SolutionProject.new(@anvil.solution.name, all_dependencies))
|
69
|
+
xml = "ivy-#{@anvil.solution.name}.xml"
|
70
|
+
builder.write_to xml
|
71
|
+
|
72
|
+
sh builder.retrieve xml
|
73
|
+
|
74
|
+
@anvil.projects.each do |project|
|
75
|
+
builder = IvyBuilder.new project
|
76
|
+
|
77
|
+
builder.modify_csproj
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
desc 'Publishes project assemblies to ivy repository (only dll projects)'
|
82
|
+
task :publish => [:generate] do
|
83
|
+
@anvil.dll_projects.topological_sort.each do |project|
|
84
|
+
xml = "ivy-#{project.name}.xml"
|
85
|
+
builder = IvyBuilder.new project
|
86
|
+
|
87
|
+
FileSystem.write! :name => xml, :path => '.',
|
88
|
+
:content => builder.generate_xml(project.dependencies_with_projects @anvil.projects)
|
89
|
+
|
90
|
+
sh builder.publish xml
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
namespace :iron do
|
3
|
+
namespace :test do
|
4
|
+
|
5
|
+
desc 'Runs the unit tests'
|
6
|
+
task :unit => [:build] do
|
7
|
+
command = @hammer.test *@anvil.unit_test_projects
|
8
|
+
puts "There are no unit tests to run" unless command
|
9
|
+
sh command if command
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'Runs the integration tests'
|
13
|
+
task :integration => [:build] do
|
14
|
+
command = @hammer.test *@anvil.integration_test_projects
|
15
|
+
puts "There are no integration tests to run" unless command
|
16
|
+
sh command if command
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
data/lib/iron_hammer/tasks.rb
CHANGED
@@ -5,6 +5,9 @@ require 'iron_hammer'
|
|
5
5
|
CLEAN.include("TestResults/**")
|
6
6
|
CLEAN.include("ivy*.xml")
|
7
7
|
|
8
|
+
require 'iron_hammer/tasks/analyze'
|
9
|
+
require 'iron_hammer/tasks/ivy'
|
10
|
+
require 'iron_hammer/tasks/test'
|
8
11
|
|
9
12
|
namespace :iron do
|
10
13
|
|
@@ -16,124 +19,12 @@ namespace :iron do
|
|
16
19
|
FileUtils.mkdir 'TestResults' unless (File.exists?('TestResults') && File.directory?('TestResults'))
|
17
20
|
|
18
21
|
desc 'Executes the default lifecycle'
|
19
|
-
task :default => [:clean, "ivy:retrieve", :build, "test:unit", "ivy:publish"]
|
22
|
+
task :default => [:clean, "ivy:retrieve", "ivy:update_version", :build, "test:unit", "ivy:publish"]
|
20
23
|
|
21
24
|
desc 'Builds the solution'
|
22
25
|
task :build => [:clean] do
|
23
26
|
sh @hammer.build @anvil.solution
|
24
27
|
end
|
25
28
|
|
26
|
-
namespace :test do
|
27
|
-
|
28
|
-
desc 'Runs the unit tests'
|
29
|
-
task :unit => [:build] do
|
30
|
-
command = @hammer.test *@anvil.unit_test_projects
|
31
|
-
puts "There are no unit tests to run" unless command
|
32
|
-
sh command if command
|
33
|
-
end
|
34
|
-
|
35
|
-
desc 'Runs the integration tests'
|
36
|
-
task :integration => [:build] do
|
37
|
-
command = @hammer.test *@anvil.integration_test_projects
|
38
|
-
puts "There are no integration tests to run" unless command
|
39
|
-
sh command if command
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
namespace :analyze do
|
44
|
-
desc 'Analyzes the code using fxcop'
|
45
|
-
task :fxcop do
|
46
|
-
sh @hammer.analyze *@anvil.projects do |ok, response|
|
47
|
-
puts response
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
namespace :ivy do
|
53
|
-
def all_dependencies
|
54
|
-
unless @all_dependencies
|
55
|
-
@all_dependencies = []
|
56
|
-
@anvil.projects.each do |project|
|
57
|
-
project.dependencies.each do |dependency|
|
58
|
-
@all_dependencies << dependency unless @all_dependencies.include? dependency
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
@all_dependencies
|
63
|
-
end
|
64
|
-
|
65
|
-
desc 'Publishes project dependencies into ivy repository'
|
66
|
-
task :setup, [:binaries_path] do |t, args|
|
67
|
-
|
68
|
-
files = Dir.new(args.binaries_path).entries
|
69
|
-
candidates = all_dependencies.select {|x| files.include? "#{x.name}.#{x.extension}"}
|
70
|
-
|
71
|
-
candidates.each do |dependency|
|
72
|
-
sh "java -jar #{IVY_JAR} -settings #{IVY_SETTINGS} -dependency #{ORGANISATION} #{dependency.name} #{dependency.version}" do |ok, res|
|
73
|
-
unless res.exitstatus == 0
|
74
|
-
dependency_project = DependencyProject.new(
|
75
|
-
:name => dependency.name,
|
76
|
-
:binaries_path => args.binaries_path,
|
77
|
-
:version => dependency.version,
|
78
|
-
:extension => dependency.extension)
|
79
|
-
|
80
|
-
puts "Dependency #{dependency.name}"
|
81
|
-
|
82
|
-
builder = IvyBuilder.new dependency_project
|
83
|
-
|
84
|
-
builder.write_to "ivy-#{dependency.name}.xml"
|
85
|
-
|
86
|
-
sh builder.publish "ivy-#{dependency.name}.xml"
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
desc 'Generates ivy-<project_name>.xml for all projects of the solution'
|
93
|
-
task :generate => :update_version do
|
94
|
-
puts "Generating ivy files for projects"
|
95
|
-
@anvil.projects.each do |project|
|
96
|
-
builder = IvyBuilder.new project
|
97
|
-
builder.write_to "ivy-#{project.name}.xml"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
desc 'updates version of AssemblyInfo based on build_number environment variable'
|
102
|
-
task :update_version do
|
103
|
-
@anvil.projects.each do |project|
|
104
|
-
old_version = project.version
|
105
|
-
project.version = old_version.gsub /\.\d+$/, ".#{build_number}"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def build_number
|
110
|
-
ENV['BUILD_NUMBER'] || '0'
|
111
|
-
end
|
112
|
-
|
113
|
-
desc 'Retrieves all project dependencies from ivy repository and modify project csproj to reference them'
|
114
|
-
task :retrieve do
|
115
|
-
builder = IvyBuilder.new(SolutionProject.new(@anvil.solution.name, all_dependencies))
|
116
|
-
xml = "ivy-#{@anvil.solution.name}.xml"
|
117
|
-
builder.write_to xml
|
118
|
-
|
119
|
-
sh builder.retrieve xml
|
120
|
-
|
121
|
-
@anvil.projects.each do |project|
|
122
|
-
builder = IvyBuilder.new project
|
123
|
-
|
124
|
-
builder.modify_csproj
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
desc 'Publishes project assemblies to ivy repository (only dll projects)'
|
129
|
-
task :publish => [:generate] do
|
130
|
-
@anvil.dll_projects.each do |project|
|
131
|
-
xml = "ivy-#{project.name}.xml"
|
132
|
-
builder = IvyBuilder.new project
|
133
|
-
|
134
|
-
sh builder.publish xml
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
29
|
end
|
139
30
|
|
@@ -13,24 +13,31 @@ module IronHammer
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def to_s
|
16
|
+
generate_xml @project.dependencies
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_xml dependencies=[]
|
16
20
|
xml = Builder::XmlMarkup.new(:indent => 2)
|
17
21
|
xml.tag! 'ivy-module', :version => '2.0' do
|
18
22
|
name = @project.assembly_name
|
19
23
|
xml.info :organisation => @organisation, :module => name
|
20
24
|
xml.publications do
|
21
|
-
@project.
|
22
|
-
|
25
|
+
@project.artifacts.each do |artifact|
|
26
|
+
names = artifact.split '.'
|
27
|
+
extension = names.pop
|
28
|
+
name = names.join '.'
|
29
|
+
xml.artifact :name => name, :type => extension
|
23
30
|
end
|
24
31
|
end if @project.is_a? DllProject
|
25
32
|
|
26
33
|
xml.dependencies do
|
27
|
-
|
34
|
+
dependencies.each do |dependency|
|
28
35
|
rev = dependency.version.gsub /\.\d+$/, '.+'
|
29
36
|
xml.dependency :org => @organisation, :name => dependency.name, :rev => rev do
|
30
37
|
xml.artifact :type => dependency.extension, :name => dependency.name
|
31
38
|
end
|
32
39
|
end
|
33
|
-
end unless
|
40
|
+
end unless dependencies.empty?
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Array
|
2
|
+
|
3
|
+
def topological_sort
|
4
|
+
graph = {}
|
5
|
+
refs = {}
|
6
|
+
set = []
|
7
|
+
list = []
|
8
|
+
self.each {|e| set << e.name if e.project_references.empty?}
|
9
|
+
self.each {|e| graph[e.name] = []; refs[e.name] = []}
|
10
|
+
self.each do |e|
|
11
|
+
e.project_references.each do |r|
|
12
|
+
graph[r] << e.name if graph[r]
|
13
|
+
refs[e.name] << r if refs[e.name]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
until set.empty?
|
18
|
+
n = set.pop
|
19
|
+
list << n
|
20
|
+
until graph[n].empty?
|
21
|
+
m = graph[n].pop
|
22
|
+
refs[m].delete n
|
23
|
+
set << m if refs[m].empty? && !set.include?(m)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
list.map {|e| self.find {|p| p.name == e}}
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iron_hammer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mozair Alves do Carmo Junior
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2010-02-
|
13
|
+
date: 2010-02-19 00:00:00 -02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -103,10 +103,14 @@ files:
|
|
103
103
|
- lib/iron_hammer/solutions/solution.rb
|
104
104
|
- lib/iron_hammer/solutions/solution_file.rb
|
105
105
|
- lib/iron_hammer/tasks.rb
|
106
|
+
- lib/iron_hammer/tasks/analyze.rb
|
107
|
+
- lib/iron_hammer/tasks/ivy.rb
|
108
|
+
- lib/iron_hammer/tasks/test.rb
|
106
109
|
- lib/iron_hammer/utils/code_analyzers_environment.rb
|
107
110
|
- lib/iron_hammer/utils/dot_net_environment.rb
|
108
111
|
- lib/iron_hammer/utils/file_system.rb
|
109
112
|
- lib/iron_hammer/utils/ivy_builder.rb
|
113
|
+
- lib/iron_hammer/utils/topological_sort.rb
|
110
114
|
- lib/iron_hammer/utils/windows.rb
|
111
115
|
- lib/iron_hammer/utils/zipper.rb
|
112
116
|
- lib/iron_hammer/version.rb
|