/
updates.py
133 lines (119 loc) · 4.17 KB
/
updates.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
""" This file is licensed under GPLv3, see https://www.gnu.org/licenses/ """
from datetime import datetime
from typing import List, Tuple, Optional
from .i18n import _n
from .version import compare_versions
from .pacman import (
PackageDB,
find_packages_not_from_repo, find_upgradeable_packages,
)
from .aur import AURPackageInfo, find_aur_packages
from .pprint import print_stderr
from .args import PikaurArgs
from .config import PikaurConfig
from .core import InstallInfo
from .exceptions import PackagesNotFoundInRepo
DEVEL_PKGS_POSTFIXES = (
'-git',
'-svn',
'-bzr',
'-hg',
'-cvs',
'-nightly',
)
def is_devel_pkg(pkg_name: str) -> bool:
result = False
for devel_pkg_postfix in DEVEL_PKGS_POSTFIXES:
if pkg_name.endswith(devel_pkg_postfix):
result = True
break
return result
def get_remote_package_version(new_pkg_name: str) -> Optional[str]:
try:
repo_pkg = PackageDB.find_repo_package(new_pkg_name)
except PackagesNotFoundInRepo:
aur_packages, _not_found = find_aur_packages([new_pkg_name])
if aur_packages:
return aur_packages[0].version
return None
else:
return repo_pkg.version
def find_repo_upgradeable() -> List[InstallInfo]:
all_local_pkgs = PackageDB.get_local_dict()
repo_packages_updates = []
for repo_pkg in find_upgradeable_packages():
local_pkg = all_local_pkgs[repo_pkg.name]
repo_packages_updates.append(
InstallInfo(
name=local_pkg.name,
new_version=repo_pkg.version,
current_version=local_pkg.version,
description=repo_pkg.desc,
repository=repo_pkg.db.name,
package=repo_pkg,
)
)
return repo_packages_updates
def find_aur_devel_updates(
aur_pkgs_info: List[AURPackageInfo],
package_ttl_days: int
) -> List[InstallInfo]:
local_packages = PackageDB.get_local_dict()
now = datetime.now()
aur_updates = []
for aur_pkg in sorted(aur_pkgs_info, key=lambda x: x.name):
pkg_name = aur_pkg.name
if not is_devel_pkg(pkg_name):
continue
local_pkg = local_packages[pkg_name]
pkg_install_datetime = datetime.fromtimestamp(
local_pkg.installdate
)
pkg_age_days = (now - pkg_install_datetime).days
if pkg_age_days >= package_ttl_days:
aur_updates.append(InstallInfo(
name=pkg_name,
current_version=local_pkg.version,
new_version='devel',
description=aur_pkg.desc,
devel_pkg_age_days=pkg_age_days,
package=aur_pkg,
))
return aur_updates
def find_aur_updates(args: PikaurArgs) -> Tuple[List[InstallInfo], List[str]]:
package_names = find_packages_not_from_repo()
print_stderr(_n(
"Reading AUR package info...",
"Reading AUR packages info...",
len(package_names)
))
aur_pkgs_info, not_found_aur_pkgs = find_aur_packages(package_names)
local_packages = PackageDB.get_local_dict()
aur_updates = []
aur_pkgs_up_to_date = []
for aur_pkg in aur_pkgs_info:
pkg_name = aur_pkg.name
aur_version = aur_pkg.version
current_version = local_packages[pkg_name].version
compare_aur_pkg = compare_versions(current_version, aur_version)
if compare_aur_pkg < 0:
aur_updates.append(InstallInfo(
name=pkg_name,
new_version=aur_version,
current_version=current_version,
description=aur_pkg.desc,
package=aur_pkg,
))
else:
aur_pkgs_up_to_date.append(aur_pkg)
if aur_pkgs_up_to_date:
sync_config = PikaurConfig().sync
devel_packages_expiration = sync_config.get_int('DevelPkgsExpiration')
if args.devel:
devel_packages_expiration = 0
if devel_packages_expiration > -1:
aur_updates += find_aur_devel_updates(
aur_pkgs_up_to_date,
package_ttl_days=devel_packages_expiration
)
return aur_updates, not_found_aur_pkgs