Merge pull request #2691 from cgwalters/rev-parse-single
This commit is contained in:
commit
1fe550e9a0
|
|
@ -54,6 +54,19 @@ License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||||
</refsynopsisdiv>
|
</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 -->
|
<!-- Is this accurate for all cases? This is what I observed -->
|
||||||
<refsect1>
|
<refsect1>
|
||||||
<title>Description</title>
|
<title>Description</title>
|
||||||
|
|
|
||||||
|
|
@ -25,13 +25,17 @@
|
||||||
#include "ot-builtins.h"
|
#include "ot-builtins.h"
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "otutil.h"
|
#include "otutil.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
/* ATTENTION:
|
/* ATTENTION:
|
||||||
* Please remember to update the bash-completion script (bash/ostree) and
|
* Please remember to update the bash-completion script (bash/ostree) and
|
||||||
* man page (man/ostree-rev-parse.xml) when changing the option list.
|
* man page (man/ostree-rev-parse.xml) when changing the option list.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static gboolean opt_single;
|
||||||
|
|
||||||
static GOptionEntry options[] = {
|
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 }
|
{ 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))
|
if (!ostree_option_context_parse (context, options, &argc, &argv, invocation, &repo, cancellable, error))
|
||||||
return FALSE;
|
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)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
ot_util_usage_error (context, "REV must be specified", error);
|
ot_util_usage_error (context, "REV must be specified", error);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (gint i = 1; i < argc; i++)
|
for (gint i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
const char *rev = argv[i];
|
const char *rev = argv[i];
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
echo "1..$((87 + ${extra_basic_tests:-0}))"
|
echo "1..$((88 + ${extra_basic_tests:-0}))"
|
||||||
|
|
||||||
CHECKOUT_U_ARG=""
|
CHECKOUT_U_ARG=""
|
||||||
CHECKOUT_H_ARGS="-H"
|
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!"
|
$OSTREE rev-parse 'test2^^' 2>/dev/null && fatal "rev-parse test2^^ unexpectedly succeeded!"
|
||||||
echo "ok rev-parse"
|
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)
|
checksum=$($OSTREE rev-parse test2)
|
||||||
partial=${checksum:0:6}
|
partial=${checksum:0:6}
|
||||||
echo "partial:" $partial
|
echo "partial:" $partial
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue