/* 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,
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;
${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"