forked from Mirrors/flatpak-builder
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
parent
753cdc97fd
commit
2875cdead5
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue