xcoder 0.0.15 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -44,41 +44,48 @@ module Xcode
44
44
  end
45
45
  builder = config.builder
46
46
 
47
- unless @values[:identity].nil?
48
- builder.identity = @values[:identity]
49
- puts "[#{label}] Set build identity to #{@values[:identity]}"
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
- puts "[#{label}] CLEAN"
58
- @before[:clean].each do |b|
59
- b.call(builder)
60
- end
61
- builder.clean
62
- @after[:clean].each do |b|
63
- b.call(builder)
64
- end
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
- puts "[#{label}] BUILD"
67
- @before[:build].each do |b|
68
- b.call(builder)
69
- end
70
- builder.build
71
- @after[:build].each do |b|
72
- b.call(builder)
73
- end
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
- puts "[#{label}] PACKAGE"
76
- @before[:package].each do |b|
77
- b.call(builder)
78
- end
79
- builder.package
80
- @after[:package].each do |b|
81
- b.call(builder)
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
 
@@ -1,29 +1,77 @@
1
1
  module Xcode
2
2
  class Keychain
3
- def initialize(path)
4
- @path = File.expand_path path
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 #{@path}"
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("~/Library/Keychains/login.keychain")
74
+ Xcode::Keychain.new("login.keychain")
27
75
  end
28
76
  end
29
77
  end
data/lib/xcode/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Xcode
2
- VERSION = "0.0.15"
2
+ VERSION = "0.0.16"
3
3
  end
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.15
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-01-31 00:00:00.000000000Z
12
+ date: 2012-02-06 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
16
- requirement: &70233550609660 !ruby/object:Gem::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: *70233550609660
24
+ version_requirements: *70335891561420
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: plist
27
- requirement: &70233550609240 !ruby/object:Gem::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: *70233550609240
35
+ version_requirements: *70335891561000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: nokogiri
38
- requirement: &70233550608820 !ruby/object:Gem::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: *70233550608820
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