[haiku-commits] haiku: hrev52172 - in src: add-ons/kernel/file_systems/packagefs/package add-ons/kernel/file_systems/packagefs/nodes kits/package

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 5 Aug 2018 18:27:22 -0400 (EDT)

hrev52172 adds 4 changesets to branch 'master'
old head: 25b6a6f19b13680a759cffecebf60d0b7e76d3d3
new head: 5301f108efb9e3d82920fc6c4d3488d69772a4eb
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=5301f108efb9+%5E25b6a6f19b13

----------------------------------------------------------------------------

5753ed5544a5: packagefs: Move PackageNode comparison into an operator<.
  
  This commit does not amount to any functional change: we still compare
  purely by modification date alone. But it does de-duplify the code somewhat,
  and makes it possible to easily implement changes to the comparison.

0779294800d8: Package Kit: Fix logic reversal in PackageInfoStringBuilder.
  
  This function is used when serializing a BPackageInfo object, which is not
  done very often, and flags are used even less often. But both of these things
  are done for the system packages, as they have the "system_package" flag
  set, and are processed by "update_package_requires", and so this meant
  that the "system_package" flag was turned into the "approve_license" flag.

abf0c2878a3a: packagefs: system_packages take precedence over non-system 
packages.
  
  Affects *all* nodes, i.e., both directories and files. It is still possible
  to override these, but it must be done in another system_package, not just by
  mounting a package with newer datestamps on the conflicting files.
  
  This is the pure version of axeld's proposal 2(d) from #10071. However,
  as the haiku_secondary packages contain application mime_db entires and
  are also 'system_package's, it does not fully solve that ticket.

5301f108efb9: packagefs: Directories with more attributes take precedence over 
ones with less.
  
  This still preserves the behavior that system packages take precedence over
  non-system packages.
  
  Fixes #10071 (at last.)

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

----------------------------------------------------------------------------

9 files changed, 66 insertions(+), 11 deletions(-)
.../packagefs/nodes/UnpackingDirectory.cpp       |  8 +++-----
.../packagefs/nodes/UnpackingLeafNode.cpp        |  7 +++----
.../file_systems/packagefs/package/Package.cpp   |  5 +++++
.../file_systems/packagefs/package/Package.h     |  7 +++++++
.../packagefs/package/PackageDirectory.cpp       | 20 ++++++++++++++++++++
.../packagefs/package/PackageDirectory.h         |  4 ++++
.../packagefs/package/PackageNode.cpp            | 17 +++++++++++++++++
.../file_systems/packagefs/package/PackageNode.h |  5 +++++
src/kits/package/PackageInfoStringBuilder.h      |  4 ++--

############################################################################

Commit:      5753ed5544a59cc8116bdeacd04ca5a9a2a23a9f
URL:         https://git.haiku-os.org/haiku/commit/?id=5753ed5544a5
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sat Aug  4 02:53:24 2018 UTC

packagefs: Move PackageNode comparison into an operator<.

This commit does not amount to any functional change: we still compare
purely by modification date alone. But it does de-duplify the code somewhat,
and makes it possible to easily implement changes to the comparison.

----------------------------------------------------------------------------

diff --git 
a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp 
b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp
index 355c3f9b19..84cb86fced 100644
--- a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp
@@ -108,8 +108,7 @@ UnpackingDirectory::AddPackageNode(PackageNode* 
packageNode, dev_t deviceID)
                = dynamic_cast<PackageDirectory*>(packageNode);
 
        PackageDirectory* other = fPackageDirectories.Head();
-       bool isNewest = other == NULL
-               || packageDirectory->ModifiedTime() > other->ModifiedTime();
+       bool isNewest = other == NULL || *packageDirectory > *other;
 
        if (isNewest) {
                fPackageDirectories.Insert(other, packageDirectory);
@@ -135,7 +134,7 @@ UnpackingDirectory::RemovePackageNode(PackageNode* 
packageNode, dev_t deviceID)
                it.Next();
                        // skip the first one
                while (PackageDirectory* otherNode = it.Next()) {
-                       if (otherNode->ModifiedTime() > 
newestNode->ModifiedTime())
+                       if (*otherNode > *newestNode)
                                newestNode = otherNode;
                }
 
@@ -170,8 +169,7 @@ UnpackingDirectory::WillBeFirstPackageNode(PackageNode* 
packageNode) const
                return false;
 
        PackageDirectory* other = fPackageDirectories.Head();
-       return other == NULL
-               || packageDirectory->ModifiedTime() > other->ModifiedTime();
+       return other == NULL || *packageDirectory > *other;
 }
 
 
diff --git 
a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp 
b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp
index bfaac35142..fc7a0e2627 100644
--- a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp
@@ -117,7 +117,7 @@ UnpackingLeafNode::AddPackageNode(PackageNode* packageNode, 
dev_t deviceID)
 
        PackageLeafNode* headNode = fPackageNodes.Head();
        bool isNewest = headNode == NULL
-               || packageLeafNode->ModifiedTime() > headNode->ModifiedTime();
+               || packageLeafNode > headNode;
 
        if (isNewest) {
                fPackageNodes.Add(packageLeafNode);
@@ -149,7 +149,7 @@ UnpackingLeafNode::RemovePackageNode(PackageNode* 
packageNode, dev_t deviceID)
                it.Next();
                        // skip the first one
                while (PackageLeafNode* otherNode = it.Next()) {
-                       if (otherNode->ModifiedTime() > 
newestNode->ModifiedTime())
+                       if (*otherNode > *newestNode)
                                newestNode = otherNode;
                }
 
@@ -187,8 +187,7 @@ UnpackingLeafNode::WillBeFirstPackageNode(PackageNode* 
packageNode) const
                return false;
 
        PackageLeafNode* headNode = fPackageNodes.Head();
-       return headNode == NULL
-               || packageLeafNode->ModifiedTime() > headNode->ModifiedTime();
+       return headNode == NULL || *packageLeafNode > *headNode;
 }
 
 void
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp
index 689b7cd732..63ed5ae118 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp
@@ -11,6 +11,7 @@
 
 #include "DebugSupport.h"
 #include "Package.h"
+#include "Utils.h"
 
 
 PackageNode::PackageNode(Package* package, mode_t mode)
@@ -101,3 +102,10 @@ PackageNode::UnsetIndexCookie(void* attributeCookie)
 {
        ((PackageNodeAttribute*)attributeCookie)->SetIndexCookie(NULL);
 }
+
+
+bool
+PackageNode::operator<(const PackageNode& other) const
+{
+       return fModifiedTime < other.fModifiedTime;
+}
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h
index 331484a883..28deaf01ff 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h
@@ -73,6 +73,10 @@ public:
        inline  void*                           IndexCookieForAttribute(const 
StringKey& name)
                                                                        const;
 
+                       bool                            operator<(const 
PackageNode& other) const;
+       inline  bool                            operator>(const PackageNode& 
other) const
+                                                                       { 
return other < *this; }
+
                        // conceptually protected, but actually declaring it so 
causes
                        // compilation issues when used with MethodDeleter in 
subclasses
                        void                            NonVirtualVFSUninit()

############################################################################

Commit:      0779294800d8782b540709c10f54ebe38e1e54ba
URL:         https://git.haiku-os.org/haiku/commit/?id=0779294800d8
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sun Aug  5 04:06:45 2018 UTC

Package Kit: Fix logic reversal in PackageInfoStringBuilder.

This function is used when serializing a BPackageInfo object, which is not
done very often, and flags are used even less often. But both of these things
are done for the system packages, as they have the "system_package" flag
set, and are processed by "update_package_requires", and so this meant
that the "system_package" flag was turned into the "approve_license" flag.

----------------------------------------------------------------------------

diff --git a/src/kits/package/PackageInfoStringBuilder.h 
b/src/kits/package/PackageInfoStringBuilder.h
index 4e4c33d323..5fff72b7d7 100644
--- a/src/kits/package/PackageInfoStringBuilder.h
+++ b/src/kits/package/PackageInfoStringBuilder.h
@@ -64,9 +64,9 @@ struct BPackageInfo::StringBuilder {
                _Write(attribute);
                _Write('\t');
 
-               if ((flags & B_PACKAGE_FLAG_APPROVE_LICENSE) == 0)
+               if ((flags & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0)
                        _Write(" approve_license");
-               if ((flags & B_PACKAGE_FLAG_SYSTEM_PACKAGE) == 0)
+               if ((flags & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0)
                        _Write(" system_package");
 
                _Write('\n');

############################################################################

Commit:      abf0c2878a3aa5389d0f054737454c50b3a8b207
URL:         https://git.haiku-os.org/haiku/commit/?id=abf0c2878a3a
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sun Aug  5 20:25:54 2018 UTC

Ticket:      https://dev.haiku-os.org/ticket/10071

packagefs: system_packages take precedence over non-system packages.

Affects *all* nodes, i.e., both directories and files. It is still possible
to override these, but it must be done in another system_package, not just by
mounting a package with newer datestamps on the conflicting files.

This is the pure version of axeld's proposal 2(d) from #10071. However,
as the haiku_secondary packages contain application mime_db entires and
are also 'system_package's, it does not fully solve that ticket.

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp
index 027275a0c2..73ded3baad 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/Package.cpp
@@ -268,6 +268,10 @@ struct Package::LoaderContentHandler : 
BPackageContentHandler {
                                break;
                        }
 
+                       case B_PACKAGE_INFO_FLAGS:
+                               fPackage->SetFlags(value.unsignedInt);
+                               break;
+
                        case B_PACKAGE_INFO_ARCHITECTURE:
                                if (value.unsignedInt >= 
B_PACKAGE_ARCHITECTURE_ENUM_COUNT)
                                        RETURN_ERROR(B_BAD_VALUE);
@@ -816,6 +820,7 @@ Package::Package(::Volume* volume, PackagesDirectory* 
directory, dev_t deviceID,
        fInstallPath(),
        fVersionedName(),
        fVersion(NULL),
+       fFlags(0),
        fArchitecture(B_PACKAGE_ARCHITECTURE_ENUM_COUNT),
        fLinkDirectory(NULL),
        fFD(-1),
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/Package.h 
b/src/add-ons/kernel/file_systems/packagefs/package/Package.h
index b886188668..0dcee7ff90 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/Package.h
+++ b/src/add-ons/kernel/file_systems/packagefs/package/Package.h
@@ -7,6 +7,7 @@
 
 
 #include <package/hpkg/DataReader.h>
+#include <package/PackageFlags.h>
 #include <package/PackageArchitecture.h>
 
 #include <Referenceable.h>
@@ -69,6 +70,11 @@ public:
                        ::Version*                      Version() const
                                                                        { 
return fVersion; }
 
+                       void                            SetFlags(uint32 flags)
+                                                                       { 
fFlags = flags; }
+                       uint32                          Flags() const
+                                                                       { 
return fFlags; }
+
                        void                            SetArchitecture(
                                                                        
BPackageArchitecture architecture)
                                                                        { 
fArchitecture = architecture; }
@@ -123,6 +129,7 @@ private:
                        String                          fInstallPath;
                        String                          fVersionedName;
                        ::Version*                      fVersion;
+                       uint32                          fFlags;
                        BPackageArchitecture fArchitecture;
                        PackageLinkDirectory* fLinkDirectory;
                        int                                     fFD;
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp
index 63ed5ae118..f299089125 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp
@@ -17,6 +17,7 @@
 PackageNode::PackageNode(Package* package, mode_t mode)
        :
        fPackage(package),
+       fPackageFlags(package != NULL ? package->Flags() : 0),
        fParent(NULL),
        fName(),
        fMode(mode),
@@ -107,5 +108,13 @@ PackageNode::UnsetIndexCookie(void* attributeCookie)
 bool
 PackageNode::operator<(const PackageNode& other) const
 {
+       const bool isSystemPkg = (fPackageFlags
+                       & BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0,
+               otherIsSystemPkg = (other.fPackageFlags
+                       & BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0;
+       if (isSystemPkg && !otherIsSystemPkg)
+               return false;
+       if (!isSystemPkg && otherIsSystemPkg)
+               return true;
        return fModifiedTime < other.fModifiedTime;
 }
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h
index 28deaf01ff..7b1e99c782 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h
@@ -86,6 +86,7 @@ public:
 
 protected:
                        Package*                        fPackage;
+                       uint32                          fPackageFlags;
                        PackageDirectory*       fParent;
                        String                          fName;
                        mode_t                          fMode;

############################################################################

Revision:    hrev52172
Commit:      5301f108efb9e3d82920fc6c4d3488d69772a4eb
URL:         https://git.haiku-os.org/haiku/commit/?id=5301f108efb9
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sun Aug  5 22:24:02 2018 UTC

Ticket:      https://dev.haiku-os.org/ticket/10071

packagefs: Directories with more attributes take precedence over ones with less.

This still preserves the behavior that system packages take precedence over
non-system packages.

Fixes #10071 (at last.)

----------------------------------------------------------------------------

diff --git 
a/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.cpp
index e24542c6f3..2cfaaff884 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.cpp
@@ -5,6 +5,7 @@
 
 
 #include "PackageDirectory.h"
+#include "Package.h"
 
 
 PackageDirectory::PackageDirectory(Package* package, mode_t mode)
@@ -35,3 +36,22 @@ PackageDirectory::RemoveChild(PackageNode* node)
        fChildren.Remove(node);
        node->ReleaseReference();
 }
+
+
+bool
+PackageDirectory::operator<(const PackageDirectory& other) const
+{
+       // If one of us has the SYSTEM_PACKAGE flag and the other doesn't,
+       // let PackageNode take care of the comparison.
+       if ((fPackageFlags & BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE)
+                       != (other.fPackageFlags
+                               & BPackageKit::B_PACKAGE_FLAG_SYSTEM_PACKAGE)) {
+               return PackageNode::operator<(other);
+       }
+
+       const int32 attrs = fAttributes.Count(),
+               otherAttrs = other.fAttributes.Count();
+       if (attrs != otherAttrs)
+               return attrs < otherAttrs;
+       return PackageNode::operator<(other);
+}
diff --git 
a/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.h 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.h
index 624b8694c8..6f2ddad140 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.h
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageDirectory.h
@@ -26,6 +26,10 @@ public:
                        const PackageNodeList& Children() const
                                                                        { 
return fChildren; }
 
+                       bool                            operator<(const 
PackageDirectory& other) const;
+       inline  bool                            operator>(const 
PackageDirectory& other) const
+                                                                       { 
return other < *this; }
+
 private:
                        PackageNodeList         fChildren;
 };


Other related posts: