Class: FlashFlow::Merge::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/flash_flow/merge/base.rb

Direct Known Subclasses

Acceptance, Master, Release

Defined Under Namespace

Classes: NothingToMergeError, OutOfSyncWithRemote, UnmergeableBranch, VersionError

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ Base

Returns a new instance of Base.


20
21
22
23
24
25
# File 'lib/flash_flow/merge/base.rb', line 20

def initialize(opts={})
  @local_git = Git.new(Config.configuration.git, logger)
  @git = ShadowGit.new(Config.configuration.git, logger)
  @lock = Lock::Base.new(Config.configuration.lock)
  @notifier = Notifier::Base.new(Config.configuration.notifier)
end

Instance Method Details

#check_git_versionObject


50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/flash_flow/merge/base.rb', line 50

def check_git_version
  git_version = @local_git.version
  return if git_version.nil?

  running_version = git_version.split(".").map(&:to_i)
  expected_version = FlashFlow::GIT_VERSION.split(".").map(&:to_i)

  if running_version[0] < expected_version[0] ||
    (running_version[0] == expected_version[0] && running_version[1] < expected_version[1]) # Ignore the point release number
    puts "Warning: Your version of git (#{git_version}) is behind the version that is tested (#{FlashFlow::GIT_VERSION}). We recommend to upgrade to at least #{expected_version[0]}.#{expected_version[1]}.0"
  end
end

#check_repoObject


31
32
33
34
35
# File 'lib/flash_flow/merge/base.rb', line 31

def check_repo
  if @local_git.staged_and_working_dir_files.any?
    raise RuntimeError.new('You have changes in your working directory. Please stash and try again')
  end
end

#check_versionObject


37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/flash_flow/merge/base.rb', line 37

def check_version
  data_version = @data.version
  return if data_version.nil?

  written_version = data_version.split(".").map(&:to_i)
  running_version = FlashFlow::VERSION.split(".").map(&:to_i)

  unless written_version[0] < running_version[0] ||
      (written_version[0] == running_version[0] && written_version[1] <= running_version[1]) # Ignore the point release number
    raise RuntimeError.new("Your version of flash flow (#{FlashFlow::VERSION}) is behind the version that was last used (#{data_version}) by a member of your team. Please upgrade to at least #{written_version[0]}.#{written_version[1]}.0 and try again.")
  end
end

#git_merge(branch) ⇒ Object


74
75
76
77
78
79
80
81
# File 'lib/flash_flow/merge/base.rb', line 74

def git_merge(branch)
  merger = BranchMerger.new(@git, branch)
  forget_rerere = is_working_branch(branch) && @rerere_forget

  merger.do_merge(forget_rerere)

  merger
end

#is_working_branch(branch) ⇒ Object


83
84
85
# File 'lib/flash_flow/merge/base.rb', line 83

def is_working_branch(branch)
  branch.ref == @git.working_branch
end

#loggerObject


27
28
29
# File 'lib/flash_flow/merge/base.rb', line 27

def logger
  @logger ||= FlashFlow::Config.configuration.logger
end

#merge_branches(branches) ⇒ Object


63
64
65
66
67
68
69
70
71
72
# File 'lib/flash_flow/merge/base.rb', line 63

def merge_branches(branches)
  ordered_branches = MergeOrder.new(@git, branches).get_order
  ordered_branches.each_with_index do |branch, index|
    branch.merge_order = index + 1

    merger = git_merge(branch)

    yield(branch, merger)
  end
end

#pending_releaseObject


87
88
89
# File 'lib/flash_flow/merge/base.rb', line 87

def pending_release
  @data.pending_release
end

#ready_to_merge_releaseObject


91
92
93
# File 'lib/flash_flow/merge/base.rb', line 91

def ready_to_merge_release
  @data.ready_to_merge_release
end

#release_ahead_of_master?Boolean

Returns:

  • (Boolean)

95
96
97
# File 'lib/flash_flow/merge/base.rb', line 95

def release_ahead_of_master?
  @git.ahead_of_master?("#{@git.remote}/#{@git.release_branch}")
end

#write_data(commit_msg) ⇒ Object


99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/flash_flow/merge/base.rb', line 99

def write_data(commit_msg)
  @git.in_temp_merge_branch do
    @git.run("reset --hard #{@git.remote}/#{@git.merge_branch}")
  end
  @git.in_merge_branch do
    @git.run("reset --hard #{@git.remote}/#{@git.merge_branch}")
  end

  @data.save!

  @git.copy_temp_to_branch(@git.merge_branch, commit_msg)
  @git.delete_temp_merge_branch
  @git.push(@git.merge_branch, false)
end