public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "gaoliming" <gaoliming@byosoft.com.cn>
To: "'Bob Feng'" <bob.c.feng@intel.com>, <devel@edk2.groups.io>
Cc: "'Yuwei Chen'" <yuwei.chen@intel.com>
Subject: 回复: [Patch 1/1 V2] BaseTools: fix the split output files root dir
Date: Thu, 4 Feb 2021 08:59:31 +0800	[thread overview]
Message-ID: <003501d6fa90$ff1b6b70$fd524250$@byosoft.com.cn> (raw)
In-Reply-To: <20210201102858.887-1-bob.c.feng@intel.com>

Bob:
  Does this behavior follow original C Split tool?

Thanks
Liming
> -----邮件原件-----
> 发件人: Bob Feng <bob.c.feng@intel.com>
> 发送时间: 2021年2月1日 18:29
> 收件人: devel@edk2.groups.io
> 抄送: Liming Gao <gaoliming@byosoft.com.cn>; Yuwei Chen
> <yuwei.chen@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@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Yuwei Chen <yuwei.chen@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




  reply	other threads:[~2021-02-04  0:59 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-01 10:28 [Patch 1/1 V2] BaseTools: fix the split output files root dir Bob Feng
2021-02-04  0:59 ` gaoliming [this message]
2021-02-04  5:26   ` Bob Feng
2021-02-04  7:34     ` 回复: " gaoliming
2021-02-05  1:18 ` Yuwei Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='003501d6fa90$ff1b6b70$fd524250$@byosoft.com.cn' \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox