fix: get_commits func

This commit is contained in:
Indranil012 2023-03-15 00:07:17 +05:30
parent b57366b854
commit dfd8a3c68e
2 changed files with 42 additions and 62 deletions

View File

@ -3,6 +3,7 @@ import uvloop
from toolz.dicttoolz import keyfilter from toolz.dicttoolz import keyfilter
import asyncstdlib.builtins as a import asyncstdlib.builtins as a
from app.utils.HTTPXClient import HTTPXClient from app.utils.HTTPXClient import HTTPXClient
from re import findall
class Releases: class Releases:
@ -59,7 +60,7 @@ class Releases:
Args: Args:
repository (str): Github's standard username/repository notation repository (str): Github's standard username/repository notation
tag (str): lateset(default)/ prerelease/ recent/ tag_name tag (str): lateset(default)/ prerelease/ recent/ tag_name
see get_tag_name() for more details. see get_tag_release() for more details.
Returns: Returns:
dict: dictionary of filename and download url dict: dictionary of filename and download url
@ -123,7 +124,7 @@ class Releases:
args: args:
repository (str): Github's standard username/repository notation repository (str): Github's standard username/repository notation
tag (str): lateset(default)/ prerelease/ recent/ tag_name tag (str): lateset(default)/ prerelease/ recent/ tag_name
see get_tag_name() for more details. see get_tag_release() for more details.
Returns: Returns:
dict: JSON content dict: JSON content
@ -140,7 +141,7 @@ class Releases:
args: args:
repository (str): Github's standard username/repository notation repository (str): Github's standard username/repository notation
tag (str): lateset(default), prerelease, recent, tag_name tag (str): lateset(default), prerelease, recent, tag_name
see get_tag_name() for more details. see get_tag_release() for more details.
Returns: Returns:
dict: Patches available for a given app dict: Patches available for a given app
@ -196,62 +197,38 @@ class Releases:
return contributors return contributors
async def get_commits(self, org: str, repository: str, path: str) -> dict: async def get_commits(self, repository: str, current_version: str, target_tag: str = "latest") -> str:
"""Get commit history from a given repository. """Get commit history from a given repository.
Args: Args:
org (str): Username of the organization | valid values: revanced or vancedapp
repository (str): Repository name repository (str): Repository name
path (str): Path to the file current_version (str): current version(vx.x.x) installed
per_page (int): Number of commits to return target_tag (str): lateset(default), prerelease, recent, tag_name
since (str): ISO 8601 timestamp
Raises:
Exception: Raise a generic exception if the organization is not revanced or vancedapp
Returns: Returns:
dict: a dictionary containing the repository's latest commits str: string containing the repository's commits between version
""" """
commits = ""
releases = await self.httpx_client.get(f"https://api.github.com/repos/{repository}/releases").json()
target_version = await self.get_tag_release(repository, target_tag)['tag_name']
target_version = "".join(findall("\d+", target_version))
current_version = "".join(findall("\d+", current_version))
payload: dict = {} while len(target_version) != len(current_version):
payload["repository"] = f"{org}/{repository}" if len(target_version) > len(current_version):
payload["path"] = path current_version += "0"
payload["commits"] = []
if org == 'revanced' or org == 'vancedapp':
_releases = await self.httpx_client.get(
f"https://api.github.com/repos/{org}/{repository}/releases?per_page=2"
)
if _releases.status_code == 200:
releases = _releases.json()
if any(releases):
since = releases[1]['created_at']
until = releases[0]['created_at']
else: else:
raise ValueError("No releases found") target_version += "0"
_response = await self.httpx_client.get( target_version = int(target_version)
f"https://api.github.com/repos/{org}/{repository}/commits?path={path}&since={since}&until={until}" current_version = int(current_version)
)
if _response.status_code == 200: for release in releases:
response = _response.json() if target_version > current_version and release['tag_name'] > current_version:
commits += release['body']
async def get_commit_data(commit: dict) -> dict: elif target_version < current_version and release['tag_name'] == target_version:
return {'sha': commit['sha'], commits += release['body']
'author': commit['commit']['author']['name'],
'date': commit['commit']['author']['date'],
'message': commit['commit']['message'],
'url': commit['html_url']
}
data: list = await asyncio.gather(*[get_commit_data(commit) for commit in response])
payload['commits'].append(data)
else: else:
raise ValueError("Error retrieving commits") break
else: # commits need cleanup
raise ValueError("Invalid organization.") return commits
return payload

View File

@ -1,4 +1,5 @@
from fastapi import APIRouter, Request, Response
from fastapi import APIRouter
from fastapi_cache.decorator import cache from fastapi_cache.decorator import cache
from app.dependencies import load_config from app.dependencies import load_config
from app.controllers.Releases import Releases from app.controllers.Releases import Releases
@ -10,16 +11,18 @@ releases = Releases()
config: dict = load_config() config: dict = load_config()
@router.get('/changelogs/{org}/{repo}', response_model=ResponseModels.ChangelogsResponseModel, tags=['ReVanced Tools']) @router.get('/commits/{repository}/{current_version}/{target_tag}', response_model=ResponseModels.ChangelogsResponseModel, tags=['ReVanced Tools'])
@cache(config['cache']['expire']) @cache(config['cache']['expire'])
async def changelogs(request: Request, response: Response, org: str, repo: str, path: str) -> dict: async def commits(repository: str, current_version: str, target_tag: str = "latest") -> str:
"""Get the latest changes from a repository. """Get commit history from a given repository.
Args:
repository (str): Repository name
current_version (str): current version(vx.x.x) installed
target_tag (str): lateset(default), prerelease, recent, tag_name
Returns: Returns:
json: list of commits str: string containing the repository's commits between version
""" """
return await releases.get_commits(
org=org, return await releases.get_commits(repository, current_version, target_tag)
repository=repo,
path=path
)