[edk2-devel] 回复: [Patch 1/1 V2] BaseTools: fix the split output files root dir

gaoliming gaoliming at byosoft.com.cn
Thu Feb 4 00:59:31 UTC 2021


Bob:
  Does this behavior follow original C Split tool?

Thanks
Liming
> -----邮件原件-----
> 发件人: Bob Feng <bob.c.feng at intel.com>
> 发送时间: 2021年2月1日 18:29
> 收件人: devel at edk2.groups.io
> 抄送: Liming Gao <gaoliming at byosoft.com.cn>; Yuwei Chen
> <yuwei.chen at intel.com>
> 主题: [Patch 1/1 V2] BaseTools: fix the split output files root dir
> 
> If the output file path is a relative path, the split
> tool will create the output file under the input file path.
> But the expected behavior for this case is the output file
> should be relative to the current directory. This patch will
> fix this bug.
> 
> If the output file path is not specified and output prefix is not
> specified, the output file should be under the input file path
> 
> Signed-off-by: Bob Feng <bob.c.feng at intel.com>
> Cc: Liming Gao <gaoliming at byosoft.com.cn>
> Cc: Yuwei Chen <yuwei.chen at intel.com>
> ---
> V2: If the output file path is not specified and output prefix is not
> specified, the output file should be under the input file path
>  BaseTools/Source/Python/Split/Split.py        | 64 +++++++------
>  .../Source/Python/tests/Split/test_split.py   | 96 ++++++++++---------
>  2 files changed, 86 insertions(+), 74 deletions(-)
> 
> diff --git a/BaseTools/Source/Python/Split/Split.py
> b/BaseTools/Source/Python/Split/Split.py
> index 45a5a060474c..e223a72a94e1 100644
> --- a/BaseTools/Source/Python/Split/Split.py
> +++ b/BaseTools/Source/Python/Split/Split.py
> @@ -90,66 +90,74 @@ def getFileSize(filename):
>          logger.error("Access file failed: %s", filename)
>          raise(e)
> 
>      return length
> 
> +def getoutputfileabs(inputfile, prefix, outputfile,index):
> +    inputfile = os.path.abspath(inputfile)
> +    if outputfile is None:
> +        if prefix is None:
> +            outputfileabs = os.path.join(os.path.dirname(inputfile),
> "{}{}".format(os.path.basename(inputfile),index))
> +        else:
> +            if os.path.isabs(prefix):
> +                outputfileabs = os.path.join(prefix,
> "{}{}".format(os.path.basename(inputfile),index))
> +            else:
> +                outputfileabs = os.path.join(os.getcwd(), prefix,
> "{}{}".format(os.path.basename(inputfile),index))
> +    elif not os.path.isabs(outputfile):
> +        if prefix is None:
> +            outputfileabs = os.path.join(os.getcwd(), outputfile)
> +        else:
> +            if os.path.isabs(prefix):
> +                outputfileabs = os.path.join(prefix, outputfile)
> +            else:
> +                outputfileabs = os.path.join(os.getcwd(), prefix,
> outputfile)
> +    else:
> +        outputfileabs = outputfile
> +    return outputfileabs
> 
>  def splitFile(inputfile, position, outputdir=None, outputfile1=None,
> outputfile2=None):
>      '''
>      Split the inputfile into outputfile1 and outputfile2 from the
position.
>      '''
>      logger = logging.getLogger('Split')
> 
> -    inputfile = os.path.abspath(inputfile)
> -    workspace = os.path.dirname(inputfile)
>      if not os.path.exists(inputfile):
>          logger.error("File Not Found: %s" % inputfile)
>          raise(Exception)
> 
>      if outputfile1 and outputfile2 and outputfile1 == outputfile2:
>          logger.error(
>              "The firstfile and the secondfile can't be the same: %s" %
> outputfile1)
>          raise(Exception)
> 
> -    if not outputdir:
> -        outputdir = workspace
> -    elif not os.path.isabs(outputdir):
> -        outputdir = os.path.join(workspace, outputdir)
> -
>      # Create dir for the output files
>      try:
> -        if not outputfile1:
> -            outputfile1 = os.path.abspath(os.path.join(
> -                outputdir, "{}1".format(os.path.basename(inputfile))))
> -        else:
> -            outputfile1 = os.path.abspath(os.path.join(outputdir,
> outputfile1))
> -        outputdir = os.path.dirname(outputfile1)
> -        if not os.path.exists(outputdir):
> -            os.makedirs(outputdir)
> 
> -        if not outputfile2:
> -            outputfile2 = os.path.abspath(os.path.join(
> -                outputdir, "{}2".format(os.path.basename(inputfile))))
> -        else:
> -            outputfile2 = os.path.abspath(os.path.join(outputdir,
> outputfile2))
> -        outputdir = os.path.dirname(outputfile2)
> -        if not os.path.exists(outputdir):
> -            os.makedirs(outputdir)
> +        outputfile1 = getoutputfileabs(inputfile, outputdir, outputfile1,
1)
> +        outputfolder = os.path.dirname(outputfile1)
> +        if not os.path.exists(outputfolder):
> +            os.makedirs(outputfolder)
> +
> +        outputfile2 = getoutputfileabs(inputfile, outputdir, outputfile2,
2)
> +        outputfolder = os.path.dirname(outputfile2)
> +        if not os.path.exists(outputfolder):
> +            os.makedirs(outputfolder)
> +
>      except Exception as e:
> -        logger.error("Can't make dir: %s" % outputdir)
> +        logger.error("Can't make dir: %s" % outputfolder)
>          raise(e)
> 
>      if position <= 0:
> -        if outputfile2 != inputfile:
> -            shutil.copy2(inputfile, outputfile2)
> +        if outputfile2 != os.path.abspath(inputfile):
> +            shutil.copy2(os.path.abspath(inputfile), outputfile2)
>          with open(outputfile1, "wb") as fout:
>              fout.write(b'')
>      else:
>          inputfilesize = getFileSize(inputfile)
>          if position >= inputfilesize:
> -            if outputfile1 != inputfile:
> -                shutil.copy2(inputfile, outputfile1)
> +            if outputfile1 != os.path.abspath(inputfile):
> +                shutil.copy2(os.path.abspath(inputfile), outputfile1)
>              with open(outputfile2, "wb") as fout:
>                  fout.write(b'')
>          else:
>              try:
>                  tempdir = tempfile.mkdtemp()
> diff --git a/BaseTools/Source/Python/tests/Split/test_split.py
> b/BaseTools/Source/Python/tests/Split/test_split.py
> index 82f71ecf5372..e4866be390b3 100644
> --- a/BaseTools/Source/Python/tests/Split/test_split.py
> +++ b/BaseTools/Source/Python/tests/Split/test_split.py
> @@ -16,30 +16,31 @@ import Split.Split as sp
>  import struct as st
> 
> 
>  class TestSplit(unittest.TestCase):
>      def setUp(self):
> -        self.WORKSPACE = tempfile.mkdtemp()
> -        self.binary_file = os.path.join(self.WORKSPACE, "Binary.bin")
> +        self.tmpdir = tempfile.mkdtemp()
> +        self.binary_file = os.path.join(self.tmpdir, "Binary.bin")
>          self.create_inputfile()
> 
>      def tearDown(self):
> -        if os.path.exists(self.WORKSPACE):
> -            shutil.rmtree(self.WORKSPACE)
> +        if os.path.exists(self.tmpdir):
> +            shutil.rmtree(self.tmpdir)
> 
>      def test_splitFile_position(self):
>          position = [-1, 0, 256, 512, 700, 1024, 2048]
>          result = [(0, 1024), (0, 1024), (256, 768),
>                    (512, 512), (700, 324), (1024, 0), (1024, 0)]
> +        outputfolder = self.tmpdir
>          for index, po in enumerate(position):
>              try:
>                  sp.splitFile(self.binary_file, po)
>              except Exception as e:
>                  self.assertTrue(False, msg="splitFile function error")
> 
> -            output1 = os.path.join(self.WORKSPACE, "Binary.bin1")
> -            output2 = os.path.join(self.WORKSPACE, "Binary.bin2")
> +            output1 = os.path.join(outputfolder, "Binary.bin1")
> +            output2 = os.path.join(outputfolder, "Binary.bin2")
>              with open(output1, "rb") as f1:
>                  size1 = len(f1.read())
>              with open(output2, "rb") as f2:
>                  size2 = len(f2.read())
> 
> @@ -51,61 +52,64 @@ class TestSplit(unittest.TestCase):
>          with open(self.binary_file, "wb") as fout:
>              for i in range(512):
>                  fout.write(st.pack("<H", i))
> 
>      def test_splitFile_outputfile(self):
> -        output = [None, "Binary.bin", "Binary1.bin",
r"output/Binary1.bin",
> -                  os.path.join(self.WORKSPACE, r"output/Binary1.bin")]
> -        for o in output:
> +        output = [
> +            None,
> +            "Binary.bin",
> +            "Binary1.bin",
> +            r"output/Binary1.bin",
> +            os.path.abspath( r"output/Binary1.bin")
> +            ]
> +        expected_output = [
> +            os.path.join(os.path.dirname(self.binary_file),"Binary.bin1"
),
> +            os.path.join(os.getcwd(),"Binary.bin"),
> +            os.path.join(os.getcwd(),"Binary1.bin"),
> +            os.path.join(os.getcwd(),r"output/Binary1.bin"),
> +            os.path.join(os.path.abspath( r"output/Binary1.bin"))
> +            ]
> +        for index, o in enumerate(output):
>              try:
>                  sp.splitFile(self.binary_file, 123, outputfile1=o)
>              except Exception as e:
>                  self.assertTrue(False, msg="splitFile function error")
> -            if o is None:
> -                self.assertTrue(os.path.exists(
> -                    os.path.join(self.WORKSPACE, "Binary.bin1")))
> -            else:
> -                if os.path.isabs(o):
> -                    self.assertTrue(os.path.exists(o))
> -                else:
> -                    self.assertTrue(os.path.exists(
> -                        os.path.join(self.WORKSPACE, o)))
> -            self.create_inputfile()
> 
> -            try:
> -                sp.splitFile(self.binary_file, 123, outputfile2=o)
> -            except Exception as e:
> -                self.assertTrue(False, msg="splitFile function error")
> -            if o is None:
> -                self.assertTrue(os.path.exists(
> -                    os.path.join(self.WORKSPACE, "Binary.bin2")))
> -            else:
> -                if os.path.isabs(o):
> -                    self.assertTrue(os.path.exists(o))
> -                else:
> -                    self.assertTrue(os.path.exists(
> -                        os.path.join(self.WORKSPACE, o)))
> +            self.assertTrue(os.path.exists(expected_output[index]))
>              self.create_inputfile()
> 
>      def test_splitFile_outputfolder(self):
> -        outputfolder = [None, "output", r"output1/output2",
> -                        os.path.join(self.WORKSPACE, "output")]
> -        for o in outputfolder:
> +        outputfolder = [
> +            None,
> +            "output",
> +            r"output1/output2",
> +            os.path.abspath("output"),
> +            "output"
> +            ]
> +        output = [
> +            None,
> +            None,
> +            "Binary1.bin",
> +            r"output/Binary1.bin",
> +            os.path.abspath( r"output_1/Binary1.bin")
> +            ]
> +
> +        expected_output = [
> +            os.path.join(os.path.dirname(self.binary_file),"Binary.bin1"
),
> +            os.path.join(os.getcwd(),"output", "Binary.bin1"),
> +            os.path.join(os.getcwd(), r"output1/output2" ,
"Binary1.bin"),
> +            os.path.join(os.getcwd(),r"output", "output/Binary1.bin"),
> +            os.path.join(os.path.abspath( r"output/Binary1.bin"))
> +            ]
> +
> +        for index, o in enumerate(outputfolder):
>              try:
> -                sp.splitFile(self.binary_file, 123, outputdir=o)
> +                sp.splitFile(self.binary_file, 123,
> outputdir=o,outputfile1=output[index])
>              except Exception as e:
>                  self.assertTrue(False, msg="splitFile function error")
> 
> -            if o is None:
> -                self.assertTrue(os.path.exists(
> -                    os.path.join(self.WORKSPACE, "Binary.bin1")))
> -            else:
> -                if os.path.isabs(o):
> -                    self.assertTrue(os.path.exists(
> -                        os.path.join(o, "Binary.bin1")))
> -                else:
> -                    self.assertTrue(os.path.exists(
> -                        os.path.join(self.WORKSPACE, o,
> "Binary.bin1")))
> +            self.assertTrue(os.path.exists(expected_output[index]))
> +            self.create_inputfile()
> 
> 
>  if __name__ == '__main__':
>      unittest.main()
> --
> 2.29.1.windows.1





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#71126): https://edk2.groups.io/g/devel/message/71126
Mute This Topic: https://groups.io/mt/80369922/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list