Source code for idmtools.plugins.git_commit

"""
Git plugin to add git repo details to items.
"""
import functools
import os
from contextlib import suppress
from logging import getLogger
from typing import TYPE_CHECKING, Dict
from idmtools import IdmConfigParser
from idmtools.assets import AssetCollection
from idmtools.core import TRUTHY_VALUES
from idmtools.registry.hook_specs import function_hook_impl

if TYPE_CHECKING:
    from idmtools.core.interfaces.ientity import IEntity

logger = getLogger(__name__)
user_logger = getLogger('user')


[docs]@function_hook_impl def idmtools_platform_pre_create_item(item: 'IEntity', kwargs): """ Adds git information from local repo as tags to items on creation. There following options are valid kwargs and configuration options: * add_git_tags_to_all - Add git tags to everything * add_to_experiments - Add git tags to experiments * add_git_tags_to_simulations - Add git tags to simulations * add_git_tags_to_workitems - Add git tags to workitems * add_git_tags_to_suite - Add git tags to suites * add_git_tags_to_asset_collection - Add git tags to asset collections Every option expects a truthy value, meaning "True, False, t, f, 1, 0, yes, or no. Any positive value, True, yes, 1, t, y will enable the option. When defined in the idmtools.ini, these should be added under the "git_tag" section without the "git_tags" portion. For example [git_tag] add_to_experiments = y Also, you can do this through environment variables using IDMTOOLS_GIT_TAG_<option>. For example, experiments would be IDMTOOLS_GIT_TAG_ADD_TO_EXPERIMENTS Args: item: Item to add tags two kwargs: Optional kwargs Returns: None """ from idmtools.entities.experiment import Experiment from idmtools.entities.simulation import Simulation from idmtools.entities.iworkflow_item import IWorkflowItem from idmtools.entities.suite import Suite add_to_all_default = kwargs.get('add_git_tags_to_all', 'f') add_to_simulations_default = kwargs.get('add_git_tags_to_simulations', 'f') add_to_experiments_default = kwargs.get('add_git_tags_to_experiments', 'f') add_to_workitems_default = kwargs.get('add_git_tags_to_workitems', 'f') add_to_suite_default = kwargs.get('add_git_tags_to_suite', 'f') add_to_asset_collection_default = kwargs.get('add_git_tags_to_asset_collection', 'f') if IdmConfigParser.get_option("git_tag", "add_to_all", add_to_all_default) in TRUTHY_VALUES or \ (isinstance(item, Experiment) and IdmConfigParser.get_option("git_tag", "add_to_experiments", add_to_experiments_default) in TRUTHY_VALUES) or \ (isinstance(item, Simulation) and IdmConfigParser.get_option("git_tag", "add_to_simulations", add_to_simulations_default) in TRUTHY_VALUES) or \ (isinstance(item, IWorkflowItem) and IdmConfigParser.get_option("git_tag", "add_to_workitems", add_to_workitems_default) in TRUTHY_VALUES) or \ (isinstance(item, Suite) and IdmConfigParser.get_option("git_tag", "add_to_suite", add_to_suite_default) in TRUTHY_VALUES) or \ (isinstance(item, AssetCollection) and IdmConfigParser.get_option("git_tag", "add_to_asset_collection", add_to_asset_collection_default) in TRUTHY_VALUES): tags = add_details_using_gitpython() if not tags: tags = add_details_using_pygit() user_logger.warning("You need gitpython or pygit2 installed to have this functionality") item.tags.update(tags)
[docs]@functools.lru_cache(1) def add_details_using_gitpython(): """ Support gitpython if installed. Returns: Git tags """ result = dict() with suppress(ImportError): import git repo = git.Repo(search_parent_directories=True) if repo: sha = repo.head.object.hexsha result['git_hash'] = sha if len(repo.remotes) > 0: result['git_url'] = repo.remotes[0].url if repo.head.ref.name: result['git_branch'] = repo.head.ref.name return result
[docs]@functools.lru_cache(1) def add_details_using_pygit() -> Dict[str, str]: """ Support pygit if installed. Returns: Git tags """ result = dict() with suppress(ImportError): import pygit2 repo_base = pygit2.discover_repository(os.getcwd()) if repo_base: repo = pygit2.Repository(repo_base) sha = repo.head.target.hex result['git_hash'] = sha if len(repo.remotes) > 0: result['git_url'] = repo.remotes[0].url if repo.head.shorthand: result['git_branch'] = repo.head.shorthand return result