| # -*- coding: utf-8 -*- |
| # Copyright 2019 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Utilities for operations on files.""" |
| |
| |
| import errno |
| import os |
| import shutil |
| |
| from cros_utils import command_executer |
| |
| |
| class FileUtils(object): |
| """Utilities for operations on files.""" |
| |
| _instance = None |
| DRY_RUN = False |
| |
| @classmethod |
| def Configure(cls, dry_run): |
| cls.DRY_RUN = dry_run |
| |
| def __new__(cls, *args, **kwargs): |
| if not cls._instance: |
| if cls.DRY_RUN: |
| cls._instance = super(FileUtils, cls).__new__( |
| MockFileUtils, *args, **kwargs |
| ) |
| else: |
| cls._instance = super(FileUtils, cls).__new__( |
| cls, *args, **kwargs |
| ) |
| return cls._instance |
| |
| def Md5File(self, filename, log_level="verbose", _block_size=2 ** 10): |
| command = "md5sum %s" % filename |
| ce = command_executer.GetCommandExecuter(log_level=log_level) |
| ret, out, _ = ce.RunCommandWOutput(command) |
| if ret: |
| raise RuntimeError("Could not run md5sum on: %s" % filename) |
| |
| return out.strip().split()[0] |
| |
| def CanonicalizeChromeOSRoot(self, chromeos_root): |
| chromeos_root = os.path.expanduser(chromeos_root) |
| if os.path.isdir(os.path.join(chromeos_root, "chromite")): |
| return chromeos_root |
| else: |
| return None |
| |
| def ChromeOSRootFromImage(self, chromeos_image): |
| chromeos_root = os.path.join( |
| os.path.dirname(chromeos_image), "../../../../.." |
| ) |
| return self.CanonicalizeChromeOSRoot(chromeos_root) |
| |
| def MkDirP(self, path): |
| try: |
| os.makedirs(path) |
| except OSError as exc: |
| if exc.errno == errno.EEXIST: |
| pass |
| else: |
| raise |
| |
| def RmDir(self, path): |
| shutil.rmtree(path, ignore_errors=True) |
| |
| def WriteFile(self, path, contents): |
| with open(path, "w", encoding="utf-8") as f: |
| f.write(contents) |
| |
| |
| class MockFileUtils(FileUtils): |
| """Mock class for file utilities.""" |
| |
| def Md5File(self, filename, log_level="verbose", _block_size=2 ** 10): |
| return "d41d8cd98f00b204e9800998ecf8427e" |
| |
| def CanonicalizeChromeOSRoot(self, chromeos_root): |
| return "/tmp/chromeos_root" |
| |
| def ChromeOSRootFromImage(self, chromeos_image): |
| return "/tmp/chromeos_root" |
| |
| def RmDir(self, path): |
| pass |
| |
| def MkDirP(self, path): |
| pass |
| |
| def WriteFile(self, path, contents): |
| pass |