nixenvironment 0.0.70 → 0.0.71
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 +4 -4
- data/README.md +1 -1
- data/bin/nixenvironment +39 -102
- data/lib/nixenvironment.rb +2 -0
- data/lib/nixenvironment/archiver.rb +43 -50
- data/lib/nixenvironment/build_env_vars_loader.rb +69 -6
- data/lib/nixenvironment/config.rb +9 -5
- data/lib/nixenvironment/deployer.rb +129 -0
- data/lib/nixenvironment/scm.rb +179 -0
- data/lib/nixenvironment/version.rb +1 -1
- data/lib/nixenvironment/xcodebuild.rb +6 -0
- data/nixenvironment.gemspec +2 -1
- metadata +20 -13
- data/legacy/CleanWorkingCopy.sh +0 -69
- data/legacy/DeployIPA.sh +0 -125
- data/legacy/DetectSCM.sh +0 -11
- data/legacy/LoadBuildEnvVars.sh +0 -123
- data/legacy/MakeTag.sh +0 -94
- data/legacy/SaveRevision.sh +0 -122
- data/legacy/VerifyBinarySigning.py +0 -80
- data/legacy/svn-clean.pl +0 -246
- data/legacy/svncopy.pl +0 -1134
@@ -1,24 +1,87 @@
|
|
1
1
|
module Nixenvironment
|
2
2
|
class BuildEnvVarsLoader
|
3
3
|
def self.load
|
4
|
-
|
4
|
+
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']
|
10
|
+
embedded_profile = build_env_vars['EMBEDDED_PROFILE']
|
11
|
+
monotonic_revision = build_env_vars['MONOTONIC_REVISION']
|
12
|
+
sdk = build_env_vars[SDK_NAME_KEY]
|
13
|
+
|
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)
|
17
|
+
|
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'
|
21
|
+
end
|
22
|
+
|
23
|
+
current_app_version = %x[ /usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' '#{app_infoplist_file}' ].strip
|
24
|
+
|
25
|
+
build_env_vars[EMBEDDED_PROFILE_NAME_KEY] = embedded_profile_name
|
26
|
+
build_env_vars[CURRENT_APP_VERSION_KEY] = current_app_version
|
27
|
+
build_env_vars[CURRENT_BUILD_VERSION_KEY] = monotonic_revision
|
28
|
+
|
29
|
+
puts
|
30
|
+
puts "#{EMBEDDED_PROFILE_NAME_KEY} = #{embedded_profile_name}"
|
31
|
+
puts "#{CURRENT_APP_VERSION_KEY} = #{current_app_version}"
|
32
|
+
puts "#{CURRENT_BUILD_VERSION_KEY} = #{monotonic_revision}"
|
33
|
+
puts
|
34
|
+
|
35
|
+
build_env_vars
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.load_last_revision
|
39
|
+
load_internal(AUTOGENERATED_LAST_REVISION, false)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.load_last_build_vars
|
43
|
+
load_internal(AUTOGENERATED_LAST_BUILD_VARS, false)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.working_copy_is_clean?
|
47
|
+
working_copy_is_clean = load_last_revision['WORKING_COPY_IS_CLEAN'] == '1'
|
48
|
+
|
49
|
+
if working_copy_is_clean
|
50
|
+
puts 'Working copy is clean. Continuing ...'
|
51
|
+
else
|
52
|
+
puts 'error: working copy must not have local modifications.'
|
53
|
+
puts 'You must add following files and folders to .gitignore:'
|
54
|
+
Git.status(:porcelain => true)
|
55
|
+
end
|
56
|
+
|
57
|
+
working_copy_is_clean
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.load_internal(file, print_log = true)
|
61
|
+
raise "error: file '#{file}' must exist!" unless File.exist?(file)
|
62
|
+
|
5
63
|
build_env_vars = {}
|
6
64
|
|
7
|
-
vars_list =
|
65
|
+
vars_list = File.read(file).lines.reject(&:empty?)
|
8
66
|
if vars_list.present?
|
67
|
+
puts if print_log
|
68
|
+
|
9
69
|
vars_to_strip = Hash[vars_list.map { |it| it.split('=', 2) }]
|
10
70
|
vars_to_strip.each do |key, value|
|
11
|
-
if key.present? &&
|
71
|
+
if key.present? && !key.include?(AUTOGENERATED_FILES_HEADER)
|
12
72
|
stripped_key = key.strip
|
13
|
-
stripped_value = value.strip
|
14
|
-
|
15
|
-
puts "#{stripped_key} : #{stripped_value}"
|
73
|
+
stripped_value = value ? value.tr("'", '').strip : 'unknown'
|
74
|
+
puts "#{stripped_key} = #{stripped_value}" if print_log
|
16
75
|
build_env_vars[stripped_key] = stripped_value
|
17
76
|
end
|
18
77
|
end
|
78
|
+
|
79
|
+
puts if print_log
|
19
80
|
end
|
20
81
|
|
21
82
|
build_env_vars
|
22
83
|
end
|
84
|
+
|
85
|
+
private_class_method :load_internal
|
23
86
|
end
|
24
87
|
end
|
@@ -12,15 +12,10 @@ module Nixenvironment
|
|
12
12
|
|
13
13
|
# ninbas legacy
|
14
14
|
BUILD_SCRIPTS_PATH = File.expand_path('../../../legacy', __FILE__)
|
15
|
-
SAVE_REVISION_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'SaveRevision.sh')
|
16
15
|
UNITY_BUILD_ANDROID_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'UnityBuildAndroid.py')
|
17
|
-
LOAD_BUILD_ENV_VARS_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'LoadBuildEnvVars.sh')
|
18
16
|
CODE_COVERAGE_REPORT_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'GenerateCodeCoverageForXCTests.sh')
|
19
17
|
CODE_DUPLICATION_REPORT_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'GenerateCodeDuplicationReport.sh')
|
20
|
-
MAKE_TAG_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'MakeTag.sh')
|
21
|
-
CLEAN_WORKING_COPY_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'CleanWorkingCopy.sh')
|
22
18
|
DEPLOY_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'Deploy.sh')
|
23
|
-
DEPLOY_IPA_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'DeployIPA.sh')
|
24
19
|
DEPLOY_APK_SCRIPT_PATH = File.join(BUILD_SCRIPTS_PATH, 'DeployAPK.py')
|
25
20
|
|
26
21
|
# utils
|
@@ -34,11 +29,20 @@ module Nixenvironment
|
|
34
29
|
|
35
30
|
# file extensions
|
36
31
|
APP_EXT = '.app'
|
32
|
+
IPA_EXT = '.ipa'
|
37
33
|
APPEX_EXT = '.appex'
|
38
34
|
DSYM_EXT = '.dSYM'
|
39
35
|
ZIP_EXT = '.zip'
|
40
36
|
GIT_EXT = '.git'
|
41
37
|
|
38
|
+
# autogenerated
|
39
|
+
AUTOGENERATED_FILES_HEADER = '### AUTOGENERATED BY Nixenvironment; DO NOT EDIT ###'
|
40
|
+
AUTOGENERATED_LAST_REVISION = '_last_revision.sh'
|
41
|
+
AUTOGENERATED_LAST_BUILD_VARS = '_last_build_vars.sh'
|
42
|
+
AUTOGENERATED_COVERAGE = 'coverage.xml'
|
43
|
+
AUTOGENERATED_DUPLICATION = 'duplication.xml'
|
44
|
+
AUTOGENERATED_TEST_RESULTS = 'test-results/'
|
45
|
+
|
42
46
|
# watch, extensions, widgets
|
43
47
|
WATCHKIT_APP_KEY = 'WatchKit App'
|
44
48
|
WATCHKIT_EXTENSION_KEY = 'WatchKit Extension'
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'net/scp'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
module Nixenvironment
|
5
|
+
class Deployer
|
6
|
+
def self.deploy(deploy_host, deploy_dir, deploy_user, deploy_password, deploy_itunesconnect_user, deliver_deploy)
|
7
|
+
build_env_vars = BuildEnvVarsLoader.load
|
8
|
+
raise 'Error! Working copy is not clean!' unless BuildEnvVarsLoader.working_copy_is_clean?
|
9
|
+
|
10
|
+
ipa_product = build_env_vars[IPA_PRODUCT_KEY]
|
11
|
+
ipa_product_resigned_device = build_env_vars['IPA_PRODUCT_RESIGNED_DEVICE']
|
12
|
+
ipa_product_resigned_adhoc = build_env_vars['IPA_PRODUCT_RESIGNED_ADHOC']
|
13
|
+
ipa_product_resigned_appstore = build_env_vars['IPA_PRODUCT_RESIGNED_APPSTORE']
|
14
|
+
|
15
|
+
ipa_bundle_id = build_env_vars[IPA_BUNDLE_ID_KEY]
|
16
|
+
ipa_bundle_id_resigned_device = build_env_vars['IPA_BUNDLE_ID_RESIGNED_DEVICE']
|
17
|
+
ipa_bundle_id_resigned_adhoc = build_env_vars['IPA_BUNDLE_ID_RESIGNED_ADHOC']
|
18
|
+
ipa_bundle_id_resigned_appstore = build_env_vars['IPA_BUNDLE_ID_RESIGNED_APPSTORE']
|
19
|
+
|
20
|
+
current_app_version = build_env_vars[CURRENT_APP_VERSION_KEY]
|
21
|
+
current_build_version = build_env_vars[CURRENT_BUILD_VERSION_KEY]
|
22
|
+
|
23
|
+
name_for_deployment = build_env_vars[NAME_FOR_DEPLOYMENT_KEY]
|
24
|
+
name_for_deployment_resigned_device = build_env_vars['NAME_FOR_DEPLOYMENT_RESIGNED_DEVICE']
|
25
|
+
name_for_deployment_resigned_adhoc = build_env_vars['NAME_FOR_DEPLOYMENT_RESIGNED_ADHOC']
|
26
|
+
name_for_deployment_resigned_appstore = build_env_vars['NAME_FOR_DEPLOYMENT_RESIGNED_APPSTORE']
|
27
|
+
|
28
|
+
executable_name = build_env_vars[EXECUTABLE_NAME_KEY]
|
29
|
+
app_dsym = build_env_vars[APP_DSYM_KEY]
|
30
|
+
sdk = build_env_vars[SDK_NAME_KEY]
|
31
|
+
|
32
|
+
ipa_count = 0
|
33
|
+
|
34
|
+
if ipa_product.present? && File.exist?(ipa_product)
|
35
|
+
ipa_count += 1
|
36
|
+
deploy_internal(deploy_host, deploy_dir, deploy_user, deploy_password, deploy_itunesconnect_user, deliver_deploy,
|
37
|
+
ipa_bundle_id, ipa_product, current_app_version, current_build_version, name_for_deployment, executable_name, app_dsym, sdk)
|
38
|
+
end
|
39
|
+
|
40
|
+
if ipa_product_resigned_device.present? && File.exist?(ipa_product_resigned_device)
|
41
|
+
ipa_count += 1
|
42
|
+
ipa_bundle_id_resigned_device = ipa_bundle_id if ipa_bundle_id_resigned_device.blank?
|
43
|
+
deploy_internal(deploy_host, deploy_dir, deploy_user, deploy_password, deploy_itunesconnect_user, deliver_deploy,
|
44
|
+
ipa_bundle_id_resigned_device, ipa_product_resigned_device, current_app_version, current_build_version, name_for_deployment_resigned_device,
|
45
|
+
executable_name, app_dsym, sdk)
|
46
|
+
end
|
47
|
+
|
48
|
+
if ipa_product_resigned_adhoc.present? && File.exist?(ipa_product_resigned_adhoc)
|
49
|
+
ipa_count += 1
|
50
|
+
ipa_bundle_id_resigned_adhoc = ipa_bundle_id if ipa_bundle_id_resigned_adhoc.blank?
|
51
|
+
deploy_internal(deploy_host, deploy_dir, deploy_user, deploy_password, deploy_itunesconnect_user, deliver_deploy,
|
52
|
+
ipa_bundle_id_resigned_adhoc, ipa_product_resigned_adhoc, current_app_version, current_build_version, name_for_deployment_resigned_adhoc,
|
53
|
+
executable_name, app_dsym, sdk)
|
54
|
+
end
|
55
|
+
|
56
|
+
if ipa_product_resigned_appstore.present? && File.exist?(ipa_product_resigned_appstore)
|
57
|
+
ipa_count += 1
|
58
|
+
ipa_bundle_id_resigned_appstore = ipa_bundle_id if ipa_bundle_id_resigned_appstore.blank?
|
59
|
+
deploy_internal(deploy_host, deploy_dir, deploy_user, deploy_password, deploy_itunesconnect_user, deliver_deploy,
|
60
|
+
ipa_bundle_id_resigned_appstore, ipa_product_resigned_appstore, current_app_version, current_build_version, name_for_deployment_resigned_appstore,
|
61
|
+
executable_name, app_dsym, sdk)
|
62
|
+
end
|
63
|
+
|
64
|
+
raise 'Nothing to upload!' if ipa_count == 0
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.deploy_internal(deploy_host, deploy_dir, deploy_user, deploy_password, deploy_itunesconnect_user, deliver_deploy,
|
68
|
+
ipa_bundle_id, ipa_product, current_app_version, current_build_version, name_for_deployment, executable_name, app_dsym, sdk)
|
69
|
+
is_macos_build = sdk.include?('macos')
|
70
|
+
|
71
|
+
local_path_to_app = File.join(Dir.tmpdir, ipa_bundle_id)
|
72
|
+
local_path_to_build = File.join(local_path_to_app, "v.#{current_app_version}_#{current_build_version}")
|
73
|
+
configuration_full_path = File.join(local_path_to_build, name_for_deployment)
|
74
|
+
destination_ipa_product = File.join(configuration_full_path, executable_name + (is_macos_build ? ZIP_EXT : IPA_EXT))
|
75
|
+
|
76
|
+
FileUtils.rm_rf(local_path_to_build)
|
77
|
+
FileUtils.mkdir_p(configuration_full_path)
|
78
|
+
FileUtils.cp_r(ipa_product, destination_ipa_product)
|
79
|
+
|
80
|
+
unless is_macos_build
|
81
|
+
if deploy_itunesconnect_user.present?
|
82
|
+
puts
|
83
|
+
print 'Starting pilot ...'.blue
|
84
|
+
puts
|
85
|
+
|
86
|
+
skip_submission = deliver_deploy ? '' : '--skip_submission'
|
87
|
+
system("pilot upload -i '#{ipa_product}' -u '#{deploy_itunesconnect_user}' #{skip_submission}")
|
88
|
+
end
|
89
|
+
|
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)
|
93
|
+
|
94
|
+
if File.exist?(app_dsym)
|
95
|
+
Dir.chdir(File.dirname(app_dsym)) do
|
96
|
+
system("/usr/bin/zip --symlinks --verbose --recurse-paths '#{zipped_dsym_path}' '#{File.basename(app_dsym)}'")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
FileUtils.chmod_R(0775, local_path_to_app)
|
102
|
+
|
103
|
+
scp(deploy_host, deploy_dir, deploy_user, deploy_password, local_path_to_app)
|
104
|
+
|
105
|
+
FileUtils.rm_rf(local_path_to_app)
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.scp(deploy_host, deploy_dir, deploy_user, deploy_password, local_path_to_app)
|
109
|
+
puts
|
110
|
+
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
|
+
|
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
|
123
|
+
|
124
|
+
puts
|
125
|
+
end
|
126
|
+
|
127
|
+
private_class_method :deploy_internal, :scp
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
module Nixenvironment
|
2
|
+
class SCM
|
3
|
+
SCM_SVN = 'svn'
|
4
|
+
SCM_GIT = 'git'
|
5
|
+
SCM_MERCURIAL = 'mercurial'
|
6
|
+
|
7
|
+
def self.current
|
8
|
+
%x[ git status ]
|
9
|
+
return SCM_GIT if $?.success?
|
10
|
+
|
11
|
+
%x[ hg status ]
|
12
|
+
return SCM_MERCURIAL if $?.success?
|
13
|
+
|
14
|
+
%x[ svn info ]
|
15
|
+
return SCM_SVN if $?.success?
|
16
|
+
|
17
|
+
return 'undefined'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.save_revision
|
21
|
+
scm_type = current
|
22
|
+
case scm_type
|
23
|
+
when SCM_SVN
|
24
|
+
puts 'SVN working copy detected'
|
25
|
+
current_revision = %x[ svnversion ]
|
26
|
+
current_monotonic_revision = current_revision
|
27
|
+
|
28
|
+
# simply check that the SVN version is a digit
|
29
|
+
if Integer(current_revision)
|
30
|
+
working_copy_is_clean = 1
|
31
|
+
else
|
32
|
+
puts "Working copy is not clean because of svnversion returning #{current_revision}"
|
33
|
+
working_copy_is_clean = 0
|
34
|
+
end
|
35
|
+
when SCM_GIT
|
36
|
+
puts 'GIT working copy detected'
|
37
|
+
current_revision = %x[ git rev-parse HEAD ]
|
38
|
+
last_revision_in_repo = %x[ git rev-list --all -n 1 ]
|
39
|
+
|
40
|
+
# number of pushes before current
|
41
|
+
current_monotonic_revision = %x[ git rev-list --all --count ]
|
42
|
+
|
43
|
+
if current_revision == last_revision_in_repo
|
44
|
+
current_monotonic_revision = current_monotonic_revision.succ
|
45
|
+
end
|
46
|
+
|
47
|
+
status = %x[ git status --porcelain ]
|
48
|
+
|
49
|
+
if status == ''
|
50
|
+
working_copy_is_clean = 1
|
51
|
+
else
|
52
|
+
# TODO: check this out for Unity builds
|
53
|
+
# ignore changes to build folder, because it's created by Xcode before the script runs as a build phase
|
54
|
+
lines_count = status.lines.count
|
55
|
+
|
56
|
+
if lines_count != 1
|
57
|
+
puts "Working copy is not clean because of status:\n#{status}"
|
58
|
+
puts
|
59
|
+
working_copy_is_clean = 0
|
60
|
+
else
|
61
|
+
wc_root = %[ git rev-parse --show-toplevel ]
|
62
|
+
modified_path = status[3..-1]
|
63
|
+
abs_modified_path = File.join(wc_root, modified_path)
|
64
|
+
|
65
|
+
# compare path to Xcode env var
|
66
|
+
if abs_modified_path == ENV['BUILD_ROOT']
|
67
|
+
working_copy_is_clean = 1
|
68
|
+
else
|
69
|
+
puts "Working copy is not clean because of status:\n#{status}"
|
70
|
+
puts
|
71
|
+
working_copy_is_clean = 0
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
when SCM_MERCURIAL
|
76
|
+
puts 'Mercurial working copy detected'
|
77
|
+
current_revision = %x[ hg id -i ]
|
78
|
+
# number of pushes in current branch
|
79
|
+
# TODO: compare with: "$(hg log --template '{rev}:{node|short} {desc|firstline} ({author})\n' | wc -l | tr -d ' ')"
|
80
|
+
current_monotonic_revision = %x[ hg id --num --rev tip ]
|
81
|
+
|
82
|
+
status = %x[ hg status ]
|
83
|
+
|
84
|
+
if status == ''
|
85
|
+
working_copy_is_clean = 1
|
86
|
+
else
|
87
|
+
# TODO: check this out for Unity builds
|
88
|
+
# ignore changes to build folder, because it's created by Xcode before the script runs as a build phase
|
89
|
+
lines_count = status.lines.count
|
90
|
+
|
91
|
+
if lines_count != 1
|
92
|
+
puts "Working copy is not clean because of status:\n#{status}"
|
93
|
+
puts
|
94
|
+
working_copy_is_clean = 0
|
95
|
+
else
|
96
|
+
wc_root = %[ hg root ]
|
97
|
+
modified_path = status[3..-1]
|
98
|
+
abs_modified_path = File.join(wc_root, modified_path)
|
99
|
+
|
100
|
+
# compare path to Xcode env var
|
101
|
+
if abs_modified_path == ENV['BUILD_ROOT']
|
102
|
+
working_copy_is_clean = 1
|
103
|
+
else
|
104
|
+
puts "Working copy is not clean because of status:\n#{status}"
|
105
|
+
puts
|
106
|
+
working_copy_is_clean = 0
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
else
|
111
|
+
puts 'warning: script must be run from working copy. Revision is undefined.'
|
112
|
+
current_revision = 'undefined'
|
113
|
+
current_monotonic_revision = 'undefined'
|
114
|
+
working_copy_is_clean = 0
|
115
|
+
end
|
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
|
+
")
|
124
|
+
end
|
125
|
+
|
126
|
+
# TODO: implement --all for svn
|
127
|
+
def self.clean_working_copy(all)
|
128
|
+
puts '--- Clean all specified' if all.present?
|
129
|
+
scm_type = current
|
130
|
+
|
131
|
+
case scm_type
|
132
|
+
when SCM_SVN
|
133
|
+
puts 'SVN working copy detected, cleaning ...'
|
134
|
+
|
135
|
+
# revert all changes
|
136
|
+
system('svn revert --depth=infinity .')
|
137
|
+
|
138
|
+
# revert all changes in external directories
|
139
|
+
# TODO: rework this for Windows
|
140
|
+
system("
|
141
|
+
for i in $(svn status | grep ^Performing | cut -d\' -f 2)
|
142
|
+
do
|
143
|
+
svn revert -R $i
|
144
|
+
done")
|
145
|
+
|
146
|
+
# Wipes out unversioned files from Subversion working copy
|
147
|
+
system('svn cleanup . --remove-unversioned')
|
148
|
+
when SCM_GIT
|
149
|
+
puts 'GIT working copy detected, cleaning ...'
|
150
|
+
|
151
|
+
# revert all changes
|
152
|
+
system('git reset --hard')
|
153
|
+
|
154
|
+
if all
|
155
|
+
# wipe out unversioned files (force, remove whole directories, remove ignored files)
|
156
|
+
system('git clean -fdx')
|
157
|
+
else
|
158
|
+
# wipe out unversioned files (force, remove whole directories)
|
159
|
+
system('git clean -fd')
|
160
|
+
end
|
161
|
+
when SCM_MERCURIAL
|
162
|
+
puts 'Mercurial working copy detected, cleaning ...'
|
163
|
+
|
164
|
+
# revert all changes
|
165
|
+
system('hg revert --all')
|
166
|
+
|
167
|
+
if all
|
168
|
+
# wipe out unversioned files
|
169
|
+
system('hg --config extensions.purge= clean --all')
|
170
|
+
else
|
171
|
+
# wipe out unversioned files (except ignored files)
|
172
|
+
system('hg --config extensions.purge= clean')
|
173
|
+
end
|
174
|
+
else
|
175
|
+
puts 'Error: script must be run from working copy!'
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -107,6 +107,8 @@ module Nixenvironment
|
|
107
107
|
build_args << '-showBuildSettings'
|
108
108
|
|
109
109
|
puts 'Reading config settings ...'
|
110
|
+
puts
|
111
|
+
|
110
112
|
cmd_output = execute(nil, build_args, true)
|
111
113
|
|
112
114
|
env_vars_list = cmd_output.split(/\n/).reject(&:empty?)
|
@@ -167,7 +169,11 @@ module Nixenvironment
|
|
167
169
|
|
168
170
|
def self.read_info
|
169
171
|
@info = {}
|
172
|
+
|
173
|
+
puts
|
170
174
|
cmd_output = execute(nil, %w(-list 2>&1))
|
175
|
+
puts
|
176
|
+
|
171
177
|
raise "Getting xcode_project_info error! #{cmd_output}" if cmd_output.include?('error')
|
172
178
|
|
173
179
|
cmd_output = cmd_output.lines[1..-1].join.split(/\n\n/)
|