summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSinny Kumari <sinny@redhat.com>2018-10-04 19:18:05 +0530
committerAtomic Bot <atomic-devel@projectatomic.io>2018-10-11 13:41:32 +0000
commitc70526841e86bf72d0714db84305cd35ac62f527 (patch)
tree31965608fbe35110ffb72fac19b065004bd24580
parent05e99da7a7395e80353210a576db52ba5062f1e7 (diff)
downloadostree-c70526841e86bf72d0714db84305cd35ac62f527.tar.gz
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
-rw-r--r--src/ostree/ot-builtin-refs.c17
-rwxr-xr-xtests/test-refs.sh5
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"