Module: Ocak::GitUtils

Defined in:
lib/ocak/git_utils.rb

Class Method Summary collapse

Class Method Details

.commit_changes(chdir:, message:, logger: nil) ⇒ Object

Stages and commits all changes in the given directory. Returns true if changes were committed, false if no changes or on failure. Logs warnings via logger on failure rather than raising.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/ocak/git_utils.rb', line 19

def self.commit_changes(chdir:, message:, logger: nil)
  stdout, _, status = Open3.capture3('git', 'status', '--porcelain', chdir: chdir)
  unless status.success?
    logger&.warn('git status --porcelain failed')
    return false
  end
  return false if stdout.strip.empty?

  _, stderr, add_status = Open3.capture3('git', 'add', '-A', chdir: chdir)
  unless add_status.success?
    logger&.warn("git add failed: #{stderr[0..200]}")
    return false
  end

  _, stderr, commit_status = Open3.capture3('git', 'commit', '-m', message, chdir: chdir)
  unless commit_status.success?
    logger&.warn("git commit failed: #{stderr[0..200]}")
    return false
  end

  true
end

.safe_branch_name?(name) ⇒ Boolean

Validates that a branch name is safe to pass to git commands. Rejects names that could be interpreted as flags (starting with -) or cause unexpected git behavior (containing ..).

Returns:

  • (Boolean)


10
11
12
13
14
# File 'lib/ocak/git_utils.rb', line 10

def self.safe_branch_name?(name)
  return false if name.nil? || name.empty?

  name.match?(%r{\A[a-zA-Z0-9_./-]+\z}) && !name.start_with?('-') && !name.include?('..')
end