qcloudhive 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.rakeTasks +7 -0
  3. data/.idea/Hive.iml +54 -0
  4. data/.idea/dictionaries/dongzhao.xml +7 -0
  5. data/.idea/misc.xml +4 -0
  6. data/.idea/modules.xml +8 -0
  7. data/.idea/vcs.xml +6 -0
  8. data/.idea/workspace.xml +699 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/Documents/Images/93A5AC58-17D5-4D3F-B5A8-E509CF429BD0.png +0 -0
  11. data/Documents/Images/C702C824-11B1-47A8-BB15-9F6F14F2B649.png +0 -0
  12. data/Gem/qcloudhive/.idea/misc.xml +4 -0
  13. data/Gem/qcloudhive/.idea/modules.xml +8 -0
  14. data/Gem/qcloudhive/.idea/qcloudhive.iml +8 -0
  15. data/Gem/qcloudhive/.idea/workspace.xml +383 -0
  16. data/Gemfile +4 -0
  17. data/Gemfile.lock +122 -0
  18. data/LICENSE.txt +21 -0
  19. data/README.md +273 -0
  20. data/Rakefile +5 -0
  21. data/bin/console +14 -0
  22. data/bin/setup +8 -0
  23. data/exe/Hive +302 -0
  24. data/lib/qcloudhive.rb +16 -0
  25. data/lib/qcloudhive/config.rb +176 -0
  26. data/lib/qcloudhive/feature.rb +92 -0
  27. data/lib/qcloudhive/framework.rb +192 -0
  28. data/lib/qcloudhive/git_helper.rb +75 -0
  29. data/lib/qcloudhive/gitlab.rb +69 -0
  30. data/lib/qcloudhive/manifest.rb +346 -0
  31. data/lib/qcloudhive/module.rb +228 -0
  32. data/lib/qcloudhive/pod_helper.rb +119 -0
  33. data/lib/qcloudhive/product.rb +32 -0
  34. data/lib/qcloudhive/project.rb +108 -0
  35. data/lib/qcloudhive/repo.rb +177 -0
  36. data/lib/qcloudhive/spec_helper.rb +45 -0
  37. data/lib/qcloudhive/utils.rb +46 -0
  38. data/lib/qcloudhive/version.rb +3 -0
  39. data/lib/qcloudhive/xcodeproj.rb +163 -0
  40. data/qcloudhive.gemspec +43 -0
  41. data/resources/shellscriptes/HiveApp.sh +156 -0
  42. data/resources/shellscriptes/HiveFramework +158 -0
  43. data/resources/shellscriptes/build_framework.sh +76 -0
  44. data/resources/templates/AppDefaultTemplate/.gitignore +41 -0
  45. data/resources/templates/AppDefaultTemplate/AppDefaultTemplate.xcodeproj/project.pbxproj +290 -0
  46. data/resources/templates/AppDefaultTemplate/AppDefaultTemplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  47. data/resources/templates/AppDefaultTemplate/AppDefaultTemplate/Info.plist +24 -0
  48. data/resources/templates/AppDefaultTemplate/Podfile +9 -0
  49. data/resources/templates/HiveAppTemplate/.gitignore +41 -0
  50. data/resources/templates/HiveAppTemplate/HiveAppTemplate.xcodeproj/project.pbxproj +539 -0
  51. data/resources/templates/HiveAppTemplate/HiveAppTemplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  52. data/resources/templates/HiveAppTemplate/HiveAppTemplate/AppDelegate.h +17 -0
  53. data/resources/templates/HiveAppTemplate/HiveAppTemplate/AppDelegate.m +51 -0
  54. data/resources/templates/HiveAppTemplate/HiveAppTemplate/Assets.xcassets/AppIcon.appiconset/Contents.json +68 -0
  55. data/resources/templates/HiveAppTemplate/HiveAppTemplate/Base.lproj/LaunchScreen.storyboard +27 -0
  56. data/resources/templates/HiveAppTemplate/HiveAppTemplate/Base.lproj/Main.storyboard +26 -0
  57. data/resources/templates/HiveAppTemplate/HiveAppTemplate/Info.plist +45 -0
  58. data/resources/templates/HiveAppTemplate/HiveAppTemplate/ViewController.h +15 -0
  59. data/resources/templates/HiveAppTemplate/HiveAppTemplate/ViewController.m +29 -0
  60. data/resources/templates/HiveAppTemplate/HiveAppTemplate/main.m +16 -0
  61. data/resources/templates/HiveAppTemplate/HiveAppTemplateTests/HiveAppTemplateTests.m +39 -0
  62. data/resources/templates/HiveAppTemplate/HiveAppTemplateTests/Info.plist +22 -0
  63. data/resources/templates/HiveAppTemplate/HiveAppTemplateUITests/HiveAppTemplateUITests.m +40 -0
  64. data/resources/templates/HiveAppTemplate/HiveAppTemplateUITests/Info.plist +22 -0
  65. data/resources/templates/HiveAppTemplate/Podfile +20 -0
  66. data/resources/templates/commonConf.sh +9 -0
  67. data/resources/templates/manifests/build.rb +8 -0
  68. data/resources/templates/manifests/default.xml +12 -0
  69. data/resources/templates/template.podspec +37 -0
  70. metadata +321 -0
@@ -0,0 +1,228 @@
1
+ require 'xcodeproj'
2
+ require 'uri'
3
+ require 'cocoapods'
4
+ require 'git'
5
+ require 'rake'
6
+ require 'optparse'
7
+ require 'pathname'
8
+ require_relative 'project.rb'
9
+ require_relative "manifest.rb"
10
+ require 'fileutils'
11
+ require_relative 'utils.rb'
12
+ require_relative 'gitlab.rb'
13
+ require_relative 'pod_helper.rb'
14
+
15
+ module QCloudHive
16
+ module HiveModule
17
+ def HiveModule.add(cmd, opts)
18
+ name = GetOptValue(cmd, opts, :c_name)
19
+ rootPath = Config.projectRootDirectory
20
+ pwd = Dir.pwd
21
+ projectPath = opts[:i_path]
22
+ if projectPath == nil
23
+ if pwd.start_with? rootPath
24
+ projectPath = pwd[rootPath.length..-1]
25
+ L.warn "您没有给定具体的目录 将使用当前目录#{projectPath}"
26
+ else
27
+ Error "您没有给定具体的目录,并且当前不在Hive工程中!!!!"
28
+ end
29
+ end
30
+ addModuleByName(name, projectPath)
31
+ end
32
+
33
+ def HiveModule.addModuleByName(name, projectPath)
34
+ L.debug "#{Config.manifest}"
35
+ if Config.manifest.existModule?(name)
36
+ L.warn "#{name} 已经在项目中,请不要重复添加"
37
+ end
38
+ if CodeOA.exist?(name)
39
+ gitProject = CodeOA.existProjectByName?(name)
40
+ if CodeOA.empty?(gitProject)
41
+ addModuleByCreate(name, projectPath)
42
+ return
43
+ end
44
+ Config.manifest.addModule(gitProject.http_url_to_repo, projectPath)
45
+ Config.manifest.flushStorage
46
+ L.debug "模块已经在git.code.oa.com上存在"
47
+ puts "已经添加模块#{name}"
48
+ podspec = HivePod.search(name)
49
+ if podspec == nil
50
+ L.warn"#{name} 已经存在于git.code.oa.com上,但是没有发布到cocoapods私有仓库,无法解析其依赖关系,将不进行依赖添加"
51
+ else
52
+ dependencies = podspec.specification.dependencies
53
+ L.debug "#{name}依赖以下库 #{dependencies}"
54
+ dependencies.each { |dependency|
55
+ addModuleByName(dependency.name, projectPath)
56
+ }
57
+ end
58
+ else
59
+ L.warn "#{name} 不再git.code.oa.com上面"
60
+ addModuleByCreate(name, projectPath)
61
+ end
62
+ end
63
+ def HiveModule.addModuleByCreate(name, projectPath)
64
+ gitProject = createModuleByName(name, projectPath)
65
+ Config.manifest.addModule(gitProject.http_url_to_repo, projectPath)
66
+ Config.manifest.flushStorage
67
+ end
68
+
69
+ def HiveModule.createLocalModule(name, path)
70
+ aimPodspecPath = "#{path}/#{name}.podspec"
71
+ podspecTempPath = Config.templatesPath+"template.podspec"
72
+ if Pathname(aimPodspecPath).exist?
73
+ L.info "#{aimPodspecPath} exsit"
74
+ return
75
+ end
76
+ tempFile= File.new(podspecTempPath, "r")
77
+ if not Pathname(path).exist?
78
+ FileUtils.mkdir_p(path)
79
+ end
80
+
81
+ if tempFile
82
+ content = tempFile.read
83
+ content = content.gsub(/<POD_NAME>/,"#{name}")
84
+ File.open(aimPodspecPath, "w") { |f|
85
+ f.write content
86
+ }
87
+ classPath = "#{path}/Pod/Classes"
88
+ FileUtils.mkdir_p(classPath)
89
+ File.open(classPath+"/replace.m", "w") { |f|
90
+ f.write "//replace me !!!"
91
+ }
92
+ File.open("#{path}/README.md", "w") { |f|
93
+ f.write "README"
94
+ }
95
+ g = Git.init(path)
96
+ g.add(:all=>true)
97
+ g.commit_all("mudule init")
98
+ else
99
+ Error "模版文件不存在 #{podspecTempPath}"
100
+ end
101
+ end
102
+
103
+
104
+ def HiveModule.createModuleByName(name, projectPath)
105
+ if File.exist?(name)
106
+ L.warn "#{name} 已经存在于当前目录下,生成新模块将会覆盖他"
107
+ end
108
+ g = Git.init(name)
109
+ oaProject = CodeOA.createProject(name)
110
+ originRemote = nil
111
+ g.remotes.each { |r|
112
+ if r.name == "origin"
113
+ originRemote = r
114
+ end
115
+ }
116
+ if originRemote != nil
117
+ if originRemote.url == oaProject.http_url_to_repo
118
+ L.warn "当前Git仓库已经有 remote origin 为 #{oaProject.http_url_to_repo}"
119
+ else
120
+ Error "当前仓库已经有remote 但是不是#{oaProject.http_url_to_repo}"
121
+ end
122
+ else
123
+ g.add_remote("origin",oaProject.http_url_to_repo)
124
+ end
125
+ createLocalModule(name, name)
126
+ g.push
127
+ return oaProject
128
+ end
129
+
130
+ def HiveModule.release(cmd, opts)
131
+ rootPath = Dir.pwd
132
+ path = Pathname(rootPath)
133
+ podspec = nil
134
+ path.entries.each { |entry|
135
+ if (entry.extname == '.podspec' )
136
+ podspec = entry
137
+ end
138
+ }
139
+ if podspec == nil
140
+ puts "当前目录下没有Podspec文件,请在有Podspec文件的目录下进行该操作"
141
+ exit(1)
142
+ end
143
+ spec = Pod::Specification.from_file(podspec)
144
+ version = spec.version.version
145
+ git = Git.open(rootPath)
146
+
147
+ versionExsit = false
148
+
149
+ git.tags.each { |t|
150
+ if t.name == version
151
+ versionExsit = true
152
+ break
153
+ end
154
+ }
155
+
156
+ if versionExsit
157
+ git.delete_tag(version)
158
+ git.push("origin", ":refs/tags/"+version)
159
+ end
160
+ git.add_tag(version)
161
+ git.push("origin",version)
162
+ specStorage = "oa-qcloud-terminal-qcloudpodspecs "
163
+ Rake::sh " pod repo push #{specStorage} #{podspec} --allow-warnings"
164
+ Rake::sh "cd ~/.cocoapods/repos/#{specStorage} \n"+
165
+ '''
166
+ git add .
167
+ ''' +
168
+ "git commit -m #{podspec}" +
169
+ '''
170
+ git pull
171
+ git push
172
+ '''
173
+ end
174
+
175
+
176
+ def HiveModule.tryRmGit?(gitPath)
177
+ git = Git.open(gitPath)
178
+ L.info "git is #{git}"
179
+ if git == nil
180
+ puts "您给的目录不是一个Git目录#{path}"
181
+ exit(1)
182
+ end
183
+ remoteUrl = nil
184
+ git.remotes.each { |r|
185
+ if r.name == "origin"
186
+ remoteUrl = r.url
187
+ end
188
+ }
189
+ if remoteUrl == nil
190
+ puts "您输入的Git目录没有设置远端地址#{path},您可能没没有提交的修改,暂不执行删除操作"
191
+ exit(1)
192
+ end
193
+ if git.status.changed.count > 0
194
+ puts "您输入的Git目录存在未提交的修改,暂不执行删除操作"
195
+ exit(1)
196
+ end
197
+ if git.status.deleted.count > 0
198
+ puts "您输入的Git目录存在未提交的修改,暂不执行删除操作"
199
+ exit(1)
200
+ end
201
+ if git.status.added.count > 0
202
+ puts "您输入的Git目录存在未提交的修改,暂不执行删除操作"
203
+ exit(1)
204
+ end
205
+ if git.status.untracked.count > 0
206
+ puts "您输入的Git目录存在未提交的修改,暂不执行删除操作"
207
+ exit(1)
208
+ end
209
+ return true
210
+ end
211
+ def HiveModule.dislink(cmd, opts)
212
+ name = GetOptValue(cmd, opts, :i_name)
213
+ manifestProjcet = Config.manifest.moduleByName(name)
214
+ if manifestProjcet == nil
215
+ Error "您要dislink的模块#{name}不在改项目中"
216
+ end
217
+ realetivePath = manifestProjcet.path
218
+ gitPath = Pathname(Config.projectRootDirectory).join(realetivePath).to_path
219
+ if File.exist?(gitPath)
220
+ tryRmGit?(gitPath)
221
+ end
222
+ Config.manifest.deleteModuleByName(name)
223
+ Config.manifest.flushStorage
224
+ FileUtils.rm_rf(gitPath)
225
+ end
226
+
227
+ end
228
+ end
@@ -0,0 +1,119 @@
1
+ require "cocoapods"
2
+ require 'pathname'
3
+ require_relative 'spec_helper.rb'
4
+ require_relative 'xcodeproj.rb'
5
+ module QCloudHive
6
+
7
+ module HivePod
8
+ class << self
9
+ @@podspecs = nil
10
+ end
11
+
12
+ def HivePod.sources()
13
+ Pod::Config::instance.sources_manager.aggregate.sources
14
+ end
15
+
16
+ def HivePod.configPostInstaller(installer)
17
+ installer.pods_project.targets.each do |target|
18
+ target.build_configurations.each do |config|
19
+ config.build_settings['ENABLE_BITCODE'] = Config.bitcodeEnable ? "YES" : "NO"
20
+ end
21
+ end
22
+ end
23
+
24
+ def HivePod.search(name)
25
+ sources.each { |source|
26
+ podspec = source.search(name)
27
+ if podspec != nil
28
+ return podspec
29
+ end
30
+ }
31
+ return nil
32
+ end
33
+
34
+ def HivePod.findPodspecs(path)
35
+ podspecs = []
36
+ path = Pathname(path)
37
+ path.entries.each { |entry|
38
+ if (entry.extname == '.podspec' || entry.to_s.end_with?('.podspec.json'))
39
+ if path.basename.to_path == "Local Podspecs"
40
+ next
41
+ end
42
+ podspecs.push(path.join(entry))
43
+ end
44
+ }
45
+ if podspecs.count != 0
46
+ return podspecs
47
+ else
48
+ path.entries.each { |entry|
49
+ next if entry.to_path == "."
50
+ next if entry.to_path == ".."
51
+ next if entry.to_path == ".git"
52
+ next if entry.to_path == ".repo"
53
+ if File.directory?(path.join(entry))
54
+ subpath = path.join(entry)
55
+ ps = findPodspecs(subpath)
56
+ podspecs = podspecs + ps
57
+ end
58
+ }
59
+ end
60
+ return podspecs
61
+ end
62
+ def HivePod.podspecs
63
+ if @@podspecs.nil?
64
+ podspecs = findPodspecs(Config.projectRootDirectory)
65
+ if not podspecs.nil?
66
+ @@podspecs = podspecs.map { |specPath|
67
+ name = nil
68
+ basenamestr = specPath.basename.to_s
69
+ extenname = specPath.extname
70
+ if extenname == ".json"
71
+ extenname = ".podspec.json"
72
+ end
73
+ if extenname.length>0 && basenamestr.end_with?(extenname)
74
+ name = basenamestr[0,basenamestr.length - extenname.length]
75
+ end
76
+ HiveSpec.new(name, specPath)
77
+ }
78
+ end
79
+ end
80
+ return @@podspecs
81
+ end
82
+
83
+ def HivePod.installDependencies(target, podfilePath)
84
+ Config.setup()
85
+ Config.loadShareConfig
86
+ L.info("target is nil #{target}")
87
+ if target.nil? or target == "nil"
88
+ return
89
+ end
90
+ Config.setup
91
+ xcodeProject = QCloudHive.xcodeprojectByPath(Pathname.new(podfilePath).parent.to_s)
92
+ if xcodeProject.nil?
93
+ ERROR "该Podfile文件没有对应的Xcode工程 #{podfilePath}"
94
+ end
95
+ if xcodeProject.hiveSpecModules.nil?
96
+ puts "nil!!!"
97
+ end
98
+ xcodeProject.hiveSpecModules.each { |spec|
99
+ # local spec
100
+ if not spec.path.nil?
101
+ relativePath = Pathname.new(spec.path).dirname.relative_path_from(Pathname.new(podfilePath).parent)
102
+ target.store_pod(spec.name,:path=>relativePath.to_s)
103
+ elsif Config.buildFromCommit && (not spec.commit.nil?)
104
+ target.store_pod(spec.name,:git=>spec.sourceURL, :commit=>spec.commit)
105
+ else
106
+ target.store_pod(spec.name,:git=>spec.sourceURL, :branch=>spec.branch)
107
+ end
108
+ }
109
+ xcodeProject.saveHiveModulesConfig
110
+ L.info("Config #{Config}")
111
+ L.info("Config use frameworks #{Config.useFrameworks}")
112
+ if Config.useFrameworks
113
+ target.use_frameworks!
114
+ L.info("Target use frameworks")
115
+ end
116
+ L.info "save projects"
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,32 @@
1
+ require_relative "utils.rb"
2
+ require_relative "config.rb"
3
+
4
+ module QCloudHive
5
+ def QCloudHive.CreateAPP(cmd, opts)
6
+ name = opts[:c_name]
7
+ if name == nil
8
+ puts "ERROR! no name, please input one"
9
+ puts cmd.help
10
+ exit(1)
11
+ end
12
+ Rake::sh "#{Config.scriptesDirectory}HiveApp.sh #{name}"
13
+ Rake::sh "cd #{name} \n" +
14
+ "pod install \n" +
15
+ "open #{name}.xcworkspace"
16
+
17
+
18
+ url = opts[:c_url]
19
+ if url == nil
20
+ puts "您没有设置URL,将不会进行Git 远端仓库配置"
21
+ else
22
+ Rake::sh "cd #{name} \n" +
23
+ '''
24
+ git init
25
+ git add .
26
+ git commit -m "init"
27
+ ''' + "git remote add origin #{url} \n " +
28
+ " git push -u origin master \n"
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,108 @@
1
+ require 'rake'
2
+ require 'optparse'
3
+ require 'pathname'
4
+ require "rake"
5
+ require 'git'
6
+ require_relative "manifest.rb"
7
+ require_relative 'gitlab.rb'
8
+
9
+ module QCloudHive
10
+ module Project
11
+ def Project.init(cmd , opts)
12
+ L.debug "#{opts}"
13
+ name = GetOptValue(cmd, opts, "name")
14
+ project = CodeOA.createProject(name)
15
+ if CodeOA.empty?(project) == true
16
+ puts "工程#{name}已经在CodeOA上存在,但是没有任何提交记录,还是个空工程,将对其进行初始化"
17
+ Project.initLocalProject(project)
18
+ else
19
+ if File.exist?(name)
20
+ Error "ERROR! the project local dirctory exist, can not cover it. please check"
21
+ end
22
+ workingPath = Pathname.new(name).to_path+"/"
23
+ if Dir.mkdir(workingPath) !=0
24
+ Error "创建目录#{name}失败"
25
+ end
26
+ Project.repoInit(workingPath, project.http_url_to_repo)
27
+ end
28
+ end
29
+ def Project.repoInit(workingPath, url)
30
+
31
+ Rake::sh "cd #{workingPath} && repo init -u #{url} \n repo sync"
32
+ manifestPath = workingPath + ".repo/manifests/default.xml"
33
+ L.debug "#{manifestPath}"
34
+ if File.exist?(manifestPath) == false
35
+ Error "初始化失败,没有manifest配置文件"
36
+ end
37
+ manifest = Manifest.new(manifestPath)
38
+ Rake::sh "cd #{workingPath} && repo start #{manifest.default.revision} --all"
39
+ end
40
+ def Project.initLocalProject(project)
41
+ name = project.name
42
+ if File.exist?(name)
43
+ Error "ERROR! the project local dirctory exist, can not cover it. please check"
44
+ end
45
+ workingPath = Pathname.new(name).to_path+"/"
46
+ if Dir.mkdir(workingPath) !=0
47
+ Error "创建目录#{name}失败"
48
+ end
49
+ L.debug "#{project}"
50
+ git = Git.init(workingPath)
51
+ git.add_remote("origin",project.http_url_to_repo)
52
+ DZCopyFile(Config.templateManifestPath+".", workingPath, true)
53
+ git.add(:all=>true)
54
+ git.commit_all("project init")
55
+ git.push
56
+ Rake::sh("rm -rf #{workingPath}")
57
+ if Dir.mkdir(workingPath) !=0
58
+ Error "创建目录#{name}失败"
59
+ end
60
+ Project.repoInit(workingPath, project.http_url_to_repo)
61
+ end
62
+ end
63
+
64
+
65
+
66
+ def QCloudHive.addCMD(origin , cmd)
67
+ return origin + "\n" + cmd + "\n"
68
+ end
69
+
70
+
71
+ def InitEmptyProject(cmd, opts)
72
+ name = opts[:i_name]
73
+ url = opts[:i_url]
74
+ if name == nil
75
+ puts "ERROR! no project name, please input one"
76
+ puts cmd.help
77
+ exit(1)
78
+ end
79
+ if url == nil
80
+ puts "ERROR! no git url"
81
+ puts cmd.help
82
+ exit(1)
83
+ end
84
+ if File.exist?(name)
85
+ puts "ERROR! the project exist, can not cover it. please check"
86
+ exit(1)
87
+ end
88
+
89
+ emptyProjectPath = CURRENT_PATH+name+"/"
90
+ templatePath = CDM_RES_PATH + "manifests/"
91
+ DZCopyFile(templatePath, emptyProjectPath, true)
92
+ Rake::sh "cd #{emptyProjectPath} \n" +'''
93
+ git init .
94
+ git add .
95
+ git commit -m "init project"
96
+ ''' + "git remote add origin #{url} \n " +
97
+ " git push -u origin master \n" +
98
+ "cd .. \n" +
99
+ "rm -rf #{name}\n" +
100
+ "mkdir #{name}\n" +
101
+ "cd #{name}\n" +
102
+ '''
103
+ echo "产品初始化完成,将使用下述命令从您常用的源码目录,checkout该项目:"
104
+ ''' + "repo init -u #{url}"
105
+
106
+ end
107
+
108
+ end