Class: RakeCommit::Git

Inherits:
Object
  • Object
show all
Defined in:
lib/rake_commit/git.rb

Instance Method Summary collapse

Constructor Details

#initialize(collapse_commits = true, incremental = false, prompt_exclusions = [], precommit = nil) ⇒ Git

Returns a new instance of Git.



6
7
8
9
10
11
# File 'lib/rake_commit/git.rb', line 6

def initialize(collapse_commits = true, incremental = false, prompt_exclusions = [], precommit = nil)
  @collapse_commits = collapse_commits
  @incremental = incremental
  @prompt_exclusions = prompt_exclusions
  @precommit = precommit
end

Instance Method Details

#addObject



61
62
63
# File 'lib/rake_commit/git.rb', line 61

def add
  RakeCommit::Shell.system "git add -A ."
end

#collapse_git_commitsObject



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rake_commit/git.rb', line 45

def collapse_git_commits
  RakeCommit::Shell.system(@precommit) unless @precommit.nil?
  add
  temp_commit
  reset_soft
  status
  return if nothing_to_commit?
  incremental_commit
  pull_rebase rescue return false
  return true
end

#collapse_git_commits?Boolean

Returns:



33
34
35
36
37
38
39
# File 'lib/rake_commit/git.rb', line 33

def collapse_git_commits?
  return false unless @collapse_commits
  return true unless merge_commits?
  status
  input = Readline.readline("Do you want to collapse merge commits? (y/n): ").chomp
  input == "y"
end

#commitObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/rake_commit/git.rb', line 13

def commit
  if @incremental
    incremental_commit
  elsif rebase_in_progress?
    rebase_continue
    RakeCommit::Shell.system("rake")
    push
  else
    if collapse_git_commits?
      return unless collapse_git_commits
    end
    RakeCommit::Shell.system("rake")
    push
  end
end

#git_branchObject



97
98
99
100
101
102
# File 'lib/rake_commit/git.rb', line 97

def git_branch
  @git_branch ||= begin
    output = RakeCommit::Shell.backtick("git symbolic-ref HEAD")
    output.gsub('refs/heads/', '').strip
  end
end

#incremental_commitObject



65
66
67
68
69
70
71
72
# File 'lib/rake_commit/git.rb', line 65

def incremental_commit
  commit_message = RakeCommit::CommitMessage.new(@prompt_exclusions)
  unless commit_message.author.nil?
    RakeCommit::Shell.system("git config user.name #{Shellwords.shellescape(commit_message.author)}")
  end
  message = [commit_message.feature, commit_message.message].compact.join(" - ")
  RakeCommit::Shell.system("git commit -m #{Shellwords.shellescape(message)}")
end

#merge_baseObject



108
109
110
# File 'lib/rake_commit/git.rb', line 108

def merge_base
  @merge_base ||= RakeCommit::Shell.backtick("git merge-base #{git_branch} origin/#{git_branch}").strip
end

#merge_commits?Boolean

Returns:



104
105
106
# File 'lib/rake_commit/git.rb', line 104

def merge_commits?
  RakeCommit::Shell.backtick("git log #{merge_base}..HEAD") != RakeCommit::Shell.backtick("git log --no-merges #{merge_base}..HEAD")
end

#nothing_to_commit?Boolean

Returns:



92
93
94
95
# File 'lib/rake_commit/git.rb', line 92

def nothing_to_commit?
  status = RakeCommit::Shell.backtick("git status", false)
  status.empty? || status =~ /nothing to commit/m
end

#pull_rebaseObject



79
80
81
# File 'lib/rake_commit/git.rb', line 79

def pull_rebase
  RakeCommit::Shell.system "git pull --rebase --stat"
end

#pushObject



83
84
85
# File 'lib/rake_commit/git.rb', line 83

def push
  RakeCommit::Shell.system "git push origin #{git_branch}"
end

#rebase_continueObject



41
42
43
# File 'lib/rake_commit/git.rb', line 41

def rebase_continue
  RakeCommit::Shell.system("git rebase --continue")
end

#rebase_in_progress?Boolean

Returns:



29
30
31
# File 'lib/rake_commit/git.rb', line 29

def rebase_in_progress?
  File.directory?(".git/rebase-merge") || File.directory?(".git/rebase-apply")
end

#reset_softObject



74
75
76
77
# File 'lib/rake_commit/git.rb', line 74

def reset_soft
  raise "Could not determine branch" unless git_branch
  RakeCommit::Shell.system "git reset --soft #{merge_base}"
end

#statusObject



57
58
59
# File 'lib/rake_commit/git.rb', line 57

def status
  RakeCommit::Shell.system("git status", false)
end

#temp_commitObject



87
88
89
90
# File 'lib/rake_commit/git.rb', line 87

def temp_commit
  return if nothing_to_commit?
  RakeCommit::Shell.system "git commit -m 'rake_commit backup commit'"
end