class MGit::Checkout
@!scope [command] checkout follow git checkout eg: mgit checkout master
Public Class Methods
description()
click to toggle source
# File lib/m-git/command/checkout.rb, line 96 def self.description "切换分支或恢复工作区改动。" end
usage()
click to toggle source
# File lib/m-git/command/checkout.rb, line 100 def self.usage "mgit checkout [<git-checkout-option>] [(--mrepo|--el-mrepo) <repo>...] [--help]" end
Public Instance Methods
checkout_config_repo(cmd, opts, repo)
click to toggle source
# File lib/m-git/command/checkout.rb, line 60 def checkout_config_repo(cmd, opts, repo) return if repo.nil? if repo.status_checker.status == Repo::Status::GIT_REPO_STATUS[:dirty] remind_config_repo_fail("主仓库\"#{repo.name}\"有改动,无法执行!") else Output.puts_processing_message("开始checkout主仓库...") success, output = repo.execute_git_cmd(cmd, opts) if !success remind_config_repo_fail("主仓库\"#{repo.name}\"执行\"#{cmd}\"失败:\n#{output}") else Output.puts_success_message("主仓库checkout成功!\n") end # 刷新配置表 Workspace.update_config { |missing_repos| if missing_repos.length > 0 all_repos.concat(missing_repos) # missing_repos包含新下载的和当前分支已有的新仓库,其中已有仓库包含在@all_repos内,需要去重 all_repos.uniq! { |repo| repo.name } end } end end
enable_repo_selection()
click to toggle source
# File lib/m-git/command/checkout.rb, line 92 def enable_repo_selection true end
execute(argv)
click to toggle source
# File lib/m-git/command/checkout.rb, line 11 def execute(argv) Output.puts_start_cmd # 优先checkout配置仓库 config_repo = generate_config_repo checkout_config_repo(argv.cmd, argv.git_opts, config_repo) do_repos = [] dirty_repos = [] Output.puts_processing_message("检查各仓库状态...") Workspace.serial_enumerate_with_progress(all_repos) { |repo| if !config_repo.nil? && repo.name == config_repo.name next elsif repo.status_checker.status != Repo::Status::GIT_REPO_STATUS[:dirty] do_repos.push(repo) else dirty_repos.push(repo) end } Output.puts_success_message("检查完成!\n") if dirty_repos.length > 0 remind_repos = [] remind_repos.push(['有本地改动', dirty_repos.map { |e| e.name }]) if dirty_repos.length > 0 Output.interact_with_multi_selection_combined_repos(remind_repos, "以上仓库状态异常", ['a: 跳过并继续', 'b: 强制执行', 'c: 终止']) { |input| if input == 'b' do_repos += dirty_repos do_repos.uniq! { |repo| repo.name } elsif input == 'c' || input != 'a' Output.puts_cancel_message return end } end if do_repos.length == 0 if config_repo.nil? Output.puts_nothing_to_do_cmd else Output.puts_succeed_cmd(argv.absolute_cmd) end else Output.puts_processing_message("开始checkout子仓库...") _, error_repos = Workspace.execute_git_cmd_with_repos(argv.cmd, argv.git_opts, do_repos) Output.puts_succeed_cmd(argv.absolute_cmd) if error_repos.length == 0 end end
remind_config_repo_fail(msg)
click to toggle source
# File lib/m-git/command/checkout.rb, line 85 def remind_config_repo_fail(msg) Output.puts_fail_message(msg) return if Output.continue_with_user_remind?("是否继续操作其余仓库?") Output.puts_cancel_message exit end