summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2016-05-13 14:17:46 +0200
committerAlexander Larsson <alexl@redhat.com>2016-05-13 14:17:46 +0200
commit2875cdead5e52279536a72fdbf898eeb2be2c4db (patch)
treeb83f522dffe3034bd31c898c0d569eff609f94fb
parent753cdc97fd31affabb117375fa22bd7929215e8c (diff)
downloadxdg-app-2875cdead5e52279536a72fdbf898eeb2be2c4db.tar.gz
remote-delete: Move to FlatpakDir and add checks for installed refs
You can't remove a remote unless you --force or there are no installs from it.
-rw-r--r--app/flatpak-builtins-delete-remote.c24
-rw-r--r--common/flatpak-dir.c107
-rw-r--r--common/flatpak-dir.h9
-rw-r--r--doc/flatpak-remote-delete.xml8
4 files changed, 93 insertions, 55 deletions
diff --git a/app/flatpak-builtins-delete-remote.c b/app/flatpak-builtins-delete-remote.c
index 48330cd..53ab9b9 100644
--- a/app/flatpak-builtins-delete-remote.c
+++ b/app/flatpak-builtins-delete-remote.c
@@ -30,6 +30,14 @@
#include "flatpak-builtins.h"
+static gboolean opt_force;
+
+static GOptionEntry modify_options[] = {
+ { "force", 0, 0, G_OPTION_ARG_NONE, &opt_force, "Remove remote even if in use", },
+ { NULL }
+};
+
+
gboolean
flatpak_builtin_delete_remote (int argc, char **argv, GCancellable *cancellable, GError **error)
{
@@ -47,23 +55,9 @@ flatpak_builtin_delete_remote (int argc, char **argv, GCancellable *cancellable,
remote_name = argv[1];
- if (!flatpak_dir_remove_all_refs (dir, remote_name,
- cancellable, error))
- return FALSE;
-
- if (!flatpak_dir_remove_appstream (dir, remote_name,
- cancellable, error))
- return FALSE;
-
- if (!ostree_repo_remote_change (flatpak_dir_get_repo (dir), NULL,
- OSTREE_REPO_REMOTE_CHANGE_DELETE,
- remote_name, NULL,
- NULL,
+ if (!flatpak_dir_remove_remote (dir, opt_force, remote_name,
cancellable, error))
return FALSE;
- if (!flatpak_dir_mark_changed (dir, error))
- return FALSE;
-
return TRUE;
}
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
index dcc8821..023dd23 100644
--- a/common/flatpak-dir.c
+++ b/common/flatpak-dir.c
@@ -921,42 +921,6 @@ flatpak_dir_remove_appstream (FlatpakDir *self,
}
gboolean
-flatpak_dir_remove_all_refs (FlatpakDir *self,
- const char *remote,
- GCancellable *cancellable,
- GError **error)
-{
- g_autofree char *prefix = NULL;
-
- g_autoptr(GHashTable) refs = NULL;
- GHashTableIter hash_iter;
- gpointer key;
-
- if (!flatpak_dir_ensure_repo (self, cancellable, error))
- return FALSE;
-
- prefix = g_strdup_printf ("%s:", remote);
-
- if (!ostree_repo_list_refs (self->repo,
- NULL,
- &refs,
- cancellable, error))
- return FALSE;
-
- g_hash_table_iter_init (&hash_iter, refs);
- while (g_hash_table_iter_next (&hash_iter, &key, NULL))
- {
- const char *refspec = key;
-
- if (g_str_has_prefix (refspec, prefix) &&
- !flatpak_dir_remove_ref (self, remote, refspec + strlen (prefix), cancellable, error))
- return FALSE;
- }
-
- return TRUE;
-}
-
-gboolean
flatpak_dir_deploy_appstream (FlatpakDir *self,
const char *remote,
const char *arch,
@@ -4188,6 +4152,77 @@ flatpak_dir_list_remotes (FlatpakDir *self,
}
gboolean
+flatpak_dir_remove_remote (FlatpakDir *self,
+ gboolean force_remove,
+ const char *remote_name,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree char *prefix = NULL;
+ g_autoptr(GHashTable) refs = NULL;
+ GHashTableIter hash_iter;
+ gpointer key;
+
+ if (!flatpak_dir_ensure_repo (self, cancellable, error))
+ return FALSE;
+
+ if (!ostree_repo_list_refs (self->repo,
+ NULL,
+ &refs,
+ cancellable, error))
+ return FALSE;
+
+ prefix = g_strdup_printf ("%s:", remote_name);
+
+ if (!force_remove)
+ {
+ g_hash_table_iter_init (&hash_iter, refs);
+ while (g_hash_table_iter_next (&hash_iter, &key, NULL))
+ {
+ const char *refspec = key;
+
+ if (g_str_has_prefix (refspec, prefix))
+ {
+ const char *unprefixed_refspec = refspec + strlen (prefix);
+ g_autofree char *origin = flatpak_dir_get_origin (self, unprefixed_refspec,
+ cancellable, NULL);
+
+ if (g_strcmp0 (origin, remote_name) == 0)
+ return flatpak_fail (error, "Can't remove remote '%s' with installed ref %s (at least)",
+ remote_name, unprefixed_refspec);
+ }
+ }
+ }
+
+ /* Remove all refs */
+ g_hash_table_iter_init (&hash_iter, refs);
+ while (g_hash_table_iter_next (&hash_iter, &key, NULL))
+ {
+ const char *refspec = key;
+
+ if (g_str_has_prefix (refspec, prefix) &&
+ !flatpak_dir_remove_ref (self, remote_name, refspec + strlen (prefix), cancellable, error))
+ return FALSE;
+ }
+
+ if (!flatpak_dir_remove_appstream (self, remote_name,
+ cancellable, error))
+ return FALSE;
+
+ if (!ostree_repo_remote_change (self->repo, NULL,
+ OSTREE_REPO_REMOTE_CHANGE_DELETE,
+ remote_name, NULL,
+ NULL,
+ cancellable, error))
+ return FALSE;
+
+ if (!flatpak_dir_mark_changed (self, error))
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean
flatpak_dir_modify_remote (FlatpakDir *self,
const char *remote_name,
GKeyFile *config,
diff --git a/common/flatpak-dir.h b/common/flatpak-dir.h
index 4298c83..eaceee8 100644
--- a/common/flatpak-dir.h
+++ b/common/flatpak-dir.h
@@ -294,10 +294,6 @@ gboolean flatpak_dir_undeploy_all (FlatpakDir *self,
gboolean *was_deployed_out,
GCancellable *cancellable,
GError **error);
-gboolean flatpak_dir_remove_all_refs (FlatpakDir *self,
- const char *remote,
- GCancellable *cancellable,
- GError **error);
gboolean flatpak_dir_remove_ref (FlatpakDir *self,
const char *remote_name,
const char *ref,
@@ -337,6 +333,11 @@ gboolean flatpak_dir_modify_remote (FlatpakDir *self,
GBytes *gpg_data,
GCancellable *cancellable,
GError **error);
+gboolean flatpak_dir_remove_remote (FlatpakDir *self,
+ gboolean force_remove,
+ const char *remote_name,
+ GCancellable *cancellable,
+ GError **error);
char *flatpak_dir_get_remote_title (FlatpakDir *self,
const char *remote_name);
int flatpak_dir_get_remote_prio (FlatpakDir *self,
diff --git a/doc/flatpak-remote-delete.xml b/doc/flatpak-remote-delete.xml
index 9f1cfbe..1a3b8a3 100644
--- a/doc/flatpak-remote-delete.xml
+++ b/doc/flatpak-remote-delete.xml
@@ -82,6 +82,14 @@
</varlistentry>
<varlistentry>
+ <term><option>--force</option></term>
+
+ <listitem><para>
+ Remove remote even if its in use by installed apps or runtimes.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-v</option></term>
<term><option>--verbose</option></term>