Merge pull request #2691 from cgwalters/rev-parse-single

This commit is contained in:
Jonathan Lebon 2022-08-18 12:07:19 -04:00 committed by GitHub
commit 1fe550e9a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 1 deletions

View File

@ -54,6 +54,19 @@ License along with this library. If not, see <https://www.gnu.org/licenses/>.
</refsynopsisdiv>
<refsect1>
<title>Options</title>
<variablelist>
<varlistentry>
<term><option>--single</option>, <option>-S</option></term>
<listitem><para>
If the repository has exactly one commit, then print it; any other case will result in an error.
</para></listitem>
</varlistentry>
</variablelist>
</refsect1>
<!-- Is this accurate for all cases? This is what I observed -->
<refsect1>
<title>Description</title>

View File

@ -25,13 +25,17 @@
#include "ot-builtins.h"
#include "ostree.h"
#include "otutil.h"
#include <stdbool.h>
/* ATTENTION:
* Please remember to update the bash-completion script (bash/ostree) and
* man page (man/ostree-rev-parse.xml) when changing the option list.
*/
static gboolean opt_single;
static GOptionEntry options[] = {
{ "single", 'S', 0, G_OPTION_ARG_NONE, &opt_single, "If the repository has exactly one commit, then print it; any other case will result in an error", NULL },
{ NULL }
};
@ -43,11 +47,43 @@ ostree_builtin_rev_parse (int argc, char **argv, OstreeCommandInvocation *invoca
if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error))
return FALSE;
if (opt_single)
{
if (argc >= 2)
{
ot_util_usage_error (context, "Cannot specify arguments with --single", error);
return FALSE;
}
g_autoptr(GHashTable) objects = NULL;
if (!ostree_repo_list_commit_objects_starting_with (repo, "", &objects, cancellable, error))
return FALSE;
GVariant *found = NULL;
GLNX_HASH_TABLE_FOREACH (objects, GVariant*, key)
{
if (found)
return glnx_throw (error, "Multiple commit objects found");
found = key;
}
if (!found)
return glnx_throw (error, "No commit objects found");
const char *checksum;
OstreeObjectType objtype;
ostree_object_name_deserialize (found, &checksum, &objtype);
g_assert (objtype == OSTREE_OBJECT_TYPE_COMMIT);
g_print ("%s\n", checksum);
return TRUE; /* Note early return */
}
if (argc < 2)
{
ot_util_usage_error (context, "REV must be specified", error);
return FALSE;
}
for (gint i = 1; i < argc; i++)
{
const char *rev = argv[i];

View File

@ -19,7 +19,7 @@
set -euo pipefail
echo "1..$((87 + ${extra_basic_tests:-0}))"
echo "1..$((88 + ${extra_basic_tests:-0}))"
CHECKOUT_U_ARG=""
CHECKOUT_H_ARGS="-H"
@ -97,6 +97,22 @@ $OSTREE rev-parse 'test2^'
$OSTREE rev-parse 'test2^^' 2>/dev/null && fatal "rev-parse test2^^ unexpectedly succeeded!"
echo "ok rev-parse"
if $OSTREE rev-parse -S 2>err.txt; then
fatal "rev parse multiple"
fi
assert_file_has_content_literal err.txt 'Multiple commit objects found'
$CMD_PREFIX ostree --repo=repo-copy init --mode=archive
if $CMD_PREFIX ostree --repo=repo-copy rev-parse -S 2>err.txt; then
fatal "rev parse none"
fi
assert_file_has_content_literal err.txt 'No commit objects found'
rev=$($OSTREE rev-parse test2)
$CMD_PREFIX ostree --repo=repo-copy pull-local repo test2
rev2=$($CMD_PREFIX ostree --repo=repo-copy rev-parse -S)
assert_streq "${rev}" "${rev2}"
echo "ok rev-parse -S"
checksum=$($OSTREE rev-parse test2)
partial=${checksum:0:6}
echo "partial:" $partial