Class: Lolcommits::InstallationGit

Inherits:
Object
  • Object
show all
Defined in:
lib/lolcommits/backends/installation_git.rb

Overview

Methods to handle enabling and disabling of lolcommits

Constant Summary collapse

HOOK_PATH =
File.join ".git", "hooks", "post-commit"
HOOK_DIR =
File.join ".git", "hooks"

Class Method Summary collapse

Class Method Details

.do_disableObject

IF –DISABLE, DO DISABLE



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/lolcommits/backends/installation_git.rb', line 46

def self.do_disable
  if lolcommits_hook_exists?
    remove_existing_hook!
    info "uninstalled lolcommits hook (from #{HOOK_PATH})"
  elsif File.exist?(HOOK_PATH)
    info "couldn't find an lolcommits hook (at #{HOOK_PATH})"
    if File.read(HOOK_PATH) =~ /lolcommit/
      info "warning: an older-style lolcommit hook may still exist, edit #{HOOK_PATH} to remove it manually"
    end
  else
    info "no post commit hook found (at #{HOOK_PATH}), so there is nothing to uninstall"
  end
end

.do_enable(capture_args = "") ⇒ Object

IF –ENABLE, DO ENABLE



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/lolcommits/backends/installation_git.rb', line 12

def self.do_enable(capture_args = "")
  # its possible a hooks dir doesnt exist, so create it if so
  Dir.mkdir(HOOK_DIR) unless File.directory?(HOOK_DIR)

  # should add a shebang (or not) adding will rewrite hook file
  add_shebang = false
  if hook_file_exists?
    # clear away any existing lolcommits hook
    remove_existing_hook! if lolcommits_hook_exists?

    # if file is empty we should add a shebang (and rewrite hook)
    if File.read(HOOK_PATH).strip.empty?
      add_shebang = true
    elsif !good_shebang?
      # look for good shebang in existing hook, abort if none found
      warn "the existing hook (at #{HOOK_PATH}) doesn't start with a good shebang; like #!/bin/sh"
      exit 1
    end
  else
    add_shebang = true
  end

  File.open(HOOK_PATH, add_shebang ? "w" : "a") do |f|
    f.write("#!/bin/sh\n") if add_shebang
    f.write(hook_script(capture_args))
  end

  FileUtils.chmod 0o755, HOOK_PATH
  HOOK_PATH
end

.good_shebang?Boolean

does the git hook file have a good shebang?



90
91
92
# File 'lib/lolcommits/backends/installation_git.rb', line 90

def self.good_shebang?
  File.read(HOOK_PATH).lines.first =~ %r{^\#!.*/bin/.*sh}
end

.hook_file_exists?Boolean

does a git hook exist at all?



79
80
81
# File 'lib/lolcommits/backends/installation_git.rb', line 79

def self.hook_file_exists?
  File.exist?(HOOK_PATH)
end

.hook_script(capture_args = "") ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/lolcommits/backends/installation_git.rb', line 60

def self.hook_script(capture_args = "")
  ruby_path     = Lolcommits::Platform.command_which("ruby", only_path: true)
  imagick_path  = Lolcommits::Platform.command_which("identify", only_path: true)
  capture_cmd   = "if [ ! -d \"$GIT_DIR/rebase-merge\" ] && [ \"$LOLCOMMITS_CAPTURE_DISABLED\" != \"true\" ]; then lolcommits --capture #{capture_args}; fi"
  exports       = "GIT_DIR=${GIT_DIR-`git rev-parse --git-dir`} && LANG=\"#{ENV.fetch('LANG', nil)}\" && PATH=\"$PATH:#{ruby_path}:#{imagick_path}\""

  if Lolcommits::Platform.platform_windows?
    exports = "set path=\"%PATH%;#{ruby_path};#{imagick_path}\""
  end

  <<-HOOK

### lolcommits hook (begin) ###
#{exports} && #{capture_cmd}
###  lolcommits hook (end)  ###
  HOOK
end

.lolcommits_hook_exists?Boolean

does a git hook exist with lolcommits commands?



84
85
86
87
# File 'lib/lolcommits/backends/installation_git.rb', line 84

def self.lolcommits_hook_exists?
  hook_file_exists? &&
    File.read(HOOK_PATH).to_s =~ /lolcommits.*\(begin\)(.*\n)*.*lolcommits.*\(end\)/
end

.remove_existing_hook!Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/lolcommits/backends/installation_git.rb', line 94

def self.remove_existing_hook!
  hook = File.read(HOOK_PATH)
  out  = File.open(HOOK_PATH, "w")
  skip = false

  hook.lines.each do |line|
    skip = true if !skip && (line =~ /lolcommits.*\(begin\)/)

    out << line unless skip

    skip = false if skip && (line =~ /lolcommits.*\(end\)/)
  end

  out.close
end