shkeeper 1.0.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.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.gitignore +8 -0
  3. data/.idea/bigkeeper.iml +68 -0
  4. data/.idea/modules.xml +8 -0
  5. data/.idea/vcs.xml +6 -0
  6. data/CODE_OF_CONDUCT.md +46 -0
  7. data/CONTRIBUTING.md +70 -0
  8. data/Gemfile +10 -0
  9. data/Gemfile.lock +145 -0
  10. data/LICENSE +21 -0
  11. data/README.md +113 -0
  12. data/big_keeper.gemspec +50 -0
  13. data/bin/big +14 -0
  14. data/bin/koo +14 -0
  15. data/bin/setup +8 -0
  16. data/bin/sh +14 -0
  17. data/docs/en-US/FEATURE.md +0 -0
  18. data/docs/en-US/README.md +54 -0
  19. data/docs/zh-CN/BIGKEEPER_FILE.md +84 -0
  20. data/docs/zh-CN/FEATURE&HOTFIX.md +88 -0
  21. data/docs/zh-CN/IMAGE.md +0 -0
  22. data/docs/zh-CN/PODFILE.md +43 -0
  23. data/docs/zh-CN/README.md +113 -0
  24. data/docs/zh-CN/RECOMMEND.md +22 -0
  25. data/docs/zh-CN/RELEASE.md +60 -0
  26. data/docs/zh-CN/SPEC.md +39 -0
  27. data/lib/big_keeper/command/feature&hotfix/delete.rb +40 -0
  28. data/lib/big_keeper/command/feature&hotfix/finish.rb +57 -0
  29. data/lib/big_keeper/command/feature&hotfix/list.rb +63 -0
  30. data/lib/big_keeper/command/feature&hotfix/publish.rb +56 -0
  31. data/lib/big_keeper/command/feature&hotfix/pull.rb +26 -0
  32. data/lib/big_keeper/command/feature&hotfix/push.rb +27 -0
  33. data/lib/big_keeper/command/feature&hotfix/rebase.rb +32 -0
  34. data/lib/big_keeper/command/feature&hotfix/start.rb +94 -0
  35. data/lib/big_keeper/command/feature&hotfix/switch.rb +48 -0
  36. data/lib/big_keeper/command/feature&hotfix/update.rb +74 -0
  37. data/lib/big_keeper/command/feature&hotfix.rb +169 -0
  38. data/lib/big_keeper/command/image/image.rb +0 -0
  39. data/lib/big_keeper/command/image.rb +28 -0
  40. data/lib/big_keeper/command/pod/podfile.rb +69 -0
  41. data/lib/big_keeper/command/pod.rb +42 -0
  42. data/lib/big_keeper/command/release/home.rb +91 -0
  43. data/lib/big_keeper/command/release/module.rb +61 -0
  44. data/lib/big_keeper/command/release.rb +75 -0
  45. data/lib/big_keeper/command/spec/add.rb +9 -0
  46. data/lib/big_keeper/command/spec/analyze.rb +88 -0
  47. data/lib/big_keeper/command/spec/delete.rb +9 -0
  48. data/lib/big_keeper/command/spec/list.rb +19 -0
  49. data/lib/big_keeper/command/spec/search.rb +9 -0
  50. data/lib/big_keeper/command/spec/sync.rb +12 -0
  51. data/lib/big_keeper/command/spec.rb +78 -0
  52. data/lib/big_keeper/dependency/dep_gradle_operator.rb +56 -0
  53. data/lib/big_keeper/dependency/dep_operator.rb +32 -0
  54. data/lib/big_keeper/dependency/dep_pod_operator.rb +131 -0
  55. data/lib/big_keeper/dependency/dep_service.rb +14 -0
  56. data/lib/big_keeper/dependency/dep_type.rb +33 -0
  57. data/lib/big_keeper/model/gitflow_type.rb +43 -0
  58. data/lib/big_keeper/model/library_model.rb +116 -0
  59. data/lib/big_keeper/model/operate_type.rb +27 -0
  60. data/lib/big_keeper/model/podfile_model.rb +33 -0
  61. data/lib/big_keeper/service/git_service.rb +261 -0
  62. data/lib/big_keeper/service/module_service.rb +161 -0
  63. data/lib/big_keeper/service/stash_service.rb +58 -0
  64. data/lib/big_keeper/util/bigkeeper_parser.rb +244 -0
  65. data/lib/big_keeper/util/cache_operator.rb +149 -0
  66. data/lib/big_keeper/util/code_operator.rb +37 -0
  67. data/lib/big_keeper/util/file_operator.rb +33 -0
  68. data/lib/big_keeper/util/git_operator.rb +226 -0
  69. data/lib/big_keeper/util/gitflow_operator.rb +51 -0
  70. data/lib/big_keeper/util/gradle_operator.rb +209 -0
  71. data/lib/big_keeper/util/info_plist_operator.rb +46 -0
  72. data/lib/big_keeper/util/leancloud_logger.rb +72 -0
  73. data/lib/big_keeper/util/list_generator.rb +101 -0
  74. data/lib/big_keeper/util/logger.rb +46 -0
  75. data/lib/big_keeper/util/pod_operator.rb +71 -0
  76. data/lib/big_keeper/util/podfile_detector.rb +137 -0
  77. data/lib/big_keeper/util/podfile_module.rb +63 -0
  78. data/lib/big_keeper/util/podfile_operator.rb +117 -0
  79. data/lib/big_keeper/util/verify_operator.rb +17 -0
  80. data/lib/big_keeper/util/xcode_operator.rb +15 -0
  81. data/lib/big_keeper/version.rb +3 -0
  82. data/lib/big_keeper.rb +71 -0
  83. data/resources/banner.png +0 -0
  84. data/resources/command.png +0 -0
  85. data/resources/keynote/big-keeper-readme-analyze.key +0 -0
  86. data/resources/keynote/big-keeper-readme-example.key +0 -0
  87. data/resources/keynote/big-keeper-readme-feature.key +0 -0
  88. data/resources/keynote/big-keeper-readme-release.key +0 -0
  89. data/resources/readme/big-keeper-readme.001.png +0 -0
  90. metadata +345 -0
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/ruby
2
+ require 'big_keeper/util/podfile_operator'
3
+ require 'big_keeper/util/gitflow_operator'
4
+ require 'big_keeper/dependency/dep_type'
5
+ require 'big_keeper/util/info_plist_operator'
6
+ require 'big_keeper/util/logger'
7
+ require 'big_keeper/util/xcode_operator'
8
+
9
+ module BigKeeper
10
+ def self.release_home_start(path, version, user)
11
+ BigkeeperParser.parse("#{path}/Bigkeeper")
12
+
13
+ version = BigkeeperParser.version if version == 'Version in Bigkeeper file'
14
+ modules = BigkeeperParser.module_names
15
+
16
+ #stash
17
+ StashService.new.stash_all(path, GitOperator.new.current_branch(path), user, modules)
18
+
19
+ # delete cache
20
+ CacheOperator.new(path).clean()
21
+ # cache Podfile
22
+ CacheOperator.new(path).save('Podfile')
23
+
24
+ # check
25
+ GitOperator.new.check_diff(path, "develop", "master")
26
+
27
+ #checkout release branch
28
+ Logger.highlight(%Q(Start to checkout Branch release/#{version}))
29
+ if GitOperator.new.current_branch(path) != "release/#{version}"
30
+ if GitOperator.new.has_branch(path, "release/#{version}")
31
+ GitOperator.new.checkout(path, "release/#{version}")
32
+ else
33
+ GitflowOperator.new.start(path, version, GitflowType::RELEASE)
34
+ GitOperator.new.push_to_remote(path, "release/#{version}")
35
+ end
36
+ end
37
+
38
+ Logger.highlight(%Q(Start to release/#{version}))
39
+ # step 2 replace_modules
40
+ PodfileOperator.new.replace_all_module_release(path,
41
+ user,
42
+ modules,
43
+ ModuleOperateType::RELEASE)
44
+
45
+ # step 3 change Info.plist value
46
+ InfoPlistOperator.new.change_version_build(path, version)
47
+
48
+ GitService.new.verify_push(path, "Change version to #{version}", "release/#{version}", 'Home')
49
+ DepService.dep_operator(path, user).install(true)
50
+ XcodeOperator.open_workspace(path)
51
+ end
52
+
53
+ def self.release_home_finish(path, version)
54
+ BigkeeperParser.parse("#{path}/Bigkeeper")
55
+ version = BigkeeperParser.version if version == 'Version in Bigkeeper file'
56
+ Logger.highlight("Start finish release home for #{version}")
57
+
58
+ if GitOperator.new.has_branch(path, "release/#{version}")
59
+ if GitOperator.new.current_branch(path) != "release/#{version}"
60
+ GitOperator.new.checkout(path, "release/#{version}")
61
+ end
62
+
63
+ GitService.new.verify_push(path, "finish release branch", "release/#{version}", 'Home')
64
+
65
+ # master
66
+ GitOperator.new.checkout(path, "master")
67
+ GitOperator.new.merge(path, "release/#{version}")
68
+ GitService.new.verify_push(path, "release V#{version}", "master", 'Home')
69
+
70
+ GitOperator.new.tag(path, version)
71
+
72
+ # release branch
73
+ GitOperator.new.checkout(path, "release/#{version}")
74
+ CacheOperator.new(path).load('Podfile')
75
+ CacheOperator.new(path).clean()
76
+ GitOperator.new.commit(path, "reset #{version} Podfile")
77
+ GitService.new.verify_push(path, "reset #{version} Podfile", "release/#{version}", 'Home')
78
+
79
+ # develop
80
+ GitOperator.new.checkout(path, "develop")
81
+ GitOperator.new.merge(path, "release/#{version}")
82
+ GitService.new.verify_push(path, "merge release/#{version} to develop", "develop", 'Home')
83
+ GitOperator.new.check_diff(path, "develop", "master")
84
+
85
+ Logger.highlight("Finish release home for #{version}")
86
+ else
87
+ raise Logger.error("There is no release/#{version} branch, please use release home start first.")
88
+ end
89
+ end
90
+
91
+ end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/ruby
2
+ require 'big_keeper/util/podfile_operator'
3
+ require 'big_keeper/util/gitflow_operator'
4
+ require 'big_keeper/dependency/dep_type'
5
+ require 'big_keeper/util/info_plist_operator'
6
+ require 'big_keeper/util/git_operator'
7
+ require 'big_keeper/util/logger'
8
+ require 'big_keeper/util/pod_operator'
9
+
10
+ module BigKeeper
11
+ def self.release_module_start(path, version, user, module_name, ignore)
12
+ BigkeeperParser.parse("#{path}/Bigkeeper")
13
+ module_path = BigkeeperParser.module_full_path(path, user, module_name)
14
+
15
+ # stash
16
+ StashService.new.stash(module_path, GitOperator.new.current_branch(module_path), module_name)
17
+
18
+ #check
19
+ if ignore != true
20
+ GitOperator.new.check_merge(module_path, "feature/#{version}")
21
+ GitOperator.new.check_diff(module_path, "develop", "master")
22
+ Logger.highlight(%Q(#{module_name} release check finish))
23
+ end
24
+
25
+ # checkout to develop branch
26
+ Logger.highlight(%Q(Start checkout #{module_name} to Branch develop))
27
+ GitService.new.verify_checkout_pull(module_path, "develop")
28
+
29
+ Logger.highlight(%Q(#{module_name} release start finish))
30
+ end
31
+
32
+ ## release finish
33
+ def self.release_module_finish(path, version, user, module_name, spec)
34
+ BigkeeperParser.parse("#{path}/Bigkeeper")
35
+ module_path = BigkeeperParser.module_full_path(path, user, module_name)
36
+
37
+ # check commit
38
+ Logger.error("current branch has unpush files") if GitOperator.new.has_changes(module_path)
39
+
40
+ #修改 podspec 文件
41
+ # TO DO: - advanced to use Regular Expression
42
+ has_change = PodfileOperator.new.podspec_change(%Q(#{module_path}/#{module_name}.podspec), version, module_name)
43
+ GitService.new.verify_push(module_path, "Change version number", "develop", "#{module_name}") if has_change == true
44
+
45
+ # check out master
46
+ Logger.highlight("'#{module_name}' checkout branch to master...")
47
+ GitService.new.verify_checkout_pull(module_path, "master")
48
+
49
+ Logger.highlight(%Q(Merge develop to master))
50
+ # merge develop to master
51
+ GitOperator.new.merge(module_path, "develop")
52
+ GitOperator.new.push_to_remote(module_path, "master")
53
+
54
+ GitOperator.new.tag(module_path, version)
55
+ # pod repo push
56
+ if spec == true
57
+ PodOperator.pod_repo_push(module_path, module_name, BigkeeperParser.source_spec_path(module_name), version)
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,75 @@
1
+ require 'big_keeper/command/release/home'
2
+ require 'big_keeper/command/release/module'
3
+ require 'big_keeper/util/leancloud_logger'
4
+
5
+ module BigKeeper
6
+ def self.release_command
7
+ desc 'Gitflow release operations'
8
+ command :release do |c|
9
+
10
+ c.desc 'Release home project operations'
11
+ c.command :home do |home|
12
+ home.desc 'Start release home project'
13
+ home.command :start do |start|
14
+ start.action do |global_options, options, args|
15
+ path = File.expand_path(global_options[:path])
16
+ version = global_options[:ver]
17
+ user = global_options[:user].gsub(/[^0-9A-Za-z]/, '').downcase
18
+ LeanCloudLogger.instance.set_command("release/home/start")
19
+
20
+ help_now!('user name is required') if user and user.empty?
21
+ raise Logger.error("release version is required") if version == nil
22
+ release_home_start(path, version, user)
23
+ end
24
+ end
25
+
26
+ home.desc 'Finish release home project'
27
+ home.command :finish do |finish|
28
+ finish.action do |global_options, options, args|
29
+ path = File.expand_path(global_options[:path])
30
+ version = global_options[:ver]
31
+ LeanCloudLogger.instance.set_command("release/home/finish")
32
+
33
+ raise Logger.error("release version is required") if version == nil
34
+ release_home_finish(path, version)
35
+ end
36
+ end
37
+ end
38
+
39
+ c.desc 'release module'
40
+ c.switch [:i,:ignore]
41
+ c.command :module do |m|
42
+ m.desc 'Start release module project'
43
+ m.command :start do |start|
44
+ start.action do |global_options, options, args|
45
+ path = File.expand_path(global_options[:path])
46
+ version = global_options[:ver]
47
+ user = global_options[:user].gsub(/[^0-9A-Za-z]/, '').downcase
48
+ LeanCloudLogger.instance.set_command("release/module/start")
49
+
50
+ help_now!('module name is required') if args.length != 1
51
+ raise Logger.error("release version is required") if version == nil
52
+ module_name = args[0]
53
+ release_module_start(path, version, user, module_name, options[:ignore])
54
+ end
55
+ end
56
+
57
+ m.desc 'finish release module project'
58
+ m.switch [:s,:spec]
59
+ m.command :finish do |finish|
60
+ finish.action do |global_options, options, args|
61
+ path = File.expand_path(global_options[:path])
62
+ version = global_options[:ver]
63
+ user = global_options[:user].gsub(/[^0-9A-Za-z]/, '').downcase
64
+ LeanCloudLogger.instance.set_command("release/module/finish")
65
+
66
+ help_now!('module name is required') if args.length != 1
67
+ raise Logger.error("release version is required") if version == nil
68
+ module_name = args[0]
69
+ release_module_finish(path, version, user, module_name, options[:spec])
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,9 @@
1
+ require 'big_keeper/util/bigkeeper_parser'
2
+ require 'big_keeper/dependency/dep_type'
3
+ require 'big_keeper/util/logger'
4
+
5
+ module BigKeeper
6
+ def self.spec_add
7
+ Logger.default('Coming soon.')
8
+ end
9
+ end
@@ -0,0 +1,88 @@
1
+ require 'big_keeper/util/bigkeeper_parser'
2
+ require 'big_keeper/dependency/dep_type'
3
+ require 'big_keeper/util/logger'
4
+ require 'big_keeper/model/library_model'
5
+
6
+ module BigKeeper
7
+ def self.spec_analyze(path,is_all,find_module_names)
8
+ # Parse Bigkeeper file
9
+ BigkeeperParser.parse("#{path}/Bigkeeper")
10
+
11
+ is_default = !is_all&&find_module_names.size==0
12
+ if is_all && find_module_names.size>0
13
+ Logger.error("parameter conflict: [--all] | [module_names]")
14
+ return
15
+ end
16
+ Logger.highlight('Start spec analyze...')
17
+ Logger.default(Time.now.to_s)
18
+
19
+ # Parse Bigkeeper file
20
+ # BigkeeperParser.parse("#{path}/Bigkeeper")
21
+ # module_names = BigkeeperParser.module_names
22
+
23
+ # find modules
24
+ Logger.highlight('Get all modules...')
25
+ module_names = []
26
+ pod_path = path+"/Pods/"
27
+ dir = Dir.open(pod_path)
28
+ dir.each do |dir_name|
29
+ if !dir_name.include?(".") && dir_name != "Headers" && dir_name != "Local Podspecs" && dir_name != "Target Support Files"
30
+ module_names[module_names.size]=dir_name
31
+ end
32
+ end
33
+
34
+ for input_moudle_name in find_module_names do
35
+ if !module_names.include?(input_moudle_name)
36
+ Logger.error("["+input_moudle_name+"] not exist.")
37
+ end
38
+ end
39
+
40
+ # setup modules
41
+ module_list = []
42
+ module_keyword_map = Hash.new
43
+ file_count = 0
44
+ for module_name in module_names do
45
+ library = LibraryModel.new(module_name)
46
+ library.get_all_public_file(path)
47
+ module_list[module_list.size]=library
48
+ module_keyword_map[module_name]=library.keyword_list
49
+ if is_all || find_module_names.include?(library.name)
50
+ file_count = file_count + library.file_list.size
51
+ end
52
+ end
53
+ # analyze modules spec
54
+
55
+ Logger.highlight('Analyze modules...')
56
+ Logger.default(Time.now.to_s)
57
+ file_index = 0
58
+ for library in module_list do
59
+ if is_all || find_module_names.include?(library.name)
60
+ Logger.default('Analyzing ' + library.name)
61
+ file_index = file_index + library.file_list.size
62
+ library.spec_dependece_library(module_keyword_map.clone)#(Hash.new(module_keyword_map)).to_hash)
63
+ progress = (file_index*100.0)/file_count
64
+ progress = format("%.02f", progress).to_f
65
+ Logger.default('progress >>>> ' + String(progress) + '% [' + library.name + ' done] ')
66
+ end
67
+ end
68
+ Logger.highlight('Analyze complete.')
69
+ Logger.default(Time.now.to_s)
70
+
71
+ # log spec info
72
+ for library in module_list do
73
+ if is_all || find_module_names.include?(library.name)
74
+ Logger.highlight("\n-"+library.name+":")
75
+ for spec_library in library.spec_library do
76
+ puts " -"+spec_library
77
+ end
78
+ end
79
+ end
80
+
81
+ # save cache to file
82
+ if is_all
83
+
84
+ end
85
+
86
+ end
87
+
88
+ end
@@ -0,0 +1,9 @@
1
+ require 'big_keeper/util/bigkeeper_parser'
2
+ require 'big_keeper/dependency/dep_type'
3
+ require 'big_keeper/util/logger'
4
+
5
+ module BigKeeper
6
+ def self.spec_delete
7
+ Logger.default('Coming soon.')
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ require 'logger'
2
+ require 'json'
3
+
4
+ module BigKeeper
5
+ def self.spec_list(path, user, options)
6
+ BigkeeperParser.parse("#{path}/Bigkeeper")
7
+
8
+ module_dic = BigkeeperParser.parse_modules
9
+ module_list = Array.new
10
+ module_dic.keys.each do | key |
11
+ dic = Hash["module_name" => key,
12
+ "git" => module_dic[key][:git],
13
+ "pulls" => module_dic[key][:pulls]]
14
+ module_list << dic
15
+ end
16
+ json = JSON.pretty_generate(module_list)
17
+ puts json
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ require 'big_keeper/util/bigkeeper_parser'
2
+ require 'big_keeper/dependency/dep_type'
3
+ require 'big_keeper/util/logger'
4
+
5
+ module BigKeeper
6
+ def self.spec_search
7
+ Logger.default('Coming soon.')
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ require 'big_keeper/util/bigkeeper_parser'
2
+ require 'big_keeper/dependency/dep_type'
3
+ require 'big_keeper/util/logger'
4
+
5
+ module BigKeeper
6
+ def self.spec_sync(path, version, user, module_name)
7
+ # Parse Bigkeeper file
8
+ BigkeeperParser.parse("#{path}/Bigkeeper")
9
+
10
+ Logger.default('Coming soon.')
11
+ end
12
+ end
@@ -0,0 +1,78 @@
1
+ require 'big_keeper/command/spec/analyze'
2
+ require 'big_keeper/command/spec/list'
3
+ require 'big_keeper/command/spec/add'
4
+ require 'big_keeper/command/spec/delete'
5
+ require 'big_keeper/command/spec/search'
6
+ require 'big_keeper/command/spec/sync'
7
+ require 'big_keeper/util/leancloud_logger'
8
+
9
+ module BigKeeper
10
+
11
+ def self.spec_command
12
+ desc 'Spec operations'
13
+
14
+ command :spec do |spec|
15
+ spec.switch [:a,:all]
16
+ spec.desc 'Analyze spec dependency infomation.'
17
+ spec.command :analyze do |analyze|
18
+ analyze.action do |global_options, options, args|
19
+ LeanCloudLogger.instance.set_command("spec/analyze")
20
+
21
+ path = File.expand_path(global_options[:path])
22
+ is_all = options[:all]
23
+ module_names = args
24
+ spec_analyze(path, is_all, module_names)
25
+ end
26
+ end
27
+
28
+ spec.desc 'List all the specs.'
29
+ spec.command :list do | list |
30
+ list.action do |global_options, options, args|
31
+ LeanCloudLogger.instance.set_command("spec/list")
32
+
33
+ path = File.expand_path(global_options[:path])
34
+ version = global_options[:ver]
35
+ user = global_options[:user].gsub(/[^0-9A-Za-z]/, '').downcase
36
+
37
+ spec_list(path, user, options)
38
+ end
39
+ end
40
+
41
+ spec.desc 'Sync Module dependency from Home.'
42
+ spec.command :sync do | sync|
43
+ sync.action do |global_options, options, args|
44
+ LeanCloudLogger.instance.set_command("spec/sync")
45
+
46
+ path = File.expand_path(global_options[:path])
47
+ version = global_options[:ver]
48
+ user = global_options[:user].gsub(/[^0-9A-Za-z]/, '').downcase
49
+ module_name = args
50
+
51
+ spec_sync(path, version, user, module_name)
52
+ end
53
+ end
54
+
55
+ spec.desc 'Add a spec (Coming soon).'
56
+ spec.command :add do |add|
57
+ add.action do
58
+ spec_add()
59
+ end
60
+ end
61
+
62
+ spec.desc 'Delete a spec (Coming soon).'
63
+ spec.command :delete do |delete|
64
+ delete.action do
65
+ spec_delete()
66
+ end
67
+ end
68
+
69
+ spec.desc 'Search a spec with name (Coming soon).'
70
+ spec.command :search do |search|
71
+ search.action do
72
+ spec_search()
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,56 @@
1
+ require 'big_keeper/dependency/dep_operator'
2
+ require 'big_keeper/util/gradle_operator'
3
+
4
+ module BigKeeper
5
+ # Operator for podfile
6
+ class DepGradleOperator < DepOperator
7
+
8
+ def backup
9
+ GradleOperator.new(@path).backup
10
+ modules = ModuleCacheOperator.new(@path).all_path_modules
11
+ modules.each do |module_name|
12
+ module_full_path = BigkeeperParser.module_full_path(@path, @user, module_name)
13
+ GradleOperator.new(module_full_path).backup
14
+ end
15
+ end
16
+
17
+ def recover
18
+ GradleOperator.new(@path).recover(true, false)
19
+ end
20
+
21
+ def update_module_config(module_name, module_operate_type)
22
+ module_full_path = BigkeeperParser.module_full_path(@path, @user, module_name)
23
+
24
+ # get modules
25
+ if ModuleOperateType::ADD == module_operate_type
26
+ GradleOperator.new(module_full_path).backup
27
+
28
+ add_modules = ModuleCacheOperator.new(@path).add_path_modules
29
+ GradleOperator.new(module_full_path).update_build_config(module_name, add_modules, ModuleOperateType::ADD)
30
+ GradleOperator.new(module_full_path).update_settings_config(module_name, add_modules, ModuleOperateType::ADD, @user)
31
+
32
+ del_modules = ModuleCacheOperator.new(@path).del_path_modules
33
+ GradleOperator.new(module_full_path).update_build_config(module_name, del_modules, ModuleOperateType::DELETE)
34
+ GradleOperator.new(module_full_path).update_settings_config(module_name, del_modules, ModuleOperateType::DELETE, @user)
35
+ elsif ModuleOperateType::DELETE == module_operate_type
36
+ GradleOperator.new(module_full_path).recover(true, true)
37
+ elsif ModuleOperateType::FINISH == module_operate_type
38
+ modules = ModuleCacheOperator.new(@path).all_path_modules
39
+ GradleOperator.new(module_full_path).update_build_config(module_name, modules, ModuleOperateType::FINISH)
40
+ elsif ModuleOperateType::PUBLISH == module_operate_type
41
+ modules = ModuleCacheOperator.new(@path).all_git_modules
42
+ GradleOperator.new(module_full_path).update_build_config(module_name, modules, ModuleOperateType::PUBLISH)
43
+ GradleOperator.new(module_full_path).recover(true, false)
44
+ end
45
+
46
+ GradleOperator.new(@path).update_build_config('', [module_name], module_operate_type)
47
+ GradleOperator.new(@path).update_settings_config('', [module_name], module_operate_type, @user)
48
+ end
49
+
50
+ def install(should_update)
51
+ end
52
+
53
+ def open
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,32 @@
1
+ module BigKeeper
2
+ # Operator for podfile
3
+ class DepOperator
4
+ @path
5
+ @user
6
+
7
+ def initialize(path, user)
8
+ @path = path
9
+ @user = user
10
+ end
11
+
12
+ def backup
13
+ raise "You should override this method in subclass."
14
+ end
15
+
16
+ def recover
17
+ raise "You should override this method in subclass."
18
+ end
19
+
20
+ def update_module_config(module_name, module_operate_type)
21
+ raise "You should override this method in subclass."
22
+ end
23
+
24
+ def install(should_update)
25
+ raise "You should override this method in subclass."
26
+ end
27
+
28
+ def open
29
+ raise "You should override this method in subclass."
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,131 @@
1
+ require 'big_keeper/dependency/dep_operator'
2
+
3
+ require 'big_keeper/util/pod_operator'
4
+ require 'big_keeper/util/xcode_operator'
5
+ require 'big_keeper/util/cache_operator'
6
+ require 'big_keeper/util/file_operator'
7
+
8
+ module BigKeeper
9
+ # Operator for podfile
10
+ class DepPodOperator < DepOperator
11
+ def backup
12
+ CacheOperator.new(@path).save('Podfile')
13
+ end
14
+
15
+ def recover
16
+ cache_operator = CacheOperator.new(@path)
17
+ cache_operator.load('Podfile')
18
+ cache_operator.clean
19
+ end
20
+
21
+ def update_module_config(module_name, module_operate_type)
22
+ file = "#{@path}/Podfile"
23
+ temp_file = Tempfile.new('.Podfile.tmp')
24
+
25
+ begin
26
+ File.open(file, 'r') do |file|
27
+ file.each_line do |line|
28
+ temp_file.puts generate_module_config(line, module_name, module_operate_type)
29
+ end
30
+ end
31
+ temp_file.close
32
+ FileUtils.mv(temp_file.path, file)
33
+ ensure
34
+ temp_file.close
35
+ temp_file.unlink
36
+ end
37
+ end
38
+
39
+ def install(should_update)
40
+ PodOperator.pod_install(@path, should_update)
41
+ end
42
+
43
+ def open
44
+ XcodeOperator.open_workspace(@path)
45
+ end
46
+
47
+ def generate_module_config(line, module_name, module_operate_type)
48
+ line.sub(/(\s*)pod(\s*)('|")#{module_name}('|")([\s\S]*)/){
49
+ if ModuleOperateType::ADD == module_operate_type
50
+ module_path = BigkeeperParser.module_path(@user, module_name)
51
+ "#{$1}pod '#{module_name}', :path => '#{module_path}'"
52
+ elsif ModuleOperateType::DELETE == module_operate_type
53
+ origin_config_of_module = origin_config_of_module(module_name)
54
+ if origin_config_of_module.empty?
55
+ line
56
+ else
57
+ origin_config_of_module
58
+ end
59
+ elsif ModuleOperateType::FINISH == module_operate_type
60
+ module_git = BigkeeperParser.module_git(module_name)
61
+ #branch_name = GitOperator.new.current_branch(@path)
62
+ branch_name = ModuleCacheOperator.new(@path).branch_name
63
+ "#{$1}pod '#{module_name}', :git => '#{module_git}', :branch => '#{branch_name}'"
64
+ elsif ModuleOperateType::PUBLISH == module_operate_type
65
+ module_git = BigkeeperParser.module_git(module_name)
66
+ branch_name = GitOperator.new.current_branch(@path)
67
+ base_branch_name = GitflowType.base_branch(GitService.new.current_branch_type(@path))
68
+ "#{$1}pod '#{module_name}', :git => '#{module_git}', :branch => '#{base_branch_name}'"
69
+ elsif ModuleOperateType::RELEASE == module_operate_type
70
+ module_git = BigkeeperParser.module_git(module_name)
71
+ lastest_tag, is_spec = find_lastest_tag(module_name)
72
+ if is_spec == true
73
+ Logger.default("#{module_name} lastest tag is #{lastest_tag}, this tag has published.")
74
+ "#{$1}pod '#{module_name}', '#{lastest_tag}'"
75
+ else
76
+ Logger.default("#{module_name} lastest tag is #{lastest_tag}, this tag not publish.")
77
+ "#{$1}pod '#{module_name}', :git => '#{module_git}', :tag => '#{lastest_tag}'"
78
+ end
79
+ else
80
+ line
81
+ end
82
+ }
83
+ end
84
+
85
+ def origin_config_of_module(module_name)
86
+ origin_config = ''
87
+
88
+ File.open("#{@path}/.bigkeeper/Podfile", 'r') do |file|
89
+ file.each_line do |line|
90
+ if line =~ /(\s*)pod(\s*)('|")#{module_name}('|")([\s\S]*)/
91
+ origin_config = line
92
+ break
93
+ end
94
+ end
95
+ end
96
+
97
+ origin_config.chop
98
+ end
99
+
100
+ def find_lastest_tag(module_name)
101
+ username = FileOperator.new.current_username
102
+ tags_repos_pwd = Array.new
103
+ tags_spec_list = Array.new
104
+ tags_module_list = Array.new
105
+
106
+ IO.popen("find /Users/#{username}/.cocoapods/repos -type d -name #{module_name}") do |io|
107
+ io.each do |line|
108
+ tags_repos_pwd.push(line) if line.include? "#{module_name}"
109
+ end
110
+ end
111
+ for pwd in tags_repos_pwd do
112
+ path = pwd.chomp
113
+ IO.popen("cd '#{path}'; ls") do |io|
114
+ io.each do |line|
115
+ tags_spec_list.push(line)
116
+ end
117
+ end
118
+ end
119
+
120
+ tags_module_list = GitOperator.new.tag_list(BigkeeperParser.module_full_path(@path, @user, module_name))
121
+ last_tag = tags_module_list[tags_module_list.length - 1]
122
+ if tags_module_list.include?(last_tag) && tags_spec_list.include?(last_tag)
123
+ return [last_tag.chomp, true]
124
+ else
125
+ return [last_tag.chomp, false]
126
+ end
127
+ end
128
+
129
+ private :generate_module_config, :origin_config_of_module, :find_lastest_tag
130
+ end
131
+ end