cocoapods-tdfire-binary 0.1.4 → 0.1.6

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: 874fd6aebf5cebf48727df8baa0c51854986c995
4
- data.tar.gz: 31d9a9f92b97355c2bdc9b9ff80003beeae8586d
3
+ metadata.gz: 557565f493e63f0aae84418d13f594d10765a227
4
+ data.tar.gz: 57905b4d491285860bdfd6969273e3be26c6abaa
5
5
  SHA512:
6
- metadata.gz: 966aaaf0facd094a2ca7faa54084ffcc7ad1f3b4998623f3a4f0361216bd722512a7ebece32a52ef4b6b5481f2a2b1f5c28aca73e64b3c62f07036dd08f3b18b
7
- data.tar.gz: 98099bf42395c06ce64ea8d441e57d5269613606750caf7ab75d26e488eb97d3623f63ccb41f9ecf429c3a4a8bb781033a7d5425374e5c30577e0bab663e9c06
6
+ metadata.gz: 75e7b0d512ce521dcbac84ca4dece0c17942b244f060b588657d587d0b8c4caae6f460294753a8eaf5e3fbab3d126b2c60a1b02690bf37aef6f3a521f4fa54b7
7
+ data.tar.gz: 3368ae748ea31de56c94c77fada4d23ad04a86dc5a1077651a61caa4e4f55eafba9baf7f995e0d99347ba95b64e2226462544aabf67e47fdb238acc5d81539cf
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cocoapods-tdfire-binary (0.1.4)
4
+ cocoapods-tdfire-binary (0.1.6)
5
5
  cocoapods (~> 1.4)
6
+ colored2 (~> 3.1)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
@@ -22,5 +22,5 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'rake', '~> 12.0'
23
23
 
24
24
  spec.add_dependency 'cocoapods', '~> 1.4'
25
-
25
+ spec.add_dependency 'colored2', '~> 3.1'
26
26
  end
@@ -3,16 +3,24 @@ module Tdfire
3
3
  public
4
4
 
5
5
  class << self
6
- attr_accessor :unpublished_pods
7
- attr_writer :use_source_pods
6
+ # attr_accessor :unpublished_pods
7
+ attr_accessor :use_source_pods
8
8
  attr_reader :printed_pods
9
9
  end
10
- @unpublished_pods = []
10
+ # @unpublished_pods = []
11
11
  @use_source_pods = []
12
12
  @printed_pods = []
13
13
 
14
- def self.use_source_pods
15
- (@use_source_pods + @unpublished_pods).uniq
14
+ def self.real_use_source_pods
15
+ (@use_source_pods + unpublished_pods).uniq
16
+ end
17
+
18
+ def self.unpublished_pods
19
+ String(ENV[UNPBLISHED_PODS]).split('|')
20
+ end
21
+
22
+ def self.unpublished_pods=(pods)
23
+ ENV[UNPBLISHED_PODS] = Array(pods).join('|')
16
24
  end
17
25
 
18
26
  def self.use_binary?
@@ -27,21 +35,17 @@ module Tdfire
27
35
  ENV[FORCE_USE_BINARY_KEY] == USE_SURE_VALUE
28
36
  end
29
37
 
30
- def self.force_use_source?
31
- ENV[FORCE_USE_SOURCE_KEY] == USE_SURE_VALUE
38
+ def self.set_force_use_binary
39
+ ENV[FORCE_USE_BINARY_KEY] = USE_SURE_VALUE
32
40
  end
33
41
 
34
- def self.auto_set_default_unpublished_pod?
35
- ENV[AUTO_SET_DEFAULT_UNPUBLISHED_POD_KEY] == USE_SURE_VALUE
36
- end
37
-
38
- def self.set_auto_set_default_unpublished_pod
39
- ENV[AUTO_SET_DEFAULT_UNPUBLISHED_POD_KEY] = USE_SURE_VALUE
42
+ def self.force_use_source?
43
+ ENV[FORCE_USE_SOURCE_KEY] == USE_SURE_VALUE
40
44
  end
41
45
 
42
46
  private
43
-
44
- AUTO_SET_DEFAULT_UNPUBLISHED_POD_KEY = 'auto_set_default_unpublished_pod'
47
+
48
+ UNPBLISHED_PODS = "tdfire_unpublished_pods"
45
49
  FORCE_USE_SOURCE_KEY = 'tdfire_force_use_source'
46
50
  FORCE_USE_BINARY_KEY = 'tdfire_force_use_binary'
47
51
  USE_BINARY_KEY = 'tdfire_use_binary'
@@ -1,3 +1,3 @@
1
1
  module CocoapodsTdfireBinary
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -10,21 +10,15 @@ module Pod
10
10
  Tdfire::BinaryStateStore.use_source_pods = Array(pods)
11
11
  end
12
12
 
13
- # 标明未发布的pod,因为未发布pod没有对应的二进制版本,无法下载
14
- # 未发布的pod,一定是源码依赖的
15
- def tdfire_unpublished_pods(pods)
16
- Pod::UI.puts "Tdfire: set unpublished pods: #{Array(pods).join(', ')}"
17
- Tdfire::BinaryStateStore.unpublished_pods = Array(pods)
18
- end
19
-
20
13
  # 使用二进制依赖
21
14
  def tdfire_use_binary!
22
15
  Tdfire::BinaryStateStore.set_use_binary
23
- end
16
+ end
24
17
 
25
- def tdfire_auto_set_default_unpublished_pod!
26
- Tdfire::BinaryStateStore.set_auto_set_default_unpublished_pod
27
- end
18
+ # 强制使用二进制依赖,忽略未发布和依赖源码设置
19
+ # def tdfire_force_use_binary!
20
+ # Tdfire::BinaryStateStore.set_force_use_binary
21
+ # end
28
22
 
29
23
  # 外源组件依赖
30
24
  def tdfire_external_pods(pods, *rest)
@@ -74,11 +68,6 @@ EOF
74
68
  end
75
69
  else
76
70
  end
77
-
78
- # 除了依赖私有源正式版本的组件,其余组件一律视为未发布组件,进行源码依赖
79
- Tdfire::BinaryStateStore.unpublished_pods += Array(pods)
80
-
81
- # Tdfire::BinaryStateStore.use_source_pods = Array(pods) + Tdfire::BinaryStateStore.use_source_pods
82
71
  end
83
72
  end
84
73
  end
@@ -1,8 +1,8 @@
1
1
  require 'cocoapods-tdfire-binary/binary_state_store'
2
+ require 'cocoapods-tdfire-binary/source_chain_analyzer'
2
3
 
3
4
  module CocoapodsTdfireBinary
4
5
 
5
- tdfire_default_development_pod = nil
6
6
  Pod::HooksManager.register('cocoapods-tdfire-binary', :pre_install) do |context, _|
7
7
  first_target_definition = context.podfile.target_definition_list.select{ |d| d.name != 'Pods' }.first
8
8
  development_pod = first_target_definition.name.split('_').first unless first_target_definition.nil?
@@ -12,13 +12,24 @@ module CocoapodsTdfireBinary
12
12
  context.podfile.install!('cocoapods', :share_schemes_for_development_pods => [development_pod])
13
13
  end unless development_pod.nil?
14
14
 
15
- # 在采用二进制依赖,并且不是强制二进制依赖的情况下,当前打成 framework 的开发 Pod 需要源码依赖
16
- if Tdfire::BinaryStateStore.use_binary? && Tdfire::BinaryStateStore.auto_set_default_unpublished_pod?
17
- Pod::UI.section("Tdfire: auto set unpublished for development pod: \'#{development_pod}\'") do
18
- # 开发 Pod 默认设置为未发布状态
19
- Tdfire::BinaryStateStore.unpublished_pods << development_pod
20
- end unless development_pod.nil?
21
- tdfire_default_development_pod = development_pod
15
+
16
+ # 标明未发布的pod,因为未发布pod没有对应的二进制版本,无法下载
17
+ # 未发布的pod,一定是源码依赖的
18
+ Pod::UI.section("Tdfire: auto set unpublished pods") do
19
+ Tdfire::BinaryStateStore.unpublished_pods = context.podfile.dependencies.select(&:external?).map(&:root_name)
20
+
21
+ Pod::UI.message "> Tdfire: unpublished pods: #{Tdfire::BinaryStateStore.unpublished_pods.join(', ')}"
22
+ end
23
+
24
+ # 没有标识use_frameworks!,进行源码依赖需要设置Pod依赖链上,依赖此源码Pod的也进行源码依赖
25
+ unless first_target_definition.uses_frameworks?
26
+ Pod::UI.section("Tdfire: analyze chain pods depend on use source pods: #{Tdfire::BinaryStateStore.use_source_pods.join(', ')}") do
27
+ chain_pods = Tdfire::SourceChainAnalyzer.new(context.podfile).analyze(Tdfire::BinaryStateStore.use_source_pods)
28
+
29
+ Pod::UI.message "> Tdfire: find chain pods: #{chain_pods.join(', ')}"
30
+
31
+ Tdfire::BinaryStateStore.use_source_pods += chain_pods
32
+ end unless Tdfire::BinaryStateStore.use_source_pods.empty?
22
33
  end
23
34
  end
24
35
 
@@ -44,14 +55,7 @@ module CocoapodsTdfireBinary
44
55
  end
45
56
  end
46
57
 
47
- # 在采用二进制依赖,并且不是强制二进制依赖的情况下,提示当前工程的未发布的 Pods
48
- if Tdfire::BinaryStateStore.use_binary?
49
- all_development_pods = context.sandbox.development_pods.keys - Array(tdfire_default_development_pod) - Tdfire::BinaryStateStore.use_source_pods
50
- all_development_pods_displayed_text = all_development_pods.map { |p| "'#{p}'" }.join(',')
51
- Pod::UI.puts "Tdfire: You should add following code to your `Podfile`, and then run `pod install or pod update` again. \n\ntdfire_unpublished_pods [#{all_development_pods_displayed_text}]\n".cyan unless all_development_pods.empty?
52
- end
53
-
54
- Pod::UI.puts "Tdfire: all source dependency pods: #{Tdfire::BinaryStateStore.use_source_pods.join(', ')}"
58
+ Pod::UI.puts "Tdfire: all source dependency pods: #{Tdfire::BinaryStateStore.real_use_source_pods.join(', ')}"
55
59
  Pod::UI.puts "Tdfire: all unpublished pods: #{Tdfire::BinaryStateStore.unpublished_pods.join(', ')}"
56
60
  end
57
61
  end
@@ -0,0 +1,66 @@
1
+ module Tdfire
2
+ class SourceChainAnalyzer
3
+
4
+ def initialize(podfile)
5
+ @lockfile = generate_lockfile(podfile)
6
+ @pods_data = @lockfile.internal_data['PODS']
7
+ @parent_pods = []
8
+ end
9
+
10
+ public
11
+
12
+ def analyze(pods)
13
+ pods.each do |pod|
14
+ find_parent_pods(pod, @pods_data) unless @parent_pods.include?(pod)
15
+ end unless @lockfile.nil?
16
+
17
+ @parent_pods.uniq
18
+ end
19
+
20
+ private
21
+
22
+ def find_parent_pods(pod, pods_data)
23
+ return if pod.nil?
24
+
25
+ parent_pod_hashes = pods_data.select{ |pod_data| pod_data.is_a?(Hash) && pod_data.values.flatten.include?(pod) }
26
+ parent_pod_hashes.each do |hold_pod_hash|
27
+ hold_pod_name = hold_pod_hash.keys.first.split('(').first.strip
28
+ @parent_pods << hold_pod_name
29
+ find_parent_pods(hold_pod_name, pods_data - parent_pod_hashes)
30
+ end
31
+ end
32
+
33
+
34
+ def generate_lockfile(podfile)
35
+ fetch_external_source = false
36
+
37
+ lockfile = Pod::Lockfile.from_file(Pathname.new('Podfile.lock'))
38
+
39
+ # 如果手动去删除 Pods/Local Podspecs 里面的文件,那就会直接报错了
40
+ if lockfile.nil? || !Pathname.new('Pods').exist?
41
+ fetch_external_source = true
42
+ else
43
+ external = podfile.dependencies.select(&:external?)
44
+ external_source = {}
45
+ external.each { |d| external_source[d.root_name] = d.external_source }
46
+ lockfile_external_source = lockfile.internal_data['EXTERNAL SOURCES']
47
+ fetch_external_source = external_source != lockfile_external_source
48
+ end
49
+
50
+ sandbox = Pod::Config.instance.sandbox
51
+ analyzer = Pod::Installer::Analyzer.new(sandbox, podfile, lockfile)
52
+ specs = Pod::Config.instance.with_changes(skip_repo_update: true) do
53
+ # allow fetch ,初次install时,或者新增external source 时,由于Pods/Local Podspecs 是空,会抛出找不到specification异常
54
+ begin
55
+ analyzer.analyze(fetch_external_source).specs_by_target.values.flatten(1)
56
+ rescue
57
+ Pod::UI.message "> Tdfire: allow to fetch external source and try again".yellow
58
+ analyzer.analyze(true).specs_by_target.values.flatten(1)
59
+ end
60
+ end
61
+
62
+ Pod::Lockfile.generate(podfile, specs, {}) || lockfile
63
+ end
64
+
65
+ end
66
+ end
@@ -1,5 +1,5 @@
1
1
  require 'cocoapods-tdfire-binary/binary_state_store'
2
- require 'colored'
2
+ require 'colored2'
3
3
 
4
4
  module Pod
5
5
  class Specification
@@ -9,7 +9,7 @@ module Pod
9
9
 
10
10
  def use_source?
11
11
  (!Tdfire::BinaryStateStore.force_use_binary? &&
12
- (!Tdfire::BinaryStateStore.use_binary? || Tdfire::BinaryStateStore.use_source_pods.include?(name))) ||
12
+ (!Tdfire::BinaryStateStore.use_binary? || Tdfire::BinaryStateStore.real_use_source_pods.include?(name))) ||
13
13
  Tdfire::BinaryStateStore.force_use_source?
14
14
  end
15
15
 
@@ -19,7 +19,7 @@ module Pod
19
19
  def tdfire_source(&block)
20
20
  if use_source?
21
21
  if !Tdfire::BinaryStateStore.printed_pods.include?(name)
22
- UI.puts "Source".magenta.bold + " dependecy for " + "#{name} #{version}".blue
22
+ UI.puts "Source".magenta.bold + " dependecy for " + "#{name} #{version}".green.bold
23
23
  Tdfire::BinaryStateStore.printed_pods << name
24
24
  end
25
25
 
@@ -31,7 +31,7 @@ module Pod
31
31
  def tdfire_binary(&block)
32
32
  if !use_source?
33
33
  if !Tdfire::BinaryStateStore.printed_pods.include?(name)
34
- UI.puts "Binary".cyan.bold + " dependecy for " + "#{name} #{version}".blue
34
+ UI.puts "Binary".cyan.bold + " dependecy for " + "#{name} #{version}".green.bold
35
35
  Tdfire::BinaryStateStore.printed_pods << name
36
36
  end
37
37
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-tdfire-binary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - tripleCC
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-19 00:00:00.000000000 Z
11
+ date: 2018-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: colored2
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.1'
55
69
  description: cocoapods-tdfire-binary is a plugin which helps developer switching there
56
70
  project dependency between source and binary.
57
71
  email:
@@ -72,6 +86,7 @@ files:
72
86
  - lib/cocoapods-tdfire-binary/gem_version.rb
73
87
  - lib/cocoapods-tdfire-binary/podfile_dsl.rb
74
88
  - lib/cocoapods-tdfire-binary/podfile_hook.rb
89
+ - lib/cocoapods-tdfire-binary/source_chain_analyzer.rb
75
90
  - lib/cocoapods-tdfire-binary/specification_dsl.rb
76
91
  - lib/cocoapods_plugin.rb
77
92
  - spec/command/binary_spec.rb