Class: Mbeditor::GitLineDiffService
- Inherits:
-
Object
- Object
- Mbeditor::GitLineDiffService
- Includes:
- GitService
- Defined in:
- app/services/mbeditor/git_line_diff_service.rb
Overview
Per-line git status for one file, for colouring the editor's line numbers.
Wraps git diff -U0 (working tree vs HEAD) and turns its hunk headers into
line ranges in the current file:
{
"added" => [{ "start" => 12, "end" => 14 }, ...],
"modified" => [{ "start" => 30, "end" => 30 }, ...],
"deleted" => [{ "start" => 47, "end" => 47 }, ...],
"tracked" => true
}
A deletion has no lines left to mark, so it is reported as the single line the removed content sat after — line 0 when the file's opening lines were the ones deleted, which the frontend renders above the first line.
An untracked file has no HEAD side at all, so every line counts as added.
Constant Summary collapse
- HUNK_HEADER =
@@ -<old_start>[,<old_count>] +<new_start>[,<new_count>] @@
/\A@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/
Constants included from GitService
Mbeditor::GitService::SAFE_GIT_REF
Instance Attribute Summary collapse
-
#file_path ⇒ Object
readonly
Returns the value of attribute file_path.
-
#repo_path ⇒ Object
readonly
Returns the value of attribute repo_path.
Instance Method Summary collapse
- #call ⇒ Object
-
#initialize(repo_path:, file_path:) ⇒ GitLineDiffService
constructor
A new instance of GitLineDiffService.
Methods included from GitService
ahead_behind, current_branch, find_branch_base, parse_git_log, parse_git_log_with_parents, parse_name_status, parse_numstat, parse_porcelain_status, resolve_path, run_git, upstream_branch
Constructor Details
#initialize(repo_path:, file_path:) ⇒ GitLineDiffService
Returns a new instance of GitLineDiffService.
29 30 31 32 |
# File 'app/services/mbeditor/git_line_diff_service.rb', line 29 def initialize(repo_path:, file_path:) @repo_path = repo_path.to_s @file_path = file_path.to_s end |
Instance Attribute Details
#file_path ⇒ Object (readonly)
Returns the value of attribute file_path.
27 28 29 |
# File 'app/services/mbeditor/git_line_diff_service.rb', line 27 def file_path @file_path end |
#repo_path ⇒ Object (readonly)
Returns the value of attribute repo_path.
27 28 29 |
# File 'app/services/mbeditor/git_line_diff_service.rb', line 27 def repo_path @repo_path end |
Instance Method Details
#call ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'app/services/mbeditor/git_line_diff_service.rb', line 34 def call return untracked_result if untracked? output, status = GitService.run_git( repo_path, "diff", "--no-color", "--no-ext-diff", "-U0", "HEAD", "--", file_path ) # A non-zero status here means the diff could not be produced at all (no # HEAD yet, path outside the repo). Report a clean file rather than # raising: line colouring is decoration, never a reason to fail a load. return empty_result unless status.success? parse(output) end |