tuya-ci-core 0.1.2 → 0.2.0
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/bin/tuyacicore +0 -0
- data/lib/tuya/ci/core/config/config_gitlab.rb +2 -0
- data/lib/tuya/ci/core/config/config_modules.rb +109 -0
- data/lib/tuya/ci/core/config/odm_config_modules.rb +56 -0
- data/lib/tuya/ci/core/config.rb +21 -0
- data/lib/tuya/ci/core/dependencies/node/podfile_lock_analyse.rb +119 -0
- data/lib/tuya/ci/core/dependencies/node/podfile_lock_node.rb +39 -0
- data/lib/tuya/ci/core/dependencies/podfile_lock.rb +39 -0
- data/lib/tuya/ci/core/dependencies.rb +40 -0
- data/lib/tuya/ci/core/download.rb +11 -0
- data/lib/tuya/ci/core/executable.rb +2 -0
- data/lib/tuya/ci/core/git/gitlab/gitlab_odm.rb +143 -0
- data/lib/tuya/ci/core/git.rb +98 -33
- data/lib/tuya/ci/core/language_update.rb +17 -0
- data/lib/tuya/ci/core/odm_build.rb +246 -0
- data/lib/tuya/ci/core/podfile.rb +21 -3
- data/lib/tuya/ci/core/podspec.rb +39 -9
- data/lib/tuya/ci/core/repo_release_ci.rb +44 -0
- data/lib/tuya/ci/core/spec/odm/spec_odm.rb +48 -0
- data/lib/tuya/ci/core/spec/release/repo_release.rb +67 -0
- data/lib/tuya/ci/core/spec/release/repo_release_git.rb +27 -0
- data/lib/tuya/ci/core/template/template_configurator.rb +54 -15
- data/lib/tuya/ci/core/template.rb +10 -4
- data/lib/tuya/ci/core/util/file.rb +39 -0
- data/lib/tuya/ci/core/version.rb +1 -1
- data/lib/tuya/ci/core.rb +28 -2
- metadata +32 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 5c318fd664d9d6a7dd4f535615ec6172e638c3a2
         | 
| 4 | 
            +
              data.tar.gz: 8e1005fc9d1ee413438a0ddd0483d066e26cdc82
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a7e3dd4eb3ec40f61eb7d2669a5ccca253783d054c50fe87de7c33564beb52444b5af009fc444dbc930ccd8e200e93b60e79d986ee3c893115cc9b4afd3f8621
         | 
| 7 | 
            +
              data.tar.gz: 7b8be9fa7634b4a53cd0c73dc5ef0bb31312d0fef7080135503565262658f849f11a1cf455b3ef928d0aa1754048bf61662fd726f75bbbfa10c0d5080373348a
         | 
    
        data/bin/tuyacicore
    CHANGED
    
    | 
            File without changes
         | 
| @@ -0,0 +1,109 @@ | |
| 1 | 
            +
            $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
         | 
| 2 | 
            +
            module TYCiCore
         | 
| 3 | 
            +
            	class ConfigModules
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            		attr_accessor :config_path, :advance_fields, :pod_path
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            		def initialize(config_path="./config_modules.json", advance_fields="{}", pod_path="./Pods/")
         | 
| 8 | 
            +
            			@config_path = config_path
         | 
| 9 | 
            +
            			@advance_fields = advance_fields
         | 
| 10 | 
            +
            			@pod_path = pod_path
         | 
| 11 | 
            +
            		end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            		def config_hash
         | 
| 14 | 
            +
            			content = File.read @config_path
         | 
| 15 | 
            +
            			hash = JSON content
         | 
| 16 | 
            +
            			hash
         | 
| 17 | 
            +
            		end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            		def modules_in_pods
         | 
| 20 | 
            +
            			result = []
         | 
| 21 | 
            +
            			pod_directories = Dir["#{@pod_path}*"].reject{|o| not File.directory?(o)}
         | 
| 22 | 
            +
            			pod_directories.each do |folder|
         | 
| 23 | 
            +
            				name = folder.gsub(/\s+/,'').split('/')[-1]
         | 
| 24 | 
            +
            				if module?(name) && name!="Target Support Files"
         | 
| 25 | 
            +
            					result.push(name)
         | 
| 26 | 
            +
            				end
         | 
| 27 | 
            +
            			end
         | 
| 28 | 
            +
            			result
         | 
| 29 | 
            +
            		end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            		def setup_modules
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            			puts "Setup #{@config_path} at #{@pod_path}".green
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            			modules = modules_in_pods
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            			advance_json = JSON.parse(@advance_fields)
         | 
| 38 | 
            +
            			advance_json["modules"] = modules
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            			advance_json_pretty = JSON.pretty_generate(advance_json)
         | 
| 41 | 
            +
            			fh = File.new(@config_path, "w")
         | 
| 42 | 
            +
            			fh.puts advance_json_pretty
         | 
| 43 | 
            +
            			fh.close
         | 
| 44 | 
            +
            		end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            		def module?(name)
         | 
| 47 | 
            +
            			# find_command = "find #{pod_path} -iname #{name}Impl.h"
         | 
| 48 | 
            +
            			# # puts("find_command is #{find_command}")
         | 
| 49 | 
            +
            			# find_command_result = Action.sh find_command
         | 
| 50 | 
            +
            			# # puts("find_command_result is #{find_command_result}")
         | 
| 51 | 
            +
            			# if find_command_result.length > 0
         | 
| 52 | 
            +
            			# 	return true
         | 
| 53 | 
            +
            			# else
         | 
| 54 | 
            +
            			# 	return module_lib?(name)
         | 
| 55 | 
            +
            			# end
         | 
| 56 | 
            +
            			commands = %W(#{pod_path} -iname #{name}Impl.h)
         | 
| 57 | 
            +
            			result = EXE.exe('find', commands)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            			if result.length > 0
         | 
| 60 | 
            +
            				true
         | 
| 61 | 
            +
            			else
         | 
| 62 | 
            +
            				module_lib?(name)
         | 
| 63 | 
            +
            			end
         | 
| 64 | 
            +
            		end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            		def module_lib?(name)
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            			puts "Name is #{name}".green
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            			lib_path =  "#{@pod_path}#{name}/#{name}*/lib#{name}.a"
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            			puts "File_path is #{lib_path}".yellow
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            			libs_path_result = Dir.glob(lib_path)
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            			puts("The path is#{libs_path_result}")
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            			if libs_path_result.length > 0
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            				file_path = libs_path_result[0]
         | 
| 81 | 
            +
            				# find_command = "nm -gU #{file_path} | grep '_OBJC_CLASS_\\$_#{name}Impl'"
         | 
| 82 | 
            +
            				#
         | 
| 83 | 
            +
            				exists_impl = true
         | 
| 84 | 
            +
            				# find_command_result = Action.sh(
         | 
| 85 | 
            +
            				# 	find_command,
         | 
| 86 | 
            +
            				# 	error_callback: ->(result) {
         | 
| 87 | 
            +
            				# 		exists_impl = false
         | 
| 88 | 
            +
            				# 	}
         | 
| 89 | 
            +
            				# )
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            				# TODO exist?
         | 
| 92 | 
            +
            				commands = %W(-gU #{file_path} | grep '_OBJC_CLASS_\\$_#{name}Impl')
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            				find_result = EXE.exe('nm', commands)
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            				if exists_impl && !find_result.empty?
         | 
| 97 | 
            +
            					puts "Static lib #{name} has #{name}mpl".green
         | 
| 98 | 
            +
            					true
         | 
| 99 | 
            +
            				else
         | 
| 100 | 
            +
            					puts "Static lib #{name} can not find #{name}mpl".red
         | 
| 101 | 
            +
            					false
         | 
| 102 | 
            +
            				end
         | 
| 103 | 
            +
            			end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            			false
         | 
| 106 | 
            +
            		end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
            	end
         | 
| 109 | 
            +
            end
         | 
| @@ -0,0 +1,56 @@ | |
| 1 | 
            +
            require 'tuya/ci/core/config/config_modules'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module TYCiCore
         | 
| 4 | 
            +
              class ODMConfigModules < ConfigModules
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                attr_accessor :content
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def initialize(config_path="./config_modules.json", pod_path="./Pods/")
         | 
| 9 | 
            +
                  @config_path = config_path
         | 
| 10 | 
            +
                  @pod_path = pod_path
         | 
| 11 | 
            +
                  @content = config_hash
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def add_mix(key, value)
         | 
| 15 | 
            +
                  mix = @content["mixMap"]
         | 
| 16 | 
            +
                  if mix.nil? || mix.empty?
         | 
| 17 | 
            +
                    mix = Hash[key => value]
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    mix[key]=value
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                  @content["mixMap"]=mix
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # def add_mix(mixHash)
         | 
| 25 | 
            +
                #   mix = @content["mixMap"]
         | 
| 26 | 
            +
                #   if mix.nil? || mix.empty?
         | 
| 27 | 
            +
                #     mix = mixHash
         | 
| 28 | 
            +
                #   else
         | 
| 29 | 
            +
                #     mix = mix.merge(mixHash)
         | 
| 30 | 
            +
                #   end
         | 
| 31 | 
            +
                # end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def remove_mix(key)
         | 
| 34 | 
            +
                  @content["mixMap"].delete(key)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def update_config(key, value)
         | 
| 38 | 
            +
                  @content[key]=value
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def setup_modules # 根据 pod目录生成 modules
         | 
| 42 | 
            +
                  puts "ODM Setup #{@config_path} at #{@pod_path}".green
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  modules = modules_in_pods
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  @content["modules"] = modules
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def save(target=@config_path)
         | 
| 50 | 
            +
                  file_content = JSON.pretty_generate(@content)
         | 
| 51 | 
            +
                  fh = File.new(target, "w")
         | 
| 52 | 
            +
                  fh << file_content
         | 
| 53 | 
            +
                  fh.close
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module TYCiCore
         | 
| 2 | 
            +
            	class Config
         | 
| 3 | 
            +
            		def initialize(path)
         | 
| 4 | 
            +
            			raise "Can not find config at : #{path}" unless File.exist? path
         | 
| 5 | 
            +
            			@content = File.read path
         | 
| 6 | 
            +
            			@content_json = JSON @content
         | 
| 7 | 
            +
            		end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            		def value(key)
         | 
| 10 | 
            +
            			eval("@content_json" << key.split('.').map { |i| "[\"" + i + "\"]" }.join)
         | 
| 11 | 
            +
            		end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            		def method_missing(name)
         | 
| 14 | 
            +
            			if @content_json.has_key? name.to_s
         | 
| 15 | 
            +
            				@content_json[name.to_s]
         | 
| 16 | 
            +
            			else
         | 
| 17 | 
            +
            				super.method_missing name
         | 
| 18 | 
            +
            			end
         | 
| 19 | 
            +
            		end
         | 
| 20 | 
            +
            	end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,119 @@ | |
| 1 | 
            +
            module TYCiCore
         | 
| 2 | 
            +
            	class TYPodAnalyse
         | 
| 3 | 
            +
            		attr_accessor :pods_hash, :pod_nodes_hash, :podfile_lock
         | 
| 4 | 
            +
            		def initialize(podfile_lock)
         | 
| 5 | 
            +
            			@pods_hash = Hash.new
         | 
| 6 | 
            +
            			@pod_nodes_hash = Hash.new
         | 
| 7 | 
            +
            			@podfile_lock = podfile_lock
         | 
| 8 | 
            +
            			podfile_lock.all_pods.each do |pod|
         | 
| 9 | 
            +
            				pod_item = TYPodItem.new pod
         | 
| 10 | 
            +
            				pod_item.dependency_list = @podfile_lock.pods[pod]
         | 
| 11 | 
            +
            				@pods_hash[pod] = pod_item
         | 
| 12 | 
            +
            			end
         | 
| 13 | 
            +
            		end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            		def sorted_pods
         | 
| 16 | 
            +
            			trees
         | 
| 17 | 
            +
            			dep_tree
         | 
| 18 | 
            +
            			diplomatic_pods
         | 
| 19 | 
            +
            		end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            		def trees
         | 
| 22 | 
            +
            			@podfile_lock.all_pods.each do |pod_name|
         | 
| 23 | 
            +
            				pod_item = @pods_hash[pod_name]
         | 
| 24 | 
            +
            				unless pod_item.dependency
         | 
| 25 | 
            +
            					@pod_nodes_hash[pod_name] = tree_build TYPodNode.new, pod_item
         | 
| 26 | 
            +
            				end
         | 
| 27 | 
            +
            			end
         | 
| 28 | 
            +
            		end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            		def tree_build(root_node, root_item)
         | 
| 31 | 
            +
            			root_node.add_pod_item root_item
         | 
| 32 | 
            +
            			root_item.dependency = true
         | 
| 33 | 
            +
            			if root_item.dependency_list
         | 
| 34 | 
            +
            				root_item.dependency_list.each do |item|
         | 
| 35 | 
            +
            					child_item = @pods_hash[item]
         | 
| 36 | 
            +
            					if child_item
         | 
| 37 | 
            +
            						child_node = @pod_nodes_hash[child_item.name]
         | 
| 38 | 
            +
            						if child_node
         | 
| 39 | 
            +
            							unless child_node.parent
         | 
| 40 | 
            +
            								@pod_nodes_hash.delete child_node.pod_item.name
         | 
| 41 | 
            +
            								root_node.join_node child_node
         | 
| 42 | 
            +
            							end
         | 
| 43 | 
            +
            						else
         | 
| 44 | 
            +
            							child_node = TYPodNode.new
         | 
| 45 | 
            +
            							root_node.join_node tree_build(child_node, child_item)
         | 
| 46 | 
            +
            						end
         | 
| 47 | 
            +
            					end
         | 
| 48 | 
            +
            				end
         | 
| 49 | 
            +
            			end
         | 
| 50 | 
            +
            			root_node
         | 
| 51 | 
            +
            		end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            		def dep_tree
         | 
| 54 | 
            +
            			@pods_hash.keys.each do |name|
         | 
| 55 | 
            +
            				child_node = @pod_nodes_hash[name]
         | 
| 56 | 
            +
            				dep_node child_node
         | 
| 57 | 
            +
            			end
         | 
| 58 | 
            +
            		end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            		def dep_node(node)
         | 
| 61 | 
            +
            			if !node || !node.nodes || node.nodes.size == 0
         | 
| 62 | 
            +
            				return 0
         | 
| 63 | 
            +
            			end
         | 
| 64 | 
            +
            			dep = []
         | 
| 65 | 
            +
            			node.nodes.keys.each do |name|
         | 
| 66 | 
            +
            				child_node = node.nodes[name]
         | 
| 67 | 
            +
            				dep.push((dep_node child_node) + 1)
         | 
| 68 | 
            +
            			end
         | 
| 69 | 
            +
            			max_dep = dep.max
         | 
| 70 | 
            +
            			node.node_dep = max_dep
         | 
| 71 | 
            +
            			node.node_dep
         | 
| 72 | 
            +
            		end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            		def sort_nodes
         | 
| 75 | 
            +
            			@pod_nodes_hash.sort_by do |k, v|
         | 
| 76 | 
            +
            				v.node_dep
         | 
| 77 | 
            +
            			end
         | 
| 78 | 
            +
            		end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            		def diplomatic_pods
         | 
| 81 | 
            +
            			sort_nodes
         | 
| 82 | 
            +
            			pods_ = []
         | 
| 83 | 
            +
            			@pod_nodes_hash.keys.each do |key|
         | 
| 84 | 
            +
            				pods_ << (level_order_node @pod_nodes_hash[key])
         | 
| 85 | 
            +
            			end
         | 
| 86 | 
            +
            			pods_hash = Hash.new
         | 
| 87 | 
            +
            			pods_.each do |pods|
         | 
| 88 | 
            +
            				order = pods_hash[pods.size]
         | 
| 89 | 
            +
            				if order
         | 
| 90 | 
            +
            					order.pods = order.pods + pods
         | 
| 91 | 
            +
            				else
         | 
| 92 | 
            +
            					pods_hash[pods.size] = TYPodOrder.new pods.size, pods
         | 
| 93 | 
            +
            				end
         | 
| 94 | 
            +
            			end
         | 
| 95 | 
            +
            			pods_keys_sort = pods_hash.keys.sort.reverse
         | 
| 96 | 
            +
            			result = []
         | 
| 97 | 
            +
            			pods_keys_sort.each do |key|
         | 
| 98 | 
            +
            			  pods = pods_hash[key].pods
         | 
| 99 | 
            +
            				result += pods
         | 
| 100 | 
            +
            			end
         | 
| 101 | 
            +
            			result.uniq
         | 
| 102 | 
            +
            		end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
            		def level_order_node(node)
         | 
| 105 | 
            +
            			result = []
         | 
| 106 | 
            +
            			queue = []
         | 
| 107 | 
            +
            			queue.push node
         | 
| 108 | 
            +
            			while queue.size > 0 do
         | 
| 109 | 
            +
            				target_node = queue[0]
         | 
| 110 | 
            +
            				queue.delete_at 0
         | 
| 111 | 
            +
            				result.insert 0,target_node.pod_item.name
         | 
| 112 | 
            +
            				target_node.nodes.keys.each do |key_node|
         | 
| 113 | 
            +
            					queue.push target_node.nodes[key_node] if target_node.nodes[key_node]
         | 
| 114 | 
            +
            				end
         | 
| 115 | 
            +
            			end
         | 
| 116 | 
            +
            			result.uniq
         | 
| 117 | 
            +
            		end
         | 
| 118 | 
            +
            	end
         | 
| 119 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            module TYCiCore
         | 
| 2 | 
            +
            	class TYPodNode
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            		attr_accessor :node_dep, :parent, :nodes, :pod_item
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            		def initialize
         | 
| 7 | 
            +
            			@node_dep = 0
         | 
| 8 | 
            +
            			@parent = ''
         | 
| 9 | 
            +
            			@nodes = Hash.new
         | 
| 10 | 
            +
            			@pod_item = nil
         | 
| 11 | 
            +
            		end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            		def join_node(node)
         | 
| 14 | 
            +
            			node.parent = @pod_item.name
         | 
| 15 | 
            +
            			nodes[node.pod_item.name] = node
         | 
| 16 | 
            +
            		end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            		def add_pod_item(item)
         | 
| 19 | 
            +
            			@pod_item = item if item
         | 
| 20 | 
            +
            		end
         | 
| 21 | 
            +
            	end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            	class TYPodItem
         | 
| 24 | 
            +
            		attr_accessor :name, :dependency, :dependency_list
         | 
| 25 | 
            +
            		def initialize(name)
         | 
| 26 | 
            +
            			@name = name
         | 
| 27 | 
            +
            			@dependency = false
         | 
| 28 | 
            +
            			@dependency_list = nil
         | 
| 29 | 
            +
            		end
         | 
| 30 | 
            +
            	end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            	class TYPodOrder
         | 
| 33 | 
            +
            		attr_accessor :pods, :group
         | 
| 34 | 
            +
            		def initialize(order, pods)
         | 
| 35 | 
            +
            			@group = order
         | 
| 36 | 
            +
            			@pods = pods
         | 
| 37 | 
            +
            		end
         | 
| 38 | 
            +
            	end
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            module TYCiCore
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            	class TYPodFileLock
         | 
| 4 | 
            +
            		attr_accessor :all_pods, :pods
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            		def initialize(text)
         | 
| 7 | 
            +
            			 all_pods_temp = text.scan /^\s+(\w+-*\w+): [0-9a-zA-Z]*$/
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            			 @all_pods = []
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            			 all_pods_temp.each do |pod|
         | 
| 12 | 
            +
            				 @all_pods << pod[0]
         | 
| 13 | 
            +
            			 end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            			 @pods = Hash.new
         | 
| 16 | 
            +
            			 @all_pods.each do |pod|
         | 
| 17 | 
            +
            				 pod_dependencies = []
         | 
| 18 | 
            +
            				 pod_scan = text.scan /^\s{2}-\s+#{pod}\s+.*:((\n\s{4}-\s+.*)*)/
         | 
| 19 | 
            +
            				 pod_scan.each do |pod_item|
         | 
| 20 | 
            +
            					 if pod_item.size > 0
         | 
| 21 | 
            +
            						 item = pod_item[0]
         | 
| 22 | 
            +
            						 item.gsub!(/\n/, '')
         | 
| 23 | 
            +
            						 item.split('    - ').each do |item_content|
         | 
| 24 | 
            +
            							 if item_content != ""
         | 
| 25 | 
            +
            								 item_content_clean = item_content.gsub!(/\s\(.*\s.*\)/, '')
         | 
| 26 | 
            +
            								 if item_content_clean
         | 
| 27 | 
            +
            									 pod_dependencies.push item_content_clean
         | 
| 28 | 
            +
            								 else
         | 
| 29 | 
            +
            									 pod_dependencies.push item_content
         | 
| 30 | 
            +
            								 end
         | 
| 31 | 
            +
            							 end
         | 
| 32 | 
            +
            						 end
         | 
| 33 | 
            +
            					 end
         | 
| 34 | 
            +
            				 end
         | 
| 35 | 
            +
            				 @pods[pod] = pod_dependencies if pod_dependencies.size > 0
         | 
| 36 | 
            +
            			 end
         | 
| 37 | 
            +
            		end
         | 
| 38 | 
            +
            	end
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            module TYCiCore
         | 
| 2 | 
            +
            	class TYDependencies
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            		attr_accessor :path, :content
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            		def initialize(path)
         | 
| 7 | 
            +
            			@path = path
         | 
| 8 | 
            +
            			@content = ''
         | 
| 9 | 
            +
            		end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            		def sort_pods(pods)
         | 
| 12 | 
            +
            			if File.exist? @path
         | 
| 13 | 
            +
            				lock_pods = analysis
         | 
| 14 | 
            +
            				pods_hash = Hash.new
         | 
| 15 | 
            +
            				pods.each do |pod|
         | 
| 16 | 
            +
            					pods_hash[pod["name"]] = pod
         | 
| 17 | 
            +
            				end
         | 
| 18 | 
            +
            				result = []
         | 
| 19 | 
            +
            				lock_pods.each do |lock_pod|
         | 
| 20 | 
            +
            					if pods_hash.keys.include? lock_pod
         | 
| 21 | 
            +
            						result.push pods_hash[lock_pod]
         | 
| 22 | 
            +
            					end
         | 
| 23 | 
            +
            				end
         | 
| 24 | 
            +
            				result
         | 
| 25 | 
            +
            			else
         | 
| 26 | 
            +
            				puts "Can not find file: #{@path}".red
         | 
| 27 | 
            +
            				pods
         | 
| 28 | 
            +
            			end
         | 
| 29 | 
            +
            		end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            		def analysis
         | 
| 32 | 
            +
            			content = File.read @path
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            			podfile_lock = TYPodFileLock.new content
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            			analysis = TYPodAnalyse.new podfile_lock
         | 
| 37 | 
            +
            			analysis.sorted_pods
         | 
| 38 | 
            +
            		end
         | 
| 39 | 
            +
            	end
         | 
| 40 | 
            +
            end
         | 
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            module TYCiCore
         | 
| 2 | 
            +
            	class TYDownload
         | 
| 3 | 
            +
            		def self.download(url, name, path='./')
         | 
| 4 | 
            +
            			puts "Start download : #{url}"
         | 
| 5 | 
            +
            			data=open(url){|f|f.read}
         | 
| 6 | 
            +
            			puts "Saving #{path}#{name}"
         | 
| 7 | 
            +
            			open("#{path}#{name}","wb"){|f|f.write(data)}
         | 
| 8 | 
            +
            			FileUtils.pwd << "/#{name}"
         | 
| 9 | 
            +
            		end
         | 
| 10 | 
            +
            	end
         | 
| 11 | 
            +
            end
         | 
| @@ -0,0 +1,143 @@ | |
| 1 | 
            +
            module TYCiCore
         | 
| 2 | 
            +
            	class GitlabODM
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            		attr_accessor :config, :name, :path, :visibility
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            		def initialize (config, path, visibility, username, password, email)
         | 
| 7 | 
            +
            			@config = config
         | 
| 8 | 
            +
            			@path = path
         | 
| 9 | 
            +
            			@visibility = visibility
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            			@username = username
         | 
| 12 | 
            +
            			@password = password
         | 
| 13 | 
            +
            			@email = email
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            			@group_id = ""
         | 
| 16 | 
            +
            			@user_id = ""
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            			@hook_project_ios = ""
         | 
| 19 | 
            +
            			@hook_project_android = ""
         | 
| 20 | 
            +
            			@hook_project_id_ios = ""
         | 
| 21 | 
            +
            			@hook_project_id_android = ""
         | 
| 22 | 
            +
            			@hook_project_url_ios = ""
         | 
| 23 | 
            +
            			@hook_project_url_android = ""
         | 
| 24 | 
            +
            		end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            		def odm
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            			if create_group
         | 
| 29 | 
            +
            				if create_user
         | 
| 30 | 
            +
            					if add_user_group
         | 
| 31 | 
            +
            						add_project_group
         | 
| 32 | 
            +
            						get_project_id
         | 
| 33 | 
            +
            						add_project_hook @hook_project_id_ios, @config.hook_ios
         | 
| 34 | 
            +
            						add_project_hook @hook_project_id_android, @config.hook_android
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            						TYCiCore::Git.git_delete_temp_path @hook_project_ios
         | 
| 37 | 
            +
            						TYCiCore::Git.git_delete_temp_path @hook_project_android
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            						puts "odm create gitlab group json is:[start:success:end]".green
         | 
| 40 | 
            +
            					else
         | 
| 41 | 
            +
            						puts 'ODM add user to group failed'.red
         | 
| 42 | 
            +
            						puts "odm create gitlab group json is:[start:failed:end]".red
         | 
| 43 | 
            +
            					end
         | 
| 44 | 
            +
            				else
         | 
| 45 | 
            +
            					puts 'ODM create user failed'.red
         | 
| 46 | 
            +
            					puts "odm create gitlab group json is:[start:failed:end]".red
         | 
| 47 | 
            +
            					return false
         | 
| 48 | 
            +
            				end
         | 
| 49 | 
            +
            			else
         | 
| 50 | 
            +
            				puts 'ODM create group failed'.red
         | 
| 51 | 
            +
            				puts "odm create gitlab group json is:[start:failed:end]".red
         | 
| 52 | 
            +
            				return false
         | 
| 53 | 
            +
            			end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            		end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            		def create_group
         | 
| 58 | 
            +
            			puts 'ODM create group ...'.green
         | 
| 59 | 
            +
            			result = `curl #{@config.host}/api/#{@config.version}/groups -X POST -d "private_token=#{@config.private_token}&name=#{@path}&path=#{@path}&visibility=#{@visibility}"`
         | 
| 60 | 
            +
            			json = JSON result
         | 
| 61 | 
            +
            			@group_id = json["id"]
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            			result_bool = not_empty?(json["name"]) && not_empty?(json["web_url"])
         | 
| 64 | 
            +
            			puts json unless result_bool
         | 
| 65 | 
            +
            			result_bool
         | 
| 66 | 
            +
            		end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            		def create_user
         | 
| 69 | 
            +
            			puts 'ODM create user ...'.green
         | 
| 70 | 
            +
            			result = `curl #{@config.host}/api/v4/users?private_token=#{@config.private_token} -X POST -d "name=#{@username}&username=#{@username}&password=#{@password}&email=#{@email}&skip_confirmation=true"`
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            			json = JSON result
         | 
| 73 | 
            +
            			@user_id = json["id"]
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            			result_bool = not_empty?(json["state"]) && not_empty?(json["created_at"])
         | 
| 76 | 
            +
            			puts json unless result_bool
         | 
| 77 | 
            +
            			result_bool
         | 
| 78 | 
            +
            		end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            		def add_user_group
         | 
| 81 | 
            +
            			puts 'ODM add user to group ...'.green
         | 
| 82 | 
            +
            			result = `curl #{@config.host}/api/v4/groups/#{@group_id}/members?private_token=#{@config.private_token} -X POST -d "id=#{@group_id}&user_id=#{@user_id}&access_level=50"`
         | 
| 83 | 
            +
            			json = JSON result
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            			result_bool = not_empty?(json["state"]) && not_empty?(json["username"])
         | 
| 86 | 
            +
            			puts json unless result_bool
         | 
| 87 | 
            +
            			result_bool
         | 
| 88 | 
            +
            		end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            		def add_project_group
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            			@hook_project_android = "#{path}Repository"
         | 
| 93 | 
            +
            			@hook_project_ios = "#{path}Specs"
         | 
| 94 | 
            +
             | 
| 95 | 
            +
            			@hook_project_url_ios = "#{@config.host}/#{path}/#{@hook_project_ios}.git"
         | 
| 96 | 
            +
            			@hook_project_url_android = "#{@config.host}/#{path}/#{@hook_project_android}.git"
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            			TYCiCore::Git.git_create_empty_repos @hook_project_ios, @hook_project_url_ios
         | 
| 99 | 
            +
            			TYCiCore::Git.git_create_empty_repos @hook_project_android, @hook_project_url_android
         | 
| 100 | 
            +
            		end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
            		def get_project_id
         | 
| 103 | 
            +
            			puts 'ODM get project id in group'.green
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            			result = `curl #{@config.host}/api/v4/groups/#{@group_id}/projects?private_token=#{@config.private_token}&id=#{@group_id}`
         | 
| 106 | 
            +
             | 
| 107 | 
            +
            			json = JSON result
         | 
| 108 | 
            +
             | 
| 109 | 
            +
            			get_project_id_temp json, 0
         | 
| 110 | 
            +
            			get_project_id_temp json, 1
         | 
| 111 | 
            +
             | 
| 112 | 
            +
            			puts "Project iOS id is: #{@hook_project_id_ios}, android id is #{@hook_project_id_android}"
         | 
| 113 | 
            +
            		end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            		def get_project_id_temp(json, index)
         | 
| 116 | 
            +
            			temp_name = json[index]['name']
         | 
| 117 | 
            +
            			temp_id = json[index]['id']
         | 
| 118 | 
            +
            			if temp_name == @hook_project_android
         | 
| 119 | 
            +
            				@hook_project_id_android = temp_id
         | 
| 120 | 
            +
            			else
         | 
| 121 | 
            +
            				@hook_project_id_ios = temp_id
         | 
| 122 | 
            +
            			end
         | 
| 123 | 
            +
            		end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            		def add_project_hook(id, url)
         | 
| 126 | 
            +
            			puts "ODM add hook url:#{url} to project #{id}".green
         | 
| 127 | 
            +
            			result = `curl #{@config.host}/api/v4/projects/#{id}/hooks?private_token=#{@config.private_token} -X POST -d "id=#{id}&url=#{url}&push_events=true"`
         | 
| 128 | 
            +
            			json = JSON result
         | 
| 129 | 
            +
            			puts json
         | 
| 130 | 
            +
            		end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            		def not_empty?(str)
         | 
| 133 | 
            +
            			if str.nil?
         | 
| 134 | 
            +
            				return false
         | 
| 135 | 
            +
            			else
         | 
| 136 | 
            +
            				if str.empty?
         | 
| 137 | 
            +
            					return false
         | 
| 138 | 
            +
            				end
         | 
| 139 | 
            +
            				return true
         | 
| 140 | 
            +
            			end
         | 
| 141 | 
            +
            		end
         | 
| 142 | 
            +
            	end
         | 
| 143 | 
            +
            end
         |