Module: GitCrecord::Git

Defined in:
lib/git_crecord/git.rb

Class Method Summary collapse

Class Method Details

._stage(diff, reverse = false) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/git_crecord/git.rb', line 20

def self._stage(diff, reverse = false)
  cmd = "git apply --cached --unidiff-zero #{reverse ? '-R' : ''} - "
  content, status = Open3.capture2e(cmd, stdin_data: diff)
  LOGGER.info(cmd)
  LOGGER.info(diff)
  LOGGER.info(diff.lines.size)
  LOGGER.info('stdout/stderr:')
  LOGGER.info(content)
  LOGGER.info("return code: #{status}")
  status
end

.add_file(filename) ⇒ Object



39
40
41
# File 'lib/git_crecord/git.rb', line 39

def self.add_file(filename)
  system("git add -N #{filename}")
end

.add_files(files) ⇒ Object



32
33
34
35
36
37
# File 'lib/git_crecord/git.rb', line 32

def self.add_files(files)
  files.each do |file|
    success = add_file(file.filename_a)
    raise "could not add file #{file.filename_a}" unless success
  end
end

.commitObject



58
59
60
# File 'lib/git_crecord/git.rb', line 58

def self.commit
  exec('git commit')
end

.diff(staged: false) ⇒ Object



62
63
64
# File 'lib/git_crecord/git.rb', line 62

def self.diff(staged: false)
  `git diff --no-ext-diff --no-color #{staged ? '--staged' : ''}`
end

.reset_file(filename) ⇒ Object



50
51
52
# File 'lib/git_crecord/git.rb', line 50

def self.reset_file(filename)
  system("git reset -q #{filename}")
end

.reset_files(files) ⇒ Object



43
44
45
46
47
48
# File 'lib/git_crecord/git.rb', line 43

def self.reset_files(files)
  files.each do |file|
    success = reset_file(file.filename_a)
    raise "could not reset file #{file.filename_a}" unless success
  end
end

.stage(files, reverse = false) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/git_crecord/git.rb', line 8

def self.stage(files, reverse = false)
  selected_files = files.select(&:selected)
  untracked_files = selected_files.select { |file| file.type == :untracked }
  add_files(untracked_files) unless reverse
  diff = selected_files.map(&:generate_diff).join("\n")
  status = _stage(diff, reverse).success?
  return status unless reverse

  reset_files(untracked_files.select { |file| file.selected == true })
  true
end

.statusObject



54
55
56
# File 'lib/git_crecord/git.rb', line 54

def self.status
  `git status --porcelain`
end

.tabObject



70
71
72
# File 'lib/git_crecord/git.rb', line 70

def self.tab
  @tab ||= ' ' * [2, `git config crecord.tabwidth`.to_i].max
end

.toplevel_dirObject



66
67
68
# File 'lib/git_crecord/git.rb', line 66

def self.toplevel_dir
  `git rev-parse --show-toplevel`.chomp
end