Webrev:
https://cr.opensolaris.org/action/browse/pkg/bpytlik/18441-v4
This makes freeze state be stored in the catalog. Not surprisingly, this
means that 'pkg freeze foo' went from being essentially instant to
taking 15 seconds while we rebuild the index.
Incremental diff:
diff -r 4a3be3eee8c8 src/client.py
--- a/src/client.py Fri Jun 24 18:10:39 2011 -0700
+++ b/src/client.py Fri Jul 01 14:22:31 2011 -0700
@@ -2655,23 +2655,29 @@
msg(lic)
continue
- state = ""
+ state = "%s"
+ if api.PackageInfo.INSTALLED in pi.states:
+ state = state % _("Installed")
+ elif api.PackageInfo.UNSUPPORTED in pi.states:
+ state = state % _("Unsupported")
+ else:
+ state = state % _("Not installed")
+
+ lparen = False
if api.PackageInfo.OBSOLETE in pi.states:
- state = _("Obsolete")
+ state += " (%s" % _("Obsolete")
+ print >> sys.stderr, "got obsolete state"
+ lparen = True
elif api.PackageInfo.RENAMED in pi.states:
- state = _("Renamed")
-
- if state:
- fmt = "%%s (%s)" % state
- else:
- fmt = "%s"
-
- if api.PackageInfo.INSTALLED in pi.states:
- state = fmt % _("Installed")
- elif api.PackageInfo.UNSUPPORTED in pi.states:
- state = fmt % _("Unsupported")
- else:
- state = fmt % _("Not installed")
+ state += " (%s" % _("Renamed")
+ lparen = True
+ if api.PackageInfo.FROZEN in pi.states:
+ if lparen:
+ state += ", %s)" % _("Frozen")
+ else:
+ state += " (%s)" % _("Frozen")
+ elif lparen:
+ state += ")"
name_str = _(" Name:")
msg(name_str, pi.pkg_stem)
diff -r 4a3be3eee8c8 src/modules/client/api.py
--- a/src/modules/client/api.py Fri Jun 24 18:10:39 2011 -0700
+++ b/src/modules/client/api.py Fri Jul 01 14:22:31 2011 -0700
@@ -2670,11 +2670,6 @@
# per-publisher basis.
nlist = collections.defaultdict(int)
- # Get the list of frozen packages for later use.
- frozen_pkgs = dict([
- (p[0].pkg_name, p[0]) for p in self.get_frozen_list()
- ])
-
def check_state(t, entry):
states = entry["metadata"]["states"]
pkgi = self._img.PKG_STATE_INSTALLED in states
@@ -2995,15 +2990,6 @@
# category criteria.
continue
- # Check if this package has been frozen.
- if stem in frozen_pkgs:
- f_ver = frozen_pkgs[stem].version
- if f_ver == ver or \
- pkg.version.Version(ver,
- brelease).is_successor(f_ver,
-
constraint=pkg.version.CONSTRAINT_AUTO):
- states.append(PackageInfo.FROZEN)
-
# Return the requested package data.
if not unsupported:
# Prevent modification of state data.
diff -r 4a3be3eee8c8 src/modules/client/image.py
--- a/src/modules/client/image.py Fri Jun 24 18:10:39 2011 -0700
+++ b/src/modules/client/image.py Fri Jul 01 14:22:31 2011 -0700
@@ -2788,6 +2788,10 @@
self.IMG_CATALOG_INSTALLED), sign=False)
excludes = self.list_excludes()
+
+ frozen_pkgs = dict([
+ (p[0].pkg_name, p[0]) for p in self.get_frozen_list()
+ ])
for pfx, cat, name, spart in sparts:
# 'spart' is the source part.
if spart is None:
@@ -2849,6 +2853,18 @@
if snver is not None and ver != snver:
states.append(self.PKG_STATE_UPGRADABLE)
+ # Check if the package is frozen.
+ if stem in frozen_pkgs:
+ f_ver = frozen_pkgs[stem].version
+ if f_ver == ver or \
+ pkg.version.Version(ver,
+ self.attrs["Build-Release"]
+ ).is_successor(f_ver,
+ constraint=
+ pkg.version.CONSTRAINT_AUTO):
+ states.append(
+ self.PKG_STATE_FROZEN)
+
# Determine if package is obsolete or
has been
# renamed and mark with appropriate state.
dpent = None
@@ -4102,3 +4118,4 @@
portable.rename(tmp_file, state_file)
except EnvironmentError, e:
raise apx._convert_error(e)
+ self.__rebuild_image_catalogs()
diff -r 4a3be3eee8c8 src/tests/cli/t_pkg_freeze.py
--- a/src/tests/cli/t_pkg_freeze.py Fri Jun 24 18:10:39 2011 -0700
+++ b/src/tests/cli/t_pkg_freeze.py Fri Jul 01 14:22:31 2011 -0700
@@ -60,10 +60,16 @@
open [email protected],5.11-0
close """
+ obsolete10 = """
+ open [email protected],5.11-0
+ add set name=pkg.obsolete value=true
+ close """
+
def setUp(self):
pkg5unittest.SingleDepotTestCase.setUp(self)
self.sent_pkgs = self.pkgsend_bulk(self.rurl, [self.foo10,
- self.foo11, self.baz10, self.bar10, self.pkg410])
+ self.foo11, self.baz10, self.bar10, self.pkg410,
+ self.obsolete10])
self.foo10_name =
fmri.PkgFmri(self.sent_pkgs[0]).get_fmri(
anarchy=True)
self.foo11_name =
fmri.PkgFmri(self.sent_pkgs[1]).get_fmri(
@@ -158,6 +164,8 @@
self.assertEqualDiff("foo", tmp[0])
self.assertEqualDiff("1.0", tmp[1])
self.assert_("None" in self.output)
+ self.pkg("info foo")
+ self.assert_("(Frozen)" in self.output)
# Test that unfreezing a package allows it to move.
self.pkg("unfreeze foo")
@@ -191,6 +199,10 @@
self.pkg("install [email protected]", exit=1)
self.assert_("1.2 is broken" in self.errout)
+ self.pkg("freeze [email protected]")
+ self.pkg("info -r obso")
+ self.assert_("(Obsolete, Frozen)" in self.output)
+
def test_unprived_operation(self):
"""Test that pkg freeze and unfreeze display the
frozen packages
without needing privs, and that they don't stack trace
when run
Thanks,
Brock
On 06/24/11 06:12 PM, Brock Pytlik wrote:
New webrev:
http://cr.opensolaris.org/~bpytlik/ips-18441-v3/
Diff from v2 to v3:
http://cr.opensolaris.org/~bpytlik/ips-18441-v2-v3.diff
This addresses the comments Danek had, and fills in the F field of the
IFO in pkg list (which is why I sent this out once more).
Thanks,
Brock
On 06/10/11 12:13 AM, Brock Pytlik wrote:
Webrev:
http://cr.opensolaris.org/~bpytlik/ips-18441-v1/
Bug:
18441 pkg needs a freeze mechanism
These changes provide the freeze mechanism I outlined previously. The
biggest changes I know of from the original use cases I sent out are
that:
1) If pkg unfreeze <blah> doesn't match any frozen packages, no error
is reported. I decided that seems reasonable since pkg unfreeze
details each package that was unfrozen, so no output means no
packages were unfrozen.
2) Publishers can be part of the patterns used for matching, but a
package is only frozen to a version, not to a publisher.
I think that covers the major changes.
Thanks,
Brock
_______________________________________________
pkg-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/pkg-discuss
_______________________________________________
pkg-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/pkg-discuss
_______________________________________________
pkg-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/pkg-discuss