From c70526841e86bf72d0714db84305cd35ac62f527 Mon Sep 17 00:00:00 2001 From: Sinny Kumari Date: Thu, 4 Oct 2018 19:18:05 +0530 Subject: [PATCH] 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 Closes: #1749 Approved by: cgwalters --- src/ostree/ot-builtin-refs.c | 17 +++++++++++++++-- tests/test-refs.sh | 5 +++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/ostree/ot-builtin-refs.c b/src/ostree/ot-builtin-refs.c index 5c2214cc..f88d08a6 100644 --- a/src/ostree/ot-builtin-refs.c +++ b/src/ostree/ot-builtin-refs.c @@ -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, @@ -245,7 +247,18 @@ 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; diff --git a/tests/test-refs.sh b/tests/test-refs.sh index f4fe1833..1730423d 100755 --- a/tests/test-refs.sh +++ b/tests/test-refs.sh @@ -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"