diff --git a/common/flatpak-dir.h b/common/flatpak-dir.h
index 628e844c..014c8206 100644
--- a/common/flatpak-dir.h
+++ b/common/flatpak-dir.h
@@ -420,13 +420,13 @@ gboolean flatpak_dir_fetch_ref_cache (FlatpakDir *self,
GCancellable *cancellable,
GError **error);
GPtrArray * flatpak_dir_find_remote_related (FlatpakDir *dir,
- const char *ref,
const char *remote_name,
+ const char *ref,
GCancellable *cancellable,
GError **error);
GPtrArray * flatpak_dir_find_local_related (FlatpakDir *self,
- const char *ref,
const char *remote_name,
+ const char *ref,
GCancellable *cancellable,
GError **error);
diff --git a/lib/Makefile.am.inc b/lib/Makefile.am.inc
index f1d51278..d3a2ad93 100644
--- a/lib/Makefile.am.inc
+++ b/lib/Makefile.am.inc
@@ -9,6 +9,7 @@ flatpakinclude_HEADERS = \
lib/flatpak-error.h \
lib/flatpak-installed-ref.h \
lib/flatpak-remote-ref.h \
+ lib/flatpak-related-ref.h \
lib/flatpak-bundle-ref.h \
lib/flatpak-installation.h \
lib/flatpak-remote.h \
@@ -46,8 +47,10 @@ libflatpak_la_SOURCES = \
lib/flatpak-installed-ref.c \
lib/flatpak-installed-ref-private.h \
lib/flatpak-remote-ref.c \
- lib/flatpak-bundle-ref.c \
lib/flatpak-remote-ref-private.h \
+ lib/flatpak-bundle-ref.c \
+ lib/flatpak-related-ref.c \
+ lib/flatpak-related-ref-private.h \
lib/flatpak-remote-private.h \
lib/flatpak-remote.c \
lib/flatpak-error.c \
diff --git a/lib/flatpak-installation.c b/lib/flatpak-installation.c
index cc558a76..02ca7f67 100644
--- a/lib/flatpak-installation.c
+++ b/lib/flatpak-installation.c
@@ -26,6 +26,7 @@
#include "flatpak-utils.h"
#include "flatpak-installation.h"
#include "flatpak-installed-ref-private.h"
+#include "flatpak-related-ref-private.h"
#include "flatpak-remote-private.h"
#include "flatpak-remote-ref-private.h"
#include "flatpak-enum-types.h"
@@ -1571,3 +1572,117 @@ flatpak_installation_create_monitor (FlatpakInstallation *self,
return g_file_monitor_file (path, G_FILE_MONITOR_NONE,
cancellable, error);
}
+
+
+/**
+ * flatpak_installation_list_remote_related_refs_sync:
+ * @self: a #FlatpakInstallation
+ * @remote_name: the name of the remote
+ * @ref: the name of the remote
+ * @cancellable: (nullable): a #GCancellable
+ * @error: return location for a #GError
+ *
+ * Lists all the available refs on @remote_name that are related to
+ * @ref, and the subpaths to use. These are things that are
+ * interesting to install, update, or uninstall together with
+ * @ref. For instance, locale data or debug information.
+ *
+ * The returned list contains all available related refs, but not
+ * everyone should always be installed. For example,
+ * flatpak_related_ref_should_download () returns TRUE if the
+ * reference should be installed/updated with the app, and
+ * flatpak_related_ref_should_delete () returns TRUE if it
+ * should be uninstalled with the main ref.
+ *
+ * Returns: (transfer container) (element-type FlatpakRelatedRef): an GPtrArray of
+ * #FlatpakRelatedRef instances
+ *
+ * Since: 0.6.7
+ */
+GPtrArray *
+flatpak_installation_list_remote_related_refs_sync (FlatpakInstallation *self,
+ const char *remote_name,
+ const char *ref,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(FlatpakDir) dir = flatpak_installation_get_dir (self);
+ g_autoptr(GPtrArray) related = NULL;
+ g_autoptr(GPtrArray) refs = g_ptr_array_new_with_free_func (g_object_unref);
+ int i;
+
+ related = flatpak_dir_find_remote_related (dir, ref, remote_name,
+ cancellable, error);
+ if (related == NULL)
+ return NULL;
+
+ for (i = 0; i < related->len; i++)
+ {
+ FlatpakRelated *rel = g_ptr_array_index (related, i);
+ FlatpakRelatedRef *ref;
+
+ ref = flatpak_related_ref_new (rel->ref, rel->commit,
+ rel->subpaths, rel->download, rel->delete);
+
+ if (ref)
+ g_ptr_array_add (refs, ref);
+ }
+
+ return g_steal_pointer (&refs);
+}
+
+/**
+ * flatpak_installation_list_installed_related_refs_sync:
+ * @self: a #FlatpakInstallation
+ * @remote_name: the name of the remote
+ * @ref: the name of the remote
+ * @cancellable: (nullable): a #GCancellable
+ * @error: return location for a #GError
+ *
+ * Lists all the locally installed refs from @remote_name that are
+ * related to @ref. These are things that are interesting to install,
+ * update, or uninstall together with @ref. For instance, locale data
+ * or debug information.
+ *
+ * This function is similar to flatpak_installation_list_remote_related_refs_sync,
+ * but instead of looking at what is available on the remote, it only looks
+ * at the locally installed refs. This is useful for instance when you're
+ * looking for related refs to uninstall, or when you're planning to use
+ * FLATPAK_UPDATE_FLAGS_NO_PULL to install previously pulled refs.
+ *
+ * Returns: (transfer container) (element-type FlatpakRelatedRef): an GPtrArray of
+ * #FlatpakRelatedRef instances
+ *
+ * Since: 0.6.7
+ */
+GPtrArray *
+flatpak_installation_list_installed_related_refs_sync (FlatpakInstallation *self,
+ const char *remote_name,
+ const char *ref,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(FlatpakDir) dir = flatpak_installation_get_dir (self);
+ g_autoptr(GPtrArray) related = NULL;
+ g_autoptr(GPtrArray) refs = g_ptr_array_new_with_free_func (g_object_unref);
+ int i;
+
+ related = flatpak_dir_find_local_related (dir, ref, remote_name,
+ cancellable, error);
+ if (related == NULL)
+ return NULL;
+
+ for (i = 0; i < related->len; i++)
+ {
+ FlatpakRelated *rel = g_ptr_array_index (related, i);
+ FlatpakRelatedRef *ref;
+
+ ref = flatpak_related_ref_new (rel->ref, rel->commit,
+ rel->subpaths, rel->download, rel->delete);
+
+ if (ref)
+ g_ptr_array_add (refs, ref);
+ }
+
+ return g_steal_pointer (&refs);
+}
diff --git a/lib/flatpak-installation.h b/lib/flatpak-installation.h
index 106fda3b..2d2fc28c 100644
--- a/lib/flatpak-installation.h
+++ b/lib/flatpak-installation.h
@@ -251,5 +251,15 @@ FLATPAK_EXTERN gboolean flatpak_installation_update_appstream_sync (Fla
gboolean *out_changed,
GCancellable *cancellable,
GError **error);
+FLATPAK_EXTERN GPtrArray * flatpak_installation_list_remote_related_refs_sync (FlatpakInstallation *self,
+ const char *remote_name,
+ const char *ref,
+ GCancellable *cancellable,
+ GError **error);
+FLATPAK_EXTERN GPtrArray * flatpak_installation_list_installed_related_refs_sync (FlatpakInstallation *self,
+ const char *remote_name,
+ const char *ref,
+ GCancellable *cancellable,
+ GError **error);
#endif /* __FLATPAK_INSTALLATION_H__ */
diff --git a/lib/flatpak-related-ref-private.h b/lib/flatpak-related-ref-private.h
new file mode 100644
index 00000000..0c65622c
--- /dev/null
+++ b/lib/flatpak-related-ref-private.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2015 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Authors:
+ * Alexander Larsson
+ */
+
+#if !defined(__FLATPAK_H_INSIDE__) && !defined(FLATPAK_COMPILATION)
+#error "Only can be included directly."
+#endif
+
+#ifndef __FLATPAK_RELATED_REF_PRIVATE_H__
+#define __FLATPAK_RELATED_REF_PRIVATE_H__
+
+#include
+#include
+
+FlatpakRelatedRef *flatpak_related_ref_new (const char *full_ref,
+ const char *commit,
+ char **subpaths,
+ gboolean download,
+ gboolean delete);
+
+#endif /* __FLATPAK_RELATED_REF_PRIVATE_H__ */
diff --git a/lib/flatpak-related-ref.c b/lib/flatpak-related-ref.c
new file mode 100644
index 00000000..073920a9
--- /dev/null
+++ b/lib/flatpak-related-ref.c
@@ -0,0 +1,255 @@
+/*
+ * Copyright © 2015 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Authors:
+ * Alexander Larsson
+ */
+
+#include "config.h"
+
+#include
+
+#include "flatpak-utils.h"
+#include "flatpak-related-ref.h"
+#include "flatpak-enum-types.h"
+
+/**
+ * SECTION:flatpak-related-ref
+ * @Title: FlatpakRelatedRef
+ * @Short_description: Related application reference
+ *
+ * A FlatpakRelatedRef provides information about an ref that is related
+ * to another ref. For instance, the local extension ref of an app.
+ *
+ * Since: 0.6.7
+ */
+
+typedef struct _FlatpakRelatedRefPrivate FlatpakRelatedRefPrivate;
+
+struct _FlatpakRelatedRefPrivate
+{
+ char **subpaths;
+ gboolean download;
+ gboolean delete;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (FlatpakRelatedRef, flatpak_related_ref, FLATPAK_TYPE_REF)
+
+enum {
+ PROP_0,
+
+ PROP_SUBPATHS,
+ PROP_SHOULD_DOWNLOAD,
+ PROP_SHOULD_DELETE,
+};
+
+static void
+flatpak_related_ref_finalize (GObject *object)
+{
+ FlatpakRelatedRef *self = FLATPAK_RELATED_REF (object);
+ FlatpakRelatedRefPrivate *priv = flatpak_related_ref_get_instance_private (self);
+
+ g_strfreev (priv->subpaths);
+
+ G_OBJECT_CLASS (flatpak_related_ref_parent_class)->finalize (object);
+}
+
+static void
+flatpak_related_ref_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ FlatpakRelatedRef *self = FLATPAK_RELATED_REF (object);
+ FlatpakRelatedRefPrivate *priv = flatpak_related_ref_get_instance_private (self);
+
+ switch (prop_id)
+ {
+ case PROP_SHOULD_DOWNLOAD:
+ priv->download = g_value_get_boolean (value);
+ break;
+
+ case PROP_SHOULD_DELETE:
+ priv->delete = g_value_get_boolean (value);
+ break;
+
+ case PROP_SUBPATHS:
+ g_clear_pointer (&priv->subpaths, g_strfreev);
+ priv->subpaths = g_strdupv (g_value_get_boxed (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+flatpak_related_ref_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ FlatpakRelatedRef *self = FLATPAK_RELATED_REF (object);
+ FlatpakRelatedRefPrivate *priv = flatpak_related_ref_get_instance_private (self);
+
+ switch (prop_id)
+ {
+ case PROP_SHOULD_DOWNLOAD:
+ g_value_set_boolean (value, priv->download);
+ break;
+
+ case PROP_SHOULD_DELETE:
+ g_value_set_boolean (value, priv->delete);
+ break;
+
+ case PROP_SUBPATHS:
+ g_value_set_boxed (value, priv->subpaths);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+flatpak_related_ref_class_init (FlatpakRelatedRefClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->get_property = flatpak_related_ref_get_property;
+ object_class->set_property = flatpak_related_ref_set_property;
+ object_class->finalize = flatpak_related_ref_finalize;
+
+ g_object_class_install_property (object_class,
+ PROP_SHOULD_DOWNLOAD,
+ g_param_spec_boolean ("should-download",
+ "Should download",
+ "Whether to auto-download the ref with the main ref",
+ FALSE,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_SHOULD_DELETE,
+ g_param_spec_boolean ("should-delete",
+ "Should delete",
+ "Whether to auto-delete the ref with the main ref",
+ FALSE,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_SUBPATHS,
+ g_param_spec_boxed ("subpaths",
+ "",
+ "",
+ G_TYPE_STRV,
+ G_PARAM_READWRITE));
+}
+
+static void
+flatpak_related_ref_init (FlatpakRelatedRef *self)
+{
+}
+
+/**
+ * flatpak_related_ref_get_download:
+ * @self: a #FlatpakRelatedRef
+ *
+ * Returns whether to auto-download the ref with the main ref.
+ *
+ * Returns: %TRUE if the ref should be downloaded with the main ref.
+ *
+ * Since: 0.6.7
+*/
+gboolean
+flatpak_related_ref_should_download (FlatpakRelatedRef *self)
+{
+ FlatpakRelatedRefPrivate *priv = flatpak_related_ref_get_instance_private (self);
+
+ return priv->download;
+}
+
+/**
+ * flatpak_related_ref_should_delete:
+ * @self: a #FlatpakRelatedRef
+ *
+ * Returns whether to auto-delete the ref with the main ref.
+ *
+ * Returns: %TRUE if the ref should be deleted with the main ref.
+ *
+ * Since: 0.6.7
+ */
+gboolean
+flatpak_related_ref_should_delete (FlatpakRelatedRef *self)
+{
+ FlatpakRelatedRefPrivate *priv = flatpak_related_ref_get_instance_private (self);
+
+ return priv->delete;
+}
+
+/**
+ * flatpak_related_ref_get_subpaths:
+ * @self: a #FlatpakRelatedRef
+ *
+ * Returns the subpaths that should be installed/updated for the ref.
+ * This returns %NULL if all files should be installed.
+ *
+ * Returns: (transfer none): A strv, or %NULL
+ *
+ * Since: 0.6.7
+ */
+const char * const *
+flatpak_related_ref_get_subpaths (FlatpakRelatedRef *self)
+{
+ FlatpakRelatedRefPrivate *priv = flatpak_related_ref_get_instance_private (self);
+
+ return (const char * const *) priv->subpaths;
+}
+
+
+FlatpakRelatedRef *
+flatpak_related_ref_new (const char *full_ref,
+ const char *commit,
+ char **subpaths,
+ gboolean download,
+ gboolean delete)
+{
+ FlatpakRefKind kind = FLATPAK_REF_KIND_APP;
+ FlatpakRelatedRef *ref;
+
+ g_auto(GStrv) parts = NULL;
+
+ parts = g_strsplit (full_ref, "/", -1);
+
+ if (strcmp (parts[0], "app") != 0)
+ kind = FLATPAK_REF_KIND_RUNTIME;
+
+ /* Canonicalize the "no subpaths" case */
+ if (subpaths && *subpaths == NULL)
+ subpaths = NULL;
+
+ ref = g_object_new (FLATPAK_TYPE_RELATED_REF,
+ "kind", kind,
+ "name", parts[1],
+ "arch", parts[2],
+ "branch", parts[3],
+ "commit", commit,
+ "subpaths", subpaths,
+ "should-download", download,
+ "should-delete", delete,
+ NULL);
+
+ return ref;
+}
diff --git a/lib/flatpak-related-ref.h b/lib/flatpak-related-ref.h
new file mode 100644
index 00000000..a700005e
--- /dev/null
+++ b/lib/flatpak-related-ref.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2015 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Authors:
+ * Alexander Larsson
+ */
+
+#if !defined(__FLATPAK_H_INSIDE__) && !defined(FLATPAK_COMPILATION)
+#error "Only can be included directly."
+#endif
+
+#ifndef __FLATPAK_RELATED_REF_H__
+#define __FLATPAK_RELATED_REF_H__
+
+typedef struct _FlatpakRelatedRef FlatpakRelatedRef;
+
+#include
+#include
+
+#define FLATPAK_TYPE_RELATED_REF flatpak_related_ref_get_type ()
+#define FLATPAK_RELATED_REF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FLATPAK_TYPE_RELATED_REF, FlatpakRelatedRef))
+#define FLATPAK_IS_RELATED_REF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FLATPAK_TYPE_RELATED_REF))
+
+FLATPAK_EXTERN GType flatpak_related_ref_get_type (void);
+
+struct _FlatpakRelatedRef
+{
+ FlatpakRef parent;
+};
+
+typedef struct
+{
+ FlatpakRefClass parent_class;
+} FlatpakRelatedRefClass;
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakRelatedRef, g_object_unref)
+#endif
+
+FLATPAK_EXTERN const char * const *flatpak_related_ref_get_subpaths (FlatpakRelatedRef *self);
+FLATPAK_EXTERN gboolean flatpak_related_ref_should_download (FlatpakRelatedRef *self);
+FLATPAK_EXTERN gboolean flatpak_related_ref_should_delete (FlatpakRelatedRef *self);
+
+#endif /* __FLATPAK_RELATED_REF_H__ */
diff --git a/lib/flatpak.h b/lib/flatpak.h
index 08c92b24..78c6afa3 100644
--- a/lib/flatpak.h
+++ b/lib/flatpak.h
@@ -31,6 +31,7 @@
#include
#include
#include
+#include
#include
#include
#include