# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # # This module needs to stay Python 2 and 3 compatible # """ Maintains a unique file that lists all artifacts operations. """ import json import os import sys from datetime import datetime # XXX we should do one per platform and use platform-changelog.json as a name class Changelog: def __init__(self, archives_dir): self.archives_dir = archives_dir self.location = os.path.join(archives_dir, "changelog.json") if os.path.exists(self.location): with open(self.location) as f: self._data = json.loads(f.read()) if "changes" not in self._data: self._data["changes"] = [] else: self._data = {"changes": []} def append(self, action, platform=sys.platform, **metadata): now = datetime.timestamp(datetime.now()) log = {"action": action, "platform": platform, "when": now} log.update(metadata) # adding taskcluster specific info if we see it in the env for key in ( "TC_SCHEDULER_ID", "TASK_ID", "TC_OWNER", "TC_SOURCE", "TC_PROJECT", ): if key in os.environ: log[key] = os.environ[key] self._data["changes"].append(log) def save(self, archives_dir=None): if archives_dir is not None and archives_dir != self.archives_dir: self.location = os.path.join(archives_dir, "changelog.json") # we need to resolve potential r/w conflicts on TC here with open(self.location, "w") as f: f.write(json.dumps(self._data)) def history(self): """From older to newer""" return sorted( self._data["changes"], key=lambda entry: entry["when"], reverse=True )