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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +79 -20
- data/bin/{big-keeper → bigkeeper} +0 -0
- data/docs/en-US/README.md +50 -0
- data/docs/zh-CN/BIGKEEPER_FILE.md +2 -2
- data/docs/zh-CN/FEATURE&HOTFIX.md +121 -0
- data/docs/zh-CN/PODFILE.md +43 -0
- data/docs/zh-CN/README.md +33 -15
- data/docs/zh-CN/RECOMMEND.md +22 -0
- data/docs/zh-CN/RELEASE.md +8 -5
- data/lib/big_keeper/command/feature&hotfix/delete.rb +33 -0
- data/lib/big_keeper/command/feature&hotfix/{feature_finish.rb → finish.rb} +13 -12
- data/lib/big_keeper/command/feature&hotfix/{feature_pull.rb → pull.rb} +4 -4
- data/lib/big_keeper/command/feature&hotfix/{feature_push.rb → push.rb} +4 -8
- data/lib/big_keeper/command/feature&hotfix/{feature_start.rb → start.rb} +7 -7
- data/lib/big_keeper/command/feature&hotfix/{feature_switch.rb → switch.rb} +6 -6
- data/lib/big_keeper/command/feature&hotfix/{feature_update.rb → update.rb} +7 -7
- data/lib/big_keeper/command/release/{release_home.rb → home.rb} +4 -4
- data/lib/big_keeper/command/release/module.rb +106 -0
- data/lib/big_keeper/model/gitflow_type.rb +13 -1
- data/lib/big_keeper/service/git_service.rb +84 -40
- data/lib/big_keeper/service/module_service.rb +52 -62
- data/lib/big_keeper/util/bigkeeper_parser.rb +19 -3
- data/lib/big_keeper/util/git_operator.rb +19 -12
- data/lib/big_keeper/version.rb +1 -1
- data/lib/big_keeper.rb +131 -25
- data/resources/banner.png +0 -0
- data/resources/keynote/big-keeper-readme-example.key +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.001.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.002.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.003.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.004.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.005.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.006.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.007.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.008.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.009.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.010.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.011.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.012.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.013.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature/big-keeper-readme-feature.014.jpeg +0 -0
- data/resources/keynote/big-keeper-readme-feature.key +0 -0
- data/resources/keynote/big-keeper-readme-release.key +0 -0
- data/resources/readme/big-keeper-readme.008.png +0 -0
- data/resources/readme/big-keeper-readme.009.png +0 -0
- data/resources/readme/big-keeper-readme.010.png +0 -0
- data/resources/readme/big-keeper-readme.011.png +0 -0
- data/resources/readme/big-keeper-readme.012.png +0 -0
- metadata +40 -17
- data/docs/zh-CN/FEATURE.md +0 -88
- data/lib/big_keeper/command/release/release_module.rb +0 -86
- data/lib/big_keeper/command/release/release_module.sh +0 -44
- data/resources/readme/big-keeper-readme.008.jpeg +0 -0
- data/resources/readme/big-keeper-readme.009.jpeg +0 -0
- 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. | 
| 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 | 
            -
             | 
| 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 | 
            -
                     | 
| 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. | 
| 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 | 
            -
                   | 
| 23 | 
            -
                  branch_name = "#{GitflowType.name( | 
| 22 | 
            +
                  full_name = "#{version}_#{user}_#{name}"
         | 
| 23 | 
            +
                  branch_name = "#{GitflowType.name(type)}/#{full_name}"
         | 
| 24 24 |  | 
| 25 | 
            -
                  GitService.new. | 
| 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,  | 
| 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,  | 
| 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( | 
| 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. | 
| 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 | 
            -
                   | 
| 14 | 
            -
                  branch_name = "#{GitflowType.name( | 
| 13 | 
            +
                  full_name = "#{version}_#{user}_#{name}"
         | 
| 14 | 
            +
                  branch_name = "#{GitflowType.name(type)}/#{full_name}"
         | 
| 15 15 |  | 
| 16 | 
            -
                  GitService.new. | 
| 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. | 
| 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. | 
| 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. | 
| 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 | 
            -
                   | 
| 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. | 
| 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,  | 
| 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,  | 
| 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. | 
| 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. | 
| 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. | 
| 46 | 
            +
                      GitOperator.new.checkout(project_path, "release/#{version}")
         | 
| 47 47 | 
             
                    else
         | 
| 48 48 | 
             
                      GitflowOperator.new.start(project_path, version, GitflowType::RELEASE)
         | 
| 49 | 
            -
                      GitOperator.new. | 
| 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 | 
            -
                     | 
| 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 | 
            -
                   | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
                     | 
| 19 | 
            -
             | 
| 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 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                       | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 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 | 
            -
             | 
| 37 | 
            -
             | 
| 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 | 
            -
                   | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 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 | 
            -
                     | 
| 47 | 
            -
                     | 
| 56 | 
            +
                    verify_checkout(path, name)
         | 
| 57 | 
            +
                    git.push_to_remote(path, name)
         | 
| 48 58 | 
             
                  end
         | 
| 49 59 | 
             
                end
         | 
| 50 60 |  | 
| 51 | 
            -
                def  | 
| 61 | 
            +
                def verify_home_branch(path, branch_name, type)
         | 
| 52 62 | 
             
                  Logger.highlight('Sync local branchs from remote, waiting...')
         | 
| 53 | 
            -
                  GitOperator.new | 
| 63 | 
            +
                  git = GitOperator.new
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  git.fetch(path)
         | 
| 54 66 |  | 
| 55 67 | 
             
                  if OperateType::START == type
         | 
| 56 | 
            -
                    if  | 
| 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  | 
| 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 ! | 
| 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  | 
| 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 ! | 
| 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  | 
| 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 | 
            -
                       | 
| 140 | 
            +
                      Dir.chdir(path) do
         | 
| 141 | 
            +
                        `git push`
         | 
| 142 | 
            +
                      end
         | 
| 99 143 | 
             
                    else
         | 
| 100 | 
            -
                      git. | 
| 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. | 
| 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 | 
            -
             | 
| 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 | 
            -
                     | 
| 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 | 
            -
             | 
| 32 | 
            -
                   | 
| 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 | 
            -
             | 
| 24 | 
            +
                    GitService.new.start(module_full_path, name, type)
         | 
| 35 25 |  | 
| 36 | 
            -
             | 
| 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  | 
| 50 | 
            -
                   | 
| 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 | 
            -
                   | 
| 36 | 
            +
                  GitService.new.verify_push(module_full_path, comment, home_branch_name, module_name)
         | 
| 37 | 
            +
                end
         | 
| 53 38 |  | 
| 54 | 
            -
             | 
| 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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 44 | 
            +
                  module_full_path = BigkeeperParser.module_full_path(path, user, module_name)
         | 
| 45 | 
            +
                  GitOperator.new.pull(module_full_path)
         | 
| 46 | 
            +
                end
         | 
| 62 47 |  | 
| 63 | 
            -
             | 
| 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  | 
| 67 | 
            -
                   | 
| 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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 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 | 
            -
                  # | 
| 81 | 
            -
             | 
| 71 | 
            +
                  `open #{BigkeeperParser.module_pulls(module_name)}`
         | 
| 72 | 
            +
                end
         | 
| 82 73 |  | 
| 83 | 
            -
             | 
| 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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 89 | 
            +
                  home_branch_name = "#{GitflowType.name(type)}/#{name}"
         | 
| 100 90 |  | 
| 101 | 
            -
                  Logger.highlight("Delete branch '#{ | 
| 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,  | 
| 95 | 
            +
                  StashService.new.stash(module_full_path, home_branch_name, module_name)
         | 
| 106 96 |  | 
| 107 | 
            -
                  GitOperator.new. | 
| 108 | 
            -
                  GitOperator.new.del(module_full_path,  | 
| 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,  | 
| 105 | 
            +
                                                       GitInfo.new(module_git, GitType::BRANCH, GitflowType.base_branch(type)))
         | 
| 116 106 | 
             
                end
         | 
| 117 107 | 
             
              end
         | 
| 118 108 | 
             
            end
         |