Skip to content
This repository was archived by the owner on Jun 23, 2024. It is now read-only.

Commit 5b192c0

Browse files
committed
Filter tracks based on latest push date
1 parent 3ebbda4 commit 5b192c0

File tree

6 files changed

+80
-82
lines changed

6 files changed

+80
-82
lines changed

Diff for: sync/cli/Main.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from datetime import datetime
77
from pathlib import Path
88

9+
from dateutil.parser import parse
10+
911
from .Parameters import Parameters
1012
from .TypeDict import ConfigDict, TrackDict
1113
from ..core import (
@@ -219,7 +221,8 @@ def github(cls) -> int:
219221
tracks = GithubTracks(
220222
modules_folder=modules_folder,
221223
config=config,
222-
api_token=cls._args.api_token
224+
api_token=cls._args.api_token,
225+
after_date=parse(cls._args.after_date).date()
223226
)
224227

225228
if cls._args.update:
@@ -250,6 +253,9 @@ def github(cls) -> int:
250253
use_ssh=cls._args.ssh
251254
)
252255

256+
if cls._args.clear:
257+
tracks.clear_tracks()
258+
253259
return cls.CODE_SUCCESS
254260

255261
@classmethod

Diff for: sync/cli/Parameters.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,15 @@ def configure_parser_github(cls, sub_parsers):
246246
default=Index.latest_version,
247247
help="Version of the index file ({0}), default: {1}.".format(ModulesJson.filename(), "%(default)s")
248248
)
249+
p.add_argument(
250+
"-d",
251+
"--date",
252+
dest="after_date",
253+
metavar="DATE",
254+
type=str,
255+
default="2016-09-08",
256+
help="Filter latest push date (before it), default: {0}.".format("%(default)s")
257+
)
249258
p.add_argument(
250259
"-S",
251260
"--ssh",
@@ -263,6 +272,11 @@ def configure_parser_github(cls, sub_parsers):
263272
action="store_true",
264273
help="Update modules to the latest version."
265274
)
275+
p.add_argument(
276+
"--clear",
277+
action="store_true",
278+
help="Remove tracks, exclude those in the current session."
279+
)
266280

267281
cls.add_parser_git(p)
268282
env = cls.add_parser_env(p, add_quiet=True)
@@ -415,7 +429,7 @@ def add_parser_git(cls, p, add_set_size=True):
415429
metavar="MAX_SIZE",
416430
type=float,
417431
default=50.0,
418-
help="Limit size of file, default: {0} MB.".format("%(default)s")
432+
help="Filter size of file (less than it), default: {0} MB.".format("%(default)s")
419433
)
420434

421435
return git

Diff for: sync/core/Sync.py

+3-9
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,12 @@ def _check_tracks(obj, cls):
9797

9898
return isinstance(obj, cls)
9999

100-
def create_github_tracks(self, api_token):
100+
def create_github_tracks(self, api_token, after_date=None):
101101
self._tracks = GithubTracks(
102102
modules_folder=self._modules_folder,
103103
config=self._config,
104-
api_token=api_token
104+
api_token=api_token,
105+
after_date=after_date
105106
)
106107
return self._tracks
107108

@@ -112,13 +113,6 @@ def create_local_tracks(self):
112113
)
113114
return self._tracks
114115

115-
def create_tracks(self, **kwargs):
116-
api_token = kwargs.get("api_token")
117-
if api_token is not None:
118-
return self.create_github_tracks(api_token)
119-
else:
120-
return self.create_local_tracks()
121-
122116
def update(self, module_ids=None, force=False, **kwargs):
123117
user_name = kwargs.get("user_name")
124118
if user_name is not None:

Diff for: sync/core/Sync.pyi

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import date
12
from pathlib import Path
23
from typing import Optional, List
34

@@ -25,8 +26,7 @@ class Sync:
2526
def _update_jsons(self, track: TrackJson, force: bool) -> Optional[OnlineModule]: ...
2627
@staticmethod
2728
def _check_tracks(obj: BaseTracks, cls: type) -> bool: ...
28-
def create_github_tracks(self, api_token: str) -> BaseTracks: ...
29+
def create_github_tracks(self, api_token: str, after_date: Optional[date] = ...) -> BaseTracks: ...
2930
def create_local_tracks(self) -> BaseTracks: ...
30-
def create_tracks(self, **kwargs) -> BaseTracks: ...
3131
def update(self, module_ids: Optional[List[str]] = ..., force: bool = ..., **kwargs): ...
3232
def push_by_git(self, branch: str): ...

Diff for: sync/track/GithubTracks.py

+40-61
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
import concurrent.futures
2+
import shutil
23
from concurrent.futures import ThreadPoolExecutor
4+
from datetime import date
35

4-
import requests
56
from github import Github, Auth, UnknownObjectException
67
from github.Repository import Repository
78

89
from .BaseTracks import BaseTracks
910
from .LocalTracks import LocalTracks
1011
from ..error import MagiskModuleError, Result
1112
from ..model import TrackJson
12-
from ..utils import Log, StrUtils
13+
from ..utils import Log, GitHubGraphQLAPI
1314

1415

1516
class GithubTracks(BaseTracks):
16-
def __init__(self, modules_folder, config, *, api_token):
17+
def __init__(self, modules_folder, config, *, api_token, after_date=None):
1718
self._log = Log("GithubTracks", enable_log=config.enable_log, log_dir=config.log_dir)
1819
self._modules_folder = modules_folder
1920

21+
if after_date is None:
22+
after_date = date(2016, 9, 8)
23+
2024
self._api_token = api_token
25+
self._after_date = after_date
2126
self._github = Github(auth=Auth.Token(api_token))
27+
self._graphql_api = GitHubGraphQLAPI(api_token=api_token)
2228
self._tracks = list()
2329

2430
@Result.catching()
@@ -41,18 +47,28 @@ def _get_from_repo_common(self, repo: Repository, use_ssh):
4147
else:
4248
issues = ""
4349

44-
donate_urls = self.get_sponsor_url(self._api_token, repo)
50+
donate_urls = self._graphql_api.get_sponsor_url(
51+
owner=repo.owner.login,
52+
name=repo.name
53+
)
4554
if len(donate_urls) == 0:
4655
donate = ""
4756
else:
4857
donate = donate_urls[0]
4958

59+
homepage = self._graphql_api.get_homepage_url(
60+
owner=repo.owner.login,
61+
name=repo.name
62+
)
63+
if homepage is None:
64+
homepage = repo.html_url
65+
5066
return TrackJson(
5167
id=repo.name,
5268
update_to=update_to,
5369
license=self.get_license(repo),
5470
changelog=changelog,
55-
homepage=self.get_homepage_url(self._api_token, repo),
71+
homepage=homepage,
5672
source=repo.clone_url,
5773
support=issues,
5874
donate=donate
@@ -61,6 +77,18 @@ def _get_from_repo_common(self, repo: Repository, use_ssh):
6177
def _get_from_repo(self, repo, cover, use_ssh):
6278
self._log.d(f"_get_from_repo: repo_name = {repo.name}")
6379

80+
pushed_at = self._graphql_api.get_pushed_at(
81+
owner=repo.owner.login,
82+
name=repo.name
83+
)
84+
if pushed_at is None:
85+
return None
86+
87+
if pushed_at.date() < self._after_date:
88+
msg = f"pushed at {pushed_at.date()}, too old"
89+
self._log.w(f"_get_from_repo: [{repo.name}] -> {msg}")
90+
return None
91+
6492
result = self._get_from_repo_common(repo, use_ssh)
6593
if result.is_failure:
6694
msg = Log.get_msg(result.error)
@@ -111,6 +139,13 @@ def get_tracks(self, user_name, repo_names=None, *, cover=False, use_ssh=True):
111139
self._log.i(f"get_tracks: size = {self.size}")
112140
return self._tracks
113141

142+
def clear_tracks(self):
143+
names = [track.id for track in self._tracks]
144+
for module_folder in self._modules_folder.glob("*/"):
145+
if module_folder.name not in names:
146+
self._log.i(f"clear_tracks: [{module_folder.name}] -> removed")
147+
shutil.rmtree(module_folder, ignore_errors=True)
148+
114149
@property
115150
def size(self):
116151
return self._tracks.__len__()
@@ -148,59 +183,3 @@ def is_module_repo(cls, repo):
148183
return True
149184
except UnknownObjectException:
150185
return False
151-
152-
@classmethod
153-
def _graphql_query(cls, api_token, query):
154-
query = {"query": query}
155-
156-
response = requests.post(
157-
url="https://api.github.com/graphql",
158-
headers={
159-
"Authorization": f"bearer {api_token}",
160-
"Content-Type": "application/json",
161-
},
162-
json=query
163-
)
164-
165-
if response.ok:
166-
return response.json()
167-
else:
168-
return None
169-
170-
@classmethod
171-
def get_sponsor_url(cls, api_token, repo):
172-
params = "owner: \"{}\", name: \"{}\"".format(repo.owner.login, repo.name)
173-
query = "query { repository(%s) { fundingLinks { platform url } } }" % params
174-
result = cls._graphql_query(api_token, query)
175-
if result is None:
176-
return list()
177-
178-
links = list()
179-
data = result["data"]
180-
repository = data["repository"]
181-
funding_links = repository["fundingLinks"]
182-
183-
for item in funding_links:
184-
if item["platform"] == "GITHUB":
185-
name = item["url"].split("/")[-1]
186-
links.append(f"https://github.com/sponsors/{name}")
187-
else:
188-
links.append(item["url"])
189-
190-
return links
191-
192-
@classmethod
193-
def get_homepage_url(cls, api_token, repo):
194-
params = "owner: \"{}\", name: \"{}\"".format(repo.owner.login, repo.name)
195-
query = "query { repository(%s) { homepageUrl } }" % params
196-
result = cls._graphql_query(api_token, query)
197-
if result is None:
198-
return repo.html_url
199-
200-
data = result["data"]
201-
repository = data["repository"]
202-
homepage_url = repository["homepageUrl"]
203-
if StrUtils.is_not_none(homepage_url):
204-
return homepage_url
205-
else:
206-
return repo.html_url

Diff for: sync/track/GithubTracks.pyi

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import date
12
from pathlib import Path
23
from typing import Optional, List
34

@@ -7,17 +8,26 @@ from github.Repository import Repository
78
from .BaseTracks import BaseTracks
89
from ..error import Result
910
from ..model import TrackJson, ConfigJson
10-
from ..utils import Log
11+
from ..utils import Log, GitHubGraphQLAPI
1112

1213

1314
class GithubTracks(BaseTracks):
1415
_log: Log
1516
_modules_folder: Path
1617
_api_token: str
18+
_after_date: date
1719
_github: Github
20+
_graphql_api: GitHubGraphQLAPI
1821
_tracks: List[TrackJson]
1922

20-
def __init__(self, modules_folder: Path, config: ConfigJson, *, api_token: str): ...
23+
def __init__(
24+
self,
25+
modules_folder: Path,
26+
config: ConfigJson,
27+
*,
28+
api_token: str,
29+
after_date: Optional[date] = ...
30+
): ...
2131
@Result.catching()
2232
def _get_from_repo_common(self, repo: Repository, use_ssh: bool) -> Result: ...
2333
def _get_from_repo(self, repo: Repository, cover: bool, use_ssh: bool) -> Optional[TrackJson]: ...
@@ -37,6 +47,7 @@ class GithubTracks(BaseTracks):
3747
cover: bool = ...,
3848
use_ssh: bool = ...
3949
) -> List[TrackJson]: ...
50+
def clear_tracks(self): ...
4051
@property
4152
def size(self) -> int: ...
4253
@property
@@ -47,9 +58,3 @@ class GithubTracks(BaseTracks):
4758
def get_changelog(cls, repo: Repository) -> str: ...
4859
@classmethod
4960
def is_module_repo(cls, repo: Repository) -> bool: ...
50-
@classmethod
51-
def _graphql_query(cls, api_token: str, query: str) -> Optional[dict]: ...
52-
@classmethod
53-
def get_sponsor_url(cls, api_token: str, repo: Repository) -> List[str]: ...
54-
@classmethod
55-
def get_homepage_url(cls, api_token: str, repo: Repository) -> str: ...

0 commit comments

Comments
 (0)