File indexing completed on 2024-12-01 05:10:56
0001 """ 0002 This module contains code for the feature command 0003 """ 0004 0005 # SPDX-FileCopyrightText: 2020 Jonah BrĂ¼chert <jbb@kaidan.im> 0006 # 0007 # SPDX-License-Identifier: GPL-2.0-or-later 0008 0009 import argparse 0010 0011 from typing import Any 0012 0013 from git import Repo 0014 from git.exc import GitCommandError 0015 0016 from lab.utils import Utils, LogType 0017 0018 0019 def parser( 0020 subparsers: argparse._SubParsersAction, # pylint: disable=protected-access 0021 ) -> argparse.ArgumentParser: 0022 """ 0023 Subparser for feature command 0024 :param subparsers: subparsers object from global parser 0025 :return: feature request subparser 0026 """ 0027 feature_parser: argparse.ArgumentParser = subparsers.add_parser( 0028 "feature", help="Create branches and list branches" 0029 ) 0030 feature_parser.add_argument("name", nargs="?", help="name for the new branch") 0031 feature_parser.add_argument( 0032 "start", 0033 nargs="?", 0034 help="starting point for the new branch", 0035 default="origin/" + Utils.get_default_branch(Utils.get_cwd_repo()), 0036 ) 0037 return feature_parser 0038 0039 0040 def run(args: argparse.Namespace) -> None: 0041 """ 0042 run feature command 0043 :param args: parsed arguments 0044 """ 0045 feature = Feature() 0046 if args.name: 0047 feature.checkout(args.start, args.name) 0048 else: 0049 feature.list() 0050 0051 0052 class Feature: 0053 """ 0054 represents the feature command 0055 """ 0056 0057 # private 0058 __repo: Repo 0059 __git: Any 0060 0061 def __init__(self) -> None: 0062 self.__repo = Utils.get_cwd_repo() 0063 self.__git = self.__repo.git 0064 0065 def checkout(self, start: str, name: str) -> None: 0066 """ 0067 Checkouts a branch if it exists or creates a new one 0068 """ 0069 try: 0070 if name in self.__repo.refs: 0071 self.__git.checkout(name) 0072 Utils.log(LogType.INFO, "Switched to branch '{}'".format(name)) 0073 else: 0074 self.__git.checkout(start, b=name) # create a new branch 0075 Utils.log(LogType.INFO, "Switched to a new branch '{}'".format(name)) 0076 0077 except GitCommandError as git_error: 0078 Utils.log(LogType.ERROR, git_error.stderr.strip()) 0079 0080 def list(self) -> None: 0081 """ 0082 lists branches 0083 """ 0084 print(self.__git.branch())