-
Notifications
You must be signed in to change notification settings - Fork 2
/
slackware-dependency-resolver.py
executable file
·92 lines (65 loc) · 3.02 KB
/
slackware-dependency-resolver.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
#!/usr/bin/python3
import sys
import json
"""
Slackware Dependency Resolver (SDR)
Author: Milad As (Ravexina)
Github: https://github.com/ravexina/slackware-dependency-resolver
The script relies on a list of dependencies provided by salixos.org
==============================================================================
THE SCRIPT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
==============================================================================
"""
class DependencyResolver:
def __init__(self):
file = open('./slackware-packages.json')
self.packages = json.load(file)
file.close()
# Reform data as a key [package] pair [deps] dictionary
self.packages_data = {}
for pkg in self.packages['packages']:
try:
self.packages_data[pkg['name']] = pkg['deps']
except:
self.packages_data[pkg['name']] = []
self.queue = [] # List of actual dependencies
self.checked = [] # To skip checking packages we already have checked
def first_degree_depends(self, pkg_name):
deps = self.packages_data[pkg_name]
# Check for multiple options which come as a list. like: [openssl-solibs, openssl]
dep_lst = []
for dep in deps:
# Multiple options as a dependency is available
if type(dep) is type([]):
# Skip asking for options that one already have been selected from
# to avoid re-prompting about same options over and over
if not set(dep).isdisjoint(self.queue):
continue
# Show a list of available options to user to select from
print('Seems there are options to choose from for "' + pkg_name + '":')
for index, name in enumerate(dep):
print('[' + str(index) + ']', name)
choice = int(input('\nWhich one do you choose? '))
dep_lst.append(dep[choice])
else:
dep_lst.append(dep)
return dep_lst
def recursive_depends(self, *pkgs_names):
for pkg in pkgs_names:
self.queue.extend(self.first_degree_depends(pkg))
self.checked.append(pkg)
new_pkgs = set(self.queue) - set(self.checked)
if len(new_pkgs) > 0:
# There are still packages that we did not check their chain of dependencies
self.recursive_depends(*new_pkgs)
return set(self.queue)
package_name = sys.argv[1]
dependency_resolver = DependencyResolver()
dep_list = dependency_resolver.recursive_depends(package_name)
print(dep_list)