Skip to content

Commit 703e259

Browse files
committed
done
1 parent 8e3a649 commit 703e259

File tree

7 files changed

+77
-24
lines changed

7 files changed

+77
-24
lines changed

logger.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import logging.config
2+
3+
logging.config.fileConfig('logging.conf')
4+
logger = logging.getLogger("disaster_recovery")

logging.conf

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[loggers]
2+
keys=root, disaster_recovery
3+
4+
[handlers]
5+
keys=consoleHandler
6+
7+
[formatters]
8+
keys=simpleFormatter
9+
10+
[logger_disaster_recovery]
11+
level=DEBUG
12+
handlers=consoleHandler
13+
qualname=disaster_recovery
14+
propagate=0
15+
16+
[handler_consoleHandler]
17+
class=StreamHandler
18+
level=DEBUG
19+
formatter=simpleFormatter
20+
args=(sys.stdout,)
21+
22+
[formatter_simpleFormatter]
23+
format=%(asctime)s - %(levelname)s - %(message)s
24+
25+
[logger_root]
26+
level=ERROR
27+
handlers=consoleHandler

main.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
from typing import Dict
2-
3-
from PyInquirer import prompt, Separator
4-
import logging
2+
from PyInquirer import prompt
53
from consts import providers, contexts, config_file
4+
from logger import logger
65
from menus.menu_base import MenuBase
76
from menus.release_block_pr_menu import ReleaseBlockPrMenu
87

98
release_block_pr_menu = ReleaseBlockPrMenu()
109
menus = [release_block_pr_menu]
1110
menu_value_to_class: Dict[str, MenuBase] = {menu.get_menu(): menu for menu in menus}
1211

13-
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
14-
logger = logging.getLogger(__name__)
1512

1613
main_menu = [
1714
{
@@ -50,5 +47,7 @@
5047
menu = menu_value_to_class.get(answer.get('menu'))
5148
if menu:
5249
menu.handle(answer)
50+
logger.info("Completed successfully")
5351
else:
5452
logger.error(f"invalid menu {answer.get('menu')}")
53+

menus/release_block_pr_menu.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,31 @@
11
import os
2-
from typing import List, Dict
2+
from typing import List, Dict, Type
33
import pydantic
4-
import logging
54
from consts import github
5+
from logger import logger
66
from menus.menu_base import MenuBase
77
from providers.github_handler import GithubHandler
8-
from providers.provider_handler import ProviderHandler
9-
import PyInquirer
108
from release_block_pr_config import ReleaseBlockPrConfig
119

12-
logger = logging.getLogger(__name__)
1310

1411
release_block = "Release Blocked PR's"
1512

1613

1714
class ReleaseBlockPrMenu(MenuBase):
18-
handlers: Dict[str, ProviderHandler] = {
19-
github: GithubHandler()
15+
handlers: Dict[str, Type[GithubHandler]] = {
16+
github: GithubHandler
2017
}
2118

2219
def handle(self, answers):
2320
if answers.get("provider") in self.handlers:
24-
handler = self.handlers[answers["provider"]]
21+
handler_class = self.handlers[answers["provider"]]
2522
repositories_to_unblock: List[ReleaseBlockPrConfig] = pydantic.parse_file_as(List[ReleaseBlockPrConfig],
2623
answers["config_file"])
2724
for tokens_to_repositories in repositories_to_unblock:
25+
handler = handler_class(tokens_to_repositories.token)
2826
for repository in tokens_to_repositories.repositories:
29-
handler.release_branch_protection(tokens_to_repositories.token, repository.organization_name,
30-
repository.organization_name, repository.branch,
31-
answers["contexts"])
27+
handler.release_branch_protection(repository.organization_name, repository.repository_name,
28+
repository.branch, answers["contexts"])
3229
else:
3330
logger.error(f"Invalid provider selected: {answers.get('provider')}")
3431

providers/github_handler.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
1-
import logging
2-
from typing import List
1+
from typing import List, Set
32

3+
from logger import logger
44
from providers.provider_handler import ProviderHandler
5-
6-
logger = logging.getLogger(__name__)
5+
from github import Github
76

87

98
class GithubHandler(ProviderHandler):
10-
def release_branch_protection(self, token, organization_name, repository_name, branch, contexts: List[str]):
11-
logger.info(f"Releasing branch protection on repository {repository_name}")
9+
def __init__(self, token):
10+
super().__init__(token)
11+
self.github: Github = Github(token)
12+
13+
def release_branch_protection(self, organization_name, repository_name, branch, contexts: List[str]):
14+
full_repo_name = f"{organization_name}/{repository_name}"
15+
if len(contexts) > 0:
16+
try:
17+
repo = self.github.get_repo(full_repo_name, lazy=True)
18+
branch = repo.get_branch(branch)
19+
required_status_checks = branch.get_required_status_checks()
20+
current_contexts = set(required_status_checks.contexts)
21+
logger.info(f"Current required status checks {current_contexts}")
22+
contexts_to_keep = current_contexts.difference(contexts)
23+
if contexts_to_keep != current_contexts:
24+
logger.info(
25+
f"Updating required status checks repository {full_repo_name} branch {branch.name} to contexts {contexts_to_keep}")
26+
branch.edit_required_status_checks(contexts=list(contexts_to_keep))
27+
else:
28+
logger.info(f"Skipping {full_repo_name} contexts to remove are not required")
29+
except:
30+
logger.exception(f"Failed to update required status checks on repository {full_repo_name}")

providers/provider_handler.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
from abc import ABC, abstractmethod
2-
from typing import List
2+
from typing import List, Set
33

44

55
class ProviderHandler(ABC):
6+
7+
def __init__(self, token):
8+
self.token = token
9+
610
@abstractmethod
7-
def release_branch_protection(self, token, organization_name, repository_name, branch, contexts: List[str]):
11+
def release_branch_protection(self, organization_name, repository_name, branch, contexts: List[str]):
812
pass

requirements.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pydantic==1.10.2
2+
PyGithub==1.57
3+
PyInquirer==1.0.3

0 commit comments

Comments
 (0)