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

Reply via email to