aboutsummaryrefslogtreecommitdiff
path: root/cros_utils/file_utils.py
blob: 743edefae4f91aad5d8fbe42434d379f4bde5bdf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# -*- 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