decomposed: Add flatpak_decomposed_id_is_subref_of()

This checks if e.g. `org.app.App.Locale` is a subref of `org.app.App`.
This commit is contained in:
Alexander Larsson
2020-11-14 13:35:13 +01:00
committed by Alexander Larsson
parent 866d471d37
commit 7b1b706f80
3 changed files with 96 additions and 0 deletions

View File

@@ -113,6 +113,8 @@ gboolean flatpak_decomposed_id_has_prefix (FlatpakDecomposed
gboolean flatpak_decomposed_is_id_fuzzy (FlatpakDecomposed *ref,
const char *id);
gboolean flatpak_decomposed_id_is_subref (FlatpakDecomposed *ref);
gboolean flatpak_decomposed_id_is_subref_of (FlatpakDecomposed *ref,
FlatpakDecomposed *parent_ref);
const char * flatpak_decomposed_peek_arch (FlatpakDecomposed *ref,
gsize *out_len);
char * flatpak_decomposed_dup_arch (FlatpakDecomposed *ref);

View File

@@ -1353,9 +1353,55 @@ flatpak_decomposed_id_is_subref (FlatpakDecomposed *ref)
gsize ref_id_len;
const char *ref_id = flatpak_decomposed_peek_id (ref, &ref_id_len);
if (!flatpak_decomposed_is_runtime (ref))
return FALSE;
return flatpak_id_has_subref_suffix (ref_id, ref_id_len);
}
gboolean
flatpak_decomposed_id_is_subref_of (FlatpakDecomposed *ref,
FlatpakDecomposed *parent_ref)
{
gsize ref_id_len;
const char *ref_id = flatpak_decomposed_peek_id (ref, &ref_id_len);
gsize parent_id_len;
const char *parent_id = flatpak_decomposed_peek_id (parent_ref, &parent_id_len);
/* All subrefs are runtimes, even for apps */
if (!flatpak_decomposed_is_runtime (ref))
return FALSE;
if (!flatpak_id_has_subref_suffix (ref_id, ref_id_len))
return FALSE;
/* Guaranteed to have a dot in it from the above check, so strip last element */
while (ref_id[ref_id_len-1] != '.')
ref_id_len--;
ref_id_len--; /* And strip dot */
/* Any dashes in the last element of parent_id got converted to
underscores to make it a valid prefix, so custom compare here. */
if (ref_id_len != parent_id_len)
return FALSE;
for (int i = 0; i < ref_id_len; i++)
{
char c = parent_id[i];
if (c == '-')
c = '_';
if (c != ref_id[i])
return FALSE;
}
/* Check the rest of the ref */
return strcmp (flatpak_decomposed_peek_arch (ref, NULL),
flatpak_decomposed_peek_arch (parent_ref, NULL)) == 0;
}
const char *
flatpak_decomposed_peek_arch (FlatpakDecomposed *ref,
gsize *out_len)

View File

@@ -431,6 +431,54 @@ test_decompose (void)
branch = flatpak_decomposed_dup_branch (pref);
g_assert_cmpstr (branch, ==, "master");
}
{
g_autoptr(FlatpakDecomposed) a = flatpak_decomposed_new_from_ref ("app/org.app.A/x86_64/master", NULL);
g_autoptr(FlatpakDecomposed) a_l = flatpak_decomposed_new_from_ref ("runtime/org.app.A.Locale/x86_64/master", NULL);
g_autoptr(FlatpakDecomposed) b = flatpak_decomposed_new_from_ref ("app/org.app.B/x86_64/master", NULL);
g_autoptr(FlatpakDecomposed) b_l = flatpak_decomposed_new_from_ref ("runtime/org.app.B.Locale/x86_64/master", NULL);
g_autoptr(FlatpakDecomposed) c = flatpak_decomposed_new_from_ref ("app/org.app.A/i386/master", NULL);
g_autoptr(FlatpakDecomposed) c_l = flatpak_decomposed_new_from_ref ("runtime/org.app.A.Locale/i386/master", NULL);
g_autoptr(FlatpakDecomposed) d = flatpak_decomposed_new_from_ref ("app/org.app.A/x86_64/beta", NULL);
g_autoptr(FlatpakDecomposed) d_l = flatpak_decomposed_new_from_ref ("runtime/org.app.A.Locale/x86_64/beta", NULL);
g_assert (flatpak_decomposed_id_is_subref_of (a_l, a));
g_assert (!flatpak_decomposed_id_is_subref_of (b_l, a));
g_assert (!flatpak_decomposed_id_is_subref_of (c_l, a));
g_assert (!flatpak_decomposed_id_is_subref_of (d_l, a));
g_assert (!flatpak_decomposed_id_is_subref_of (a, a));
g_assert (!flatpak_decomposed_id_is_subref_of (b, a));
g_assert (!flatpak_decomposed_id_is_subref_of (c, a));
g_assert (!flatpak_decomposed_id_is_subref_of (d, a));
g_assert (!flatpak_decomposed_id_is_subref_of (a_l, b));
g_assert (flatpak_decomposed_id_is_subref_of (b_l, b));
g_assert (!flatpak_decomposed_id_is_subref_of (c_l, b));
g_assert (!flatpak_decomposed_id_is_subref_of (d_l, b));
g_assert (!flatpak_decomposed_id_is_subref_of (a, b));
g_assert (!flatpak_decomposed_id_is_subref_of (b, b));
g_assert (!flatpak_decomposed_id_is_subref_of (c, b));
g_assert (!flatpak_decomposed_id_is_subref_of (d, b));
g_assert (!flatpak_decomposed_id_is_subref_of (a_l, c));
g_assert (!flatpak_decomposed_id_is_subref_of (b_l, c));
g_assert (flatpak_decomposed_id_is_subref_of (c_l, c));
g_assert (!flatpak_decomposed_id_is_subref_of (d_l, c));
g_assert (!flatpak_decomposed_id_is_subref_of (a, c));
g_assert (!flatpak_decomposed_id_is_subref_of (b, c));
g_assert (!flatpak_decomposed_id_is_subref_of (c, c));
g_assert (!flatpak_decomposed_id_is_subref_of (d, c));
g_assert (!flatpak_decomposed_id_is_subref_of (a_l, d));
g_assert (!flatpak_decomposed_id_is_subref_of (b_l, d));
g_assert (!flatpak_decomposed_id_is_subref_of (c_l, d));
g_assert (flatpak_decomposed_id_is_subref_of (d_l, d));
g_assert (!flatpak_decomposed_id_is_subref_of (a, d));
g_assert (!flatpak_decomposed_id_is_subref_of (b, d));
g_assert (!flatpak_decomposed_id_is_subref_of (c, d));
g_assert (!flatpak_decomposed_id_is_subref_of (d, d));
}
}