Source code for l2tscaffolder.helpers.git

# -*- coding: utf-8 -*-
"""Git helper for the scaffolder project.

This file provides a class to assist with git operations.
"""
import os
import re

from typing import Tuple

from l2tscaffolder.helpers import cli
from l2tscaffolder.lib import errors

[docs]class GitHelper(cli.CLIHelper): """Helper class for git operations. Attributes: project_path: path to the git project folder. """ def __init__(self, project_path: str): """Initializes the git helper. Arguments: project_path (str): the path to the git project folder. """ super(GitHelper, self).__init__() self.project_path = project_path self._cwd = os.getcwd()
[docs] def AddFileToTrack(self, file_path: str): """Add a file to those that are tracked by the git repo. Args: file_path (str): path to the file to be added to tracked files by this git repo. Raises: errors.UnableToConfigure: when the tool is not able to add newly added files to the git repo. """ command = 'git add {0:s}'.format(file_path) exit_code, output, error = self.RunCommand(command) if exit_code != 0: raise errors.UnableToConfigure(( 'Unable to add files to git branch, output of "git add" ' 'command is [{0:s}] with the error: {1:s}'.format(output, error)))
[docs] def HasBranch(self, branch_name: str) -> bool: """Tests for the existence of a specific branch. Args: branch_name (str): the name of the branch to test for. Returns: bool: True if the branch exists. """ command = 'git show-ref --verify --quiet refs/heads/"{0:s}"'.format( branch_name) exit_code, _, _ = self.RunCommand(command) if exit_code == 0: return True return False
[docs] def GenerateBranchName(self, module_name: str) -> str: """Generates a git branch name. Args: module_name (str): module name to generate a git branch name from. Returns: str: git branch name. """ branch_name = re.sub('(?<!^)(?=[A-Z])', '_', module_name) branch_name = branch_name.lower() return branch_name
[docs] def GetActiveBranch(self) -> str: """Determines the active branch of the git project. Returns: str: the active branch of the git project. Raises: errors.UnableToConfigure: when the tool is not able to get the active branch of the git project. """ command = 'git branch --list --no-color' exit_code, output, error = self.RunCommand(command) if exit_code != 0: raise errors.UnableToConfigure(( 'Unable to get the active git branch, with error message ' '{0:s}').format(error)) for line in output.split('\n'): if line.startswith('*'): _, _, line_string = line.partition('*') return line_string.strip() raise errors.UnableToConfigure('Unable to determine the active git branch')
[docs] def RunCommand(self, command: str) -> Tuple[int, str, str]: """Runs a command. Args: command (str): command to run. Returns: tuple[int, str, str]: exit code, output that was written to stdout and stderr. """ os.chdir(self.project_path) exit_code, output, error = super(GitHelper, self).RunCommand(command) os.chdir(self._cwd) return exit_code, output, error
[docs] def SwitchToBranch(self, branch: str) -> int: """Switches the git branch and returns the exit code of the command. Arguments: branch (str): the name of the git branch. Returns: int: the exit code from the git command. """ command = 'git checkout {0:s}'.format(branch) exit_code, _, _ = self.RunCommand(command) return exit_code
[docs] def CreateBranch(self, branch: str) -> int: """Creates a git branch and returns the exit code of the command. Arguments: branch (str): the name of the git branch. Returns: int: the exit code from the git command. """ command = 'git branch {0:s}'.format(branch) exit_code, _, _ = self.RunCommand(command) return exit_code