Home | History | Annotate | Download | only in Common
      1 ## @file

      2 # manage multiple workspace file.

      3 #

      4 # This file is required to make Python interpreter treat the directory

      5 # as containing package.

      6 #

      7 # Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>

      8 # This program and the accompanying materials

      9 # are licensed and made available under the terms and conditions of the BSD License

     10 # which accompanies this distribution.  The full text of the license may be found at

     11 # http://opensource.org/licenses/bsd-license.php

     12 #

     13 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     14 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     15 #

     16 
     17 import Common.LongFilePathOs as os
     18 from Common.DataType import TAB_WORKSPACE
     19 
     20 ## MultipleWorkspace

     21 #

     22 # This class manage multiple workspace behavior

     23 # 

     24 # @param class:

     25 #

     26 # @var WORKSPACE:      defined the current WORKSPACE

     27 # @var PACKAGES_PATH:  defined the other WORKSAPCE, if current WORKSPACE is invalid, search valid WORKSPACE from PACKAGES_PATH

     28 # 

     29 class MultipleWorkspace(object):
     30     WORKSPACE = ''
     31     PACKAGES_PATH = None
     32     
     33     ## convertPackagePath()

     34     #

     35     #   Convert path to match workspace.

     36     #

     37     #   @param  cls          The class pointer

     38     #   @param  Ws           The current WORKSPACE

     39     #   @param  Path         Path to be converted to match workspace.

     40     #

     41     @classmethod
     42     def convertPackagePath(cls, Ws, Path):
     43         if str(os.path.normcase (Path)).startswith(Ws):
     44             return os.path.join(Ws, os.path.relpath(Path, Ws))
     45         return Path
     46 
     47     ## setWs()

     48     #

     49     #   set WORKSPACE and PACKAGES_PATH environment

     50     #

     51     #   @param  cls          The class pointer

     52     #   @param  Ws           initialize WORKSPACE variable

     53     #   @param  PackagesPath initialize PackagesPath variable

     54     #

     55     @classmethod
     56     def setWs(cls, Ws, PackagesPath=None):
     57         cls.WORKSPACE = Ws
     58         if PackagesPath:
     59             cls.PACKAGES_PATH = [cls.convertPackagePath (Ws, os.path.normpath(Path.strip())) for Path in PackagesPath.split(os.pathsep)]
     60         else:
     61             cls.PACKAGES_PATH = []
     62     
     63     ## join()

     64     #

     65     #   rewrite os.path.join function

     66     #

     67     #   @param  cls       The class pointer

     68     #   @param  Ws        the current WORKSPACE

     69     #   @param  *p        path of the inf/dec/dsc/fdf/conf file

     70     #   @retval Path      the absolute path of specified file

     71     #

     72     @classmethod
     73     def join(cls, Ws, *p):
     74         Path = os.path.join(Ws, *p)
     75         if not os.path.exists(Path):
     76             for Pkg in cls.PACKAGES_PATH:
     77                 Path = os.path.join(Pkg, *p)
     78                 if os.path.exists(Path):
     79                     return Path
     80             Path = os.path.join(Ws, *p)
     81         return Path
     82     
     83     ## relpath()

     84     #

     85     #   rewrite os.path.relpath function

     86     #

     87     #   @param  cls       The class pointer

     88     #   @param  Path      path of the inf/dec/dsc/fdf/conf file

     89     #   @param  Ws        the current WORKSPACE

     90     #   @retval Path      the relative path of specified file

     91     #

     92     @classmethod
     93     def relpath(cls, Path, Ws):
     94         for Pkg in cls.PACKAGES_PATH:
     95             if Path.lower().startswith(Pkg.lower()):
     96                 Path = os.path.relpath(Path, Pkg)
     97                 return Path
     98         if Path.lower().startswith(Ws.lower()):
     99             Path = os.path.relpath(Path, Ws)
    100         return Path
    101     
    102     ## getWs()

    103     #

    104     #   get valid workspace for the path

    105     #

    106     #   @param  cls       The class pointer

    107     #   @param  Ws        the current WORKSPACE

    108     #   @param  Path      path of the inf/dec/dsc/fdf/conf file

    109     #   @retval Ws        the valid workspace relative to the specified file path

    110     #

    111     @classmethod
    112     def getWs(cls, Ws, Path):
    113         absPath = os.path.join(Ws, Path)
    114         if not os.path.exists(absPath):
    115             for Pkg in cls.PACKAGES_PATH:
    116                 absPath = os.path.join(Pkg, Path)
    117                 if os.path.exists(absPath):
    118                     return Pkg
    119         return Ws
    120     
    121     ## handleWsMacro()

    122     #

    123     #   handle the $(WORKSPACE) tag, if current workspace is invalid path relative the tool, replace it.

    124     #

    125     #   @param  cls       The class pointer

    126     #   @retval PathStr   Path string include the $(WORKSPACE)

    127     #

    128     @classmethod
    129     def handleWsMacro(cls, PathStr):
    130         if TAB_WORKSPACE in PathStr:
    131             PathList = PathStr.split()
    132             if PathList:
    133                 for i, str in enumerate(PathList):
    134                     MacroStartPos = str.find(TAB_WORKSPACE)
    135                     if MacroStartPos != -1:
    136                         Substr = str[MacroStartPos:]
    137                         Path = Substr.replace(TAB_WORKSPACE, cls.WORKSPACE).strip()
    138                         if not os.path.exists(Path):
    139                             for Pkg in cls.PACKAGES_PATH:
    140                                 Path = Substr.replace(TAB_WORKSPACE, Pkg).strip()
    141                                 if os.path.exists(Path):
    142                                     break
    143                         PathList[i] = str[0:MacroStartPos] + Path
    144             PathStr = ' '.join(PathList)
    145         return PathStr
    146     
    147     ## getPkgPath()

    148     #

    149     #   get all package pathes.

    150     #

    151     #   @param  cls       The class pointer

    152     #

    153     @classmethod
    154     def getPkgPath(cls):
    155         return cls.PACKAGES_PATH
    156