cli/rev-parse: Add --single option
In the current "ostree native container" flow, we're inserting a commit object into the repo but with no refs. We have hacks in a few places to find the commit digest via e.g. `find repo/objects -name *.commit` but that's a horrible hack. Add `ostree rev-parse --single` which will print the single commit, and error out if there is not exactly one commit. Co-authored-by: Jonathan Lebon <jonathan@jlebon.com>
This commit is contained in:
1 parent
ea2f0c2943
commit
ad0354ac36
3 files changed
+66
-1
No files matched your search
@@ -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];
|
||||
|
||||
Reference in new issue
Block a user