change function get_ahead_behind_count

This commit is contained in:
VALLONGOL 2025-04-23 10:57:20 +02:00
parent ecbd987289
commit 5d8e030923

View File

@ -1659,58 +1659,71 @@ class GitCommands:
def get_ahead_behind_count(self, working_directory: str, local_branch: str, upstream_branch: str) -> Tuple[int | None, int | None]: def get_ahead_behind_count(self, working_directory: str, local_branch: str, upstream_branch: str) -> Tuple[int | None, int | None]:
""" """
Gets the number of commits the local branch is ahead and behind its upstream counterpart. Gets the number of commits the local branch is ahead and behind its upstream counterpart
Output of rev-list is <behind_count> <ahead_count>. using two separate 'git rev-list --count' commands.
Returns tuple in the order (ahead_count, behind_count).
Args:
working_directory (str): Path to the repository.
local_branch (str): The name of the local branch (implicitly HEAD when checked out).
upstream_branch (str): The full name of the upstream branch (e.g., 'origin/main').
Returns:
Tuple[int | None, int | None]: A tuple containing (ahead_count, behind_count).
Returns (None, None) if any command fails.
""" """
func_name = "get_ahead_behind_count" func_name = "get_ahead_behind_count"
log_handler.log_debug(f"Getting ahead/behind count for '{local_branch}'...'{upstream_branch}' in '{working_directory}'", func_name=func_name) log_handler.log_debug(f"Getting ahead/behind count for '{local_branch}' vs '{upstream_branch}' using separate counts.", func_name=func_name)
cmd = ["git", "rev-list", "--count", "--left-right", f"{local_branch}...{upstream_branch}"] ahead_count = None
behind_count = None
try: try:
result = self.log_and_execute( # --- Get Ahead Count ---
cmd, working_directory, check=False, capture=True, hide_console=True, log_output_level=logging.DEBUG # Conta i commit in locale non presenti nell'upstream
ahead_cmd = ["git", "rev-list", "--count", f"{upstream_branch}..{local_branch}"]
log_handler.log_debug(f"Executing ahead count command: {' '.join(ahead_cmd)}", func_name=func_name)
ahead_result = self.log_and_execute(
ahead_cmd, working_directory, check=False, capture=True, hide_console=True, log_output_level=logging.DEBUG
) )
if result.returncode == 0 and result.stdout: if ahead_result.returncode == 0 and ahead_result.stdout:
output = result.stdout.strip()
parts = output.split()
if len(parts) == 2:
try: try:
# ---<<< ASSEGNAZIONE CORRETTA DALL'OUTPUT >>>--- ahead_count = int(ahead_result.stdout.strip())
# parts[0] è behind, parts[1] è ahead log_handler.log_debug(f"Ahead count: {ahead_count}", func_name=func_name)
behind_count_from_git = int(parts[0])
ahead_count_from_git = int(parts[1])
# ---<<< FINE ASSEGNAZIONE >>>---
log_handler.log_info(
f"Git Output Parsed: Behind={behind_count_from_git}, Ahead={ahead_count_from_git} "
f"(Raw: '{output}')", # Log più chiaro
func_name=func_name
)
# ---<<< RETURN CORRETTO: (ahead, behind) >>>---
# Restituisci la tupla nell'ordine che il resto del codice si aspetta: (ahead, behind)
return ahead_count_from_git, behind_count_from_git
# ---<<< FINE RETURN >>>---
except ValueError: except ValueError:
log_handler.log_error(f"Failed to parse rev-list count output: '{output}'", func_name=func_name) log_handler.log_error(f"Failed to parse ahead count output: '{ahead_result.stdout.strip()}'", func_name=func_name)
return None, None return None, None # Errore parsing
else: else:
log_handler.log_error(f"Unexpected output format from rev-list count: '{output}'", func_name=func_name) log_handler.log_warning(f"Ahead count command failed (RC={ahead_result.returncode}). Stderr: {ahead_result.stderr.strip() if ahead_result.stderr else 'N/A'}", func_name=func_name)
return None, None return None, None # Comando fallito
else:
log_handler.log_warning( # --- Get Behind Count ---
f"Failed to get ahead/behind count (RC={result.returncode}). Maybe invalid branches or no common history? Stderr: {result.stderr.strip() if result.stderr else 'N/A'}", # Conta i commit nell'upstream non presenti in locale
func_name=func_name behind_cmd = ["git", "rev-list", "--count", f"{local_branch}..{upstream_branch}"]
log_handler.log_debug(f"Executing behind count command: {' '.join(behind_cmd)}", func_name=func_name)
behind_result = self.log_and_execute(
behind_cmd, working_directory, check=False, capture=True, hide_console=True, log_output_level=logging.DEBUG
) )
return None, None
if behind_result.returncode == 0 and behind_result.stdout:
try:
behind_count = int(behind_result.stdout.strip())
log_handler.log_debug(f"Behind count: {behind_count}", func_name=func_name)
except ValueError:
log_handler.log_error(f"Failed to parse behind count output: '{behind_result.stdout.strip()}'", func_name=func_name)
return None, None # Errore parsing
else:
log_handler.log_warning(f"Behind count command failed (RC={behind_result.returncode}). Stderr: {behind_result.stderr.strip() if behind_result.stderr else 'N/A'}", func_name=func_name)
return None, None # Comando fallito
# --- Return Result ---
log_handler.log_info(f"Ahead/Behind for '{local_branch}': Ahead={ahead_count}, Behind={behind_count}", func_name=func_name)
# Restituisce la tupla nell'ordine (ahead, behind)
return ahead_count, behind_count
except Exception as e: except Exception as e:
log_handler.log_exception(f"Unexpected error getting ahead/behind count: {e}", func_name=func_name) log_handler.log_exception(f"Unexpected error getting ahead/behind count: {e}", func_name=func_name)
return None, None # Segnala fallimento # Segnala fallimento return None, None # Segnala fallimento generico # Segnala fallimento # Segnala fallimento
# --- END OF FILE git_commands.py --- # --- END OF FILE git_commands.py ---