xcoder 0.0.15 → 0.0.16
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/lib/xcode/builder.rb +5 -1
- data/lib/xcode/buildfile.rb +34 -27
- data/lib/xcode/keychain.rb +53 -5
- data/lib/xcode/version.rb +1 -1
- data/spec/Provisioning/TestUser.p12 +0 -0
- data/spec/keychain_spec.rb +25 -0
- metadata +12 -8
data/lib/xcode/builder.rb
CHANGED
@@ -3,7 +3,8 @@ require 'xcode/provisioning_profile'
|
|
3
3
|
|
4
4
|
module Xcode
|
5
5
|
class Builder
|
6
|
-
attr_accessor :profile, :identity, :build_path
|
6
|
+
attr_accessor :profile, :identity, :build_path, :keychain
|
7
|
+
|
7
8
|
def initialize(config)
|
8
9
|
if config.is_a? Xcode::Scheme
|
9
10
|
@scheme = config
|
@@ -41,6 +42,7 @@ module Xcode
|
|
41
42
|
cmd << "-target \"#{@target.name}\"" if @scheme.nil?
|
42
43
|
cmd << "-configuration \"#{@config.name}\"" if @scheme.nil?
|
43
44
|
|
45
|
+
cmd << "OTHER_CODE_SIGN_FLAGS=\"--keychain #{@keychain.path}\"" unless @keychain.nil?
|
44
46
|
cmd << "CODE_SIGN_IDENTITY=\"#{@identity}\"" unless @identity.nil?
|
45
47
|
cmd << "OBJROOT=\"#{@build_path}\""
|
46
48
|
cmd << "SYMROOT=\"#{@build_path}\""
|
@@ -104,6 +106,8 @@ module Xcode
|
|
104
106
|
cmd << "-v \"#{app_path}\""
|
105
107
|
cmd << "-o \"#{ipa_path}\""
|
106
108
|
|
109
|
+
cmd << "OTHER_CODE_SIGN_FLAGS=\"--keychain #{@keychain.path}\"" unless @keychain.nil?
|
110
|
+
|
107
111
|
unless @identity.nil?
|
108
112
|
cmd << "--sign \"#{@identity}\""
|
109
113
|
end
|
data/lib/xcode/buildfile.rb
CHANGED
@@ -44,41 +44,48 @@ module Xcode
|
|
44
44
|
end
|
45
45
|
builder = config.builder
|
46
46
|
|
47
|
-
unless @values[:identity].nil?
|
48
|
-
|
49
|
-
|
50
|
-
end
|
47
|
+
# unless @values[:identity].nil?
|
48
|
+
# builder.identity = @values[:identity]
|
49
|
+
# puts "[#{label}] Set build identity to #{@values[:identity]}"
|
50
|
+
# end
|
51
51
|
|
52
52
|
unless @values[:profile].nil?
|
53
53
|
builder.profile = @values[:profile]
|
54
54
|
puts "[#{label}] Set build profile to #{@values[:profile]}"
|
55
55
|
end
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
57
|
+
Keychain.temp_keychain(@values[:project]) do |kc|
|
58
|
+
kc.import @values[:certificate], @values[:password]
|
59
|
+
|
60
|
+
builder.identity = @values[:identity] || kc.certificates.first
|
61
|
+
builder.keychain = kc
|
62
|
+
|
63
|
+
puts "[#{label}] CLEAN"
|
64
|
+
@before[:clean].each do |b|
|
65
|
+
b.call(builder)
|
66
|
+
end
|
67
|
+
builder.clean
|
68
|
+
@after[:clean].each do |b|
|
69
|
+
b.call(builder)
|
70
|
+
end
|
65
71
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
puts "[#{label}] BUILD"
|
73
|
+
@before[:build].each do |b|
|
74
|
+
b.call(builder)
|
75
|
+
end
|
76
|
+
builder.build
|
77
|
+
@after[:build].each do |b|
|
78
|
+
b.call(builder)
|
79
|
+
end
|
74
80
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
81
|
+
puts "[#{label}] PACKAGE"
|
82
|
+
@before[:package].each do |b|
|
83
|
+
b.call(builder)
|
84
|
+
end
|
85
|
+
builder.package
|
86
|
+
@after[:package].each do |b|
|
87
|
+
b.call(builder)
|
88
|
+
end
|
82
89
|
end
|
83
90
|
|
84
91
|
|
data/lib/xcode/keychain.rb
CHANGED
@@ -1,29 +1,77 @@
|
|
1
1
|
module Xcode
|
2
2
|
class Keychain
|
3
|
-
|
4
|
-
|
3
|
+
attr_accessor :name, :path
|
4
|
+
|
5
|
+
TEMP_PASSWORD = "build_keychain_password"
|
6
|
+
def initialize(name)
|
7
|
+
@name = name
|
8
|
+
@path = File.expand_path "~/Library/Keychains/#{name}"
|
5
9
|
end
|
6
10
|
|
7
11
|
def import(cert, password)
|
8
12
|
cmd = []
|
9
13
|
cmd << "security"
|
10
14
|
cmd << "import '#{cert}'"
|
11
|
-
cmd << "-k #{@path}"
|
15
|
+
cmd << "-k '#{@path}'"
|
12
16
|
cmd << "-P #{password}"
|
13
17
|
cmd << "-T /usr/bin/codesign"
|
14
18
|
Xcode::Shell.execute(cmd)
|
15
19
|
end
|
16
20
|
|
21
|
+
def certificates
|
22
|
+
names = []
|
23
|
+
cmd = []
|
24
|
+
cmd << "security"
|
25
|
+
cmd << "find-certificate"
|
26
|
+
cmd << "-a"
|
27
|
+
cmd << "#{@name}"
|
28
|
+
data = Xcode::Shell.execute(cmd, false).join("")
|
29
|
+
data.scan /\s+"labl"<blob>="([^"]+)"/ do |m|
|
30
|
+
names << m[0]
|
31
|
+
end
|
32
|
+
names
|
33
|
+
end
|
34
|
+
|
17
35
|
def unlock(password)
|
18
36
|
cmd = []
|
19
37
|
cmd << "security"
|
20
|
-
cmd << "unlock-keychain
|
38
|
+
cmd << "unlock-keychain"
|
39
|
+
cmd << "-p #{password}"
|
40
|
+
cmd << "#{@name}"
|
41
|
+
Xcode::Shell.execute(cmd)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.create(name, password)
|
45
|
+
cmd = []
|
46
|
+
cmd << "security"
|
47
|
+
cmd << "create-keychain"
|
21
48
|
cmd << "-p #{password}"
|
49
|
+
cmd << "#{name}"
|
22
50
|
Xcode::Shell.execute(cmd)
|
51
|
+
|
52
|
+
Xcode::Keychain.new(name)
|
53
|
+
end
|
54
|
+
|
55
|
+
# FIXME: dangerous
|
56
|
+
def delete
|
57
|
+
cmd = []
|
58
|
+
cmd << "security"
|
59
|
+
cmd << "delete-keychain #{name}"
|
60
|
+
Xcode::Shell.execute(cmd)
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.temp_keychain(name, &block)
|
64
|
+
kc = Xcode::Keychain.create(name, TEMP_PASSWORD)
|
65
|
+
begin
|
66
|
+
kc.unlock(TEMP_PASSWORD)
|
67
|
+
block.call(kc)
|
68
|
+
ensure
|
69
|
+
kc.delete
|
70
|
+
end
|
23
71
|
end
|
24
72
|
|
25
73
|
def self.login_keychain
|
26
|
-
Xcode::Keychain.new("
|
74
|
+
Xcode::Keychain.new("login.keychain")
|
27
75
|
end
|
28
76
|
end
|
29
77
|
end
|
data/lib/xcode/version.rb
CHANGED
Binary file
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'xcoder'
|
3
|
+
|
4
|
+
describe Xcode::Keychain do
|
5
|
+
it "should create a keychain" do
|
6
|
+
kc = Xcode::Keychain.temp_keychain('Test.keychain') do |kc|
|
7
|
+
puts kc.path
|
8
|
+
File.exists?(kc.path).should==true
|
9
|
+
end
|
10
|
+
File.exists?(Xcode::Keychain.new('Test.keychain').path).should==false
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should import a certificate" do
|
14
|
+
Xcode::Keychain.temp_keychain('Test2.keychain') do |kc|
|
15
|
+
kc.import "#{File.dirname(__FILE__)}/Provisioning/TestUser.p12", 'testpassword'
|
16
|
+
kc.certificates.size.should==1
|
17
|
+
kc.certificates[0].should=="Test User"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should fetch the login keychain" do
|
22
|
+
kc = Xcode::Keychain.login_keychain
|
23
|
+
File.exists?(kc.path).should==true
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcoder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-02-06 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70335891561420 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70335891561420
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: plist
|
27
|
-
requirement: &
|
27
|
+
requirement: &70335891561000 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70335891561000
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: nokogiri
|
38
|
-
requirement: &
|
38
|
+
requirement: &70335891560580 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70335891560580
|
47
47
|
description: Provides a ruby based object-model for parsing project structures and
|
48
48
|
invoking builds
|
49
49
|
email:
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- lib/xcode/version.rb
|
73
73
|
- lib/xcode/workspace.rb
|
74
74
|
- lib/xcoder.rb
|
75
|
+
- spec/Provisioning/TestUser.p12
|
75
76
|
- spec/TestProject/Buildfile
|
76
77
|
- spec/TestProject/TestProject.xcodeproj/project.pbxproj
|
77
78
|
- spec/TestProject/TestProject.xcodeproj/xcuserdata/ray.xcuserdatad/xcschemes/TestProject.xcscheme
|
@@ -91,6 +92,7 @@ files:
|
|
91
92
|
- spec/TestWorkspace.xcworkspace/contents.xcworkspacedata
|
92
93
|
- spec/TestWorkspace.xcworkspace/xcuserdata/ray.xcuserdatad/UserInterfaceState.xcuserstate
|
93
94
|
- spec/configuration_spec.rb
|
95
|
+
- spec/keychain_spec.rb
|
94
96
|
- spec/project_spec.rb
|
95
97
|
- spec/scheme_spec.rb
|
96
98
|
- spec/target_spec.rb
|
@@ -121,6 +123,7 @@ signing_key:
|
|
121
123
|
specification_version: 3
|
122
124
|
summary: Ruby wrapper around xcodebuild, xcrun, agvtool and pbxproj files
|
123
125
|
test_files:
|
126
|
+
- spec/Provisioning/TestUser.p12
|
124
127
|
- spec/TestProject/Buildfile
|
125
128
|
- spec/TestProject/TestProject.xcodeproj/project.pbxproj
|
126
129
|
- spec/TestProject/TestProject.xcodeproj/xcuserdata/ray.xcuserdatad/xcschemes/TestProject.xcscheme
|
@@ -140,6 +143,7 @@ test_files:
|
|
140
143
|
- spec/TestWorkspace.xcworkspace/contents.xcworkspacedata
|
141
144
|
- spec/TestWorkspace.xcworkspace/xcuserdata/ray.xcuserdatad/UserInterfaceState.xcuserstate
|
142
145
|
- spec/configuration_spec.rb
|
146
|
+
- spec/keychain_spec.rb
|
143
147
|
- spec/project_spec.rb
|
144
148
|
- spec/scheme_spec.rb
|
145
149
|
- spec/target_spec.rb
|