big_keeper 0.7.0 → 0.7.1

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +79 -20
  4. data/bin/{big-keeper → bigkeeper} +0 -0
  5. data/docs/en-US/README.md +50 -0
  6. data/docs/zh-CN/BIGKEEPER_FILE.md +2 -2
  7. data/docs/zh-CN/FEATURE&HOTFIX.md +121 -0
  8. data/docs/zh-CN/PODFILE.md +43 -0
  9. data/docs/zh-CN/README.md +33 -15
  10. data/docs/zh-CN/RECOMMEND.md +22 -0
  11. data/docs/zh-CN/RELEASE.md +8 -5
  12. data/lib/big_keeper/command/feature&hotfix/delete.rb +33 -0
  13. data/lib/big_keeper/command/feature&hotfix/{feature_finish.rb → finish.rb} +13 -12
  14. data/lib/big_keeper/command/feature&hotfix/{feature_pull.rb → pull.rb} +4 -4
  15. data/lib/big_keeper/command/feature&hotfix/{feature_push.rb → push.rb} +4 -8
  16. data/lib/big_keeper/command/feature&hotfix/{feature_start.rb → start.rb} +7 -7
  17. data/lib/big_keeper/command/feature&hotfix/{feature_switch.rb → switch.rb} +6 -6
  18. data/lib/big_keeper/command/feature&hotfix/{feature_update.rb → update.rb} +7 -7
  19. data/lib/big_keeper/command/release/{release_home.rb → home.rb} +4 -4
  20. data/lib/big_keeper/command/release/module.rb +106 -0
  21. data/lib/big_keeper/model/gitflow_type.rb +13 -1
  22. data/lib/big_keeper/service/git_service.rb +84 -40
  23. data/lib/big_keeper/service/module_service.rb +52 -62
  24. data/lib/big_keeper/util/bigkeeper_parser.rb +19 -3
  25. data/lib/big_keeper/util/git_operator.rb +19 -12
  26. data/lib/big_keeper/version.rb +1 -1
  27. data/lib/big_keeper.rb +131 -25
  28. data/resources/banner.png +0 -0
  29. data/resources/keynote/big-keeper-readme-example.key +0 -0
  30. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.001.jpeg +0 -0
  31. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.002.jpeg +0 -0
  32. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.003.jpeg +0 -0
  33. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.004.jpeg +0 -0
  34. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.005.jpeg +0 -0
  35. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.006.jpeg +0 -0
  36. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.007.jpeg +0 -0
  37. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.008.jpeg +0 -0
  38. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.009.jpeg +0 -0
  39. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.010.jpeg +0 -0
  40. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.011.jpeg +0 -0
  41. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.012.jpeg +0 -0
  42. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.013.jpeg +0 -0
  43. data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.014.jpeg +0 -0
  44. data/resources/keynote/big-keeper-readme-feature.key +0 -0
  45. data/resources/keynote/big-keeper-readme-release.key +0 -0
  46. data/resources/readme/big-keeper-readme.008.png +0 -0
  47. data/resources/readme/big-keeper-readme.009.png +0 -0
  48. data/resources/readme/big-keeper-readme.010.png +0 -0
  49. data/resources/readme/big-keeper-readme.011.png +0 -0
  50. data/resources/readme/big-keeper-readme.012.png +0 -0
  51. metadata +40 -17
  52. data/docs/zh-CN/FEATURE.md +0 -88
  53. data/lib/big_keeper/command/release/release_module.rb +0 -86
  54. data/lib/big_keeper/command/release/release_module.sh +0 -44
  55. data/resources/readme/big-keeper-readme.008.jpeg +0 -0
  56. data/resources/readme/big-keeper-readme.009.jpeg +0 -0
  57. data/resources/readme/big-keeper-readme.010.jpeg +0 -0
@@ -2,23 +2,19 @@ require 'big_keeper/util/logger'
2
2
 
3
3
  module BigKeeper
4
4
 
5
- def self.feature_push(path, user, comment)
5
+ def self.push(path, user, comment, type)
6
6
  begin
7
7
  # Parse Bigkeeper file
8
8
  BigkeeperParser.parse("#{path}/Bigkeeper")
9
-
10
9
  branch_name = GitOperator.new.current_branch(path)
11
- Logger.error("Not a feature branch, exit.") unless branch_name.include? 'feature'
10
+
11
+ Logger.error("Not a #{GitflowType.name(type)} branch, exit.") unless branch_name.include? GitflowType.name(type)
12
12
 
13
13
  modules = PodfileOperator.new.modules_with_type("#{path}/Podfile",
14
14
  BigkeeperParser.module_names, ModuleType::PATH)
15
15
 
16
16
  modules.each do |module_name|
17
- module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
18
- module_branch_name = GitOperator.new.current_branch(module_full_path)
19
-
20
- Logger.highlight("Push branch '#{branch_name}' for module '#{module_name}'...")
21
- GitService.new.verify_push(path, comment, module_branch_name, module_name)
17
+ ModuleService.new.push(path, user, module_name, branch_name, type, comment)
22
18
  end
23
19
 
24
20
  Logger.highlight("Push branch '#{branch_name}' for 'Home'...")
@@ -13,16 +13,16 @@ require 'big_keeper/service/module_service'
13
13
 
14
14
 
15
15
  module BigKeeper
16
- def self.feature_start(path, version, user, name, modules)
16
+ def self.start(path, version, user, name, modules, type)
17
17
  begin
18
18
  # Parse Bigkeeper file
19
19
  BigkeeperParser.parse("#{path}/Bigkeeper")
20
20
 
21
21
  version = BigkeeperParser.version if version == 'Version in Bigkeeper file'
22
- feature_name = "#{version}_#{user}_#{name}"
23
- branch_name = "#{GitflowType.name(GitflowType::FEATURE)}/#{feature_name}"
22
+ full_name = "#{version}_#{user}_#{name}"
23
+ branch_name = "#{GitflowType.name(type)}/#{full_name}"
24
24
 
25
- GitService.new.verify_branch(path, branch_name, OperateType::START)
25
+ GitService.new.verify_home_branch(path, branch_name, OperateType::START)
26
26
 
27
27
  stash_modules = PodfileOperator.new.modules_with_type("#{path}/Podfile",
28
28
  BigkeeperParser.module_names, ModuleType::PATH)
@@ -41,18 +41,18 @@ module BigKeeper
41
41
 
42
42
  Logger.highlight("Add branch '#{branch_name}' for 'Home'...")
43
43
  # Start home feature
44
- GitService.new.start(path, feature_name, GitflowType::FEATURE)
44
+ GitService.new.start(path, full_name, type)
45
45
 
46
46
  # Modify podfile as path and Start modules feature
47
47
  modules.each do |module_name|
48
- ModuleService.new.add(path, user, module_name, feature_name, GitflowType::FEATURE)
48
+ ModuleService.new.add(path, user, module_name, full_name, type)
49
49
  end
50
50
 
51
51
  # pod install
52
52
  PodOperator.pod_install(path)
53
53
 
54
54
  # Push home changes to remote
55
- GitService.new.verify_push(path, "init #{GitflowType.name(GitflowType::FEATURE)} #{feature_name}", branch_name, 'Home')
55
+ GitService.new.verify_push(path, "init #{GitflowType.name(type)} #{full_name}", branch_name, 'Home')
56
56
 
57
57
  # Open home workspace
58
58
  `open #{path}/*.xcworkspace`
@@ -4,16 +4,16 @@ require 'big_keeper/util/logger'
4
4
  require 'big_keeper/util/pod_operator'
5
5
 
6
6
  module BigKeeper
7
- def self.feature_switch(path, version, user, name)
7
+ def self.switch_to(path, version, user, name, type)
8
8
  begin
9
9
  # Parse Bigkeeper file
10
10
  BigkeeperParser.parse("#{path}/Bigkeeper")
11
11
 
12
12
  version = BigkeeperParser.version if version == 'Version in Bigkeeper file'
13
- feature_name = "#{version}_#{user}_#{name}"
14
- branch_name = "#{GitflowType.name(GitflowType::FEATURE)}/#{feature_name}"
13
+ full_name = "#{version}_#{user}_#{name}"
14
+ branch_name = "#{GitflowType.name(type)}/#{full_name}"
15
15
 
16
- GitService.new.verify_branch(path, branch_name, OperateType::SWITCH)
16
+ GitService.new.verify_home_branch(path, branch_name, OperateType::SWITCH)
17
17
 
18
18
  stash_modules = PodfileOperator.new.modules_with_type("#{path}/Podfile",
19
19
  BigkeeperParser.module_names, ModuleType::PATH)
@@ -22,7 +22,7 @@ module BigKeeper
22
22
  StashService.new.stash_all(path, branch_name, user, stash_modules)
23
23
 
24
24
  # Switch to new feature
25
- GitOperator.new.git_checkout(path, branch_name)
25
+ GitOperator.new.checkout(path, branch_name)
26
26
  GitOperator.new.pull(path)
27
27
 
28
28
  # Apply home stash
@@ -32,7 +32,7 @@ module BigKeeper
32
32
  BigkeeperParser.module_names, ModuleType::PATH)
33
33
 
34
34
  modules.each do |module_name|
35
- ModuleService.new.switch(path, user, module_name, branch_name)
35
+ ModuleService.new.switch_to(path, user, module_name, branch_name, type)
36
36
  end
37
37
 
38
38
  # pod install
@@ -13,15 +13,15 @@ require 'big_keeper/service/module_service'
13
13
 
14
14
 
15
15
  module BigKeeper
16
- def self.feature_update(path, user, modules)
16
+ def self.update(path, user, modules, type)
17
17
  begin
18
18
  # Parse Bigkeeper file
19
19
  BigkeeperParser.parse("#{path}/Bigkeeper")
20
-
21
20
  branch_name = GitOperator.new.current_branch(path)
22
- Logger.error("Not a feature branch, exit.") unless branch_name.include? 'feature'
23
21
 
24
- feature_name = branch_name.gsub(/feature\//, '')
22
+ Logger.error("Not a #{GitflowType.name(type)} branch, exit.") unless branch_name.include? GitflowType.name(type)
23
+
24
+ full_name = branch_name.gsub(/#{GitflowType.name(type)}\//, '')
25
25
 
26
26
  current_modules = PodfileOperator.new.modules_with_type("#{path}/Podfile",
27
27
  BigkeeperParser.module_names, ModuleType::PATH)
@@ -41,15 +41,15 @@ module BigKeeper
41
41
  del_modules = current_modules - modules
42
42
 
43
43
  if add_modules.empty? and del_modules.empty?
44
- Logger.info("There is nothing changed with modules #{modules}.")
44
+ Logger.default("There is nothing changed with modules #{modules}.")
45
45
  else
46
46
  # Modify podfile as path and Start modules feature
47
47
  add_modules.each do |module_name|
48
- ModuleService.new.add(path, user, module_name, feature_name, GitflowType::FEATURE)
48
+ ModuleService.new.add(path, user, module_name, full_name, type)
49
49
  end
50
50
 
51
51
  del_modules.each do |module_name|
52
- ModuleService.new.del(path, user, module_name, feature_name, GitflowType::FEATURE)
52
+ ModuleService.new.del(path, user, module_name, full_name, type)
53
53
  end
54
54
 
55
55
  # pod install
@@ -16,12 +16,12 @@ module BigKeeper
16
16
  if GitOperator.new.has_branch(path, "release/#{version}")
17
17
  if GitOperator.new.current_branch(path) == "release/#{version}"
18
18
  GitOperator.new.commit(path, "release: V #{version}")
19
- GitOperator.new.first_push(path, "release/#{version}")
19
+ GitOperator.new.push_to_remote(path, "release/#{version}")
20
20
  GitflowOperator.new.finish_release(path, version)
21
21
  if GitOperator.new.current_branch(path) == "master"
22
22
  GitOperator.new.tag(path, version)
23
23
  else
24
- GitOperator.new.git_checkout(path, "master")
24
+ GitOperator.new.checkout(path, "master")
25
25
  GitOperator.new.tag(path, version)
26
26
  end
27
27
  else
@@ -43,10 +43,10 @@ module BigKeeper
43
43
  # step 1 checkout release
44
44
  if GitOperator.new.current_branch(project_path) != "release/#{version}"
45
45
  if GitOperator.new.has_branch(project_path, "release/#{version}")
46
- GitOperator.new.git_checkout(project_path, "release/#{version}")
46
+ GitOperator.new.checkout(project_path, "release/#{version}")
47
47
  else
48
48
  GitflowOperator.new.start(project_path, version, GitflowType::RELEASE)
49
- GitOperator.new.first_push(project_path, "release/#{version}")
49
+ GitOperator.new.push_to_remote(project_path, "release/#{version}")
50
50
  end
51
51
  end
52
52
 
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/ruby
2
+ require 'big_keeper/util/podfile_operator'
3
+ require 'big_keeper/util/gitflow_operator'
4
+ require 'big_keeper/model/podfile_type'
5
+ require 'big_keeper/util/info_plist_operator'
6
+ require 'big_keeper/util/git_operator'
7
+ require 'big_keeper/util/logger'
8
+
9
+ module BigKeeper
10
+ def self.release_module_start(path, version, user, module_name)
11
+ BigkeeperParser.parse("#{path}/Bigkeeper")
12
+
13
+ Dir.chdir(path) do
14
+ git_info = GitInfo.new(BigkeeperParser::home_git, GitType::TAG, version)
15
+ module_path = self.get_module_path_default(path, user, module_name)
16
+ start_module_release(module_path, version, module_name, git_info, user)
17
+ end
18
+ end
19
+
20
+ def self.release_module_finish(path, version, user, module_name)
21
+ BigkeeperParser.parse("#{path}/Bigkeeper")
22
+ module_path = self.get_module_path_default(path, user, module_name)
23
+
24
+ Logger.error("current branch has changed") unless GitOperator.new.has_changes(module_path)
25
+ # check out master
26
+ if GitOperator.new.current_branch(module_path) != "master"
27
+ current_name = GitOperator.new.current_branch(module_path)
28
+ GitOperator.new.checkout(module_path, "master")
29
+ Logger.highlight("Push branch '#{current_name}' for '#{module_name}'...")
30
+ GitService.new.verify_push(module_path, "finish #{GitflowType.name(GitflowType::RELEASE)} #{current_name}", "master", "#{module_name}")
31
+ end
32
+ return
33
+
34
+ Dir.chdir(module_path) do
35
+ # rebase develop to master
36
+ Logger.highlight(%Q(Rebase develop to master))
37
+
38
+ #修改 podspec 文件
39
+ # TO DO: - advanced to use Regular Expression
40
+ PodfileOperator.new.podspec_change(%Q(#{module_path}/#{module_name}.podspec), version, module_name)
41
+
42
+ GitService.new.verify_rebase(module_path, 'develop', "#{module_name}")
43
+ GitOperator.new.verify_push(module_path, "finish rebase develop to master", "master", "#{module_name}")
44
+ GitOperator.new.tag(module_path, version)
45
+
46
+ Logger.highlight(%Q(Start Pod repo push #{module_name}))
47
+ IO.popen("pod repo push #{module_name} #{module_name}.podspec --allow-warnings --sources=#{BigkeeperParser::sourcemodule_path}") do |io|
48
+ io.each do |line|
49
+ has_error = true if line.include? "ERROR"
50
+ end
51
+ end
52
+ if has_error
53
+ Logger.error("Pod repo push in '#{module_name}'")
54
+ return
55
+ end
56
+
57
+ Logger.highlight(%Q(Success release #{module_name} V#{version}))
58
+ end
59
+ end
60
+
61
+ private
62
+ def self.start_module_release(module_path, version, module_name, source, user)
63
+ if GitOperator.new.has_changes(module_path)
64
+ StashService.new.stash_all(module_path, GitOperator.new.current_branch(module_path), user, module_name.split())
65
+ end
66
+
67
+ # step 1 checkout to develop branch
68
+ Logger.highlight(%Q(Start checkout #{module_name} to Branch develop))
69
+ if GitOperator.new.current_branch(module_path) != "develop"
70
+ if GitOperator.new.has_branch(module_path, "develop")
71
+ GitOperator.new.checkout(module_path, "develop")
72
+ else
73
+ Logger.error("Cann't find develop branch, please check.")
74
+ end
75
+ end
76
+
77
+ Dir.chdir(module_path) do
78
+ # Pod lib lint
79
+ Logger.highlight(%Q(Start Pod lib lint #{module_name}))
80
+ has_error = false
81
+ IO.popen("pod lib lint --allow-warnings --verbose --use-libraries --sources=#{BigkeeperParser::sourcemodule_path}") do |io|
82
+ io.each do |line|
83
+ has_error = true if line.include? "ERROR"
84
+ end
85
+ end
86
+ if has_error
87
+ Logger.error("Pod lib error in '#{module_name}'")
88
+ return
89
+ end
90
+ end
91
+
92
+ GitOperator.new.commit(module_path, "update podspec")
93
+ GitOperator.new.first_push(module_path, GitOperator.new.current_branch(module_path))
94
+ Logger.highlight(%Q(Pod lib lint success))
95
+ end
96
+
97
+ def self.get_module_path_default(path, user, module_name)
98
+ module_path = BigkeeperParser::module_path(user, module_name)
99
+ if module_path == "../#{module_name}"
100
+ path_array = path.split('/')
101
+ path_array.pop()
102
+ module_path = path_array.join('/') + "/#{module_name}"
103
+ end
104
+ module_path
105
+ end
106
+ end
@@ -12,7 +12,19 @@ module BigKeeper
12
12
  elsif RELEASE == type
13
13
  "release"
14
14
  else
15
- name
15
+ "feature"
16
+ end
17
+ end
18
+
19
+ def self.base_branch(type)
20
+ if FEATURE == type
21
+ "develop"
22
+ elsif HOTFIX == type
23
+ "master"
24
+ elsif RELEASE == type
25
+ "develop"
26
+ else
27
+ "master"
16
28
  end
17
29
  end
18
30
  end
@@ -7,70 +7,82 @@ module BigKeeper
7
7
  # Operator for got
8
8
  class GitService
9
9
  def start(path, name, type)
10
- if GitOperator.new.has_remote_branch(path, 'master')
11
- if GitOperator.new.has_local_branch(path, 'master')
12
- if GitOperator.new.has_commits(path, 'master')
13
- Logger.error(%Q('master' has unpushed commits, you should fix it))
14
- else
15
- GitOperator.new.git_checkout(path, 'master')
16
- GitOperator.new.pull(path)
17
- end
18
- else
19
- GitOperator.new.git_checkout(path, 'master')
10
+ git = GitOperator.new
11
+
12
+ branch_name = "#{GitflowType.name(type)}/#{name}"
13
+ if !git.has_remote_branch(path, branch_name) && !git.has_local_branch(path, branch_name)
14
+
15
+ verify_special_branch(path, 'master')
16
+ verify_special_branch(path, 'develop')
17
+
18
+ GitflowOperator.new.start(path, name, type)
19
+ git.push_to_remote(path, branch_name)
20
+ else
21
+ verify_checkout(path, branch_name)
22
+
23
+ if !git.has_remote_branch(path, branch_name)
24
+ git.push_to_remote(path, branch_name)
20
25
  end
21
26
  end
27
+ end
22
28
 
23
- if GitOperator.new.has_remote_branch(path, 'develop')
24
- if GitOperator.new.has_local_branch(path, 'develop')
25
- if GitOperator.new.has_commits(path, 'develop')
26
- Logger.error(%Q('develop' has unpushed commits, you should fix it))
27
- else
28
- GitOperator.new.git_checkout(path, 'develop')
29
- GitOperator.new.pull(path)
29
+ def verify_checkout(path, branch_name)
30
+ Dir.chdir(path) do
31
+ cmd = "git checkout -b #{branch_name}"
32
+ if GitOperator.new.has_branch(path, branch_name)
33
+ cmd = "git checkout #{branch_name}"
34
+ end
35
+ IO.popen(cmd) do |io|
36
+ io.each do |line|
37
+ Logger.error("Checkout #{branch_name} failed.") if line.include? 'error'
30
38
  end
31
- else
32
- GitOperator.new.git_checkout(path, 'develop')
33
39
  end
34
40
  end
41
+ end
35
42
 
36
- if !GitflowOperator.new.verify_git_flow(path)
37
- GitOperator.new.first_push(path, 'develop') if !GitOperator.new.has_remote_branch(path, 'develop')
38
- GitOperator.new.first_push(path, 'master') if !GitOperator.new.has_remote_branch(path, 'master')
39
- end
43
+ def verify_special_branch(path, name)
44
+ git = GitOperator.new
40
45
 
41
- branch_name = "#{GitflowType.name(type)}/#{name}"
42
- if GitOperator.new.has_branch(path, branch_name)
43
- GitOperator.new.git_checkout(path, branch_name)
44
- GitOperator.new.pull(path)
46
+ if git.has_remote_branch(path, name)
47
+ if git.has_local_branch(path, name)
48
+ if git.has_commits(path, name)
49
+ Logger.error(%Q('#{name}' has unpushed commits, you should fix it manually...))
50
+ end
51
+ pull(path, name)
52
+ else
53
+ git.checkout(path, name)
54
+ end
45
55
  else
46
- GitflowOperator.new.start(path, name, type)
47
- GitOperator.new.first_push(path, branch_name)
56
+ verify_checkout(path, name)
57
+ git.push_to_remote(path, name)
48
58
  end
49
59
  end
50
60
 
51
- def verify_branch(path, branch_name, type)
61
+ def verify_home_branch(path, branch_name, type)
52
62
  Logger.highlight('Sync local branchs from remote, waiting...')
53
- GitOperator.new.git_fetch(path)
63
+ git = GitOperator.new
64
+
65
+ git.fetch(path)
54
66
 
55
67
  if OperateType::START == type
56
- if GitOperator.new.current_branch(path) == branch_name
68
+ if git.current_branch(path) == branch_name
57
69
  Logger.error(%(Current branch is '#{branch_name}' already. Use 'update' please))
58
70
  end
59
- if GitOperator.new.has_branch(path, branch_name)
71
+ if git.has_branch(path, branch_name)
60
72
  Logger.error(%(Branch '#{branch_name}' already exists. Use 'switch' please))
61
73
  end
62
74
  elsif OperateType::SWITCH == type
63
- if !GitOperator.new.has_branch(path, branch_name)
75
+ if !git.has_branch(path, branch_name)
64
76
  Logger.error(%(Can't find a branch named '#{branch_name}'. Use 'start' please))
65
77
  end
66
- if GitOperator.new.current_branch(path) == branch_name
78
+ if git.current_branch(path) == branch_name
67
79
  Logger.error(%(Current branch is '#{branch_name}' already. Use 'update' please))
68
80
  end
69
81
  elsif OperateType::UPDATE == type
70
- if !GitOperator.new.has_branch(path, branch_name)
82
+ if !git.has_branch(path, branch_name)
71
83
  Logger.error(%(Can't find a branch named '#{branch_name}'. Use 'start' please))
72
84
  end
73
- if GitOperator.new.current_branch(path) != branch_name
85
+ if git.current_branch(path) != branch_name
74
86
  Logger.error(%(Current branch is not '#{branch_name}'. Use 'switch' please))
75
87
  end
76
88
  else
@@ -90,14 +102,46 @@ module BigKeeper
90
102
  branchs
91
103
  end
92
104
 
105
+ def pull(path, branch_name)
106
+ git = GitOperator.new
107
+ if git.current_branch(path) == branch_name
108
+ git.pull(path)
109
+ else
110
+ Dir.chdir(path) do
111
+ `git pull origin #{branch_name}:#{branch_name}`
112
+ end
113
+ end
114
+ end
115
+
116
+ def verify_del(path, branch_name, name, type)
117
+ git = GitOperator.new
118
+
119
+ if git.has_local_branch(path, branch_name)
120
+ Logger.highlight("Delete local branch '#{branch_name}' for '#{name}'...")
121
+
122
+ if git.current_branch(path) == branch_name
123
+ git.dicard(path)
124
+ git.checkout(path, GitflowType.base_branch(type))
125
+ end
126
+ git.del_local(path, branch_name)
127
+ end
128
+
129
+ if git.has_remote_branch(path, branch_name)
130
+ Logger.highlight("Delete remote branch '#{branch_name}' for '#{name}'...")
131
+ git.del_remote(path, branch_name)
132
+ end
133
+ end
134
+
93
135
  def verify_push(path, comment, branch_name, name)
94
136
  git = GitOperator.new
95
137
  if git.has_changes(path)
96
138
  git.commit(path, comment)
97
139
  if git.has_remote_branch(path, branch_name)
98
- git.push(path)
140
+ Dir.chdir(path) do
141
+ `git push`
142
+ end
99
143
  else
100
- git.first_push(path, branch_name)
144
+ git.push_to_remote(path, branch_name)
101
145
  end
102
146
  else
103
147
  Logger.default("Nothing to push for '#{name}'.")
@@ -126,7 +170,7 @@ module BigKeeper
126
170
  end
127
171
  end
128
172
  `git push -f origin #{branch_name}`
129
- GitOperator.new.git_checkout(path, 'develop')
173
+ GitOperator.new.checkout(path, 'develop')
130
174
  end
131
175
  end
132
176
  end
@@ -4,91 +4,81 @@ require 'big_keeper/util/logger'
4
4
  module BigKeeper
5
5
  # Operator for got
6
6
  class ModuleService
7
- def pull(path, user, module_name, branch_name)
8
- module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
9
7
 
10
- Logger.highlight("Pull branch '#{branch_name}' for module '#{module_name}'...")
8
+ def verify_module(path, user, module_name, home_branch_name, type)
9
+ name = home_branch_name.gsub(/#{GitflowType.name(type)}\//, '')
10
+ module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
11
11
 
12
+ git = GitOperator.new
12
13
  if !File.exist? module_full_path
13
14
  Logger.default("No local repository for module '#{module_name}', clone it...")
14
15
  module_git = BigkeeperParser.module_git(module_name)
15
- GitOperator.new.clone(File.expand_path("#{module_full_path}/../"), module_git)
16
- GitOperator.new.git_checkout(module_full_path, branch_name)
17
- else
18
- current_branch_name = GitOperator.new.current_branch(module_full_path)
19
- if current_branch_name != branch_name
20
- Logger.default("Current branch of '#{module_name}' is '#{current_branch_name}',\
21
- stash it and checkout '#{branch_name}'...")
22
-
23
- StashService.new.stash(module_full_path, current_branch_name, module_name)
24
-
25
- GitOperator.new.git_checkout(module_full_path, branch_name)
26
- end
27
- GitOperator.new.pull(module_full_path)
16
+ git.new.clone(File.expand_path("#{module_full_path}/../"), module_git)
28
17
  end
29
- end
30
18
 
31
- def switch(path, user, module_name, branch_name)
32
- module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
19
+ current_branch_name = git.current_branch(module_full_path)
20
+ if current_branch_name != home_branch_name
21
+ # stash current branch
22
+ StashService.new.stash(module_full_path, current_branch_name, module_name)
33
23
 
34
- Logger.highlight("Switch to branch '#{branch_name}' for module '#{module_name}'...")
24
+ GitService.new.start(module_full_path, name, type)
35
25
 
36
- if !File.exist? module_full_path
37
- Logger.default("No local repository for module '#{module_name}', clone it...")
38
- module_git = BigkeeperParser.module_git(module_name)
39
- GitOperator.new.clone(File.expand_path("#{module_full_path}/../"), module_git)
40
- GitOperator.new.git_checkout(module_full_path, branch_name)
41
- else
42
- GitOperator.new.git_checkout(module_full_path, branch_name)
43
- GitOperator.new.pull(module_full_path)
26
+ StashService.new.pop_stash(module_full_path, home_branch_name, module_name)
44
27
  end
45
-
46
- StashService.new.pop_stash(module_full_path, branch_name, module_name)
47
28
  end
48
29
 
49
- def finish(path, user, module_name)
50
- module_git = BigkeeperParser.module_git(module_name)
30
+ def push(path, user, module_name, home_branch_name, type, comment)
31
+ Logger.highlight("Push branch '#{home_branch_name}' for module '#{module_name}'...")
32
+
33
+ verify_module(path, user, module_name, home_branch_name, type)
34
+
51
35
  module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
52
- branch_name = GitOperator.new.current_branch(module_full_path)
36
+ GitService.new.verify_push(module_full_path, comment, home_branch_name, module_name)
37
+ end
53
38
 
54
- Logger.highlight("Finish branch '#{branch_name}' for module '#{module_name}'...")
39
+ def pull(path, user, module_name, home_branch_name, type)
40
+ Logger.highlight("Pull branch '#{home_branch_name}' for module '#{module_name}'...")
55
41
 
56
- PodfileOperator.new.find_and_replace("#{path}/Podfile",
57
- module_name,
58
- ModuleType::GIT,
59
- GitInfo.new(module_git, GitType::BRANCH, branch_name))
42
+ verify_module(path, user, module_name, home_branch_name, type)
60
43
 
61
- GitService.new.verify_rebase(module_full_path, 'develop', module_name)
44
+ module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
45
+ GitOperator.new.pull(module_full_path)
46
+ end
62
47
 
63
- `open #{BigkeeperParser.module_pulls(module_name)}`
48
+ def switch_to(path, user, module_name, home_branch_name, type)
49
+ Logger.highlight("Switch to branch '#{home_branch_name}' for module '#{module_name}'...")
50
+
51
+ verify_module(path, user, module_name, home_branch_name, type)
64
52
  end
65
53
 
66
- def add(path, user, module_name, name, type)
67
- branch_name = "#{GitflowType.name(type)}/#{name}"
54
+ def finish(path, user, module_name, home_branch_name, type)
55
+ Logger.highlight("Finish branch '#{home_branch_name}' for module '#{module_name}'...")
56
+
57
+ verify_module(path, user, module_name, home_branch_name, type)
68
58
 
69
- Logger.highlight("Add branch '#{branch_name}' for module '#{module_name}'...")
59
+ module_git = BigkeeperParser.module_git(module_name)
60
+ PodfileOperator.new.find_and_replace("#{path}/Podfile",
61
+ module_name,
62
+ ModuleType::GIT,
63
+ GitInfo.new(module_git, GitType::BRANCH, home_branch_name))
70
64
 
71
65
  module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
72
66
 
73
- # clone module if not exist
74
- if !File.exist? module_full_path
75
- Logger.default("No local repository for module #{module_name}, clone it...")
76
- module_git = BigkeeperParser.module_git(module_name)
77
- GitOperator.new.clone(File.expand_path("#{module_full_path}/../"), module_git)
78
- end
67
+ GitService.new.verify_push(module_full_path, "finish branch #{home_branch_name}", home_branch_name, module_name)
68
+
69
+ GitService.new.verify_rebase(module_full_path, GitflowType.base_branch(type), module_name)
79
70
 
80
- # stash current branch
81
- current_branch_name = GitOperator.new.current_branch(module_full_path)
71
+ `open #{BigkeeperParser.module_pulls(module_name)}`
72
+ end
82
73
 
83
- StashService.new.stash(module_full_path, current_branch_name, module_name)
74
+ def add(path, user, module_name, name, type)
75
+ home_branch_name = "#{GitflowType.name(type)}/#{name}"
76
+ Logger.highlight("Add branch '#{home_branch_name}' for module '#{module_name}'...")
84
77
 
85
- # start new feature/hotfix
86
- GitService.new.start(module_full_path, name, type)
87
78
 
88
- StashService.new.pop_stash(module_full_path, branch_name, module_name)
79
+ verify_module(path, user, module_name, home_branch_name, type)
89
80
 
90
81
  module_path = BigkeeperParser.module_path(user, module_name)
91
-
92
82
  PodfileOperator.new.find_and_replace("#{path}/Podfile",
93
83
  module_name,
94
84
  ModuleType::PATH,
@@ -96,23 +86,23 @@ module BigKeeper
96
86
  end
97
87
 
98
88
  def del(path, user, module_name, name, type)
99
- branch_name = "#{GitflowType.name(type)}/#{name}"
89
+ home_branch_name = "#{GitflowType.name(type)}/#{name}"
100
90
 
101
- Logger.highlight("Delete branch '#{branch_name}' for module '#{module_name}'...")
91
+ Logger.highlight("Delete branch '#{home_branch_name}' for module '#{module_name}'...")
102
92
 
103
93
  module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
104
94
 
105
- StashService.new.stash(module_full_path, branch_name, module_name)
95
+ StashService.new.stash(module_full_path, home_branch_name, module_name)
106
96
 
107
- GitOperator.new.git_checkout(module_full_path, 'develop')
108
- GitOperator.new.del(module_full_path, branch_name)
97
+ GitOperator.new.checkout(module_full_path, GitflowType.base_branch(type))
98
+ # GitOperator.new.del(module_full_path, home_branch_name)
109
99
 
110
100
  module_git = BigkeeperParser.module_git(module_name)
111
101
 
112
102
  PodfileOperator.new.find_and_replace("#{path}/Podfile",
113
103
  module_name,
114
104
  ModuleType::GIT,
115
- GitInfo.new(module_git, GitType::BRANCH, 'develop'))
105
+ GitInfo.new(module_git, GitType::BRANCH, GitflowType.base_branch(type)))
116
106
  end
117
107
  end
118
108
  end