Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
altlinux-packages-bot
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kirill Unitsaev
altlinux-packages-bot
Commits
3f2f4a62
Verified
Commit
3f2f4a62
authored
Jul 20, 2025
by
Kirill Unitsaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
altrepo.parser: add packages.ftbfs parser
parent
c066010e
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
123 additions
and
4 deletions
+123
-4
methods.py
src/altrepo/api/methods.py
+16
-0
models.py
src/altrepo/api/models.py
+13
-2
methods.py
src/altrepo/parser/methods.py
+15
-1
models.py
src/altrepo/parser/models.py
+7
-0
__init__.py
src/altrepo/parser/packages/__init__.py
+1
-0
ftbfs.py
src/altrepo/parser/packages/ftbfs.py
+16
-0
ftbfs.py
src/handlers/ftbfs.py
+46
-0
news.py
src/handlers/news.py
+9
-1
No files found.
src/altrepo/api/methods.py
View file @
3f2f4a62
...
...
@@ -86,6 +86,21 @@ class PackagesetInfo:
return
models
.
RepositoryStatisticsModel
(
**
data
)
class
AclInfo
:
def
__init__
(
self
,
client
:
BaseAPI
):
self
.
client
=
client
async
def
groups
(
self
,
branch
:
str
,
name
:
str
|
None
=
None
):
data
=
{
"branch"
:
branch
}
if
name
:
data
[
"name"
]
=
name
data
=
await
self
.
client
.
get
(
"/acl/groups"
,
data
)
return
models
.
AclGroupsModel
(
**
data
)
class
BugInfo
:
def
__init__
(
self
,
client
:
BaseAPI
):
self
.
client
=
client
...
...
@@ -155,6 +170,7 @@ class ALTRepoAPI:
self
.
api
=
APIInfo
(
self
.
_client
)
self
.
package
=
PackageInfo
(
self
.
_client
)
self
.
packageset
=
PackagesetInfo
(
self
.
_client
)
self
.
acl
=
AclInfo
(
self
.
_client
)
self
.
bug
=
BugInfo
(
self
.
_client
)
self
.
file
=
FileInfo
(
self
.
_client
)
self
.
site
=
SiteInfo
(
self
.
_client
)
...
...
src/altrepo/api/models.py
View file @
3f2f4a62
...
...
@@ -128,4 +128,16 @@ class FilesElementModel(BaseModel):
class
FilesModel
(
BaseModel
):
request_args
:
Dict
[
str
,
Any
]
length
:
int
files
:
List
[
FilesElementModel
]
\ No newline at end of file
files
:
List
[
FilesElementModel
]
class
AclGroupsElementModel
(
BaseModel
):
group
:
str
date
:
str
maintainers
:
List
[
str
]
class
AclGroupsModel
(
BaseModel
):
request_args
:
Dict
[
str
,
Any
]
length
:
int
groups
:
List
[
AclGroupsElementModel
]
src/altrepo/parser/methods.py
View file @
3f2f4a62
import
aiohttp
from
typing
import
List
from
.
import
models
from
.news
import
urls_parser
,
packages_parser
,
bugs_parser
from
.packages
import
ftbfs_parser
class
BaseParser
:
...
...
@@ -35,7 +38,7 @@ class NewsInfo:
return
None
html
=
await
self
.
client
.
get
(
url
,
"koi8-r"
)
return
await
packages_parser
(
html
,
url
)
async
def
p11
(
self
)
->
models
.
PackagesModel
|
None
:
url
=
(
await
self
.
news_urls
())
.
p11
if
not
url
:
...
...
@@ -44,7 +47,18 @@ class NewsInfo:
return
await
packages_parser
(
html
,
url
)
class
PackagesInfo
:
def
__init__
(
self
,
client
:
BaseParser
):
self
.
client
=
client
async
def
ftbfs
(
self
)
->
List
[
models
.
FTBFSModel
]:
url
=
"https://git.altlinux.org/beehive/stats/Sisyphus-x86_64/ftbfs-joined"
text
=
await
self
.
client
.
get
(
url
)
return
await
ftbfs_parser
(
text
)
class
ALTRepoParser
:
def
__init__
(
self
,
session
:
aiohttp
.
ClientSession
):
self
.
_client
=
BaseParser
(
session
)
self
.
news
=
NewsInfo
(
self
.
_client
)
self
.
packages
=
PackagesInfo
(
self
.
_client
)
src/altrepo/parser/models.py
View file @
3f2f4a62
...
...
@@ -44,3 +44,10 @@ class PackagesModel(BaseModel):
added
:
List
[
PackageElementModel
]
|
None
=
None
removed
:
List
[
RemovedPackageElementModel
]
|
None
=
None
updated
:
List
[
PackageElementModel
]
|
None
=
None
class
FTBFSModel
(
BaseModel
):
name
:
str
version
:
str
ftbfs_weeks
:
int
maintainers
:
List
[
str
]
src/altrepo/parser/packages/__init__.py
0 → 100644
View file @
3f2f4a62
from
.ftbfs
import
ftbfs_parser
src/altrepo/parser/packages/ftbfs.py
0 → 100644
View file @
3f2f4a62
from
..
import
models
async
def
ftbfs_parser
(
text
:
str
):
packages
=
[]
for
line
in
text
.
strip
()
.
splitlines
():
parts
=
line
.
split
(
'
\t
'
)
if
len
(
parts
)
!=
4
:
continue
name
,
version
,
weeks
,
maintainers
=
parts
packages
.
append
(
models
.
FTBFSModel
(
name
=
name
,
version
=
version
,
ftbfs_weeks
=
int
(
weeks
),
maintainers
=
maintainers
.
split
(
','
),
))
return
packages
src/handlers/ftbfs.py
0 → 100644
View file @
3f2f4a62
from
telegrinder
import
Dispatch
,
Message
from
telegrinder.rules
import
Command
,
Argument
from
altrepo
import
altrepo
from
database.models
import
User
dp
=
Dispatch
()
@dp.message
(
Command
(
"ftbfs"
,
Argument
(
"maintainer"
,
optional
=
True
)))
async
def
ftbfs_handler
(
m
:
Message
,
user
:
User
|
None
,
maintainer
:
str
|
None
=
None
)
->
None
:
if
maintainer
:
maintainer
=
maintainer
.
lower
()
group_data
=
await
altrepo
.
api
.
acl
.
groups
(
"sisyphus"
)
maintainer_data
=
await
altrepo
.
api
.
site
.
all_maintainers
(
"sisyphus"
)
if
not
any
(
_m
.
packager_nickname
==
maintainer
for
_m
in
maintainer_data
.
maintainers
)
and
not
any
(
_g
.
group
==
maintainer
for
_g
in
group_data
.
groups
)
and
not
maintainer
in
[
"@nobody"
]:
await
m
.
answer
(
f
"Сопровождающий или группа {maintainer} не найдены."
)
return
else
:
if
user
:
maintainer
=
user
.
maintainer
else
:
return
ftbfs_data
=
await
altrepo
.
parser
.
packages
.
ftbfs
()
maintainer_ftbfs
=
[
package
for
package
in
ftbfs_data
if
maintainer
in
package
.
maintainers
]
if
not
len
(
maintainer_ftbfs
):
await
m
.
answer
(
"Нет не пересобирающихся пакетов"
)
return
ftbfs_message
=
"Ошибки пересборки:
\n\n
"
for
package
in
maintainer_ftbfs
:
ftbfs_message
+=
f
"{package.name} | {package.ftbfs_weeks} | {"
,
".join(package.maintainers)}
\n
"
await
m
.
answer
(
ftbfs_message
)
src/handlers/news.py
View file @
3f2f4a62
from
telegrinder
import
Dispatch
,
Message
from
telegrinder.rules
import
Command
,
Argument
from
telegrinder.node
import
Error
from
altrepo
import
altrepo
...
...
@@ -19,6 +18,15 @@ async def news_handler(m: Message, news_type: str | None, translate: str | None)
return
bugs
=
await
format_bugs
(
bugs_data
)
await
m
.
answer
(
bugs
)
elif
news_type
==
"ftbfs"
:
ftbfs_data
=
await
altrepo
.
parser
.
packages
.
ftbfs
()
if
not
ftbfs_data
:
await
m
.
answer
(
"ftbfs нет."
)
return
message
=
""
for
package
in
ftbfs_data
:
message
+=
f
"{package.name} | {package.ftbfs_weeks}
\n
"
await
m
.
answer
(
message
)
else
:
if
news_type
==
"sisyphus"
:
packages_data
=
await
altrepo
.
parser
.
news
.
sisyphus
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment