xref: /aosp_15_r20/external/toolchain-utils/cros_utils/file_utils.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
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