1*760c253cSXin Li# -*- coding: utf-8 -*- 2*760c253cSXin Li# Copyright 2019 The ChromiumOS Authors 3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be 4*760c253cSXin Li# found in the LICENSE file. 5*760c253cSXin Li 6*760c253cSXin Li"""Utilities for operations on files.""" 7*760c253cSXin Li 8*760c253cSXin Li 9*760c253cSXin Liimport errno 10*760c253cSXin Liimport os 11*760c253cSXin Liimport shutil 12*760c253cSXin Li 13*760c253cSXin Lifrom cros_utils import command_executer 14*760c253cSXin Li 15*760c253cSXin Li 16*760c253cSXin Liclass FileUtils(object): 17*760c253cSXin Li """Utilities for operations on files.""" 18*760c253cSXin Li 19*760c253cSXin Li _instance = None 20*760c253cSXin Li DRY_RUN = False 21*760c253cSXin Li 22*760c253cSXin Li @classmethod 23*760c253cSXin Li def Configure(cls, dry_run): 24*760c253cSXin Li cls.DRY_RUN = dry_run 25*760c253cSXin Li 26*760c253cSXin Li def __new__(cls, *args, **kwargs): 27*760c253cSXin Li if not cls._instance: 28*760c253cSXin Li if cls.DRY_RUN: 29*760c253cSXin Li cls._instance = super(FileUtils, cls).__new__( 30*760c253cSXin Li MockFileUtils, *args, **kwargs 31*760c253cSXin Li ) 32*760c253cSXin Li else: 33*760c253cSXin Li cls._instance = super(FileUtils, cls).__new__( 34*760c253cSXin Li cls, *args, **kwargs 35*760c253cSXin Li ) 36*760c253cSXin Li return cls._instance 37*760c253cSXin Li 38*760c253cSXin Li def Md5File(self, filename, log_level="verbose", _block_size=2 ** 10): 39*760c253cSXin Li command = "md5sum %s" % filename 40*760c253cSXin Li ce = command_executer.GetCommandExecuter(log_level=log_level) 41*760c253cSXin Li ret, out, _ = ce.RunCommandWOutput(command) 42*760c253cSXin Li if ret: 43*760c253cSXin Li raise RuntimeError("Could not run md5sum on: %s" % filename) 44*760c253cSXin Li 45*760c253cSXin Li return out.strip().split()[0] 46*760c253cSXin Li 47*760c253cSXin Li def CanonicalizeChromeOSRoot(self, chromeos_root): 48*760c253cSXin Li chromeos_root = os.path.expanduser(chromeos_root) 49*760c253cSXin Li if os.path.isdir(os.path.join(chromeos_root, "chromite")): 50*760c253cSXin Li return chromeos_root 51*760c253cSXin Li else: 52*760c253cSXin Li return None 53*760c253cSXin Li 54*760c253cSXin Li def ChromeOSRootFromImage(self, chromeos_image): 55*760c253cSXin Li chromeos_root = os.path.join( 56*760c253cSXin Li os.path.dirname(chromeos_image), "../../../../.." 57*760c253cSXin Li ) 58*760c253cSXin Li return self.CanonicalizeChromeOSRoot(chromeos_root) 59*760c253cSXin Li 60*760c253cSXin Li def MkDirP(self, path): 61*760c253cSXin Li try: 62*760c253cSXin Li os.makedirs(path) 63*760c253cSXin Li except OSError as exc: 64*760c253cSXin Li if exc.errno == errno.EEXIST: 65*760c253cSXin Li pass 66*760c253cSXin Li else: 67*760c253cSXin Li raise 68*760c253cSXin Li 69*760c253cSXin Li def RmDir(self, path): 70*760c253cSXin Li shutil.rmtree(path, ignore_errors=True) 71*760c253cSXin Li 72*760c253cSXin Li def WriteFile(self, path, contents): 73*760c253cSXin Li with open(path, "w", encoding="utf-8") as f: 74*760c253cSXin Li f.write(contents) 75*760c253cSXin Li 76*760c253cSXin Li 77*760c253cSXin Liclass MockFileUtils(FileUtils): 78*760c253cSXin Li """Mock class for file utilities.""" 79*760c253cSXin Li 80*760c253cSXin Li def Md5File(self, filename, log_level="verbose", _block_size=2 ** 10): 81*760c253cSXin Li return "d41d8cd98f00b204e9800998ecf8427e" 82*760c253cSXin Li 83*760c253cSXin Li def CanonicalizeChromeOSRoot(self, chromeos_root): 84*760c253cSXin Li return "/tmp/chromeos_root" 85*760c253cSXin Li 86*760c253cSXin Li def ChromeOSRootFromImage(self, chromeos_image): 87*760c253cSXin Li return "/tmp/chromeos_root" 88*760c253cSXin Li 89*760c253cSXin Li def RmDir(self, path): 90*760c253cSXin Li pass 91*760c253cSXin Li 92*760c253cSXin Li def MkDirP(self, path): 93*760c253cSXin Li pass 94*760c253cSXin Li 95*760c253cSXin Li def WriteFile(self, path, contents): 96*760c253cSXin Li pass 97