aboutsummaryrefslogtreecommitdiff
blob: 8b1a6507b135d8186b4cd40dedd477f567ada8cb (plain)
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
"""
A package source module to import packages from filesystem locations (ebuilds)
"""

import os

from os import path
from shutil import copy2
from tempfile import mkdtemp

from pomu.package import Package
from pomu.source import dispatcher
from pomu.source.portage import cpv_split, ver_str
from pomu.util.query import query
from pomu.util.result import Result

class LocalEbuild():
    """A class to represent a local ebuild"""
    __name__ = 'fs'
    
    # slots?
    def __init__(self, category, name, version, path):
        self.category = category
        self.name = name
        self.version = version
        self.path = path

    def fetch(self):
        root = mkdtemp()
        pkgpath = path.join(root, self.category, self.name)
        os.makedirs(pkgpath)
        copy2(self.path, pkgpath)
        return Package(self, self.name, root, self.category, self.version)
    
    @staticmethod
    def from_data_file(path):
        with open(path, 'r') as f:
            return LocalEbuildSource.parse_ebuild_path(f.readline()).unwrap()

    def write_meta(self, pkgdir):
        with open(path.join(pkgdir, 'FS_ORIG_PATH'), 'w') as f:
            f.write(self.path + '\n')

    def __str__(self):
        return '{}/{}-{} (from {})'.format(self.category, self.name, self.version, self.path)

@dispatcher.source
class LocalEbuildSource():
    """The source module responsible for importing local ebuilds"""
    @dispatcher.handler(priority=5)
    def parse_ebuild_path(uri):
        if not path.isfile(uri) or not path.endswith('.ebuild'):
            return Result.Err()
        uri = path.abspath(uri)
        dirn, basen = path.split(uri)
        basen = basen[:-7]
        _, name, v1, v2, v3 = cpv_split(basen)
        ver = ver_str(v1, v2, v3)
        parent = dirn.split('/')[-1]
        # we need to query the impure world
        # TODO: write a global option which would set the impure values non-interactively
        if not ver:
            ver = query('version', 'Please specify package version for {}'.format(basen)).expect()
        category = query('category', 'Please enter category for {}'.format(basen), parent).expect()
        return Result.Ok(LocalEbuild(category, name, ver, uri))

    @dispatcher.handler()
    def parse_full(uri):
        if not uri.startswith('fs:'):
            return Result.Err()
        return LocalEbuildSource.parse_ebuild_path(uri)