objective-ci 0.0.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.
Files changed (103) hide show
  1. data/.gitignore +17 -0
  2. data/BSD-LICENSE.txt +31 -0
  3. data/GPL-LICENSE.txt +16 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +92 -0
  7. data/Rakefile +24 -0
  8. data/bin/ada_count +4 -0
  9. data/bin/asm_count +4 -0
  10. data/bin/awk_count +4 -0
  11. data/bin/break_filelist +4 -0
  12. data/bin/c_count +4 -0
  13. data/bin/cobol_count +4 -0
  14. data/bin/compute_all +4 -0
  15. data/bin/compute_sloc_lang +4 -0
  16. data/bin/count_extensions +4 -0
  17. data/bin/count_unknown_ext +4 -0
  18. data/bin/csh_count +4 -0
  19. data/bin/exp_count +4 -0
  20. data/bin/f90_count +4 -0
  21. data/bin/fortran_count +4 -0
  22. data/bin/generic_count +4 -0
  23. data/bin/get_sloc +4 -0
  24. data/bin/get_sloc_details +4 -0
  25. data/bin/haskell_count +4 -0
  26. data/bin/java_count +4 -0
  27. data/bin/jsp_count +4 -0
  28. data/bin/lex_count +4 -0
  29. data/bin/lexcount1 +4 -0
  30. data/bin/lisp_count +4 -0
  31. data/bin/make_filelists +4 -0
  32. data/bin/makefile_count +4 -0
  33. data/bin/ml_count +4 -0
  34. data/bin/modula3_count +4 -0
  35. data/bin/objc_count +4 -0
  36. data/bin/oclint-0.8 +4 -0
  37. data/bin/oclint-json-compilation-database +4 -0
  38. data/bin/oclint-xcodebuild +4 -0
  39. data/bin/pascal_count +4 -0
  40. data/bin/perl_count +4 -0
  41. data/bin/php_count +4 -0
  42. data/bin/pmd-cpd-objc +7 -0
  43. data/bin/print_sum +4 -0
  44. data/bin/python_count +4 -0
  45. data/bin/ruby_count +4 -0
  46. data/bin/sed_count +4 -0
  47. data/bin/sh_count +4 -0
  48. data/bin/show_filecount +4 -0
  49. data/bin/sloccount +4 -0
  50. data/bin/sql_count +4 -0
  51. data/bin/tcl_count +4 -0
  52. data/docs/jenkins-setup-violations.png +0 -0
  53. data/docs/jenkins-setup.jpg +0 -0
  54. data/externals/oclint/oclint-0.8 +0 -0
  55. data/externals/oclint/oclint-json-compilation-database +86 -0
  56. data/externals/oclint/oclint-xcodebuild +216 -0
  57. data/externals/pmd-cpd/ObjCLanguage-0.0.7-SNAPSHOT.jar +0 -0
  58. data/externals/pmd-cpd/pmd-4.2.5.jar +0 -0
  59. data/externals/sloccount/ada_count +27 -0
  60. data/externals/sloccount/asm_count +166 -0
  61. data/externals/sloccount/awk_count +27 -0
  62. data/externals/sloccount/break_filelist +1308 -0
  63. data/externals/sloccount/c_count +0 -0
  64. data/externals/sloccount/cobol_count +82 -0
  65. data/externals/sloccount/compute_all +87 -0
  66. data/externals/sloccount/compute_sloc_lang +66 -0
  67. data/externals/sloccount/count_extensions +56 -0
  68. data/externals/sloccount/count_unknown_ext +32 -0
  69. data/externals/sloccount/csh_count +27 -0
  70. data/externals/sloccount/exp_count +27 -0
  71. data/externals/sloccount/f90_count +81 -0
  72. data/externals/sloccount/fortran_count +83 -0
  73. data/externals/sloccount/generic_count +77 -0
  74. data/externals/sloccount/get_sloc +544 -0
  75. data/externals/sloccount/get_sloc_details +103 -0
  76. data/externals/sloccount/haskell_count +122 -0
  77. data/externals/sloccount/java_count +0 -0
  78. data/externals/sloccount/jsp_count +0 -0
  79. data/externals/sloccount/lex_count +70 -0
  80. data/externals/sloccount/lexcount1 +0 -0
  81. data/externals/sloccount/lisp_count +27 -0
  82. data/externals/sloccount/make_filelists +193 -0
  83. data/externals/sloccount/makefile_count +27 -0
  84. data/externals/sloccount/ml_count +0 -0
  85. data/externals/sloccount/modula3_count +65 -0
  86. data/externals/sloccount/objc_count +89 -0
  87. data/externals/sloccount/pascal_count +0 -0
  88. data/externals/sloccount/perl_count +147 -0
  89. data/externals/sloccount/php_count +0 -0
  90. data/externals/sloccount/print_sum +40 -0
  91. data/externals/sloccount/python_count +120 -0
  92. data/externals/sloccount/ruby_count +27 -0
  93. data/externals/sloccount/sed_count +27 -0
  94. data/externals/sloccount/sh_count +27 -0
  95. data/externals/sloccount/show_filecount +58 -0
  96. data/externals/sloccount/sloccount +258 -0
  97. data/externals/sloccount/sql_count +76 -0
  98. data/externals/sloccount/tcl_count +27 -0
  99. data/lib/objective-ci.rb +3 -0
  100. data/lib/objective_ci/ci_tasks.rb +142 -0
  101. data/lib/objective_ci/version.rb +3 -0
  102. data/objective-ci.gemspec +26 -0
  103. metadata +255 -0
@@ -0,0 +1,258 @@
1
+ #!/bin/sh
2
+
3
+ # This is the front-end program "sloccount", part of the
4
+ # SLOCCount tool suite by David A. Wheeler.
5
+ # Given a list of directories, compute the SLOC count,
6
+ # automatically creating the directory $HOME/.slocdata.
7
+
8
+ # This is part of SLOCCount, a toolsuite that counts
9
+ # source lines of code (SLOC).
10
+ # Copyright (C) 2001-2004 David A. Wheeler.
11
+ #
12
+ # This program is free software; you can redistribute it and/or modify
13
+ # it under the terms of the GNU General Public License as published by
14
+ # the Free Software Foundation; either version 2 of the License, or
15
+ # (at your option) any later version.
16
+ #
17
+ # This program is distributed in the hope that it will be useful,
18
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ # GNU General Public License for more details.
21
+ #
22
+ # You should have received a copy of the GNU General Public License
23
+ # along with this program; if not, write to the Free Software
24
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25
+ #
26
+ # To contact David A. Wheeler, see his website at:
27
+ # http://www.dwheeler.com.
28
+
29
+ # See the SLOCCount documentation if you need
30
+ # more details about the license.
31
+
32
+ version=2.26
33
+
34
+ if [ "$#" -eq 0 ]
35
+ then
36
+ echo "Error: You must provide a directory or directories of source code."
37
+ exit 1
38
+ fi
39
+
40
+ startingdir=`pwd`
41
+
42
+
43
+ # "datadir" is some suitable safe place for the data; here's the default:
44
+ datadir=${HOME}/.slocdata
45
+
46
+ details="n"
47
+ cached="n"
48
+ append="n" # If "append", then don't delete datadir, just add to it.
49
+ oneprogram="--oneprogram"
50
+ display_results="n"
51
+ duplicate_control=""
52
+ autogen=""
53
+ filecount=""
54
+ wide=""
55
+ effort_model=""
56
+ personcost=""
57
+ overhead=""
58
+ follow=""
59
+ addlang=""
60
+ notopfollow=""
61
+ showother=""
62
+
63
+ # Perl 5.8.0 handles the "LANG" environment variable oddly;
64
+ # if it includes ".UTF-8" (which is does in Red Hat Linux 9 and others)
65
+ # then it will bitterly complain about ordinary text.
66
+ # So, we'll need to filter ".UTF-8" out of LANG.
67
+ if [ x"$LANG" != x ]
68
+ then
69
+ LANG=`echo "$LANG" | sed -e 's/\.UTF-8//'`
70
+ export LANG
71
+ # echo "New LANG variable: $LANG"
72
+ fi
73
+
74
+ while [ "$#" -gt 0 ]
75
+ do
76
+ case "$1"
77
+ in
78
+ --version) echo "$version"
79
+ exit 0;;
80
+ --cached) cached="y"
81
+ shift;;
82
+ --append) append="y"
83
+ shift;;
84
+ --follow) follow="--follow"
85
+ shift;;
86
+ --notopfollow) notopfollow="--notopfollow"
87
+ shift;;
88
+ --datadir) shift
89
+ if [ ! -d "$1" ]
90
+ then
91
+ echo "Error: $1 is not a directory"
92
+ exit 1
93
+ fi
94
+ cd "$1"
95
+ datadir=`pwd`
96
+ cd $startingdir
97
+ shift;;
98
+ --duplicates) duplicate_control="$1"
99
+ shift;;
100
+ --crossdups) duplicate_control="$1"
101
+ shift;;
102
+ --autogen) autogen="$1"
103
+ shift;;
104
+ --multiproject) oneprogram=""
105
+ shift;;
106
+ --filecount) filecount="$1"
107
+ shift;;
108
+ --filecounts) filecount="$1"
109
+ shift;;
110
+ --wide) wide="$1"
111
+ shift;;
112
+ --details) details="y"
113
+ shift;;
114
+ --addlang) addlang="$addlang $1 $2"
115
+ shift; shift;;
116
+ --addlangall) addlang="--addlangall"
117
+ shift;;
118
+ --showother) showother="--showother"
119
+ shift;;
120
+ --effort) effort_model="$1 $2 $3"
121
+ shift; shift; shift;;
122
+ --schedule) schedule_model="$1 $2 $3"
123
+ shift; shift; shift;;
124
+ --personcost) personcost="$1 $2"
125
+ shift; shift;;
126
+ --overhead) overhead="$1 $2"
127
+ shift; shift;;
128
+ --) break;;
129
+ --*) echo "Error: no such option $1"
130
+ exit 1;;
131
+ *) break;;
132
+ esac
133
+ done
134
+
135
+ # --duplicates) duplicate_control="$1"
136
+ # --autogen) autogen="$1"
137
+ # $follow
138
+
139
+ case "$cached"
140
+ in
141
+ y)
142
+ if [ -n "$duplicate_control" -o -n "$autogen" -o -n "$follow" ]
143
+ then
144
+ echo "Warning: You cannot control what files are selected in a cache."
145
+ echo "The option '--cached' disables --duplicates, --crossdups,"
146
+ echo "--autogen, and --follow. Remove the --cached option if you"
147
+ echo "are changing what you wish to include in your calculations."
148
+ echo
149
+ fi
150
+ if [ -d "$datadir" ]
151
+ then
152
+ display_results="y"
153
+ else
154
+ echo "Sorry, data directory $datadir does not exist."
155
+ exit 1
156
+ fi;;
157
+ n) # Not cached -- need to compute the results.
158
+
159
+ if [ "$append" = "n" ]; then
160
+ if [ -r "${datadir}/sloc_noerase" ]; then
161
+ echo "ERROR! This data directory is marked as do-not-erase."
162
+ echo "Remove the file ${datadir}/sloc_noerase to erase it."
163
+ exit 1
164
+ fi
165
+ if [ "$#" -eq 0 ]; then
166
+ echo "ERROR! No directories for initial analysis supplied."
167
+ exit 1
168
+ fi
169
+ rm -fr "$datadir"
170
+ mkdir "$datadir"
171
+ fi
172
+
173
+ # Now that "datadir" exists, first test to make sure wc -l works.
174
+ wctestfile=${datadir}/.wctestfile
175
+ echo "" > $wctestfile
176
+ echo "line two" >> $wctestfile
177
+ echo "line three" >> $wctestfile
178
+ echo "line four" >> $wctestfile
179
+ testcount=`wc -l < ${wctestfile} | sed -e 's/ //g'`
180
+ if [ "$testcount" -ne 4 ]
181
+ then
182
+ echo "FAILURE! Your wc program's -l option produces wrong results."
183
+ echo "Update your wc (probably in a textutils package) to a correct version."
184
+ exit 1
185
+ fi
186
+
187
+
188
+ # Split things up if we're given only one directory on the argument line
189
+ # and that directory has more than one subdirectory:
190
+ split_things_up="n"
191
+ if [ "$#" -eq 1 ]
192
+ then
193
+ count=0
194
+ for x in $1/*
195
+ do
196
+ if [ -d "$x" ]
197
+ then
198
+ count=`expr $count + 1`
199
+ if [ $count -gt 1 ]
200
+ then
201
+ split_things_up="y"
202
+ break
203
+ fi
204
+ fi
205
+ done
206
+ fi
207
+ # If we're appending, don't split things up.
208
+ if [ "$append" = "y" ]
209
+ then
210
+ split_things_up="n"
211
+ fi
212
+
213
+ case $split_things_up
214
+ in
215
+ y) make_filelists $follow $notopfollow --datadir "$datadir" --skip src "$1"/* ||
216
+ exit 1
217
+ if [ -d "$1"/src ]
218
+ then
219
+ make_filelists $notopfollow --datadir "$datadir" --prefix "src_" "$1"/src/* ||
220
+ exit 1
221
+ fi
222
+ ;;
223
+ *) make_filelists $follow $notopfollow --datadir "$datadir" "$@" || exit 1
224
+ ;;
225
+ esac
226
+
227
+ cd $datadir
228
+ if echo "Categorizing files." &&
229
+ break_filelist --duplistfile sloc_hashes $duplicate_control $autogen * &&
230
+ echo "Computing results." &&
231
+ compute_all *
232
+ then
233
+ display_results=y
234
+ fi
235
+ echo
236
+ echo
237
+ ;;
238
+ esac
239
+
240
+ # If we're appending, don't display results.
241
+ if [ "$append" = "y" ]
242
+ then
243
+ display_results="n"
244
+ echo "To display results, use the --cached option."
245
+ fi
246
+
247
+
248
+ case $display_results
249
+ in
250
+ y)
251
+ cd $datadir
252
+ case $details
253
+ in
254
+ y) get_sloc_details * ;;
255
+ *) get_sloc $addlang $showother $filecount $oneprogram $effort_model $schedule_model $personcost $overhead * ;;
256
+ esac;;
257
+ esac
258
+
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/perl
2
+ # sql_count - count physical lines of code in SQL.
3
+
4
+ # SQL is really screwed up in its commenting system.
5
+ # In ANSI, "--" means start of comment, but this causes many problems
6
+ # with automatically generated SQL queries. For example, given:
7
+ # UPDATE tbl_name SET credit=credit-!payment!
8
+ # If !payment! is automatically substituted for a negative number,
9
+ # a comment is unexpectedly generated.
10
+
11
+ # So, this program accepts "-- " (dash-dash-space) as a comment character.
12
+ # It also supports "#" and /* .. */, which are supported by MySQL.
13
+
14
+ # This is part of SLOCCount, a toolsuite that counts
15
+ # source lines of code (SLOC).
16
+ # Copyright (C) 2001-2004 David A. Wheeler.
17
+ #
18
+ # This program is free software; you can redistribute it and/or modify
19
+ # it under the terms of the GNU General Public License as published by
20
+ # the Free Software Foundation; either version 2 of the License, or
21
+ # (at your option) any later version.
22
+ #
23
+ # This program is distributed in the hope that it will be useful,
24
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26
+ # GNU General Public License for more details.
27
+ #
28
+ # You should have received a copy of the GNU General Public License
29
+ # along with this program; if not, write to the Free Software
30
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31
+ #
32
+ # To contact David A. Wheeler, see his website at:
33
+ # http://www.dwheeler.com.
34
+ #
35
+ #
36
+
37
+ $total_sloc = 0;
38
+
39
+ # Do we have "-f" (read list of files from second argument)?
40
+ if (($#ARGV >= 1) && ($ARGV[0] eq "-f")) {
41
+ # Yes, we have -f
42
+ if ($ARGV[1] eq "-") {
43
+ # The list of files is in STDIN
44
+ while (<STDIN>) {
45
+ chomp ($_);
46
+ &count_file ($_);
47
+ }
48
+ } else {
49
+ # The list of files is in the file $ARGV[1]
50
+ open (FILEWITHLIST, $ARGV[1]) || die "Error: Could not open $filewithlist\n";
51
+ while (<FILEWITHLIST>) {
52
+ chomp ($_);
53
+ &count_file ($_);
54
+ }
55
+ close FILEWITHLIST;
56
+ }
57
+ shift @ARGV; shift @ARGV;
58
+ }
59
+ # Process all (remaining) arguments as file names
60
+ while ($file = shift @ARGV) {
61
+ &count_file ($file);
62
+ }
63
+
64
+ print "Total:\n";
65
+ print "$total_sloc\n";
66
+
67
+ sub count_file {
68
+ my ($file) = @_;
69
+ my $sloc = 0;
70
+
71
+ $result = `sed -e "s/#.*//" -e "s/-- .*//" < "$file" | c_count`;
72
+ $result =~ m/^\s*([0-9]+)/;
73
+ $sloc = $1;
74
+ print "$sloc $file\n";
75
+ $total_sloc += $sloc;
76
+ }
@@ -0,0 +1,27 @@
1
+ #!/bin/sh
2
+ #
3
+ # This is part of SLOCCount, a toolsuite that counts
4
+ # source lines of code (SLOC).
5
+ # Copyright (C) 2001-2004 David A. Wheeler.
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation; either version 2 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ #
21
+ # To contact David A. Wheeler, see his website at:
22
+ # http://www.dwheeler.com.
23
+ #
24
+ #
25
+
26
+ generic_count '#' $@
27
+
@@ -0,0 +1,3 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+
3
+ require 'objective_ci/ci_tasks'
@@ -0,0 +1,142 @@
1
+ require 'bundler/setup'
2
+ require 'nokogiri'
3
+
4
+ module ObjectiveCi
5
+ class CiTasks
6
+
7
+ attr_accessor :exclusions
8
+
9
+ LINT_DESTINATION = "lint.xml"
10
+ DUPLICATION_DESTINATION = "duplication.xml"
11
+ LINE_COUNT_DESTINATION = "line-count.sc"
12
+
13
+ def initialize
14
+ @exclusions = ["vendor"]
15
+ if using_pods?
16
+ @exclusions << "Pods"
17
+ `bundle exec pod install`
18
+ end
19
+ end
20
+
21
+ def build(opts={})
22
+ lint(opts)
23
+ lines_of_code(opts)
24
+ test_suite(opts)
25
+ duplicate_code_detection(opts)
26
+ end
27
+
28
+ def lint(opts={})
29
+ requires_at_least_one_option(opts, :workspace, :project)
30
+ requires_options(opts, :scheme)
31
+ opts[:configuration] ||= "Release"
32
+
33
+ sliced_opts = opts.select { |k, v| [:scheme, :workspace, :project, :configuration].include?(k) }
34
+ xcodebuild_opts_string = sliced_opts.reduce("") { |str, (k, v)| str += " -#{k} #{v}" }
35
+ xcodebuild_opts_string += " ONLY_ACTIVE_ARCH=NO clean build"
36
+
37
+ call_binary("xcodebuild", xcodebuild_opts_string, "| tee xcodebuild.log", opts)
38
+ # oclint-xcodebuild will fail if we don't exclude Pods (absolute path)
39
+ pods_dir = "#{Dir.pwd}/Pods"
40
+ call_binary("oclint-xcodebuild", "-e \"#{pods_dir}\"", "", opts)
41
+ ocjcd_opts_string = "#{exclusion_options_list("-e")} -- -report-type=pmd -o=#{LINT_DESTINATION}"
42
+ call_binary("oclint-json-compilation-database", ocjcd_opts_string, "", opts)
43
+ end
44
+
45
+ def test_suite(opts={})
46
+ requires_at_least_one_option(opts, :workspace, :project)
47
+ requires_options(opts ,:scheme)
48
+ if !opts[:xcodebuild_override] && xcode_version < 5.0
49
+ puts_red "WARNING: Xcode version #{xcode_version} is less than 5.0, and tests will likely not run"
50
+ end
51
+
52
+ sliced_opts = opts.select { |k, v| [:scheme, :workspace, :project].include?(k) }
53
+ xcodebuild_opts_string = sliced_opts.reduce("") { |str, (k, v)| str += " -#{k} #{v}" }
54
+
55
+ xcodebuild_opts_string += " -destination name=iPad -destination-timeout=10 ONLY_ACTIVE_ARCH=NO test"
56
+ call_binary("xcodebuild", xcodebuild_opts_string, ">&1 | bundle exec ocunit2junit", opts)
57
+ end
58
+
59
+ def lines_of_code(opts={})
60
+ call_binary("sloccount",
61
+ "--duplicates --wide --details .",
62
+ "| grep -v #{exclusion_options_list("-e")} > #{LINE_COUNT_DESTINATION}",
63
+ opts)
64
+ end
65
+
66
+ def duplicate_code_detection(opts={})
67
+ opts[:minimum_tokens] ||= 100
68
+ # Use `sed` to change paths like `/some/code/./path.m` to `/some/code/path.m`, or else the Violations plugin in Jenkins
69
+ # doesn't work correctly.
70
+ call_binary("pmd-cpd-objc",
71
+ "--minimum-tokens #{opts[:minimum_tokens]}",
72
+ "| LC_CTYPE=C LANG=C sed 's/\\/\\.\\//\\//' > #{DUPLICATION_DESTINATION}",
73
+ opts)
74
+ pmd_exclude
75
+ end
76
+
77
+ private
78
+ def exclusion_options_list(option_flag)
79
+ if exclusions.empty?
80
+ ''
81
+ else
82
+ wrapped_exclusions = exclusions.map { |e| "\"#{e}\"" }
83
+ "#{option_flag} #{wrapped_exclusions.join(" #{option_flag} ")}"
84
+ end
85
+ end
86
+
87
+ private
88
+ def using_pods?
89
+ File.exists?("Podfile")
90
+ end
91
+
92
+ private
93
+ def call_binary(binary, cl_options, tail, opts={})
94
+ extra_options = opts["#{binary}_options".to_sym]
95
+ override_options = opts["#{binary}_override".to_sym]
96
+ cl_options = override_options ? extra_options : "#{cl_options} #{extra_options}"
97
+ command = "#{binary} #{cl_options} #{tail}"
98
+ command.prepend("bundle exec ") unless binary == "xcodebuild"
99
+ puts command
100
+ `#{command}`
101
+ end
102
+
103
+ private
104
+ def requires_options(opts, *keys)
105
+ keys.each do |k|
106
+ raise "option #{k} is required." unless opts.has_key?(k)
107
+ end
108
+ end
109
+
110
+ private
111
+ def requires_at_least_one_option(opts, *keys)
112
+ if (opts.keys && keys).empty?
113
+ raise "at least one of the options #{keys.join(", ")} is required"
114
+ end
115
+ end
116
+
117
+ private
118
+ def pmd_exclude
119
+ # Unfortunately, pmd doesn't seem to provide any nice out-of-the-box way for excluding files from the results.
120
+ absolute_exclusions = exclusions.map { |e| "#{Dir.pwd}/#{e}/" }
121
+ regex_exclusion = Regexp.new("(#{absolute_exclusions.join("|")})")
122
+ output = Nokogiri::XML(File.open(DUPLICATION_DESTINATION))
123
+ output.xpath("//duplication").each do |duplication_node|
124
+ if duplication_node.xpath("file").all? { |n| n["path"] =~ regex_exclusion }
125
+ duplication_node.remove
126
+ end
127
+ end
128
+ File.open(DUPLICATION_DESTINATION, 'w') { |file| file.write(output.to_s) }
129
+ end
130
+
131
+ private
132
+ def xcode_version
133
+ matches = `xcodebuild -version`.match(/^Xcode ([0-9]+\.[0-9]+)/)
134
+ matches ? matches[1].to_f : 0.0
135
+ end
136
+
137
+ private
138
+ def puts_red(str)
139
+ puts "\e[31m#{str}\e[0m"
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,3 @@
1
+ module ObjectiveCi
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'objective_ci/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "objective-ci"
8
+ spec.version = ObjectiveCi::VERSION
9
+ spec.authors = ["Mark Larsen"]
10
+ spec.email = ["mark.larsen@sportngin.com"]
11
+ spec.description = %q{CI tools for objective-c}
12
+ spec.summary = %q{CI tools for objective-c}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+
24
+ spec.add_dependency "ocunit2junit"
25
+ spec.add_dependency "nokogiri"
26
+ end