Skip to content

Commit d11d641

Browse files
committed
fix:issue iterating over actions
1 parent 14dc59e commit d11d641

File tree

3 files changed

+35
-19
lines changed

3 files changed

+35
-19
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## v1.2.2
2+
### 🐛 Bug Fixes
3+
- fix: Update versions
14
## v1.2.1
25

36
### 🚀 Features

gha_cli/cli.py

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ def __init__(self, github_token: str, update_major_version_only: bool = False):
3434
self.client = Github(login_or_token=github_token)
3535
self._update_major_version_only = update_major_version_only
3636

37+
def _get_repo(self, repo_name: str) -> Repository:
38+
"""Get a repository from github client"""
39+
try:
40+
return self.client.get_repo(repo_name)
41+
except UnknownObjectException:
42+
logging.error(f"Repository {repo_name} not found")
43+
raise ValueError(f"Repository {repo_name} not found")
44+
3745
def _fix_version(self, tag_name: str) -> str:
3846
if self._update_major_version_only:
3947
return tag_name.split(".")[0]
@@ -77,10 +85,13 @@ def get_action_latest_release(self, uses_tag_value: str) -> Optional[str]:
7785
logging.debug(f"Current version for {action_name} is a SHA: {current_version}, checking whether latest release is newer")
7886
if latest_release[1] > datetime.now():
7987
return latest_release[0]
80-
return latest_release if self._compare_versions(latest_release[0], current_version) > 0 else None
88+
return latest_release[0] if self._compare_versions(latest_release[0], current_version) > 0 else None
8189

8290
logging.debug(f"Checking for updates for {action_name}@{current_version}: Getting repo {action_name}")
83-
repo: Repository = self.client.get_repo(action_name)
91+
try:
92+
repo: Repository = self._get_repo(action_name)
93+
except ValueError as e:
94+
return None
8495
logging.info(f"Getting latest release for repository: {action_name}")
8596
latest_release: GitRelease
8697
try:
@@ -125,25 +136,27 @@ def get_workflow_action_names(self, repo_name: str, workflow_path: str) -> Set[s
125136

126137
def get_repo_actions_latest(self, repo_name: str) -> Dict[str, List[ActionVersion]]:
127138
workflow_paths = self._get_github_workflow_filenames(repo_name)
128-
res = dict()
129-
all_actions = set()
130-
all_actions_no_version = set() # actions without version, e.g., actions/checkout
139+
res:Dict[str, List[ActionVersion]] = dict()
140+
actions_per_path:Dict[str,Set[str]]=dict() # actions without version, e.g., actions/checkout
131141
for path in workflow_paths:
132142
res[path] = list()
133143
actions = self.get_workflow_action_names(repo_name, path)
134-
for action in all_actions:
144+
for action in actions:
145+
actions_per_path.setdefault(path,set()).add(action)
146+
all_actions_no_version = set()
147+
for path, actions in actions_per_path.items():
148+
for action in actions:
135149
if "@" not in action:
136150
continue
137-
action_name, _ = action.split("@")
138-
all_actions_no_version.add(action_name)
139-
all_actions = all_actions.union(actions)
151+
all_actions_no_version.add(action.split("@")[0])
140152
logging.info(f"Found {len(all_actions_no_version)} actions in workflows: {", ".join(all_actions_no_version)}")
141-
for action in all_actions:
142-
if "@" not in action:
143-
continue
144-
action_name, curr_version = action.split("@")
145-
latest_version = self.get_action_latest_release(action)
146-
res[path].append(ActionVersion(action_name, curr_version, latest_version))
153+
for path, actions in actions_per_path.items():
154+
for action in actions:
155+
if "@" not in action:
156+
continue
157+
action_name, curr_version = action.split("@")
158+
latest_version = self.get_action_latest_release(action)
159+
res[path].append(ActionVersion(action_name, curr_version, latest_version))
147160
return res
148161

149162
def get_repo_workflow_names(self, repo_name: str) -> Dict[str, str]:
@@ -184,7 +197,7 @@ def _update_workflow_content(self, repo_name: str, workflow_path: str, workflow_
184197
return
185198

186199
# remote
187-
repo: Repository = self.client.get_repo(repo_name)
200+
repo: Repository = self._get_repo(repo_name)
188201
current_content = repo.get_contents(workflow_path)
189202
res = repo.update_file(
190203
workflow_path,
@@ -205,7 +218,7 @@ def _get_github_workflow_filenames(self, repo_name: str) -> Set[str]:
205218
click.secho(f"{repo_name} is not a local repo and does not start with owner/repo", fg="red", err=True)
206219
raise ValueError(f"{repo_name} is not a local repo and does not start with owner/repo")
207220
# Remote
208-
repo: Repository = self.client.get_repo(repo_name)
221+
repo: Repository = self._get_repo(repo_name)
209222
self._wf_cache[repo_name] = {wf.path: wf for wf in repo.get_workflows() if wf.path.startswith(".github/")}
210223
return set(self._wf_cache[repo_name].keys())
211224

@@ -228,8 +241,8 @@ def _get_workflow_file_content(self, repo_name: str, workflow_path: str) -> Unio
228241
f"possible values: {workflow_paths}",
229242
err=True,
230243
)
231-
repo: Repository = self.client.get_repo(repo_name)
232244
try:
245+
repo: Repository = self._get_repo(repo_name)
233246
workflow_content = repo.get_contents(workflow_path)
234247
except UnknownObjectException:
235248
raise FileNotFoundError(f"Workflow not found in repository: {repo_name}, path: {workflow_path}")

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ github-actions-cli = "gha_cli.cli:cli"
88

99
[tool.poetry]
1010
name = "github-actions-cli"
11-
version = "1.2.1"
11+
version = "1.2.2"
1212
description = "GitHub Actions CLI - allows updating workflows, etc."
1313
readme = "README.md"
1414
keywords = ["GitHub Actions", "CLI"]

0 commit comments

Comments
 (0)