BaseTool/Upt: Avoid UNI file name conflict

When creating a UNI file if there is a name conflict, add an index
from 0 to the file name

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hess Chen <hesheng.chen@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
This commit is contained in:
Hess Chen 2016-07-29 14:09:00 +08:00 committed by Yonghong Zhu
parent 0e025deac5
commit 06eb35402e
3 changed files with 32 additions and 6 deletions

View File

@ -65,6 +65,7 @@ from Library.DataType import TAB_SECTION_END
from Library.DataType import TAB_SPLIT from Library.DataType import TAB_SPLIT
import Library.DataType as DT import Library.DataType as DT
from Library.UniClassObject import FormatUniEntry from Library.UniClassObject import FormatUniEntry
from Library.String import GetUniFileName
def GenPcd(Package, Content): def GenPcd(Package, Content):
# #
@ -586,8 +587,8 @@ def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCO
if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())): if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())):
os.makedirs(os.path.dirname(PackageObject.GetFullPath())) os.makedirs(os.path.dirname(PackageObject.GetFullPath()))
ContainerFile = os.path.normpath(os.path.join(os.path.dirname(PackageObject.GetFullPath()),
(PackageObject.GetBaseName() + '.uni'))) ContainerFile = GetUniFileName(os.path.dirname(PackageObject.GetFullPath()), PackageObject.GetBaseName())
Content = UniFileHeader + '\r\n' Content = UniFileHeader + '\r\n'
Content += '\r\n' Content += '\r\n'

View File

@ -2,7 +2,7 @@
# #
# This file contained the logical of transfer package object to INF files. # This file contained the logical of transfer package object to INF files.
# #
# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials are licensed and made available # This program and the accompanying materials are licensed and made available
# under the terms and conditions of the BSD License which accompanies this # under the terms and conditions of the BSD License which accompanies this
@ -41,6 +41,7 @@ import Logger.Log as Logger
from Library import DataType as DT from Library import DataType as DT
from GenMetaFile import GenMetaFileMisc from GenMetaFile import GenMetaFileMisc
from Library.UniClassObject import FormatUniEntry from Library.UniClassObject import FormatUniEntry
from Library.String import GetUniFileName
## Transfer Module Object to Inf files ## Transfer Module Object to Inf files
@ -225,8 +226,8 @@ def GenModuleUNIEncodeFile(ModuleObject, UniFileHeader='', Encoding=DT.TAB_ENCOD
return return
else: else:
ModuleObject.UNIFlag = True ModuleObject.UNIFlag = True
ContainerFile = os.path.normpath(os.path.join(os.path.dirname(ModuleObject.GetFullPath()), ContainerFile = GetUniFileName(os.path.dirname(ModuleObject.GetFullPath()), ModuleObject.GetBaseName())
(ModuleObject.GetBaseName() + '.uni')))
if not os.path.exists(os.path.dirname(ModuleObject.GetFullPath())): if not os.path.exists(os.path.dirname(ModuleObject.GetFullPath())):
os.makedirs(os.path.dirname(ModuleObject.GetFullPath())) os.makedirs(os.path.dirname(ModuleObject.GetFullPath()))

View File

@ -2,7 +2,7 @@
# This file is used to define common string related functions used in parsing # This file is used to define common string related functions used in parsing
# process # process
# #
# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials are licensed and made available # This program and the accompanying materials are licensed and made available
# under the terms and conditions of the BSD License which accompanies this # under the terms and conditions of the BSD License which accompanies this
@ -957,3 +957,27 @@ def IsMatchArch(Arch1, Arch2):
return True return True
return False return False
# Search all files in FilePath to find the FileName with the largest index
# Return the FileName with index +1 under the FilePath
#
def GetUniFileName(FilePath, FileName):
Files = os.listdir(FilePath)
LargestIndex = -1
for File in Files:
if File.upper().startswith(FileName.upper()) and File.upper().endswith('.UNI'):
Index = File.upper().replace(FileName.upper(), '').replace('.UNI', '')
if Index:
try:
Index = int(Index)
except Exception:
Index = -1
else:
Index = 0
if Index > LargestIndex:
LargestIndex = Index + 1
if LargestIndex > -1:
return os.path.normpath(os.path.join(FilePath, FileName + str(LargestIndex) + '.uni'))
else:
return os.path.normpath(os.path.join(FilePath, FileName + '.uni'))