src/ostree: Don't delete refs having aliases

Deleting a ref with aliases makes them dangling. In such
cases, display an error message to the user.

Fixes #1597

Signed-off-by: Sinny Kumari <sinny@redhat.com>

Closes: #1749
Approved by: cgwalters
This commit is contained in:
Sinny Kumari 2018-10-04 19:18:05 +05:30 committed by Atomic Bot
parent 05e99da7a7
commit c70526841e
2 changed files with 20 additions and 2 deletions

View File

@ -146,8 +146,10 @@ static gboolean do_ref (OstreeRepo *repo, const char *refspec_prefix, GCancellab
/* If we're doing aliasing, we need the full list of aliases mostly to allow
* replacing existing aliases.
* If we are deleting a ref, we want to make sure that it doesn't have
* any corresponding aliases.
*/
if (opt_alias)
if (opt_alias || opt_delete)
{
if (!ostree_repo_list_refs_ext (repo, NULL, &ref_aliases,
OSTREE_REPO_LIST_REFS_EXT_ALIASES,
@ -246,6 +248,17 @@ static gboolean do_ref (OstreeRepo *repo, const char *refspec_prefix, GCancellab
if (!ostree_parse_refspec (refspec, &remote, &ref, error))
goto out;
/* Look for alias if it exists for a ref we want to delete */
GLNX_HASH_TABLE_FOREACH_KV (ref_aliases, const char *,
ref_alias, const char *, value)
{
if (!strcmp (ref, value))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Ref '%s' has an active alias: '%s'", ref, ref_alias);
goto out;
}
}
if (!ostree_repo_set_ref_immediate (repo, remote, ref, NULL,
cancellable, error))
goto out;

View File

@ -192,6 +192,11 @@ done
${CMD_PREFIX} ostree --repo=repo refs -A > refs.txt
assert_file_has_content_literal refs.txt 'exampleos/x86_64/stable/server -> exampleos/x86_64/27/server'
# Test that we don't delete a ref having aliases
if ${CMD_PREFIX} ostree --repo=repo refs --delete exampleos/x86_64/27/server; then
assert_not_reached "refs --delete unexpectedly succeeded in deleting a ref containing alias!"
fi
${CMD_PREFIX} ostree --repo=repo summary -u
echo "ok ref symlink"