blob: 884bc81c3c2f032cffe2be995f5e79b5002ac7e7 [file] [log] [blame]
# Copyright 2011 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""UpgradeTable class is used in Portage package upgrade process."""
from chromite.lib import table
class UpgradeTable(table.Table):
"""Class to represent upgrade data in memory, can be written to csv."""
# Column names. Note that 'ARCH' is replaced with a real arch name when
# these are accessed as attributes off an UpgradeTable object.
COL_PACKAGE = "Package"
COL_SLOT = "Slot"
COL_OVERLAY = "Overlay"
COL_CURRENT_VER = "Current ARCH Version"
COL_STABLE_UPSTREAM_VER = "Stable Upstream ARCH Version"
COL_LATEST_UPSTREAM_VER = "Latest Upstream ARCH Version"
COL_STATE = "State On ARCH"
COL_DEPENDS_ON = "Dependencies On ARCH"
COL_USED_BY = "Required By On ARCH"
COL_TARGET = "Root Target"
COL_UPGRADED = "Upgraded ARCH Version"
# COL_STATE values should be one of the following:
STATE_UNKNOWN = "unknown"
STATE_LOCAL_ONLY = "local only"
STATE_UPSTREAM_ONLY = "upstream only"
STATE_NEEDS_UPGRADE = "needs upgrade"
STATE_PATCHED = "patched locally"
STATE_DUPLICATED = "duplicated locally"
STATE_NEEDS_UPGRADE_AND_PATCHED = "needs upgrade and patched locally"
STATE_NEEDS_UPGRADE_AND_DUPLICATED = "needs upgrade and duplicated locally"
STATE_CURRENT = "current"
@staticmethod
def GetColumnName(col, arch=None):
"""Translate from generic column name to specific given |arch|."""
if arch:
return col.replace("ARCH", arch)
return col
def __init__(self, arch, upgrade=False, name=None):
self._arch = arch
# These constants serve two roles, for csv output:
# 1) Restrict which column names are valid.
# 2) Specify the order of those columns.
columns = [
self.COL_PACKAGE,
self.COL_SLOT,
self.COL_OVERLAY,
self.COL_CURRENT_VER,
self.COL_STABLE_UPSTREAM_VER,
self.COL_LATEST_UPSTREAM_VER,
self.COL_STATE,
self.COL_DEPENDS_ON,
self.COL_USED_BY,
self.COL_TARGET,
]
if upgrade:
columns.append(self.COL_UPGRADED)
table.Table.__init__(self, columns, name=name)
def __getattribute__(self, name):
"""When accessing self.COL_*, substitute ARCH name."""
if name.startswith("COL_"):
text = getattr(UpgradeTable, name)
return UpgradeTable.GetColumnName(text, arch=self._arch)
else:
return object.__getattribute__(self, name)
def GetArch(self):
"""Get the architecture associated with this UpgradeTable."""
return self._arch