-
Notifications
You must be signed in to change notification settings - Fork 24
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #53 from TingPing/archlinux
Add initial support for Archlinux
- Loading branch information
Showing
9 changed files
with
166 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,6 +32,7 @@ | |
'tracer.packageManagers', | ||
'tracer.resources', | ||
'tracer.views', | ||
'tracer.views.resource', | ||
'data', | ||
], | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
from .__meta__ import * | ||
try: | ||
from tracer.packageManagers.ipackageManager import IPackageManager | ||
from tracer.packageManagers.alpm import Alpm | ||
except ImportError: pass | ||
|
||
@unittest.skipIf(DISTRO != "arch", "Skipping tests because they are distro-specific") | ||
class TestAlpm(unittest.TestCase): | ||
def setUp(self): | ||
self.manager = Alpm() | ||
|
||
def test_implements_package_manager_interface(self): | ||
self.assertIsInstance(self.manager, IPackageManager, "Every package manager should inherit from IPackageManager") | ||
|
||
def test_package_newer_than_implemented(self): | ||
try: self.manager.packages_newer_than(0) | ||
except NotImplementedError: self.fail("packages_newer_than() is not implemented!") | ||
except Exception: pass | ||
|
||
def test_load_package_info(self): | ||
try: self.manager.load_package_info("") | ||
except NotImplementedError: self.fail("load_package_info() is not implemented!") | ||
except Exception: pass | ||
|
||
def test_package_files_implemented(self): | ||
try: self.manager.package_files("") | ||
except NotImplementedError: self.fail("packages_files() is not implemented!") | ||
except Exception: pass | ||
|
||
def test_provided_by(self): | ||
try: self.manager.provided_by("") | ||
except NotImplementedError: self.fail("provided_by() is not implemented!") | ||
except Exception: pass | ||
|
||
|
||
if __name__ == '__main__': | ||
unittest.main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
#-*- coding: utf-8 -*- | ||
# alpm.py | ||
# | ||
# Copyright (C) 2016 Patrick Griffis <tingping@tingping.se> | ||
# | ||
# This copyrighted material is made available to anyone wishing to use, | ||
# modify, copy, or redistribute it subject to the terms and conditions of | ||
# the GNU General Public License v.2, or (at your option) any later version. | ||
# This program is distributed in the hope that it will be useful, but WITHOUT | ||
# ANY WARRANTY expressed or implied, including the implied warranties of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ||
# Public License for more details. You should have received a copy of the | ||
# GNU General Public License along with this program; if not, write to the | ||
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
# 02110-1301, USA. | ||
# | ||
|
||
from __future__ import absolute_import | ||
|
||
from tracer.resources.system import System | ||
if System.distribution() in ["arch"]: | ||
|
||
import bisect | ||
from .ipackageManager import IPackageManager | ||
from tracer.resources.package import Package | ||
from tracer.resources.collections import PackagesCollection | ||
from tracer.resources.applications import Applications | ||
import pyalpm | ||
|
||
class Alpm(IPackageManager): | ||
|
||
def __init__(self, *args, **kwargs): | ||
self.opts = kwargs | ||
self.handle = pyalpm.Handle('/', '/var/lib/pacman') | ||
self.db = self.handle.get_localdb() | ||
|
||
def packages_newer_than(self, unix_time): | ||
""" | ||
Returns list of packages which were modified between unix_time and present | ||
""" | ||
new_pkgs = PackagesCollection() | ||
for pkg in self.db.pkgcache: | ||
if pkg.installdate > unix_time: | ||
new_pkgs.append(Package(pkg.name, pkg.installdate)) | ||
|
||
return new_pkgs | ||
|
||
def package_files(self, pkg_name): | ||
""" | ||
Returns list of files provided by package | ||
""" | ||
pkg = self.db.get_pkg(pkg_name) | ||
if not pkg: | ||
return [] | ||
|
||
return ['/' + f[0] for f in pkg.files] | ||
|
||
def load_package_info(self, package): | ||
""" | ||
From database load informations about given package and set them to it | ||
""" | ||
if not package: | ||
return | ||
|
||
pkg = self.db.get_pkg(package.name) | ||
if not pkg: | ||
return | ||
|
||
package.description = pkg.desc | ||
package.modified = pkg.installdate | ||
# Don't have categories | ||
|
||
def provided_by(self, app_name): | ||
""" | ||
Returns name of package which provides given application | ||
""" | ||
# We need a full path to the binary | ||
process = Applications.find(app_name).instances[0] | ||
return self._file_provided_by(process.exe) | ||
|
||
@staticmethod | ||
def _bsearch_list(l, item): | ||
""" | ||
Searches a sorted list, returns True if found | ||
""" | ||
i = bisect.bisect_left(l, item) | ||
if i != len(l) and l[i] == item: | ||
return True | ||
else: | ||
return False | ||
|
||
def _file_provided_by(self, file_name): | ||
""" | ||
Returns name of package which provides given file | ||
""" | ||
# This is a bit slow | ||
for pkg in self.db.pkgcache: | ||
files = [f[0] for f in pkg.files] | ||
if self._bsearch_list(files, file_name[1:]): | ||
return Package(pkg.name, pkg.installdate) | ||
else: | ||
return None | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters