• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2011 Google Inc. All Rights Reserved.
2"""Utilities for operations on files."""
3
4from __future__ import print_function
5
6import errno
7import os
8import shutil
9import command_executer
10
11
12class FileUtils(object):
13  """Utilities for operations on files."""
14  _instance = None
15  DRY_RUN = False
16
17  @classmethod
18  def Configure(cls, dry_run):
19    cls.DRY_RUN = dry_run
20
21  def __new__(cls, *args, **kwargs):
22    if not cls._instance:
23      if cls.DRY_RUN:
24        cls._instance = super(FileUtils, cls).__new__(MockFileUtils, *args,
25                                                      **kwargs)
26      else:
27        cls._instance = super(FileUtils, cls).__new__(cls, *args, **kwargs)
28    return cls._instance
29
30  def Md5File(self, filename, log_level='verbose', _block_size=2**10):
31    command = 'md5sum %s' % filename
32    ce = command_executer.GetCommandExecuter(log_level=log_level)
33    ret, out, _ = ce.RunCommandWOutput(command)
34    if ret:
35      raise RuntimeError('Could not run md5sum on: %s' % filename)
36
37    return out.strip().split()[0]
38
39  def CanonicalizeChromeOSRoot(self, chromeos_root):
40    chromeos_root = os.path.expanduser(chromeos_root)
41    if os.path.isdir(os.path.join(chromeos_root, 'chromite')):
42      return chromeos_root
43    else:
44      return None
45
46  def ChromeOSRootFromImage(self, chromeos_image):
47    chromeos_root = os.path.join(
48        os.path.dirname(chromeos_image), '../../../../..')
49    return self.CanonicalizeChromeOSRoot(chromeos_root)
50
51  def MkDirP(self, path):
52    try:
53      os.makedirs(path)
54    except OSError as exc:
55      if exc.errno == errno.EEXIST:
56        pass
57      else:
58        raise
59
60  def RmDir(self, path):
61    shutil.rmtree(path, ignore_errors=True)
62
63  def WriteFile(self, path, contents):
64    with open(path, 'wb') as f:
65      f.write(contents)
66
67
68class MockFileUtils(FileUtils):
69  """Mock class for file utilities."""
70
71  def Md5File(self, filename, log_level='verbose', _block_size=2**10):
72    return 'd41d8cd98f00b204e9800998ecf8427e'
73
74  def CanonicalizeChromeOSRoot(self, chromeos_root):
75    return '/tmp/chromeos_root'
76
77  def ChromeOSRootFromImage(self, chromeos_image):
78    return '/tmp/chromeos_root'
79
80  def RmDir(self, path):
81    pass
82
83  def MkDirP(self, path):
84    pass
85
86  def WriteFile(self, path, contents):
87    pass
88