summaryrefslogtreecommitdiff
path: root/morphlib/localartifactcache.py
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2013-06-01 18:37:32 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2013-06-01 19:52:19 +0000
commit8e344d75754fbb9124effcdaf68c5b563314ef44 (patch)
tree0af27a49d83358ae75bb64a9eb4e877b655160d3 /morphlib/localartifactcache.py
parent86cbc1bc8ef84dc9496d7723a15dec9b43eacb73 (diff)
downloadmorph-8e344d75754fbb9124effcdaf68c5b563314ef44.tar.gz
Update timestamps on artifact access
Diffstat (limited to 'morphlib/localartifactcache.py')
-rw-r--r--morphlib/localartifactcache.py39
1 files changed, 35 insertions, 4 deletions
diff --git a/morphlib/localartifactcache.py b/morphlib/localartifactcache.py
index 7ad53db0..b845cebf 100644
--- a/morphlib/localartifactcache.py
+++ b/morphlib/localartifactcache.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2012 Codethink Limited
+# Copyright (C) 2012,2013 Codethink Limited
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -20,6 +20,28 @@ import morphlib
class LocalArtifactCache(object):
+ '''Abstraction over the local artifact cache
+
+ It provides methods for getting a file handle to cached artifacts
+ so that the layout of the cache need not be known.
+
+ It also updates modification times of artifacts so that it can track
+ when they were last used, so it can be requested to clean up if
+ disk space is low.
+
+ Modification time is updated in both the get and has methods.
+
+ NOTE: Parts of the build assume that every artifact of a source is
+ available, so all the artifacts of a source need to be removed together.
+
+ This complication needs to be handled either during the fetch logic, by
+ updating the mtime of every artifact belonging to a source, or at
+ cleanup time by only removing an artifact if every artifact belonging to
+ a source is too old, and then remove them all at once.
+
+ Since the cleanup logic will be complicated for other reasons it makes
+ sense to put the complication there.
+ '''
def __init__(self, cachedir):
self.cachedir = cachedir
@@ -36,28 +58,37 @@ class LocalArtifactCache(object):
filename = self._source_metadata_filename(source, cachekey, name)
return morphlib.savefile.SaveFile(filename, mode='w')
+ def _has_file(self, filename):
+ if os.path.exists(filename):
+ os.utime(filename, None)
+ return True
+ return False
+
def has(self, artifact):
filename = self.artifact_filename(artifact)
- return os.path.exists(filename)
+ return self._has_file(filename)
def has_artifact_metadata(self, artifact, name):
filename = self._artifact_metadata_filename(artifact, name)
- return os.path.exists(filename)
+ return self._has_file(filename)
def has_source_metadata(self, source, cachekey, name):
filename = self._source_metadata_filename(source, cachekey, name)
- return os.path.exists(filename)
+ return self._has_file(filename)
def get(self, artifact):
filename = self.artifact_filename(artifact)
+ os.utime(filename, None)
return open(filename)
def get_artifact_metadata(self, artifact, name):
filename = self._artifact_metadata_filename(artifact, name)
+ os.utime(filename, None)
return open(filename)
def get_source_metadata(self, source, cachekey, name):
filename = self._source_metadata_filename(source, cachekey, name)
+ os.utime(filename, None)
return open(filename)
def artifact_filename(self, artifact):