Skip to content

Commit e1fbc08

Browse files
authored
Merge pull request #331 from codecov/dana/fork-branch-names
amend branch names to be forked-slug:branch-name
2 parents 65210ba + 94540b2 commit e1fbc08

6 files changed

Lines changed: 97 additions & 25 deletions

File tree

codecov_cli/helpers/git.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,20 @@ def parse_git_service(remote_repo_url: str):
9292
return None
9393

9494

95-
def is_fork_pr(pr_num, slug, service):
95+
def is_fork_pr(pull_dict):
9696
"""
97-
takes in pull request number, slug in the owner/repo format, and the git service e.g. github, gitlab etc.
97+
takes in dict: pull_dict
9898
returns true if PR is made in a fork context, false if not.
9999
"""
100+
return pull_dict and pull_dict["head"]["slug"] != pull_dict["base"]["slug"]
101+
102+
103+
def get_pull(service, slug, pr_num):
104+
"""
105+
takes in str git service e.g. github, gitlab etc., slug in the owner/repo format, and the pull request number
106+
returns the pull request info gotten from the git service provider if successful, None if not
107+
"""
100108
git_service = get_git_service(service)
101109
if git_service:
102110
pull_dict = git_service.get_pull_request(slug, pr_num)
103-
if pull_dict and pull_dict["head"]["slug"] != pull_dict["base"]["slug"]:
104-
return True
105-
return False
111+
return pull_dict

codecov_cli/services/commit/__init__.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from codecov_cli.helpers.config import CODECOV_API_URL
66
from codecov_cli.helpers.encoder import decode_slug, encode_slug
7-
from codecov_cli.helpers.git import is_fork_pr
7+
from codecov_cli.helpers.git import get_git_service, get_pull, is_fork_pr
88
from codecov_cli.helpers.request import (
99
get_token_header_or_fail,
1010
log_warnings_and_errors_if_any,
@@ -44,18 +44,22 @@ def create_commit_logic(
4444
def send_commit_data(
4545
commit_sha, parent_sha, pr, branch, slug, token, service, enterprise_url
4646
):
47+
decoded_slug = decode_slug(slug)
48+
pull_dict = get_pull(service, decoded_slug, pr) if not token else None
49+
if is_fork_pr(pull_dict):
50+
headers = {}
51+
branch = pull_dict["head"]["slug"] + ":" + branch
52+
logger.info("The PR is happening in a forked repo. Using tokenless upload.")
53+
else:
54+
headers = get_token_header_or_fail(token)
55+
4756
data = {
4857
"commitid": commit_sha,
4958
"parent_commit_id": parent_sha,
5059
"pullid": pr,
5160
"branch": branch,
5261
}
53-
decoded_slug = decode_slug(slug)
54-
headers = (
55-
{}
56-
if not token and is_fork_pr(pr, decoded_slug, service)
57-
else get_token_header_or_fail(token)
58-
)
62+
5963
upload_url = enterprise_url or CODECOV_API_URL
6064
url = f"{upload_url}/upload/{service}/{slug}/commits"
6165
return send_post_request(url=url, data=data, headers=headers)

codecov_cli/services/report/__init__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from codecov_cli.helpers import request
99
from codecov_cli.helpers.config import CODECOV_API_URL
1010
from codecov_cli.helpers.encoder import decode_slug, encode_slug
11-
from codecov_cli.helpers.git import is_fork_pr
11+
from codecov_cli.helpers.git import get_pull, is_fork_pr
1212
from codecov_cli.helpers.request import (
1313
get_token_header_or_fail,
1414
log_warnings_and_errors_if_any,
@@ -49,10 +49,11 @@ def send_create_report_request(
4949
):
5050
data = {"code": code}
5151
decoded_slug = decode_slug(encoded_slug)
52+
pull_dict = (
53+
get_pull(service, decoded_slug, pull_request_number) if not token else None
54+
)
5255
headers = (
53-
{}
54-
if not token and is_fork_pr(pull_request_number, decoded_slug, service)
55-
else get_token_header_or_fail(token)
56+
{} if not token and is_fork_pr(pull_dict) else get_token_header_or_fail(token)
5657
)
5758
upload_url = enterprise_url or CODECOV_API_URL
5859
url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports"

codecov_cli/services/upload/upload_sender.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from codecov_cli import __version__ as codecov_cli_version
1010
from codecov_cli.helpers.config import CODECOV_API_URL
1111
from codecov_cli.helpers.encoder import encode_slug
12-
from codecov_cli.helpers.git import is_fork_pr
12+
from codecov_cli.helpers.git import get_pull, is_fork_pr
1313
from codecov_cli.helpers.request import (
1414
get_token_header_or_fail,
1515
send_post_request,
@@ -54,9 +54,12 @@ def send_upload_data(
5454
}
5555

5656
# Data to upload to Codecov
57+
pull_dict = (
58+
get_pull(git_service, slug, pull_request_number) if not token else None
59+
)
5760
headers = (
5861
{}
59-
if not token and is_fork_pr(pull_request_number, slug, git_service)
62+
if not token and is_fork_pr(pull_dict)
6063
else get_token_header_or_fail(token)
6164
)
6265
encoded_slug = encode_slug(slug)

tests/helpers/test_git.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,15 @@ def mock_request(*args, headers={}, **kwargs):
160160
"get",
161161
side_effect=mock_request,
162162
)
163-
encoded_slug = "codecov::::codecov-cli"
164-
assert not git.is_fork_pr(1, encoded_slug, "github")
163+
pull_dict = git.get_pull("github", "codecov/codecov-cli", 1)
164+
assert not git.is_fork_pr(pull_dict)
165165

166166

167167
def test_pr_is_fork_pr(mocker):
168168
def mock_request(*args, headers={}, **kwargs):
169169
assert headers["X-GitHub-Api-Version"] == "2022-11-28"
170170
res = {
171-
"url": "https://api.github.com/repos/codecov/codecov-cli/pulls/325",
171+
"url": "https://api.github.com/repos/codecov/codecov-cli/pulls/1",
172172
"head": {
173173
"sha": "123",
174174
"label": "codecov-cli:branch",
@@ -192,8 +192,8 @@ def mock_request(*args, headers={}, **kwargs):
192192
"get",
193193
side_effect=mock_request,
194194
)
195-
encoded_slug = "codecov::::codecov-cli"
196-
assert git.is_fork_pr(1, encoded_slug, "github")
195+
pull_dict = git.get_pull("github", "codecov/codecov-cli", 1)
196+
assert git.is_fork_pr(pull_dict)
197197

198198

199199
def test_pr_not_found(mocker):
@@ -209,5 +209,5 @@ def mock_request(*args, headers={}, **kwargs):
209209
"get",
210210
side_effect=mock_request,
211211
)
212-
encoded_slug = "codecov::::codecov-cli"
213-
assert not git.is_fork_pr(1, encoded_slug, "github")
212+
pull_dict = git.get_pull("github", "codecov/codecov-cli", 1)
213+
assert not git.is_fork_pr(pull_dict)

tests/services/commit/test_commit_service.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import json
12
import uuid
23

4+
import requests
35
from click.testing import CliRunner
6+
from requests import Response
47

58
from codecov_cli.services.commit import create_commit_logic, send_commit_data
69
from codecov_cli.types import RequestError, RequestResult, RequestResultWarning
@@ -139,3 +142,58 @@ def test_commit_sender_403(mocker):
139142
params={},
140143
)
141144
mocked_response.assert_called_once()
145+
146+
147+
def test_commit_sender_with_forked_repo(mocker):
148+
mocked_response = mocker.patch(
149+
"codecov_cli.services.commit.send_post_request",
150+
return_value=mocker.MagicMock(status_code=200, text="success"),
151+
)
152+
153+
def mock_request(*args, headers={}, **kwargs):
154+
assert headers["X-GitHub-Api-Version"] == "2022-11-28"
155+
res = {
156+
"url": "https://api.github.com/repos/codecov/codecov-cli/pulls/1",
157+
"head": {
158+
"sha": "123",
159+
"label": "codecov-cli:branch",
160+
"ref": "branch",
161+
"repo": {"full_name": "user_forked_repo/codecov-cli"},
162+
},
163+
"base": {
164+
"sha": "123",
165+
"label": "codecov-cli:main",
166+
"ref": "main",
167+
"repo": {"full_name": "codecov/codecov-cli"},
168+
},
169+
}
170+
response = Response()
171+
response.status_code = 200
172+
response._content = json.dumps(res).encode("utf-8")
173+
return response
174+
175+
mocker.patch.object(
176+
requests,
177+
"get",
178+
side_effect=mock_request,
179+
)
180+
res = send_commit_data(
181+
"commit_sha",
182+
"parent_sha",
183+
"1",
184+
"branch",
185+
"codecov::::codecov-cli",
186+
None,
187+
"github",
188+
None,
189+
)
190+
mocked_response.assert_called_with(
191+
url="https://api.codecov.io/upload/github/codecov::::codecov-cli/commits",
192+
data={
193+
"commitid": "commit_sha",
194+
"parent_commit_id": "parent_sha",
195+
"pullid": "1",
196+
"branch": "user_forked_repo/codecov-cli:branch",
197+
},
198+
headers={},
199+
)

0 commit comments

Comments
 (0)