mirror of
https://github.com/lilydjwg/nvchecker.git
synced 2025-03-10 06:14:02 +00:00
ss
This commit is contained in:
parent
12d8e3daa7
commit
e56157145a
1 changed files with 71 additions and 78 deletions
|
@ -107,105 +107,89 @@ async def get_version_real(
|
||||||
if token is None:
|
if token is None:
|
||||||
token = keymanager.get_key(host.lower(), 'github')
|
token = keymanager.get_key(host.lower(), 'github')
|
||||||
|
|
||||||
# Set up headers with proper authentication
|
|
||||||
headers = {
|
headers = {
|
||||||
'Accept': 'application/vnd.github.quicksilver-preview+json',
|
'Accept': 'application/vnd.github.quicksilver-preview+json',
|
||||||
}
|
}
|
||||||
|
|
||||||
# Now ensure we always add Authorization header if we have a token
|
|
||||||
if token:
|
if token:
|
||||||
if token.startswith('github_pat_'): # Personal Access Token (Fine-grained)
|
if token.startswith('github_pat_'):
|
||||||
headers['Authorization'] = f'Bearer {token}'
|
headers['Authorization'] = f'Bearer {token}'
|
||||||
else:
|
else:
|
||||||
headers['Authorization'] = f'token {token}'
|
headers['Authorization'] = f'token {token}'
|
||||||
|
|
||||||
use_latest_tag = conf.get('use_latest_tag', False)
|
use_latest_tag = conf.get('use_latest_tag', False)
|
||||||
if use_latest_tag:
|
|
||||||
if not token:
|
|
||||||
raise GetVersionError('token not given but it is required')
|
|
||||||
|
|
||||||
query = conf.get('query', '')
|
|
||||||
result = await cache.get((host, repo, query, token), get_latest_tag)
|
|
||||||
return await enhance_version_with_commit_info(result, host, repo, headers, use_commit_info)
|
|
||||||
|
|
||||||
use_latest_release = conf.get('use_latest_release', False)
|
use_latest_release = conf.get('use_latest_release', False)
|
||||||
include_prereleases = conf.get('include_prereleases', False)
|
include_prereleases = conf.get('include_prereleases', False)
|
||||||
use_release_name = conf.get('use_release_name', False)
|
|
||||||
if use_latest_release and include_prereleases:
|
|
||||||
if not token:
|
|
||||||
raise GetVersionError('token not given but it is required')
|
|
||||||
|
|
||||||
result = await cache.get(
|
|
||||||
(host, repo, token, use_release_name),
|
|
||||||
get_latest_release_with_prereleases)
|
|
||||||
return await enhance_version_with_commit_info(result, host, repo, headers, use_commit_info)
|
|
||||||
|
|
||||||
br = conf.get('branch')
|
|
||||||
path = conf.get('path')
|
|
||||||
use_max_tag = conf.get('use_max_tag', False)
|
use_max_tag = conf.get('use_max_tag', False)
|
||||||
|
use_release_name = conf.get('use_release_name', False)
|
||||||
# Check for token requirement early for max_tag
|
|
||||||
if use_max_tag and not token:
|
|
||||||
raise GetVersionError('token not given but it is required for max_tag')
|
|
||||||
|
|
||||||
if use_latest_release:
|
# Token requirement checks
|
||||||
url = GITHUB_LATEST_RELEASE % (host, repo)
|
if any([use_latest_tag, (use_latest_release and include_prereleases), use_max_tag]) and not token:
|
||||||
elif use_max_tag:
|
raise GetVersionError('token not given but it is required for this operation')
|
||||||
url = GITHUB_MAX_TAG % (host, repo)
|
|
||||||
else:
|
try:
|
||||||
|
if use_latest_tag:
|
||||||
|
query = conf.get('query', '')
|
||||||
|
result = await cache.get((host, repo, query, token), get_latest_tag)
|
||||||
|
return await enhance_version_with_commit_info(result, host, repo, headers, use_commit_info)
|
||||||
|
|
||||||
|
if use_latest_release:
|
||||||
|
url = GITHUB_LATEST_RELEASE % (host, repo)
|
||||||
|
try:
|
||||||
|
data = await cache.get_json(url, headers=headers)
|
||||||
|
if 'tag_name' not in data:
|
||||||
|
raise GetVersionError('No release found in upstream repository.')
|
||||||
|
|
||||||
|
version = data['name'] if use_release_name else data['tag_name']
|
||||||
|
result = RichResult(
|
||||||
|
version=version,
|
||||||
|
gitref=f"refs/tags/{data['tag_name']}",
|
||||||
|
url=data['html_url'],
|
||||||
|
)
|
||||||
|
return await enhance_version_with_commit_info(result, host, repo, headers, use_commit_info)
|
||||||
|
except HTTPError as e:
|
||||||
|
if e.code == 404:
|
||||||
|
raise GetVersionError(f'No releases found for repository {repo}. The repository might not have any releases yet.')
|
||||||
|
raise
|
||||||
|
|
||||||
|
if use_max_tag:
|
||||||
|
url = GITHUB_MAX_TAG % (host, repo)
|
||||||
|
try:
|
||||||
|
data = await cache.get_json(url, headers=headers)
|
||||||
|
tags: List[Union[str, RichResult]] = [
|
||||||
|
RichResult(
|
||||||
|
version=ref['ref'].split('/', 2)[-1],
|
||||||
|
gitref=ref['ref'],
|
||||||
|
revision=ref['object']['sha'],
|
||||||
|
url=f'https://github.com/{repo}/releases/tag/{ref["ref"].split("/", 2)[-1]}',
|
||||||
|
) for ref in data
|
||||||
|
]
|
||||||
|
if not tags:
|
||||||
|
raise GetVersionError('No tags found in upstream repository.')
|
||||||
|
|
||||||
|
if use_commit_info:
|
||||||
|
return [await enhance_version_with_commit_info(
|
||||||
|
tag, host, repo, headers, use_commit_info
|
||||||
|
) for tag in tags if isinstance(tag, RichResult)]
|
||||||
|
return tags
|
||||||
|
except HTTPError as e:
|
||||||
|
if e.code == 404:
|
||||||
|
raise GetVersionError(f'No tags found for repository {repo}. The repository might not have any tags yet.')
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Default: use commits
|
||||||
|
br = conf.get('branch')
|
||||||
|
path = conf.get('path')
|
||||||
url = GITHUB_URL % (host, repo)
|
url = GITHUB_URL % (host, repo)
|
||||||
parameters = {}
|
parameters = {}
|
||||||
if br:
|
if br:
|
||||||
parameters['sha'] = br
|
parameters['sha'] = br
|
||||||
if path:
|
if path:
|
||||||
parameters['path'] = path
|
parameters['path'] = path
|
||||||
url += '?' + urlencode(parameters)
|
if parameters:
|
||||||
|
url += '?' + urlencode(parameters)
|
||||||
|
|
||||||
data = await cache.get_json(url, headers=headers)
|
data = await cache.get_json(url, headers=headers)
|
||||||
|
|
||||||
if use_max_tag:
|
|
||||||
tags: List[Union[str, RichResult]] = [
|
|
||||||
RichResult(
|
|
||||||
version=ref['ref'].split('/', 2)[-1],
|
|
||||||
gitref=ref['ref'],
|
|
||||||
revision=ref['object']['sha'],
|
|
||||||
url=f'https://github.com/{repo}/releases/tag/{ref["ref"].split("/", 2)[-1]}',
|
|
||||||
) for ref in data
|
|
||||||
]
|
|
||||||
if not tags:
|
|
||||||
raise GetVersionError('No tag found in upstream repository.')
|
|
||||||
|
|
||||||
# Enhance all tags with commit info if enabled
|
|
||||||
if use_commit_info:
|
|
||||||
enhanced_tags = []
|
|
||||||
for tag in tags:
|
|
||||||
if isinstance(tag, RichResult):
|
|
||||||
enhanced_tag = await enhance_version_with_commit_info(
|
|
||||||
tag, host, repo, headers, use_commit_info
|
|
||||||
)
|
|
||||||
enhanced_tags.append(enhanced_tag)
|
|
||||||
else:
|
|
||||||
enhanced_tags.append(tag)
|
|
||||||
return enhanced_tags
|
|
||||||
return tags
|
|
||||||
|
|
||||||
if use_latest_release:
|
|
||||||
if 'tag_name' not in data:
|
|
||||||
raise GetVersionError('No release found in upstream repository.')
|
|
||||||
|
|
||||||
if use_release_name:
|
|
||||||
version = data['name']
|
|
||||||
else:
|
|
||||||
version = data['tag_name']
|
|
||||||
|
|
||||||
result = RichResult(
|
|
||||||
version=version,
|
|
||||||
gitref=f"refs/tags/{data['tag_name']}",
|
|
||||||
url=data['html_url'],
|
|
||||||
)
|
|
||||||
return await enhance_version_with_commit_info(result, host, repo, headers, use_commit_info)
|
|
||||||
|
|
||||||
else:
|
|
||||||
version = data[0]['commit']['committer']['date'].rstrip('Z').replace('-', '').replace(':', '').replace('T', '.')
|
version = data[0]['commit']['committer']['date'].rstrip('Z').replace('-', '').replace(':', '').replace('T', '.')
|
||||||
|
|
||||||
result = RichResult(
|
result = RichResult(
|
||||||
|
@ -215,6 +199,15 @@ async def get_version_real(
|
||||||
)
|
)
|
||||||
return await enhance_version_with_commit_info(result, host, repo, headers, use_commit_info)
|
return await enhance_version_with_commit_info(result, host, repo, headers, use_commit_info)
|
||||||
|
|
||||||
|
except HTTPError as e:
|
||||||
|
if e.code == 404:
|
||||||
|
raise GetVersionError(f'Repository {repo} not found or access denied.')
|
||||||
|
elif e.code in [403, 429]:
|
||||||
|
if n := check_ratelimit(e, name):
|
||||||
|
raise GetVersionError(f'Rate limited. Try again in {n} seconds or use an API token.')
|
||||||
|
raise GetVersionError('Rate limit exceeded. Please use an API token to increase the allowance.')
|
||||||
|
raise
|
||||||
|
|
||||||
def check_ratelimit(exc: HTTPError, name: str) -> Optional[int]:
|
def check_ratelimit(exc: HTTPError, name: str) -> Optional[int]:
|
||||||
res = exc.response
|
res = exc.response
|
||||||
if not res:
|
if not res:
|
||||||
|
|
Loading…
Add table
Reference in a new issue