Class: Ace::Git::Worktree::Molecules::TaskCommitter

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/git/worktree/molecules/task_committer.rb

Overview

Task committer molecule

Commits task file changes using ace-git-commit or direct git commands. Provides automatic commit message generation and handles commit operations.

Examples:

Commit task changes with automatic message

committer = TaskCommitter.new
success = committer.commit_task_changes(["task.081.md"], "in-progress")

Commit with custom message

success = committer.commit_with_message(["task.081.md"], "Custom commit message")

Constant Summary collapse

FALLBACK_TIMEOUT =

Fallback timeout for git commands Used only when config is unavailable

30

Instance Method Summary collapse

Constructor Details

#initialize(timeout: nil, use_ace_git_commit: true) ⇒ TaskCommitter

Initialize a new TaskCommitter

Parameters:

  • timeout (Integer, nil) (defaults to: nil)

    Command timeout in seconds (uses config default if nil)

  • use_ace_git_commit (Boolean) (defaults to: true)

    Whether to use ace-git-commit if available



27
28
29
30
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 27

def initialize(timeout: nil, use_ace_git_commit: true)
  @timeout = timeout || config_timeout
  @use_ace_git_commit = use_ace_git_commit
end

Instance Method Details

#ace_git_commit_available?Boolean

Check if ace-git-commit is available

Returns:

  • (Boolean)

    true if ace-git-commit command is available



186
187
188
189
190
191
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 186

def ace_git_commit_available?
  return @ace_git_commit_available if defined?(@ace_git_commit_available)

  result = execute_command("ace-git-commit", "--version", timeout: 5)
  @ace_git_commit_available = result[:success]
end

#commit_all_changes(status, task_id = nil) ⇒ Boolean

Commit all changes with automatic message

Examples:

success = committer.commit_all_changes("in-progress", "081")

Parameters:

  • status (String)

    Task status

  • task_id (String, nil) (defaults to: nil)

    Task ID

Returns:

  • (Boolean)

    true if commit was successful



97
98
99
100
101
102
103
104
105
106
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 97

def commit_all_changes(status, task_id = nil)
  # Only attempt commit if there are actually changes to commit
  unless has_uncommitted_changes?
    puts "No changes to commit" if ENV["DEBUG"]
    return true
  end

  message = generate_commit_message(status, task_id)
  commit_all_with_message(message)
end

#commit_all_with_message(message) ⇒ Boolean

Commit all changes with specific message

Examples:

success = committer.commit_all_with_message("Update all task files")

Parameters:

  • message (String)

    Commit message

Returns:

  • (Boolean)

    true if commit was successful



115
116
117
118
119
120
121
122
123
124
125
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 115

def commit_all_with_message(message)
  return false if message.nil? || message.empty?

  # Try ace-git-commit first if enabled
  if @use_ace_git_commit && ace_git_commit_available?
    return commit_all_with_ace_git_commit(message)
  end

  # Fallback to direct git commands
  commit_all_with_git(message)
end

#commit_task_changes(files, status, task_id = nil) ⇒ Boolean

Commit task changes with automatic message generation

Examples:

committer = TaskCommitter.new
success = committer.commit_task_changes(["task.081.md"], "in-progress", "081")

Parameters:

  • files (Array<String>)

    Files to commit

  • status (String)

    Task status (for message generation)

  • task_id (String, nil) (defaults to: nil)

    Task ID (for message generation)

Returns:

  • (Boolean)

    true if commit was successful



54
55
56
57
58
59
60
61
62
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 54

def commit_task_changes(files, status, task_id = nil)
  return false if files.nil? || files.empty?
  return false if status.nil? || status.empty?

  # Generate commit message
  message = generate_commit_message(status, task_id)

  commit_with_message(files, message)
end

#commit_with_message(files, message) ⇒ Boolean

Commit files with a specific message

Examples:

success = committer.commit_with_message(["task.081.md"], "Update task metadata")

Parameters:

  • files (Array<String>)

    Files to commit

  • message (String)

    Commit message

Returns:

  • (Boolean)

    true if commit was successful



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 72

def commit_with_message(files, message)
  return false if files.nil? || files.empty?
  return false if message.nil? || message.empty?

  # Filter to only existing files
  existing_files = Array(files).select { |file| File.exist?(file) }
  return false if existing_files.empty?

  # Try ace-git-commit first if enabled
  if @use_ace_git_commit && ace_git_commit_available?
    return commit_with_ace_git_commit(existing_files, message)
  end

  # Fallback to direct git commands
  commit_with_git(existing_files, message)
end

#get_file_status(files) ⇒ Hash

Get status of files

Examples:

status = committer.get_file_status(["task.081.md"])
status["task.081.md"] # => "modified"

Parameters:

  • files (Array<String>)

    Files to check

Returns:

  • (Hash)

    Status information



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 159

def get_file_status(files)
  status = {}

  Array(files).each do |file|
    next unless File.exist?(file)

    result = execute_git_command("status", "--porcelain", file)
    if result[:success]
      line = result[:output].strip
      if line.empty?
        status[file] = "unmodified"
      else
        # Parse git status output format
        status_code = line[0, 2]
        status[file] = parse_status_code(status_code)
      end
    else
      status[file] = "error"
    end
  end

  status
end

#has_uncommitted_changes?(files = nil) ⇒ Boolean

Check if there are uncommitted changes

Examples:

has_changes = committer.has_uncommitted_changes?
has_changes = committer.has_uncommitted_changes?(["task.081.md"])

Parameters:

  • files (Array<String>, nil) (defaults to: nil)

    Specific files to check (nil for all)

Returns:

  • (Boolean)

    true if there are uncommitted changes



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/ace/git/worktree/molecules/task_committer.rb', line 135

def has_uncommitted_changes?(files = nil)
  if files.nil? || files.empty?
    # Check all changes
    result = execute_git_command("status", "--porcelain")
    result[:success] && !result[:output].strip.empty?
  else
    # Check specific files
    files.any? do |file|
      next false unless File.exist?(file)

      result = execute_git_command("diff", "--quiet", file)
      !result[:success]
    end
  end
end