diff options
| -rw-r--r-- | bitbake-dev/lib/bb/cache.py | 2 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/cooker.py | 1 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/fetch/__init__.py | 5 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/fetch/git.py | 13 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/fetch/hg.py | 10 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/fetch/osc.py | 155 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/parse/__init__.py | 4 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/providers.py | 1 | ||||
| -rw-r--r-- | bitbake-dev/lib/bb/utils.py | 37 | 
9 files changed, 214 insertions, 14 deletions
| diff --git a/bitbake-dev/lib/bb/cache.py b/bitbake-dev/lib/bb/cache.py index bcf393a578..fe38ea0aee 100644 --- a/bitbake-dev/lib/bb/cache.py +++ b/bitbake-dev/lib/bb/cache.py @@ -39,7 +39,7 @@ except ImportError:      import pickle      bb.msg.note(1, bb.msg.domain.Cache, "Importing cPickle failed. Falling back to a very slow implementation.") -__cache_version__ = "128" +__cache_version__ = "129"  class Cache:      """ diff --git a/bitbake-dev/lib/bb/cooker.py b/bitbake-dev/lib/bb/cooker.py index c92ad70a2c..8eb1a410f2 100644 --- a/bitbake-dev/lib/bb/cooker.py +++ b/bitbake-dev/lib/bb/cooker.py @@ -758,6 +758,7 @@ class BBCooker:          self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) )          bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files") +        bb.data.renameVar("__depends", "__base_depends", self.configuration.data)          (filelist, masked) = self.collect_bbfiles()          self.parse_bbfiles(filelist, masked)          bb.msg.debug(1, bb.msg.domain.Collection, "parsing complete") diff --git a/bitbake-dev/lib/bb/fetch/__init__.py b/bitbake-dev/lib/bb/fetch/__init__.py index c3bea447c1..721eb4d646 100644 --- a/bitbake-dev/lib/bb/fetch/__init__.py +++ b/bitbake-dev/lib/bb/fetch/__init__.py @@ -49,6 +49,9 @@ class ParameterError(Exception):  class MD5SumError(Exception):      """Exception raised when a MD5SUM of a file does not match the expected one""" +class InvalidSRCREV(Exception): +    """Exception raised when an invalid SRCREV is encountered""" +  def uri_replace(uri, uri_find, uri_replace, d):  #   bb.msg.note(1, bb.msg.domain.Fetcher, "uri_replace: operating on %s" % uri)      if not uri or not uri_find or not uri_replace: @@ -425,6 +428,8 @@ class Fetch(object):              rev = data.getVar("SRCREV_pn-" + pn + "_" + ud.parm['name'], d, 1)          if not rev:              rev = data.getVar("SRCREV", d, 1) +        if rev == "INVALID": +            raise InvalidSRCREV("Please set SRCREV to a valid value")          if not rev:              return False          if rev is "SRCREVINACTION": diff --git a/bitbake-dev/lib/bb/fetch/git.py b/bitbake-dev/lib/bb/fetch/git.py index f4ae724f87..aa26a500c7 100644 --- a/bitbake-dev/lib/bb/fetch/git.py +++ b/bitbake-dev/lib/bb/fetch/git.py @@ -27,15 +27,6 @@ from   bb.fetch import Fetch  from   bb.fetch import FetchError  from   bb.fetch import runfetchcmd -def prunedir(topdir): -    # Delete everything reachable from the directory named in 'topdir'. -    # CAUTION:  This is dangerous! -    for root, dirs, files in os.walk(topdir, topdown=False): -        for name in files: -            os.remove(os.path.join(root, name)) -        for name in dirs: -            os.rmdir(os.path.join(root, name)) -  class Git(Fetch):      """Class to fetch a module or modules from git repositories"""      def supports(self, url, ud, d): @@ -107,7 +98,7 @@ class Git(Fetch):              runfetchcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ), d)          if os.path.exists(codir): -            prunedir(codir) +            bb.utils.prunedir(codir)          bb.mkdirhier(codir)          os.chdir(repodir) @@ -119,7 +110,7 @@ class Git(Fetch):          runfetchcmd("tar -czf %s %s" % (ud.localpath, os.path.join(".", "*") ), d)          os.chdir(repodir) -        prunedir(codir) +        bb.utils.prunedir(codir)      def suppports_srcrev(self):          return True diff --git a/bitbake-dev/lib/bb/fetch/hg.py b/bitbake-dev/lib/bb/fetch/hg.py index ee3bd2f7fe..1cd5a8aa5c 100644 --- a/bitbake-dev/lib/bb/fetch/hg.py +++ b/bitbake-dev/lib/bb/fetch/hg.py @@ -79,7 +79,10 @@ class Hg(Fetch):              host = "/"              ud.host = "localhost" -        hgroot = host + ud.path +        if ud.user == None: +            hgroot = host + ud.path +        else: +            hgroot = ud.user + "@" + host + ud.path          if command is "info":              return "%s identify -i %s://%s/%s" % (basecmd, proto, hgroot, ud.module) @@ -91,7 +94,10 @@ class Hg(Fetch):          if command is "fetch":              cmd = "%s clone %s %s://%s/%s %s" % (basecmd, " ".join(options), proto, hgroot, ud.module, ud.module)          elif command is "pull": -            cmd = "%s pull %s" % (basecmd, " ".join(options)) +            # do not pass options list; limiting pull to rev causes the local +            # repo not to contain it and immediately following "update" command +            # will crash +            cmd = "%s pull" % (basecmd)          elif command is "update":              cmd = "%s update -C %s" % (basecmd, " ".join(options))          else: diff --git a/bitbake-dev/lib/bb/fetch/osc.py b/bitbake-dev/lib/bb/fetch/osc.py new file mode 100644 index 0000000000..2c34caf6c9 --- /dev/null +++ b/bitbake-dev/lib/bb/fetch/osc.py @@ -0,0 +1,155 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +""" +Bitbake "Fetch" implementation for osc (Opensuse build service client). +Based on the svn "Fetch" implementation. + +""" + +import  os +import  sys +import  bb +from    bb       import data +from    bb.fetch import Fetch +from    bb.fetch import FetchError +from    bb.fetch import MissingParameterError +from    bb.fetch import runfetchcmd + +class Osc(Fetch): +    """Class to fetch a module or modules from Opensuse build server  +       repositories.""" + +    def supports(self, url, ud, d): +        """ +        Check to see if a given url can be fetched with osc. +        """ +        return ud.type in ['osc'] + +    def localpath(self, url, ud, d): +        if not "module" in ud.parm: +            raise MissingParameterError("osc method needs a 'module' parameter.") + +        ud.module = ud.parm["module"] + +        # Create paths to osc checkouts +        relpath = ud.path +        if relpath.startswith('/'): +            # Remove leading slash as os.path.join can't cope +            relpath = relpath[1:] +        ud.pkgdir = os.path.join(data.expand('${OSCDIR}', d), ud.host) +        ud.moddir = os.path.join(ud.pkgdir, relpath, ud.module) + +        if 'rev' in ud.parm: +            ud.revision = ud.parm['rev'] +        else: +            pv = data.getVar("PV", d, 0) +            rev = Fetch.srcrev_internal_helper(ud, d) +            if rev and rev != True: +                ud.revision = rev +            else: +                ud.revision = "" + +        ud.localfile = data.expand('%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.path.replace('/', '.'), ud.revision), d) + +        return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) + +    def _buildosccommand(self, ud, d, command): +        """ +        Build up an ocs commandline based on ud +        command is "fetch", "update", "info" +        """ + +        basecmd = data.expand('${FETCHCMD_osc}', d) + +        proto = "ocs" +        if "proto" in ud.parm: +            proto = ud.parm["proto"] +         +        options = [] + +        config = "-c %s" % self.generate_config(ud, d) + +        if ud.revision: +            options.append("-r %s" % ud.revision) + +        coroot = ud.path +        if coroot.startswith('/'): +            # Remove leading slash as os.path.join can't cope +            coroot= coroot[1:] + +        if command is "fetch": +            osccmd = "%s %s co %s/%s %s" % (basecmd, config, coroot, ud.module, " ".join(options)) +        elif command is "update": +            osccmd = "%s %s up %s" % (basecmd, config, " ".join(options)) +        else: +            raise FetchError("Invalid osc command %s" % command) + +        return osccmd + +    def go(self, loc, ud, d): +        """ +        Fetch url +        """ + +        # Try to use the tarball stash +        if Fetch.try_mirror(d, ud.localfile): +            bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping osc checkout." % ud.localpath) +            return + +        bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'") + +        if os.access(os.path.join(data.expand('${OSCDIR}', d), ud.path, ud.module), os.R_OK): +            oscupdatecmd = self._buildosccommand(ud, d, "update") +            bb.msg.note(1, bb.msg.domain.Fetcher, "Update "+ loc) +            # update sources there +            os.chdir(ud.moddir) +            bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % oscupdatecmd) +            runfetchcmd(oscupdatecmd, d) +        else: +            oscfetchcmd = self._buildosccommand(ud, d, "fetch") +            bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc) +            # check out sources there +            bb.mkdirhier(ud.pkgdir) +            os.chdir(ud.pkgdir) +            bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % oscfetchcmd) +            runfetchcmd(oscfetchcmd, d) +         +        os.chdir(os.path.join(ud.pkgdir + ud.path)) +        # tar them up to a defined filename +        try: +            runfetchcmd("tar -czf %s %s" % (ud.localpath, ud.module), d) +        except: +            t, v, tb = sys.exc_info() +            try: +                os.unlink(ud.localpath) +            except OSError: +                pass +            raise t, v, tb + +    def supports_srcrev(self): +        return False + +    def generate_config(self, ud, d): +        """ +        Generate a .oscrc to be used for this run. +        """ + +        config_path = "%s/oscrc" % data.expand('${OSCDIR}', d) +        if (os.path.exists(config_path)): +            os.remove(config_path)  + +        f = open(config_path, 'w') +        f.write("[general]\n") +        f.write("apisrv = %s\n" % ud.host) +        f.write("scheme = http\n") +        f.write("su-wrapper = su -c\n") +        f.write("build-root = %s\n" % data.expand('${WORKDIR}', d)) +        f.write("urllist = http://moblin-obs.jf.intel.com:8888/build/%(project)s/%(repository)s/%(buildarch)s/:full/%(name)s.rpm\n") +        f.write("extra-pkgs = gzip\n") +        f.write("\n") +        f.write("[%s]\n" % ud.host) +        f.write("user = %s\n" % ud.parm["user"]) +        f.write("pass = %s\n" % ud.parm["pswd"]) +        f.close() +         +        return config_path diff --git a/bitbake-dev/lib/bb/parse/__init__.py b/bitbake-dev/lib/bb/parse/__init__.py index 3c9ba8e6da..5dd96c4136 100644 --- a/bitbake-dev/lib/bb/parse/__init__.py +++ b/bitbake-dev/lib/bb/parse/__init__.py @@ -50,6 +50,10 @@ def cached_mtime_noerror(f):              return 0      return __mtime_cache[f] +def update_mtime(f): +    __mtime_cache[f] = os.stat(f)[8] +    return __mtime_cache[f] +  def mark_dependency(d, f):      if f.startswith('./'):          f = "%s/%s" % (os.getcwd(), f[2:]) diff --git a/bitbake-dev/lib/bb/providers.py b/bitbake-dev/lib/bb/providers.py index 63d4f5b3cb..3504efc86e 100644 --- a/bitbake-dev/lib/bb/providers.py +++ b/bitbake-dev/lib/bb/providers.py @@ -296,6 +296,7 @@ def getRuntimeProviders(dataCache, rdepend):      # Only search dynamic packages if we can't find anything in other variables      for pattern in dataCache.packages_dynamic: +        pattern = pattern.replace('+', "\+")          try:              regexp = re.compile(pattern)          except: diff --git a/bitbake-dev/lib/bb/utils.py b/bitbake-dev/lib/bb/utils.py index 17e22e389e..0a0c9ada34 100644 --- a/bitbake-dev/lib/bb/utils.py +++ b/bitbake-dev/lib/bb/utils.py @@ -96,7 +96,34 @@ def explode_deps(s):              #r[-1] += ' ' + ' '.join(j)      return r +def explode_dep_versions(s): +    """ +    Take an RDEPENDS style string of format: +    "DEPEND1 (optional version) DEPEND2 (optional version) ..." +    and return a dictonary of dependencies and versions. +    """ +    r = {} +    l = s.split() +    lastdep = None +    lastver = "" +    inversion = False +    for i in l: +        if i[0] == '(': +            inversion = True +            lastver = i[1:] or "" +            #j = [] +        elif inversion and i.endswith(')'): +            inversion = False +            lastver = lastver + " " + (i[:-1] or "") +            r[lastdep] = lastver +        elif not inversion: +            r[i] = None +            lastdep = i +            lastver = "" +        elif inversion: +            lastver = lastver + " " + i +    return r  def _print_trace(body, line):      """ @@ -268,3 +295,13 @@ def sha256_file(filename):      for line in open(filename):          s.update(line)      return s.hexdigest() + +def prunedir(topdir): +    # Delete everything reachable from the directory named in 'topdir'. +    # CAUTION:  This is dangerous! +    for root, dirs, files in os.walk(topdir, topdown=False): +        for name in files: +            os.remove(os.path.join(root, name)) +        for name in dirs: +            os.rmdir(os.path.join(root, name)) +    os.rmdir(topdir) | 
