git list refactor
This commit is contained in:
@@ -302,12 +302,62 @@ class GitService:
|
||||
except (ValueError, Exception):
|
||||
has_commits = False
|
||||
|
||||
current_branch = repo.active_branch.name
|
||||
tracking_branch = None
|
||||
has_upstream = False
|
||||
ahead_count = 0
|
||||
behind_count = 0
|
||||
|
||||
try:
|
||||
tracking_branch = repo.active_branch.tracking_branch()
|
||||
has_upstream = tracking_branch is not None
|
||||
except Exception:
|
||||
tracking_branch = None
|
||||
has_upstream = False
|
||||
|
||||
if has_upstream and tracking_branch is not None:
|
||||
try:
|
||||
# Commits present locally but not in upstream.
|
||||
ahead_count = sum(
|
||||
1 for _ in repo.iter_commits(f"{tracking_branch.name}..{current_branch}")
|
||||
)
|
||||
# Commits present in upstream but not local.
|
||||
behind_count = sum(
|
||||
1 for _ in repo.iter_commits(f"{current_branch}..{tracking_branch.name}")
|
||||
)
|
||||
except Exception:
|
||||
ahead_count = 0
|
||||
behind_count = 0
|
||||
|
||||
is_dirty = repo.is_dirty(untracked_files=True)
|
||||
untracked_files = repo.untracked_files
|
||||
modified_files = [item.a_path for item in repo.index.diff(None)]
|
||||
staged_files = [item.a_path for item in repo.index.diff("HEAD")] if has_commits else []
|
||||
is_diverged = ahead_count > 0 and behind_count > 0
|
||||
|
||||
if is_diverged:
|
||||
sync_state = "DIVERGED"
|
||||
elif behind_count > 0:
|
||||
sync_state = "BEHIND_REMOTE"
|
||||
elif ahead_count > 0:
|
||||
sync_state = "AHEAD_REMOTE"
|
||||
elif is_dirty or modified_files or staged_files or untracked_files:
|
||||
sync_state = "CHANGES"
|
||||
else:
|
||||
sync_state = "SYNCED"
|
||||
|
||||
return {
|
||||
"is_dirty": repo.is_dirty(untracked_files=True),
|
||||
"untracked_files": repo.untracked_files,
|
||||
"modified_files": [item.a_path for item in repo.index.diff(None)],
|
||||
"staged_files": [item.a_path for item in repo.index.diff("HEAD")] if has_commits else [],
|
||||
"current_branch": repo.active_branch.name
|
||||
"is_dirty": is_dirty,
|
||||
"untracked_files": untracked_files,
|
||||
"modified_files": modified_files,
|
||||
"staged_files": staged_files,
|
||||
"current_branch": current_branch,
|
||||
"upstream_branch": tracking_branch.name if tracking_branch is not None else None,
|
||||
"has_upstream": has_upstream,
|
||||
"ahead_count": ahead_count,
|
||||
"behind_count": behind_count,
|
||||
"is_diverged": is_diverged,
|
||||
"sync_state": sync_state,
|
||||
}
|
||||
# [/DEF:get_status:Function]
|
||||
|
||||
@@ -411,4 +461,4 @@ class GitService:
|
||||
# [/DEF:test_connection:Function]
|
||||
|
||||
# [/DEF:GitService:Class]
|
||||
# [/DEF:backend.src.services.git_service:Module]
|
||||
# [/DEF:backend.src.services.git_service:Module]
|
||||
|
||||
Reference in New Issue
Block a user