string << '.' << version.Micro();
}
- // append pre-release -- separate it with '/' to keep pool_evrcmp_str() happy
- // (it expects only the release to be separated by '-')
+ // append pre-release
if (!version.PreRelease().IsEmpty())
- string << '/' << version.PreRelease();
+ string << '-' << version.PreRelease();
// append revision
if (version.Revision() != 0)
{
versionId = pool_rel2id(pool, pool_str2id(pool, compatVersion, 1),
versionId, REL_COMPAT, 1);
- versionId = MAKERELDEP(versionId);
}
dependency = pool_rel2id(pool, dependency, versionId, flags, 1);
name << packageInfo.Name();
solvable->name = pool_str2id(pool, name, 1);
if (packageInfo.Architecture() == B_PACKAGE_ARCHITECTURE_ANY)
- solvable->arch = ARCH_NOARCH;
+ solvable->arch = ARCH_ANY;
else
solvable->arch = pool_str2id(pool,
BPackageInfo::kArchitectureNames[packageInfo.Architecture()], 1);
#endif
-#if defined(HAIKU)
+#if defined(HAIKU) || defined(MULTI_SEMANTICS)
static int
solv_cmp_version_part_haiku(const char *s1, const char *q1, const char *s2,
int cmp;
/* find pre-release separator */
- while (pre1 != q1 && *pre1 != '/')
+ while (pre1 != q1 && *pre1 != '-')
pre1++;
- while (pre2 != q2 && *pre2 != '/')
+ while (pre2 != q2 && *pre2 != '-')
pre2++;
/* compare main versions */
return -1;
return solv_cmp_version_part_haiku(pre1 + 1, q1, pre2 + 1, q2);
- cmp = solv_cmp_version_part_haiku(pre1 + 1, q1, pre2 + 1, q2);
- return cmp == 0 ? 0 : cmp < 0 ? -1 : 1; /* must return -1, 0, or 1 */
}
#endif /* HAIKU */
}
#if defined(MULTI_SEMANTICS)
-# define solv_vercmp (*(pool->disttype == DISTTYPE_DEB ? &solv_vercmp_deb : &solv_ver##cmp_rpm))
+# define solv_vercmp (*(pool->disttype == DISTTYPE_DEB ? &solv_vercmp_deb : \
+ pool->disttype == DISTTYPE_HAIKU ? solv_vercmp_haiku : \
+ &solv_ver##cmp_rpm))
#elif defined(DEBIAN)
# define solv_vercmp solv_vercmp_deb
#elif defined(ARCHLINUX)
# define solv_vercmp solv_vercmp_rpm_notilde
+#elif defined(HAIKU)
+# define solv_vercmp solv_vercmp_haiku
#else
# define solv_vercmp solv_vercmp_rpm
#endif
#elif defined(ARCHLINUX)
pool->disttype = DISTTYPE_ARCH;
pool->noarchid = ARCH_ANY;
+#elif defined(HAIKU)
+ pool->disttype = DISTTYPE_HAIKU;
+ pool->noarchid = ARCH_ANY;
+ pool->obsoleteusesprovides = 1;
#else
pool->disttype = DISTTYPE_RPM;
pool->noarchid = ARCH_NOARCH;
pool->noarchid = ARCH_ALL;
if (disttype == DISTTYPE_ARCH)
pool->noarchid = ARCH_ANY;
+ if (disttype == DISTTYPE_HAIKU)
+ pool->noarchid = ARCH_ANY;
pool->solvables[SYSTEMSOLVABLE].arch = pool->noarchid;
}
#endif
return 0;
}
+#if defined(HAIKU) || defined(MULTI_SEMANTICS)
+/* forward declaration */
+static int pool_match_flags_evr_rel_compat(Pool *pool, Reldep *range, int flags, int evr);
+#endif
+
/* match (flags, evr) against provider (pflags, pevr) */
static inline int
pool_match_flags_evr(Pool *pool, int pflags, Id pevr, int flags, int evr)
return 1; /* both rels show in the same direction */
if (pevr == evr)
return (flags & pflags & REL_EQ) ? 1 : 0;
+#if defined(HAIKU) || defined(MULTI_SEMANTICS)
if (ISRELDEP(pevr))
{
- Reldep *range = GETRELDEP(pool, pevr);
- if (range->flags != REL_COMPAT)
- return 0; /* unsupported */
- /* range->name is the backwards compatibility version, range->evr the
- actual version. If flags are '>=' or '>', we match the compatibility
- version as well, otherwise only the actual version. */
- if (!(flags & REL_GT) || (flags & REL_LT))
- return pool_match_flags_evr(pool, REL_EQ, range->evr, flags, evr);
- return pool_match_flags_evr(pool, REL_LT | REL_EQ, range->evr, flags, evr) &&
- pool_match_flags_evr(pool, REL_GT | REL_EQ, range->name, REL_EQ, evr);
+ Reldep *rd = GETRELDEP(pool, pevr);
+ if (rd->flags == REL_COMPAT)
+ return pool_match_flags_evr_rel_compat(pool, rd, flags, evr);
}
+#endif
switch (pool_evrcmp(pool, pevr, evr, EVRCMP_DEPCMP))
{
case -2:
return 0;
}
+#if defined(HAIKU) || defined(MULTI_SEMANTICS)
+static int
+pool_match_flags_evr_rel_compat(Pool *pool, Reldep *range, int flags, int evr)
+{
+ /* range->name is the backwards compatibility version, range->evr the
+ actual version. If flags are '>=' or '>', we match the compatibility
+ version as well, otherwise only the actual version. */
+ if (!(flags & REL_GT) || (flags & REL_LT))
+ return pool_match_flags_evr(pool, REL_EQ, range->evr, flags, evr);
+ return pool_match_flags_evr(pool, REL_LT | REL_EQ, range->evr, flags, evr) &&
+ pool_match_flags_evr(pool, REL_GT | REL_EQ, range->name, REL_EQ, evr);
+}
+#endif
+
/* match two dependencies (d1 = provider) */
int