bin/refs: Allow overwriting existing ref
Currently if you want to update a non-alias ref, you need to first check if it exists and use either `ostree refs --create` or `ostree reset` as appropriate. That's unnecessarily complicated and is much less convenient than the old `write-refs` builtin that simply called `ostree_repo_set_ref_immediate()` without any checks. Add a `--force` option to be used with `--create` that does not raise an error when the destination ref already exists. Closes: #1870 Approved by: jlebon
This commit is contained in:
parent
6733843f87
commit
d916383953
|
|
@ -952,6 +952,7 @@ _ostree_refs() {
|
||||||
--collections -c
|
--collections -c
|
||||||
--delete
|
--delete
|
||||||
--list
|
--list
|
||||||
|
--force
|
||||||
"
|
"
|
||||||
|
|
||||||
local options_with_args="
|
local options_with_args="
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,16 @@ Boston, MA 02111-1307, USA.
|
||||||
PREFIX are deleted.
|
PREFIX are deleted.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--force</option></term>
|
||||||
|
|
||||||
|
<listitem><para>
|
||||||
|
When creating <literal>NEWREF</literal> with
|
||||||
|
<option>--create</option>, allow an existing ref to be
|
||||||
|
updated instead of erroring.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ static gboolean opt_list;
|
||||||
static gboolean opt_alias;
|
static gboolean opt_alias;
|
||||||
static char *opt_create;
|
static char *opt_create;
|
||||||
static gboolean opt_collections;
|
static gboolean opt_collections;
|
||||||
|
static gboolean opt_force;
|
||||||
|
|
||||||
/* ATTENTION:
|
/* ATTENTION:
|
||||||
* Please remember to update the bash-completion script (bash/ostree) and
|
* Please remember to update the bash-completion script (bash/ostree) and
|
||||||
|
|
@ -44,6 +45,7 @@ static GOptionEntry options[] = {
|
||||||
{ "alias", 'A', 0, G_OPTION_ARG_NONE, &opt_alias, "If used with --create, create an alias, otherwise just list aliases", NULL },
|
{ "alias", 'A', 0, G_OPTION_ARG_NONE, &opt_alias, "If used with --create, create an alias, otherwise just list aliases", NULL },
|
||||||
{ "create", 0, 0, G_OPTION_ARG_STRING, &opt_create, "Create a new ref for an existing commit", "NEWREF" },
|
{ "create", 0, 0, G_OPTION_ARG_STRING, &opt_create, "Create a new ref for an existing commit", "NEWREF" },
|
||||||
{ "collections", 'c', 0, G_OPTION_ARG_NONE, &opt_collections, "Enable listing collection IDs for refs", NULL },
|
{ "collections", 'c', 0, G_OPTION_ARG_NONE, &opt_collections, "Enable listing collection IDs for refs", NULL },
|
||||||
|
{ "force", 0, 0, G_OPTION_ARG_NONE, &opt_force, "Overwrite existing refs when creating", NULL },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -89,7 +91,7 @@ do_ref_with_collections (OstreeRepo *repo,
|
||||||
else goto out;
|
else goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checksum_existing != NULL)
|
if (!opt_force && checksum_existing != NULL)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"--create specified but ref %s already exists", opt_create);
|
"--create specified but ref %s already exists", opt_create);
|
||||||
|
|
@ -205,9 +207,11 @@ static gboolean do_ref (OstreeRepo *repo, const char *refspec_prefix, GCancellab
|
||||||
else goto out;
|
else goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We want to allow replacing an existing alias */
|
/* We want to allow replacing an existing alias or a normal ref when
|
||||||
|
* forced
|
||||||
|
*/
|
||||||
gboolean replacing_alias = opt_alias && g_hash_table_contains (ref_aliases, opt_create);
|
gboolean replacing_alias = opt_alias && g_hash_table_contains (ref_aliases, opt_create);
|
||||||
if (!replacing_alias && checksum_existing != NULL)
|
if (!replacing_alias && !opt_force && checksum_existing != NULL)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"--create specified but ref %s already exists", opt_create);
|
"--create specified but ref %s already exists", opt_create);
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,11 @@ if ${CMD_PREFIX} ostree --repo=repo refs foo/ctest --create=ctest; then
|
||||||
assert_not_reached "refs --create unexpectedly succeeded in overwriting an existing prefix!"
|
assert_not_reached "refs --create unexpectedly succeeded in overwriting an existing prefix!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Force overwriting ctest and check the revision got updated
|
||||||
|
foo_ctest_rev=$(${CMD_PREFIX} ostree --repo=repo rev-parse foo/ctest)
|
||||||
|
${CMD_PREFIX} ostree --repo=repo refs foo/ctest --create=ctest --force
|
||||||
|
assert_ref repo ctest ${foo_ctest_rev}
|
||||||
|
|
||||||
# https://github.com/ostreedev/ostree/issues/1285
|
# https://github.com/ostreedev/ostree/issues/1285
|
||||||
# One tool was creating .latest_rsync files in each dir, let's ignore stuff like
|
# One tool was creating .latest_rsync files in each dir, let's ignore stuff like
|
||||||
# that.
|
# that.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue