Removing a package lock was not counted as state change (bnc #501850)
authorMichael Andres <ma@suse.de>
Fri, 31 Jul 2009 16:08:15 +0000 (18:08 +0200)
committerMichael Andres <ma@suse.de>
Fri, 31 Jul 2009 16:08:15 +0000 (18:08 +0200)
tests/zypp/ResStatus_test.cc
zypp/PoolItem.cc

index c18e92f..5b975e0 100644 (file)
@@ -209,3 +209,35 @@ BOOST_AUTO_TEST_CASE(transition)
   testTable( &ResStatus::setSoftTransact,      &evaluateSetSoftTransact );
   testTable( &ResStatus::setLock,              &evaluateSetLock );
 }
+
+
+bool WhilePoolItemSameStateIsPrivate( ResStatus ostatus, ResStatus nstatus )
+{
+  if ( nstatus == ostatus )
+    return true;
+        // some bits changed...
+  if ( nstatus.getTransactValue() != ostatus.getTransactValue()
+       && ( ! nstatus.isBySolver() // ignore solver state changes
+                  // removing a user lock also goes to bySolver
+       || ostatus.getTransactValue() == ResStatus::LOCKED ) )
+    return false;
+  if ( nstatus.isLicenceConfirmed() != ostatus.isLicenceConfirmed() )
+    return false;
+  return true;
+}
+
+BOOST_AUTO_TEST_CASE(savestate)
+{
+  ResStatus ostatus;
+  ResStatus nstatus;
+
+  BOOST_CHECK_EQUAL( WhilePoolItemSameStateIsPrivate( ostatus, nstatus ), true );
+  nstatus.setLock( true, ResStatus::USER );
+  BOOST_CHECK_EQUAL( WhilePoolItemSameStateIsPrivate( ostatus, nstatus ), false );
+  ostatus = nstatus;
+  nstatus.setLock( false, ResStatus::USER );
+  BOOST_CHECK_EQUAL( WhilePoolItemSameStateIsPrivate( ostatus, nstatus ), false );
+}
+
+
+
index 28ac594..710255a 100644 (file)
@@ -106,8 +106,13 @@ namespace zypp
       { status() = _savedStatus; }
       bool sameState() const
       {
-        if (    status().getTransactValue() != _savedStatus.getTransactValue()
-                && !status().isBySolver() )
+        if ( status() == _savedStatus )
+          return true;
+        // some bits changed...
+        if ( status().getTransactValue() != _savedStatus.getTransactValue()
+             && ( ! status().isBySolver() // ignore solver state changes
+                  // removing a user lock also goes to bySolver
+                  || _savedStatus.getTransactValue() == ResStatus::LOCKED ) )
           return false;
         if ( status().isLicenceConfirmed() != _savedStatus.isLicenceConfirmed() )
           return false;