nixenvironment 0.0.71 → 0.0.73

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ae2568f0e26258c2c5e3f378a4aee05e0b81fd2
4
- data.tar.gz: 5d6ad9e68cd00116e9b6d2d7d43bd37dc6aa1ce2
3
+ metadata.gz: 94649fdebb03545fcac8ae40b7584aabda8526ee
4
+ data.tar.gz: a6be2884186d11d082d152668134e9926ba98786
5
5
  SHA512:
6
- metadata.gz: f6f8c13907d4f803eb394d014e5806f77a703df837fade6863486ae6c485e373ebf834517ba79b92c5e620d0dd31ac41d6149fc42f044a1b28dfe7a492c8b770
7
- data.tar.gz: b52b91be9c13277b93325dc528308b7256d218f6c32ab3cc9c1bb80fbfdad0f3b72ac24480f3974b0fbacdfe30a3358d50c701fcd8af788b6e16f2d63a67bbc3
6
+ metadata.gz: 9bca24fc940fab470d7071e601a6dd57d3bd20460259483eb6fe1b35f21e6dfd2b15f5fd1ca41c288171ae36c32eab566bb7ded3d4b21be1d285cbecdc100488
7
+ data.tar.gz: 70bd4c5d606642f6dc6f9425c2b01661ae506e09c6a1a6cd7f056c1953b349d80b43c55aa75140b59169cd60d0fe6a07db179f125cba6144952bb0b780c662ac
data/bin/nixenvironment CHANGED
@@ -62,6 +62,7 @@ command :build do |c|
62
62
  c.syntax = 'nixenvironment build [options]'
63
63
  c.description = 'Build project for selected configuration and make signed/resigned ipa'
64
64
  c.option '--config NAME', String, 'Select configuration'
65
+ c.option '--xcconfig PATH', String, 'Specify the path to .xcconfig file'
65
66
  c.option '--ipa TYPES', String, 'Select sign (device, resigned_device, resigned_adhoc, resigned_appstore)'
66
67
  c.option '--unity_path PATH', String, 'Select unity executable path (UNITY, UNITY_4 or custom path)'
67
68
  c.option '--development_build', 'Enable Developmen flag in Unity project'
@@ -73,7 +74,9 @@ command :build do |c|
73
74
  c.option '--ndsym', 'Disable .dsym generation for ios project'
74
75
  c.option '--ci_build', 'Deprecated' # TODO: remove
75
76
  c.option '--icon_tagger MODE', String, 'Set XcodeIconTagger mode (full, short, off)'
76
- c.option '--app_version VERSION', String, 'Specify the version of the app (for mac and unity-winphone builds only)'
77
+ c.option '--app_version VERSION', String, 'Specify the version of the app (not implemented for unity-android)' # TODO: implement for unity-android
78
+ c.option '--build_number BUILD_NUMBER', String, 'Specify the build number of the app (not implemented for unity-android)' # TODO: implement for unity-android
79
+ c.option '--requires_fullscreen', 'Set UIRequiresFullScreen to YES in Info.plist (ios)'
77
80
  c.action do |_args, options|
78
81
  options.default :config => 'Debug', :ipa => 'device', :icon_tagger => 'full', :unity_path => 'UNITY'
79
82
  unity_platform = options.unity_platform
@@ -82,6 +85,8 @@ command :build do |c|
82
85
  need_to_process_macos_build = false
83
86
  need_to_process_winphone_build = false
84
87
 
88
+ $build_number = options.build_number
89
+
85
90
  if is_unity_platform
86
91
  unity_path = ENV[options.unity_path] || options.unity_path
87
92
  unity_build(options.config, unity_platform, unity_path, options.development_build, options.keystore_path, options.keystore_password, options.key_alias_name, options.key_alias_password)
@@ -95,7 +100,7 @@ command :build do |c|
95
100
 
96
101
  info_plist = Plist.from_file(plist_path)
97
102
  info_plist['RevisionNumber'] = revision
98
- info_plist['CFBundleVersion'] = monotonic_revision
103
+ info_plist['CFBundleVersion'] = build_number
99
104
  info_plist['CFBundleShortVersionString'] = options.app_version if options.app_version.present?
100
105
  info_plist['CFBundleName'] = $resigned_bundle_name if $resigned_bundle_name.present?
101
106
  info_plist['CFBundleDisplayName'] = $resigned_bundle_name if $resigned_bundle_name.present?
@@ -110,7 +115,7 @@ command :build do |c|
110
115
  @config_settings[CONFIGURATION_KEY] = options.development_build ? 'Debug' : 'Release'
111
116
  @config_settings[SDK_NAME_KEY] = 'macosx'
112
117
 
113
- save_build_env_vars
118
+ BuildEnvVarsLoader.save_last_build_vars(@config_settings)
114
119
 
115
120
  Archiver.make_macos_zip
116
121
  elsif need_to_process_winphone_build
@@ -118,7 +123,7 @@ command :build do |c|
118
123
 
119
124
  File.open(manifest_path,'w') do |f|
120
125
  manifest = Nokogiri::XML(File.open(f))
121
- manifest.at('Package/Identity')['Version'] = "#{options.app_version}.#{monotonic_revision}"
126
+ manifest.at('Package/Identity')['Version'] = "#{options.app_version}.#{build_number}"
122
127
  end
123
128
  elsif need_to_build_ios
124
129
  Dir.chdir(UNITY_IOS_PROJECT_PATH) if is_unity_platform
@@ -146,8 +151,8 @@ command :build do |c|
146
151
  @config_settings.merge!(Xcodebuild.config_settings) { |_key, v1, v2| v1 || v2 }
147
152
 
148
153
  begin
149
- prebuild(options.config)
150
- build(options.config, options.ipa, options.ndsym, options.icon_tagger)
154
+ prebuild(options.config, options.app_version, options.requires_fullscreen)
155
+ build(options.config, options.xcconfig, options.ipa, options.ndsym, options.icon_tagger)
151
156
  ensure
152
157
  restore_info_plists
153
158
  end
@@ -379,61 +384,27 @@ def revision
379
384
  BuildEnvVarsLoader.load_last_revision['REVISION']
380
385
  end
381
386
 
382
- def monotonic_revision
383
- BuildEnvVarsLoader.load_last_revision['MONOTONIC_REVISION']
387
+ def build_number
388
+ $build_number.presence || BuildEnvVarsLoader.load_last_revision['MONOTONIC_REVISION']
384
389
  end
385
390
 
386
- def save_build_env_vars
387
- executable_name = @config_settings[EXECUTABLE_NAME_KEY]
388
- watchkit_app_executable = executable_name + WATCHKIT_APP_SUFFIX_WITH_EXT
389
- watchkit_extension_executable = executable_name + WATCHKIT_EXTENSION_SUFFIX_WITH_EXT
390
- widget_executable = executable_name + WIDGET_SUFFIX_WITH_EXT
391
-
392
- app_product = File.join(@config_settings[BUILT_PRODUCTS_DIR_KEY], executable_name) + APP_EXT
393
- watchkit_extension_relative_product = @config_settings[RESIGNED_WATCHKIT_EXTENSION_BUNDLE_ID_KEY].nil? ? nil : File.join(IOS_PLUGINS_FOLDER_NAME, watchkit_extension_executable)
394
- watchkit_app_relative_product = @config_settings[RESIGNED_WATCHKIT_APP_BUNDLE_ID_KEY].nil? ? nil : File.join(watchkit_extension_relative_product, watchkit_app_executable)
395
- widget_relative_product = @config_settings[RESIGNED_WIDGET_BUNDLE_ID_KEY].nil? ? nil : File.join(IOS_PLUGINS_FOLDER_NAME, widget_executable)
396
-
397
- resigned_watchkit_extension_entitlements_path = @config_settings[RESIGNED_WATCHKIT_EXTENSION_ENTITLEMENTS_PATH_KEY].nil? ? nil : @config_settings[RESIGNED_WATCHKIT_EXTENSION_ENTITLEMENTS_PATH_KEY]
398
- resigned_widget_entitlements_path = @config_settings[RESIGNED_WIDGET_ENTITLEMENTS_PATH_KEY].nil? ? nil : @config_settings[RESIGNED_WIDGET_ENTITLEMENTS_PATH_KEY]
399
-
400
- system("
401
- echo \"#!/bin/sh\
402
- #{AUTOGENERATED_FILES_HEADER}
403
- PROJECT='#{@config_settings[PROJECT_KEY]}'
404
- BUILT_PRODUCTS_DIR='#{@config_settings[BUILT_PRODUCTS_DIR_KEY]}'
405
- OBJECTS_NORMAL_DIR='#{@config_settings[OBJECT_FILE_DIR_NORMAL_KEY]}'
406
- EXECUTABLE_NAME='#{@config_settings[EXECUTABLE_NAME_KEY]}'
407
- APP_PRODUCT='#{app_product}'
408
- WATCHKIT_APP_RELATIVE_PRODUCT='#{watchkit_app_relative_product}'
409
- WATCHKIT_EXTENSION_RELATIVE_PRODUCT='#{watchkit_extension_relative_product}'
410
- WIDGET_RELATIVE_PRODUCT='#{widget_relative_product}'
411
- APP_DSYM='#{app_product + DSYM_EXT}'
412
- APP_INFOPLIST_FILE='#{@config_settings[PRODUCT_SETTINGS_PATH_KEY]}'
413
- EMBEDDED_PROFILE='#{app_product}/#{@config_settings[EMBEDDED_PROFILE_NAME_KEY]}'
414
- TARGET_NAME='#{@config_settings[TARGET_NAME_KEY]}'
415
- CONFIGURATION='#{@config_settings[CONFIGURATION_KEY]}'
416
- SDK_NAME='#{@config_settings[SDK_NAME_KEY]}'
417
- RESIGNED_BUNDLE_ID='#{@config_settings[RESIGNED_BUNDLE_ID_KEY]}'
418
- RESIGNED_WATCHKIT_APP_BUNDLE_ID='#{@config_settings[RESIGNED_WATCHKIT_APP_BUNDLE_ID_KEY]}'
419
- RESIGNED_WATCHKIT_EXTENSION_BUNDLE_ID='#{@config_settings[RESIGNED_WATCHKIT_EXTENSION_BUNDLE_ID_KEY]}'
420
- RESIGNED_WIDGET_BUNDLE_ID='#{@config_settings[RESIGNED_WIDGET_BUNDLE_ID_KEY]}'
421
- RESIGNED_BUNDLE_NAME='#{@config_settings[RESIGNED_BUNDLE_NAME_KEY]}'
422
- RESIGNED_ENTITLEMENTS_PATH='#{@config_settings[RESIGNED_ENTITLEMENTS_PATH_KEY]}'
423
- RESIGNED_WATCHKIT_EXTENSION_ENTITLEMENTS_PATH='#{resigned_watchkit_extension_entitlements_path}'
424
- RESIGNED_WIDGET_ENTITLEMENTS_PATH='#{resigned_widget_entitlements_path}'\" > #{AUTOGENERATED_LAST_BUILD_VARS}
425
- ")
426
- end
391
+ def save_revision
392
+ revision, monotonic_revision, working_copy_is_clean = SCM.last_revision
393
+ build_num = $build_number.presence || monotonic_revision
394
+
395
+ BuildEnvVarsLoader.save_last_revision(revision, build_num, working_copy_is_clean)
427
396
 
428
- def prebuild(config)
429
- SCM.save_revision
430
397
  error('Error! Working copy is not clean!') unless BuildEnvVarsLoader.working_copy_is_clean?
398
+ end
399
+
400
+ def prebuild(config, app_version, requires_fullscreen)
401
+ save_revision
431
402
  backup_info_plists
432
- save_build_env_vars
433
- update_info_plists(config)
403
+ BuildEnvVarsLoader.save_last_build_vars(@config_settings)
404
+ update_info_plists(config, app_version, requires_fullscreen)
434
405
  end
435
406
 
436
- def build(config, ipa, ndsym, icon_tagger)
407
+ def build(config, xcconfig, ipa, ndsym, icon_tagger)
437
408
  project_to_build = @config_settings[PROJECT_TO_BUILD_KEY]
438
409
  project_target_to_build = @config_settings[PROJECT_TARGET_TO_BUILD_KEY]
439
410
  workspace_to_build = @config_settings[WORKSPACE_TO_BUILD_KEY]
@@ -449,7 +420,7 @@ def build(config, ipa, ndsym, icon_tagger)
449
420
  other_args = { 'DEBUG_INFORMATION_FORMAT' => debug_information_format, 'DWARF_DSYM_FOLDER_PATH' => dwarf_dsym_folder_path,
450
421
  'CONFIGURATION_BUILD_DIR' => configuration_build_dir, 'BUILT_PRODUCTS_DIR' => built_products_dir }
451
422
 
452
- Xcodebuild.build(sdk, config, project_to_build, project_target_to_build, workspace_to_build, workspace_scheme_to_build, env_var_prefix, other_args)
423
+ Xcodebuild.build(sdk, config, xcconfig, project_to_build, project_target_to_build, workspace_to_build, workspace_scheme_to_build, env_var_prefix, other_args)
453
424
 
454
425
  error('Build error!') unless Xcodebuild.last_cmd_success?
455
426
 
@@ -500,8 +471,7 @@ def build(config, ipa, ndsym, icon_tagger)
500
471
  end
501
472
 
502
473
  def unity_build(configuration, unity_platform, unity_path, development_build, keystore_path, keystore_password, key_alias_name, key_alias_password)
503
- SCM.save_revision
504
- error('Error! Working copy is not clean!') unless BuildEnvVarsLoader.working_copy_is_clean?
474
+ save_revision
505
475
 
506
476
  if File.directory?(UNITY_EDITOR_DIR)
507
477
  FileUtils.cp_r(UNITY_BUILD_SCRIPTS_DIR, UNITY_EDITOR_DIR)
@@ -560,7 +530,7 @@ def tag_icon(short_version)
560
530
  app_product = File.join(@config_settings[BUILT_PRODUCTS_DIR_KEY], @config_settings[EXECUTABLE_NAME_KEY]) + APP_EXT
561
531
 
562
532
  system("#{TAGGER_UTILITY_PATH} --shortVersion='#{version}'\
563
- --buildNumber='#{monotonic_revision}'\
533
+ --buildNumber='#{build_number}'\
564
534
  --style='#{style}'\
565
535
  --maskPath='#{mask_path}'\
566
536
  --plist='#{plist_path}'\
@@ -588,27 +558,29 @@ def backup_info_plist(product_settings_path, description)
588
558
  info_plist_backup_name
589
559
  end
590
560
 
591
- def update_info_plists(config)
592
- monoc_revision = monotonic_revision
593
- bundle_id = @config_settings[BUNDLE_ID_KEY]
561
+ def update_info_plists(config, app_version, requires_fullscreen)
562
+ build_num = build_number
563
+ bundle_id = @config_settings[BUNDLE_ID_KEY]
594
564
 
595
- update_info_plist(@config_settings[PRODUCT_SETTINGS_PATH_KEY], monoc_revision, revision, bundle_id, config, nil)
596
- update_info_plist(@config_settings[WATCHKIT_APP_PRODUCT_SETTINGS_PATH_KEY], monoc_revision, nil, nil, nil, WATCHKIT_APP_PREFIX)
597
- update_info_plist(@config_settings[WATCHKIT_EXTENSION_PRODUCT_SETTINGS_PATH_KEY], monoc_revision, nil, nil, nil, WATCHKIT_EXTENSION_PREFIX)
598
- update_info_plist(@config_settings[WIDGET_PRODUCT_SETTINGS_PATH_KEY], monoc_revision, nil, nil, nil, WIDGET_PREFIX)
565
+ update_info_plist(@config_settings[PRODUCT_SETTINGS_PATH_KEY], app_version, requires_fullscreen, build_num, revision, bundle_id, config, nil)
566
+ update_info_plist(@config_settings[WATCHKIT_APP_PRODUCT_SETTINGS_PATH_KEY], app_version, nil, build_num, nil, nil, nil, WATCHKIT_APP_PREFIX)
567
+ update_info_plist(@config_settings[WATCHKIT_EXTENSION_PRODUCT_SETTINGS_PATH_KEY], app_version, nil, build_num, nil, nil, nil, WATCHKIT_EXTENSION_PREFIX)
568
+ update_info_plist(@config_settings[WIDGET_PRODUCT_SETTINGS_PATH_KEY], app_version, nil, build_num, nil, nil, nil, WIDGET_PREFIX)
599
569
  end
600
570
 
601
- def update_info_plist(product_settings_path, monotonic_revision, revision, bundle_id, config, description)
571
+ def update_info_plist(product_settings_path, app_version, requires_fullscreen, build_num, revision, bundle_id, config, description)
602
572
  return if product_settings_path.blank?
603
573
 
604
574
  puts "Updating #{description}Info.plist ..."
605
575
 
606
576
  begin
607
577
  info_plist = Plist.from_file(product_settings_path)
608
- info_plist['CFBundleVersion'] = monotonic_revision if monotonic_revision
609
- info_plist['RevisionNumber'] = revision if revision
610
- info_plist['CFBundleIdentifier'] = bundle_id if bundle_id
611
- info_plist['Configuration'] = config if config
578
+ info_plist['UIRequiresFullScreen'] = true if requires_fullscreen
579
+ info_plist['CFBundleShortVersionString'] = app_version if app_version
580
+ info_plist['CFBundleVersion'] = build_num if build_num
581
+ info_plist['RevisionNumber'] = revision if revision
582
+ info_plist['CFBundleIdentifier'] = bundle_id if bundle_id
583
+ info_plist['Configuration'] = config if config
612
584
  info_plist.save(product_settings_path, Plist::FORMAT_XML)
613
585
  rescue => e
614
586
  error("Update #{description}Info.plist error!", e)
@@ -18,17 +18,18 @@ module Nixenvironment
18
18
  AVAILABLE_PROFILE_TYPES = [PROFILE_TYPE_DEVELOPER, PROFILE_TYPE_ADHOC, PROFILE_TYPE_APPSTORE]
19
19
 
20
20
  class ProfileInfo
21
- attr_accessor :path, :name, :app_id, :device_count
21
+ attr_accessor :path, :name, :app_id, :device_count, :expiration_date
22
22
 
23
- def initialize(path, name, app_id, device_count)
24
- @path = path
25
- @name = name
26
- @app_id = app_id
27
- @device_count = device_count
23
+ def initialize(path, name, app_id, device_count, expiration_date)
24
+ @path = path
25
+ @name = name
26
+ @app_id = app_id
27
+ @device_count = device_count
28
+ @expiration_date = expiration_date
28
29
  end
29
30
 
30
31
  def to_s
31
- "<'path=#{@path}', name='#{@name}', app_id='#{@app_id}', device_count=#{@device_count}>"
32
+ "<path='#{@path}', name='#{@name}', app_id='#{@app_id}', device_count=#{@device_count}, expiration_date=#{@expiration_date || 'None'}>"
32
33
  end
33
34
  end
34
35
 
@@ -470,7 +471,7 @@ NAME_FOR_DEPLOYMENT='#{configuration}'
470
471
  end
471
472
 
472
473
  def app_id_prefix_from_profile(profile_path)
473
- _profile_name, app_id, _certs, _device_count = parse_profile(profile_path)
474
+ _profile_name, app_id, _certs, _device_count, _expiration_date = parse_profile(profile_path)
474
475
  app_id.partition('.').first
475
476
  end
476
477
 
@@ -587,9 +588,9 @@ NAME_FOR_DEPLOYMENT='#{configuration}'
587
588
  print_underline "Profile '#{filename}', "
588
589
 
589
590
  profile_path = File.join(profiles_path, filename)
590
- profile_name, app_id, certs, device_count = parse_profile(profile_path)
591
+ profile_name, app_id, certs, device_count, expiration_date = parse_profile(profile_path)
591
592
 
592
- puts "name = '#{profile_name}', app id='#{app_id}', #{device_count} device(s)"
593
+ puts "name = '#{profile_name}', app_id = '#{app_id}', #{device_count} device(s)" + (expiration_date.present? ? ", expires at #{expiration_date}" : '')
593
594
 
594
595
  unless bundle_id_corresponds_to_app_id(new_bundle_id, app_id)
595
596
  puts_warning "\t--> Can't use this profile, because app id '#{app_id}' doesn't allow new bundle id '#{new_bundle_id}'"
@@ -597,10 +598,16 @@ NAME_FOR_DEPLOYMENT='#{configuration}'
597
598
  end
598
599
 
599
600
  puts_header "\t--> Profile's app id '#{app_id}' allows new bundle id '#{new_bundle_id}'"
601
+
602
+ if expiration_date.present? && expiration_date < Time.now
603
+ puts_warning "\t--> Can't use this profile, because it has expired at '#{expiration_date}'"
604
+ next
605
+ end
606
+
600
607
  puts_bold "\t--> Scan certs ..."
601
608
 
602
609
  get_matching_identities_from_certs(certs) do |identity_name|
603
- profile_info = ProfileInfo.new(profile_path, profile_name, app_id, device_count)
610
+ profile_info = ProfileInfo.new(profile_path, profile_name, app_id, device_count, expiration_date)
604
611
  match = [profile_info, identity_name]
605
612
 
606
613
  puts_header "\t--> Match found: #{profile_info.to_s}, identity_name='#{identity_name}'"
@@ -617,13 +624,14 @@ NAME_FOR_DEPLOYMENT='#{configuration}'
617
624
  def parse_profile(profile_path)
618
625
  plist = get_plist_from_file(profile_path)
619
626
 
620
- profile_name = plist['Name']
621
- app_id = plist[ENTITLEMENTS_KEY][APPLICATION_IDENTIFIER_KEY]
622
- certs = plist['DeveloperCertificates']
623
- devices = plist['ProvisionedDevices']
624
- device_count = devices.present? ? devices.size : 0
627
+ profile_name = plist['Name']
628
+ app_id = plist[ENTITLEMENTS_KEY][APPLICATION_IDENTIFIER_KEY]
629
+ certs = plist['DeveloperCertificates']
630
+ expiration_date = plist["ExpirationDate"]
631
+ devices = plist['ProvisionedDevices']
632
+ device_count = devices.present? ? devices.size : 0
625
633
 
626
- return profile_name, app_id, certs, device_count
634
+ return profile_name, app_id, certs, device_count, expiration_date
627
635
  end
628
636
 
629
637
  def get_plist_from_file(path)
@@ -650,7 +658,7 @@ NAME_FOR_DEPLOYMENT='#{configuration}'
650
658
  # key.subject.to_a => [["UID", ..., ...], ["CN", identity_name, ...], ...]
651
659
  identity_name = key.subject.to_a[1][1]
652
660
 
653
- print "\tIdentity '#{identity_name}'..."
661
+ print "\tIdentity '#{identity_name}'... "
654
662
 
655
663
  unless identity_is_valid(identity_name)
656
664
  puts_warning 'invalid'
@@ -1,33 +1,85 @@
1
1
  module Nixenvironment
2
2
  class BuildEnvVarsLoader
3
+ def self.save_last_build_vars(config_settings)
4
+ executable_name = config_settings[EXECUTABLE_NAME_KEY]
5
+ watchkit_app_executable = executable_name + WATCHKIT_APP_SUFFIX_WITH_EXT
6
+ watchkit_extension_executable = executable_name + WATCHKIT_EXTENSION_SUFFIX_WITH_EXT
7
+ widget_executable = executable_name + WIDGET_SUFFIX_WITH_EXT
8
+
9
+ app_product = File.join(config_settings[BUILT_PRODUCTS_DIR_KEY], executable_name) + APP_EXT
10
+ watchkit_extension_relative_product = config_settings[RESIGNED_WATCHKIT_EXTENSION_BUNDLE_ID_KEY].nil? ? nil : File.join(IOS_PLUGINS_FOLDER_NAME, watchkit_extension_executable)
11
+ watchkit_app_relative_product = config_settings[RESIGNED_WATCHKIT_APP_BUNDLE_ID_KEY].nil? ? nil : File.join(watchkit_extension_relative_product, watchkit_app_executable)
12
+ widget_relative_product = config_settings[RESIGNED_WIDGET_BUNDLE_ID_KEY].nil? ? nil : File.join(IOS_PLUGINS_FOLDER_NAME, widget_executable)
13
+
14
+ resigned_watchkit_extension_entitlements_path = config_settings[RESIGNED_WATCHKIT_EXTENSION_ENTITLEMENTS_PATH_KEY].nil? ? nil : @config_settings[RESIGNED_WATCHKIT_EXTENSION_ENTITLEMENTS_PATH_KEY]
15
+ resigned_widget_entitlements_path = config_settings[RESIGNED_WIDGET_ENTITLEMENTS_PATH_KEY].nil? ? nil : @config_settings[RESIGNED_WIDGET_ENTITLEMENTS_PATH_KEY]
16
+
17
+ embedded_profile = File.join(app_product, config_settings[EMBEDDED_PROFILE_NAME_KEY])
18
+
19
+ system("
20
+ echo \"#!/bin/sh\
21
+ #{AUTOGENERATED_FILES_HEADER}
22
+ PROJECT='#{config_settings[PROJECT_KEY]}'
23
+ BUILT_PRODUCTS_DIR='#{config_settings[BUILT_PRODUCTS_DIR_KEY]}'
24
+ OBJECTS_NORMAL_DIR='#{config_settings[OBJECT_FILE_DIR_NORMAL_KEY]}'
25
+ EXECUTABLE_NAME='#{config_settings[EXECUTABLE_NAME_KEY]}'
26
+ APP_PRODUCT='#{app_product}'
27
+ WATCHKIT_APP_RELATIVE_PRODUCT='#{watchkit_app_relative_product}'
28
+ WATCHKIT_EXTENSION_RELATIVE_PRODUCT='#{watchkit_extension_relative_product}'
29
+ WIDGET_RELATIVE_PRODUCT='#{widget_relative_product}'
30
+ APP_DSYM='#{app_product + DSYM_EXT}'
31
+ EMBEDDED_PROFILE='#{embedded_profile}'
32
+ TARGET_NAME='#{config_settings[TARGET_NAME_KEY]}'
33
+ CONFIGURATION='#{config_settings[CONFIGURATION_KEY]}'
34
+ SDK_NAME='#{config_settings[SDK_NAME_KEY]}'
35
+ RESIGNED_BUNDLE_ID='#{config_settings[RESIGNED_BUNDLE_ID_KEY]}'
36
+ RESIGNED_WATCHKIT_APP_BUNDLE_ID='#{config_settings[RESIGNED_WATCHKIT_APP_BUNDLE_ID_KEY]}'
37
+ RESIGNED_WATCHKIT_EXTENSION_BUNDLE_ID='#{config_settings[RESIGNED_WATCHKIT_EXTENSION_BUNDLE_ID_KEY]}'
38
+ RESIGNED_WIDGET_BUNDLE_ID='#{config_settings[RESIGNED_WIDGET_BUNDLE_ID_KEY]}'
39
+ RESIGNED_BUNDLE_NAME='#{config_settings[RESIGNED_BUNDLE_NAME_KEY]}'
40
+ RESIGNED_ENTITLEMENTS_PATH='#{config_settings[RESIGNED_ENTITLEMENTS_PATH_KEY]}'
41
+ RESIGNED_WATCHKIT_EXTENSION_ENTITLEMENTS_PATH='#{resigned_watchkit_extension_entitlements_path}'
42
+ RESIGNED_WIDGET_ENTITLEMENTS_PATH='#{resigned_widget_entitlements_path}'\" > #{AUTOGENERATED_LAST_BUILD_VARS}
43
+ ")
44
+ end
45
+
46
+ def self.save_last_revision(revision, monotonic_revision, working_copy_is_clean)
47
+ system("
48
+ echo \"#!/bin/sh\
49
+ #{AUTOGENERATED_FILES_HEADER}
50
+ REVISION='#{revision}'
51
+ MONOTONIC_REVISION='#{monotonic_revision}'
52
+ WORKING_COPY_IS_CLEAN='#{working_copy_is_clean}'\" > #{AUTOGENERATED_LAST_REVISION}
53
+ ")
54
+ end
55
+
3
56
  def self.load
4
57
  build_env_vars = load_last_revision.merge(load_last_build_vars)
5
-
6
- built_products_dir = build_env_vars[BUILT_PRODUCTS_DIR_KEY]
7
- app_product = build_env_vars[APP_PRODUCT_KEY]
8
- ipa_product = build_env_vars[IPA_PRODUCT_KEY]
9
- app_infoplist_file = build_env_vars['APP_INFOPLIST_FILE']
58
+ app_product_path = build_env_vars[APP_PRODUCT_KEY]
10
59
  embedded_profile = build_env_vars['EMBEDDED_PROFILE']
11
60
  monotonic_revision = build_env_vars['MONOTONIC_REVISION']
12
61
  sdk = build_env_vars[SDK_NAME_KEY]
13
62
 
14
- raise "error: directory '#{built_products_dir}' must exist (build products dir)!" unless File.exist?(built_products_dir)
15
- raise "error: app product directory '#{app_product}' or ipa file '#{ipa_product}' must exist!" unless File.exist?(app_product) && File.exist?(ipa_product)
16
- raise "error: file '#{app_infoplist_file}' must exist (app info plist)!" unless File.exist?(app_infoplist_file)
63
+ info_plist_relative_path = nil
17
64
 
18
- if sdk.include?('ios')
19
- embedded_profile_exist = embedded_profile.present? && File.exist?(embedded_profile)
20
- embedded_profile_name = embedded_profile_exist ? %x[ /usr/libexec/PlistBuddy -c 'Print :Name' /dev/stdin <<< $(security cms -D -i '#{embedded_profile}') ].strip : 'SIMULATOR'
65
+ if sdk.include?('iphoneos')
66
+ embedded_profile_exist = embedded_profile.present? && File.exist?(embedded_profile)
67
+ embedded_profile_name = embedded_profile_exist ? %x[ /usr/libexec/PlistBuddy -c 'Print :Name' /dev/stdin <<< $(security cms -D -i '#{embedded_profile}') ].strip : 'SIMULATOR'
68
+ info_plist_relative_path = 'Info.plist'
69
+ elsif sdk.include?('macos')
70
+ info_plist_relative_path = 'Contents/Info.plist'
21
71
  end
22
72
 
23
- current_app_version = %x[ /usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' '#{app_infoplist_file}' ].strip
73
+ info_plist_path = File.join(app_product_path, info_plist_relative_path)
74
+ info_plist = Plist.from_file(info_plist_path)
75
+ current_app_version = info_plist['CFBundleShortVersionString']
24
76
 
25
77
  build_env_vars[EMBEDDED_PROFILE_NAME_KEY] = embedded_profile_name
26
78
  build_env_vars[CURRENT_APP_VERSION_KEY] = current_app_version
27
79
  build_env_vars[CURRENT_BUILD_VERSION_KEY] = monotonic_revision
28
80
 
29
81
  puts
30
- puts "#{EMBEDDED_PROFILE_NAME_KEY} = #{embedded_profile_name}"
82
+ puts "#{EMBEDDED_PROFILE_NAME_KEY} = #{embedded_profile_name}" # TODO: find out why it's blank!!!
31
83
  puts "#{CURRENT_APP_VERSION_KEY} = #{current_app_version}"
32
84
  puts "#{CURRENT_BUILD_VERSION_KEY} = #{monotonic_revision}"
33
85
  puts
@@ -88,11 +88,14 @@ module Nixenvironment
88
88
  end
89
89
 
90
90
  # zip dsym
91
- dsym_path = executable_name + APP_EXT + DSYM_EXT
92
- zipped_dsym_path = File.join(configuration_full_path, dsym_path + ZIP_EXT)
91
+ dsym_path = File.dirname(app_dsym)
92
+ zipped_dsym_name = executable_name + APP_EXT + DSYM_EXT
93
+ zipped_dsym_path = File.join(configuration_full_path, zipped_dsym_name + ZIP_EXT)
93
94
 
94
95
  if File.exist?(app_dsym)
95
- Dir.chdir(File.dirname(app_dsym)) do
96
+ Dir.chdir(dsym_path) do
97
+ puts
98
+ puts "--> Zip '#{app_dsym}' into '#{zipped_dsym_path}' ..."
96
99
  system("/usr/bin/zip --symlinks --verbose --recurse-paths '#{zipped_dsym_path}' '#{File.basename(app_dsym)}'")
97
100
  end
98
101
  end
@@ -108,18 +111,41 @@ module Nixenvironment
108
111
  def self.scp(deploy_host, deploy_dir, deploy_user, deploy_password, local_path_to_app)
109
112
  puts
110
113
  puts "Uploading build from '#{local_path_to_app}' ...".blue
111
- puts
112
-
113
- max_percentage = 100
114
- progress_step = 5
115
- max_progress = max_percentage / progress_step
116
114
 
117
- Net::SCP.upload!(deploy_host, deploy_user, local_path_to_app, deploy_dir, :ssh => { :password => deploy_password }, :recursive => true, :preserve => true) do |_ch, _name, sent, total|
118
- percentage = (sent.to_f / total.to_f * max_percentage).round(1)
119
- current_progress = (percentage / progress_step).floor
120
- progress_bar = '|' + '#' * current_progress + '_' * (max_progress - current_progress) + '|'
121
- print "#{percentage}% #{progress_bar}\r"
122
- end
115
+ raise 'Deploy error!' unless system("#{DEPLOY_SCRIPT_PATH} '#{deploy_host}' '#{deploy_dir}' '#{deploy_user}' '#{deploy_password}' '#{local_path_to_app}'")
116
+
117
+ # TODO: Will use code below after fix https://github.com/net-ssh/net-scp/issues/24
118
+ #
119
+ # max_percentage = 100
120
+ # progress_step = 5
121
+ # max_progress = max_percentage / progress_step
122
+ #
123
+ # prev_file_name = ''
124
+ # prev_print_threshold = -1
125
+ #
126
+ # Net::SCP.upload!(deploy_host, deploy_user, local_path_to_app, deploy_dir, :ssh => { :password => deploy_password }, :recursive => true, :preserve => true) do |_ch, name, sent, total|
127
+ # # percentage = (sent.to_f / total.to_f * max_percentage).round(1)
128
+ # # current_progress = (percentage / progress_step).floor
129
+ # # progress_bar = '|' + '#' * current_progress + '-' * (max_progress - current_progress) + '|'
130
+ # # print "#{percentage}% #{progress_bar}\r"
131
+ #
132
+ # if name != prev_file_name
133
+ # prev_file_name = name
134
+ # puts
135
+ # puts "#{File.basename(name)}:"
136
+ # end
137
+ #
138
+ # percentage = sent.to_f / total.to_f * max_percentage
139
+ # print_threshold = (percentage / max_progress).floor
140
+ #
141
+ # if print_threshold != prev_print_threshold
142
+ # prev_print_threshold = print_threshold
143
+ # print_percentage = print_threshold * max_progress
144
+ # current_progress = (print_percentage / progress_step).floor
145
+ # progress_bar = '|' + '#' * current_progress + '-' * (max_progress - current_progress) + '|'
146
+ # print "#{print_percentage}% #{progress_bar}\r"
147
+ # end
148
+ # end
123
149
 
124
150
  puts
125
151
  end
@@ -17,7 +17,7 @@ module Nixenvironment
17
17
  return 'undefined'
18
18
  end
19
19
 
20
- def self.save_revision
20
+ def self.last_revision
21
21
  scm_type = current
22
22
  case scm_type
23
23
  when SCM_SVN
@@ -114,13 +114,7 @@ module Nixenvironment
114
114
  working_copy_is_clean = 0
115
115
  end
116
116
 
117
- system("
118
- echo \"#!/bin/sh\
119
- #{AUTOGENERATED_FILES_HEADER}
120
- REVISION='#{current_revision.strip!}'
121
- MONOTONIC_REVISION='#{current_monotonic_revision.strip!}'
122
- WORKING_COPY_IS_CLEAN='#{working_copy_is_clean}'\" > #{AUTOGENERATED_LAST_REVISION}
123
- ")
117
+ return current_revision.strip!, current_monotonic_revision.strip!, working_copy_is_clean
124
118
  end
125
119
 
126
120
  # TODO: implement --all for svn
@@ -1,3 +1,3 @@
1
1
  module Nixenvironment
2
- VERSION = '0.0.71'
2
+ VERSION = '0.0.73'
3
3
  end
@@ -26,10 +26,11 @@ module Nixenvironment
26
26
  end
27
27
 
28
28
  # other => other args to be passed to xcodebuild
29
- def self.build(sdk = nil, config = nil, project = nil, target = nil, workspace = nil, scheme = nil, env_var_prefix = nil, other = {})
29
+ def self.build(sdk = nil, config = nil, xcconfig = nil, project = nil, target = nil, workspace = nil, scheme = nil, env_var_prefix = nil, other = {})
30
30
  build_args = []
31
31
  build_args << "-sdk '#{sdk}'" if sdk.present?
32
32
  build_args << "-configuration '#{config}'" if config.present?
33
+ build_args << "-xcconfig '#{xcconfig}'" if xcconfig.present?
33
34
 
34
35
  if project.present?
35
36
  build_args << "-project '#{project}'"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nixenvironment
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.71
4
+ version: 0.0.73
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-23 00:00:00.000000000 Z
12
+ date: 2015-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cocoapods
@@ -272,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
272
  version: '0'
273
273
  requirements: []
274
274
  rubyforge_project:
275
- rubygems_version: 2.4.8
275
+ rubygems_version: 2.0.14
276
276
  signing_key:
277
277
  specification_version: 4
278
278
  summary: NIX projects build and deploy utility