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.
tingping/wmclass
Alexander Larsson 2016-05-13 14:17:46 +02:00
parent 753cdc97fd
commit 2875cdead5
4 changed files with 93 additions and 55 deletions

View File

@ -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;
}

View File

@ -920,42 +920,6 @@ flatpak_dir_remove_appstream (FlatpakDir *self,
return TRUE;
}
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,
@ -4187,6 +4151,77 @@ flatpak_dir_list_remotes (FlatpakDir *self,
return res;
}
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,

View File

@ -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,

View File

@ -81,6 +81,14 @@
</para></listitem>
</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>