5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'fastlane/lib/fastlane/actions/hg_commit_version_bump.rb', line 5
def self.run(params)
require 'xcodeproj'
require 'pathname'
require 'set'
require 'shellwords'
xcodeproj_path = params[:xcodeproj] ? File.expand_path(File.join('.', params[:xcodeproj])) : nil
if Helper.test?
xcodeproj_path = "/tmp/Test.xcodeproj"
end
repo_path = Helper.test? ? '/tmp/repo' : Actions.sh('hg root').strip
repo_pathname = Pathname.new(repo_path)
if xcodeproj_path
unless Helper.test?
UI.user_error!("Could not find the specified xcodeproj: #{xcodeproj_path}") unless File.directory?(xcodeproj_path)
end
else
xcodeproj_paths = Fastlane::Helper::XcodeprojHelper.find(repo_path)
UI.user_error!('Could not find a .xcodeproj in the current repository\'s working directory.') if xcodeproj_paths.count == 0
if xcodeproj_paths.count > 1
relative_projects = xcodeproj_paths.map { |e| Pathname.new(e).relative_path_from(repo_pathname).to_s }.join("\n")
UI.user_error!("Found multiple .xcodeproj projects in the current repository's working directory. Please specify your app's main project: \n#{relative_projects}")
end
xcodeproj_path = xcodeproj_paths.first
end
if Helper.test?
hg_dirty_files = params[:test_dirty_files].split(",")
expected_changed_files = params[:test_expected_files].split(",")
else
pbxproj_pathname = Pathname.new(File.join(xcodeproj_path, 'project.pbxproj'))
pbxproj_path = pbxproj_pathname.relative_path_from(repo_pathname).to_s
project = Xcodeproj::Project.open(xcodeproj_path)
info_plist_files = project.objects.select do |object|
object.isa == 'XCBuildConfiguration'
end.map(&:to_hash).map do |object_hash|
object_hash['buildSettings']
end.select do |build_settings|
build_settings.key?('INFOPLIST_FILE')
end.map do |build_settings|
build_settings['INFOPLIST_FILE']
end.uniq.map do |info_plist_path|
Pathname.new(File.expand_path(File.join(xcodeproj_path, '..', info_plist_path))).relative_path_from(repo_pathname).to_s
end
expected_changed_files = []
expected_changed_files << pbxproj_path
expected_changed_files << info_plist_files
expected_changed_files.flatten!.uniq!
hg_dirty_files = Actions.sh('hg status -n').split("\n")
end
UI.user_error!("No file changes picked up. Make sure you run the `increment_build_number` action first.") if hg_dirty_files.empty?
dirty_set = Set.new(hg_dirty_files.map(&:downcase))
expected_set = Set.new(expected_changed_files.map(&:downcase))
changed_files_as_expected = dirty_set.subset?(expected_set)
unless changed_files_as_expected
unless params[:force]
str = ["Found unexpected uncommitted changes in the working directory. Expected these files to have changed:",
"#{expected_changed_files.join("\n")}.",
"But found these actual changes: \n#{hg_dirty_files.join("\n")}.",
"Make sure you have cleaned up the build artifacts and are only left with the changed version files at this",
"stage in your lane, and don't touch the working directory while your lane is running. You can also use the :force option to ",
"bypass this check, and always commit a version bump regardless of the state of the working directory."].join("\n")
UI.user_error!(str)
end
end
command = "hg commit -m '#{params[:message]}'"
return command if Helper.test?
begin
Actions.sh(command)
UI.success("Committed \"#{params[:message]}\" 💾.")
rescue => ex
UI.error(ex)
UI.important("Didn't commit any changes. 😐")
end
end
|