cocoapods-hd 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,4 @@
1
1
  require 'cocoapods-hd/command/hd'
2
2
  require 'cocoapods-hd/command/tag'
3
3
  require 'cocoapods-hd/tag_util'
4
+ require 'cocoapods-hd/command/binary'
@@ -0,0 +1,67 @@
1
+ require 'cocoapods'
2
+ require 'fileutils'
3
+ require 'cocoapods-hd/helper/feature_switches'
4
+ require 'cocoapods-hd/main'
5
+ require_relative '../../cocoapods-hd/helper/passer'
6
+
7
+ module Pod
8
+ class Command
9
+ class Binary < Command
10
+
11
+ self.summary = '指定源码二进制化'
12
+ self.description = <<-DESC
13
+ 提升项目的整体编译速度,将代码二进制
14
+ DESC
15
+
16
+ def self.options
17
+ [
18
+ ['--beta', 'beta tag'],
19
+ ['--targets', 'specify targets for binary'],
20
+ ['--delete', 'delete tag and remove pod repo source'],
21
+ ]
22
+ end
23
+
24
+ def initialize(argv)
25
+ @beta = argv.flag?('beta', false)
26
+ @delete = argv.flag?('delete', false)
27
+ # @tag_version = argv.shift_argument
28
+ @targets = argv.shift_argument
29
+ super
30
+ end
31
+
32
+ # 创建 binary tag
33
+ def binary_tag
34
+ UI.puts "binary targets: #{@targets}"
35
+ if @targets.nil?
36
+ Prebuild::Passer.target_names = []
37
+ else
38
+ Prebuild::Passer.target_names = @targets
39
+ end
40
+ Pod.is_ignore_hook_install = false
41
+ run_pod_install
42
+ Pod.is_ignore_hook_install = true
43
+
44
+
45
+ end
46
+
47
+ # 移除tag
48
+ def delete_tag
49
+
50
+ end
51
+
52
+ # 获取tag名称
53
+ def get_tag
54
+ # @beta ? "#{@tag_version}-beta" : @tag_version
55
+ end
56
+
57
+ def run
58
+ if @delete
59
+ delete_tag
60
+ else
61
+ binary_tag
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ end
@@ -28,20 +28,8 @@ module Pod
28
28
  super
29
29
  end
30
30
 
31
- # 创建tag
32
- def create_tag
33
-
34
- unless TagUtil.exist_branch
35
- UI.warn("当前分支名格式不正确,请修改为 release_x.x.x 格式")
36
- return
37
- end
38
- unless TagUtil.check_branch_include_tag(@tag_version)
39
- UI.warn("分支后缀版本号,必须跟tag保持一致")
40
- return
41
- end
42
-
43
- UI.puts "🍉 开始创建tag: #{get_tag}"
44
-
31
+ def build_tag
32
+ UI.puts "🍉 开始创建tag : #{get_tag}"
45
33
  if TagUtil.exist_tag(get_tag)
46
34
  TagUtil.git_delete_tag(get_tag)
47
35
  end
@@ -72,17 +60,15 @@ module Pod
72
60
  `pod ipc spec #{pod_name}.podspec >>#{podspec_json_name}`
73
61
  podspec_json_dir = File.join(Dir.pwd, podspec_json_name)
74
62
 
75
- source_specs_dir = get_source_specs_dir
76
-
77
- UI.puts("HDSourceSpecs目录: #{source_specs_dir}")
63
+ UI.puts("HDSourceSpecs目录: #{get_source_specs_dir}")
78
64
 
79
- Dir.chdir(source_specs_dir)
65
+ Dir.chdir(get_source_specs_dir)
80
66
  `git pull`
81
67
 
82
- dest_dir = File.join(source_specs_dir, pod_name, get_tag)
68
+ dest_dir = File.join(get_source_specs_dir, pod_name, get_tag)
83
69
 
84
70
  UI.section("创建目录: #{dest_dir}") do
85
- FileUtils.mkdir(dest_dir) unless File.directory? dest_dir
71
+ FileUtils.mkdir_p(dest_dir) unless File.directory?(dest_dir)
86
72
  end
87
73
 
88
74
  UI.section("move #{podspec_json_dir} to #{dest_dir}") do
@@ -90,18 +76,12 @@ module Pod
90
76
  end
91
77
 
92
78
  UI.section("✅ #{podspec_json_name} 上传成功") do
93
- `git status -s`
94
- `git add .`
95
- `git commit -m 'add #{pod_name} #{get_tag}'`
96
- `git push origin master`
79
+ TagUtil.upload_origin_sources("添加 #{pod_name}/#{get_tag}")
97
80
  end
98
-
99
81
  Dir.chdir(module_dir)
100
82
  end
101
- unless exist_cocoapods_source_dir
102
- module_parent_dir = File.expand_path("..", Dir.pwd) # ~/debug-cocoapods-hd
103
- source_repo_path = File.join(module_parent_dir, "HDSourceSpecs")
104
- FileUtils.rm_r(source_repo_path)
83
+ unless File.directory?(cocoapods_repos_dir)
84
+ remove_git_source_repo
105
85
  end
106
86
 
107
87
  unless @beta
@@ -111,8 +91,25 @@ module Pod
111
91
  delete_tag(beta_tag)
112
92
  end
113
93
  end
94
+ end
95
+ end
96
+
97
+ # 创建tag
98
+ def create_tag
114
99
 
100
+ unless TagUtil.check_master_branch
101
+ UI.warn("❌ 当前分支仅支持打 beta tag") unless @beta
102
+ build_tag if @beta
103
+ return
104
+ end
105
+
106
+ unless TagUtil.check_branch_include_tag(@tag_version)
107
+ UI.warn("❌ 分支后缀版本号,必须跟tag保持一致")
108
+ return
115
109
  end
110
+ build_tag
111
+
112
+
116
113
  end
117
114
 
118
115
  # 获取 HDSourceSpecs 路径
@@ -136,6 +133,7 @@ module Pod
136
133
 
137
134
  # 移除tag
138
135
  def delete_tag(tag)
136
+
139
137
  UI.puts "🍉 开始删除tag: #{tag}"
140
138
  if TagUtil.exist_tag(tag)
141
139
  TagUtil.git_delete_tag(tag)
@@ -157,25 +155,19 @@ module Pod
157
155
  pod_name = rip.to_s.gsub(".podspec", "")
158
156
  UI.puts "pod_name: #{pod_name}"
159
157
 
160
- unless File.directory?(cocoapods_repos_dir)
161
- Pod::UI.puts "本地 HDSourceSpecs not found"
162
- break
163
- end
158
+ source_specs_dir = get_source_specs_dir
164
159
 
165
- full_path = File.join(cocoapods_repos_dir, pod_name, tag_name)
160
+ pod_tag_path = File.join(source_specs_dir, pod_name, tag_name)
166
161
 
167
- unless File.exist?(full_path)
162
+ unless File.exist?(pod_tag_path)
168
163
  UI.warn "❌ 本地HDSourceSpecs不包含#{pod_name}的#{tag_name}标签, 请先执行 pod repo update"
164
+ remove_git_source_repo
169
165
  break
170
166
  end
171
- FileUtils.remove_dir(full_path)
172
- Dir.chdir(cocoapods_repos_dir)
173
- # UI.puts "切换到:#{Dir.pwd}"
167
+ FileUtils.remove_dir(pod_tag_path)
168
+ Dir.chdir(source_specs_dir)
174
169
  UI.section("✅ #{pod_name} #{tag_name} 标签删除成功 !!!") do
175
- `git pull origin master`
176
- `git add .`
177
- `git commit -m '删除#{pod_name}/#{tag_name}'`
178
- `git push origin master`
170
+ TagUtil.upload_origin_sources("删除 #{pod_name}/#{tag_name}")
179
171
  end
180
172
 
181
173
  end
@@ -185,8 +177,9 @@ module Pod
185
177
  File.join(Dir.home, ".cocoapods/repos/HDSourceSpecs")
186
178
  end
187
179
 
188
- def exist_cocoapods_source_dir
189
- File.directory?(cocoapods_repos_dir)
180
+ def remove_git_source_repo
181
+ source_repo_path = File.join(File.dirname(Dir.pwd), "HDSourceSpecs")
182
+ FileUtils.rm_r(source_repo_path)
190
183
  end
191
184
 
192
185
  def run
@@ -1,3 +1,3 @@
1
1
  module CocoapodsHd
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,101 @@
1
+ require_relative '../tool/tool'
2
+ require_relative 'prebuild_sandbox'
3
+
4
+ module Pod
5
+
6
+ # a flag that indicate stages
7
+ class_attr_accessor :is_prebuild_stage
8
+
9
+ # 是否忽略hook pre install
10
+ class_attr_accessor :is_ignore_hook_install
11
+
12
+ # a switch for the `pod` DSL to make it only valid for ':binary => true'
13
+ class Podfile
14
+ module DSL
15
+
16
+ @@enable_prebuild_patch = false
17
+
18
+ # when enable, `pod` function will skip all pods without 'prebuild => true'
19
+ def self.enable_prebuild_patch(value)
20
+ @@enable_prebuild_patch = value
21
+ end
22
+
23
+ # --- patch ---
24
+ old_method = instance_method(:pod)
25
+
26
+ define_method(:pod) do |name, *args|
27
+ if !@@enable_prebuild_patch
28
+ old_method.bind(self).(name, *args)
29
+ return
30
+ end
31
+
32
+ # patched content
33
+ should_prebuild = Pod::Podfile::DSL.is_all_binary
34
+ local = false
35
+
36
+ options = args.last
37
+ if options.is_a?(Hash) and options[Pod::Prebuild.keyword] != nil
38
+ should_prebuild = options[Pod::Prebuild.keyword]
39
+ local = (options[:path] != nil)
40
+ end
41
+
42
+ if should_prebuild and (not local)
43
+ old_method.bind(self).(name, *args)
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ # a force disable option for integral
50
+ class Installer
51
+ @@force_disable_integration = false
52
+ def self.force_disable_integration(value)
53
+ @@force_disable_integration = value
54
+ end
55
+
56
+ old_method = instance_method(:integrate_user_project)
57
+ define_method(:integrate_user_project) do
58
+ if @@force_disable_integration
59
+ return
60
+ end
61
+ old_method.bind(self).()
62
+ end
63
+ end
64
+
65
+ # a option to disable install complete message
66
+ class Installer
67
+ @@disable_install_complete_message = false
68
+ def self.disable_install_complete_message(value)
69
+ @@disable_install_complete_message = value
70
+ end
71
+
72
+ old_method = instance_method(:print_post_install_message)
73
+ define_method(:print_post_install_message) do
74
+ if @@disable_install_complete_message
75
+ return
76
+ end
77
+ old_method.bind(self).()
78
+ end
79
+ end
80
+
81
+ # option to disable write lockfiles
82
+ class Config
83
+
84
+ @@force_disable_write_lockfile = false
85
+
86
+ def self.force_disable_write_lockfile(value)
87
+ @@force_disable_write_lockfile = value
88
+ end
89
+
90
+ old_method = instance_method(:lockfile_path)
91
+ define_method(:lockfile_path) do
92
+ if @@force_disable_write_lockfile
93
+ # As config is a singleton, sandbox_root refer to the standard sandbox.
94
+ return PrebuildSandbox.from_standard_sanbox_path(sandbox_root).root + 'Manifest.lock.tmp'
95
+ else
96
+ return old_method.bind(self).()
97
+ end
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,78 @@
1
+ # ABOUT NAMES
2
+ #
3
+ # There are many kinds of name in cocoapods. Two main names are widely used in this plugin.
4
+ # - root_spec.name (spec.root_name, targe.pod_name):
5
+ # aka "pod_name"
6
+ # the name we use in podfile. the concept.
7
+ #
8
+ # - target.name:
9
+ # aka "target_name"
10
+ # the name of the final target in xcode project. the final real thing.
11
+ #
12
+ # One pod may have multiple targets in xcode project, due to one pod can be used in mutiple
13
+ # platform simultaneously. So one `root_spec.name` may have multiple coresponding `target.name`s.
14
+ # Therefore, map a spec to/from targets is a little complecated. It's one to many.
15
+ #
16
+
17
+ # Tool to transform Pod_name to target efficiently
18
+ module Pod
19
+ def self.fast_get_targets_for_pod_name(pod_name, targets, cache)
20
+ pod_name_to_targets_hash = nil
21
+ if cache.empty?
22
+ pod_name_to_targets_hash = targets.reduce({}) do |sum, target|
23
+ array = sum[target.pod_name] || []
24
+ array << target
25
+ sum[target.pod_name] = array
26
+ sum
27
+ end
28
+ cache << pod_name_to_targets_hash
29
+ else
30
+ pod_name_to_targets_hash = cache.first
31
+ end
32
+
33
+ pod_name_to_targets_hash[pod_name] || []
34
+ end
35
+ end
36
+
37
+
38
+
39
+
40
+
41
+
42
+ # Target:
43
+
44
+ # def pod_name
45
+ # root_spec.name
46
+ # end
47
+
48
+ # def name
49
+ # pod_name + #{scope_suffix}
50
+ # end
51
+
52
+ # def product_module_name
53
+ # root_spec.module_name
54
+ # end
55
+
56
+ # def framework_name
57
+ # "#{product_module_name}.framework"
58
+ # end
59
+
60
+ # def product_name
61
+ # if requires_frameworks?
62
+ # framework_name
63
+ # else
64
+ # static_library_name
65
+ # end
66
+ # end
67
+
68
+ # def product_basename
69
+ # if requires_frameworks?
70
+ # product_module_name
71
+ # else
72
+ # label
73
+ # end
74
+ # end
75
+
76
+ # def framework_name
77
+ # "#{product_module_name}.framework"
78
+ # end
@@ -0,0 +1,46 @@
1
+ require_relative '../tool/tool'
2
+
3
+ module Pod
4
+ class Prebuild
5
+
6
+ # Pass the data between the 2 steps
7
+ #
8
+ # At step 2, the normal pod install, it needs some info of the
9
+ # prebuilt step. So we store it here.
10
+ #
11
+ class Passer
12
+
13
+ # indicate the add/remove/update of prebuit pods
14
+ # @return [Analyzer::SpecsState]
15
+ #
16
+ class_attr_accessor :prebuild_pods_changes
17
+
18
+
19
+ # represent the path of resurces to copy
20
+ class ResourcePath
21
+ attr_accessor :real_file_path
22
+ attr_accessor :target_file_path
23
+ end
24
+ # Save the resoures for static framework, and used when installing the prebuild framework
25
+ # static framework needs copy the resurces mannully
26
+ #
27
+ # @return [Hash<String, [Passer::ResourcePath]>]
28
+ class_attr_accessor :resources_to_copy_for_static_framework
29
+ self.resources_to_copy_for_static_framework = {}
30
+
31
+ # Some pod won't be build in prebuild stage even if it have `binary=>true`.
32
+ # The targets of this pods have `oshould_build? == true`.
33
+ # We should skip integration (patch spec) for this pods
34
+ #
35
+ # @return [Array<String>]
36
+ class_attr_accessor :target_names_to_skip_integration_framework
37
+ self.target_names_to_skip_integration_framework = []
38
+
39
+
40
+ # 指定targets编译
41
+ class_attr_accessor :target_names
42
+ self.target_names = []
43
+
44
+ end
45
+ end
46
+ end