You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.4 KiB
93 lines
2.4 KiB
4 months ago
|
# -*- coding: utf-8 -*-
|
||
|
# Copyright 2019 The Chromium OS Authors. All rights reserved.
|
||
|
# 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."""
|
||
|
|
||
|
from __future__ import print_function
|
||
|
|
||
|
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
|