aboutsummaryrefslogtreecommitdiff
path: root/utils/file_utils.py
blob: 987e88ad72f650a8e696c03bbe5b8bc601e72107 (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
#!/usr/bin/python

# Copyright 2011 Google Inc. All Rights Reserved.

import errno
import hashlib
import os
import shutil


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, block_size=2 ** 10):
    md5 = hashlib.md5()

    with open(filename) as f:
      while True:
        data = f.read(block_size)
        if not data:
          break
        md5.update(data)

    return md5.hexdigest()

  def CanonicalizeChromeOSRoot(self, chromeos_root):
    chromeos_root = os.path.expanduser(chromeos_root)
    if os.path.isfile(os.path.join(chromeos_root,
                                   "src/scripts/enter_chroot.sh")):
      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, "wb") as f:
      f.write(contents)


class MockFileUtils(FileUtils):
  """Mock class for file utilities."""

  def Md5File(self, filename, 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