core: Allow resolving e.g. "origin/master" as a rev
Also: * Disallow .. in revs to avoid looking outside where we should be * Allow resolving empty revs
This commit is contained in:
parent
aa865bbb83
commit
db9801bff2
|
|
@ -249,12 +249,12 @@ parse_rev_file (OstreeRepo *self,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
gboolean
|
||||||
resolve_rev (OstreeRepo *self,
|
ostree_repo_resolve_rev (OstreeRepo *self,
|
||||||
const char *rev,
|
const char *rev,
|
||||||
gboolean allow_noent,
|
gboolean allow_noent,
|
||||||
char **sha256,
|
char **sha256,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
OstreeRepoPrivate *priv = GET_PRIVATE (self);
|
OstreeRepoPrivate *priv = GET_PRIVATE (self);
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
|
|
@ -262,16 +262,25 @@ resolve_rev (OstreeRepo *self,
|
||||||
char *tmp2 = NULL;
|
char *tmp2 = NULL;
|
||||||
char *ret_rev = NULL;
|
char *ret_rev = NULL;
|
||||||
GFile *child = NULL;
|
GFile *child = NULL;
|
||||||
|
GFile *origindir = NULL;
|
||||||
char *child_path = NULL;
|
char *child_path = NULL;
|
||||||
GError *temp_error = NULL;
|
GError *temp_error = NULL;
|
||||||
GVariant *commit = NULL;
|
GVariant *commit = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (rev != NULL, FALSE);
|
||||||
|
|
||||||
if (strlen (rev) == 0)
|
if (strlen (rev) == 0)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"Invalid empty rev");
|
"Invalid empty rev");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
else if (strstr (rev, "..") != NULL)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Invalid rev %s", rev);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
else if (strlen (rev) == 64)
|
else if (strlen (rev) == 64)
|
||||||
{
|
{
|
||||||
ret_rev = g_strdup (rev);
|
ret_rev = g_strdup (rev);
|
||||||
|
|
@ -281,7 +290,7 @@ resolve_rev (OstreeRepo *self,
|
||||||
tmp = g_strdup (rev);
|
tmp = g_strdup (rev);
|
||||||
tmp[strlen(tmp) - 1] = '\0';
|
tmp[strlen(tmp) - 1] = '\0';
|
||||||
|
|
||||||
if (!resolve_rev (self, tmp, allow_noent, &tmp2, error))
|
if (!ostree_repo_resolve_rev (self, tmp, allow_noent, &tmp2, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_repo_load_variant_checked (self, OSTREE_SERIALIZED_COMMIT_VARIANT, tmp2, &commit, error))
|
if (!ostree_repo_load_variant_checked (self, OSTREE_SERIALIZED_COMMIT_VARIANT, tmp2, &commit, error))
|
||||||
|
|
@ -298,8 +307,33 @@ resolve_rev (OstreeRepo *self,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
child = g_file_get_child (priv->local_heads_dir, rev);
|
const char *slash = strchr (rev, '/');
|
||||||
child_path = g_file_get_path (child);
|
if (slash != NULL && (slash == rev || !*(slash+1)))
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Invalid rev %s", rev);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
else if (slash == NULL)
|
||||||
|
{
|
||||||
|
child = g_file_get_child (priv->local_heads_dir, rev);
|
||||||
|
child_path = g_file_get_path (child);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const char *rest = slash + 1;
|
||||||
|
|
||||||
|
if (strchr (rest, '/'))
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Invalid rev %s", rev);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
child = g_file_get_child (priv->remote_heads_dir, rev);
|
||||||
|
child_path = g_file_get_path (child);
|
||||||
|
|
||||||
|
}
|
||||||
if (!ot_util_gfile_load_contents_utf8 (child, NULL, &ret_rev, NULL, &temp_error))
|
if (!ot_util_gfile_load_contents_utf8 (child, NULL, &ret_rev, NULL, &temp_error))
|
||||||
{
|
{
|
||||||
if (allow_noent && g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
if (allow_noent && g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
||||||
|
|
@ -333,21 +367,12 @@ resolve_rev (OstreeRepo *self,
|
||||||
g_free (tmp);
|
g_free (tmp);
|
||||||
g_free (tmp2);
|
g_free (tmp2);
|
||||||
g_clear_object (&child);
|
g_clear_object (&child);
|
||||||
|
g_clear_object (&origindir);
|
||||||
g_free (child_path);
|
g_free (child_path);
|
||||||
g_free (ret_rev);
|
g_free (ret_rev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
|
||||||
ostree_repo_resolve_rev (OstreeRepo *self,
|
|
||||||
const char *rev,
|
|
||||||
char **sha256,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (rev != NULL, FALSE);
|
|
||||||
return resolve_rev (self, rev, FALSE, sha256, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
write_checksum_file (GFile *parentdir,
|
write_checksum_file (GFile *parentdir,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
|
@ -1450,7 +1475,7 @@ ostree_repo_commit_from_filelist_fd (OstreeRepo *self,
|
||||||
if (!import_root (self, base, &root, error))
|
if (!import_root (self, base, &root, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!resolve_rev (self, parent, TRUE, ¤t_head, error))
|
if (!ostree_repo_resolve_rev (self, parent, TRUE, ¤t_head, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
in = (GUnixInputStream*)g_unix_input_stream_new (fd, FALSE);
|
in = (GUnixInputStream*)g_unix_input_stream_new (fd, FALSE);
|
||||||
|
|
@ -1802,7 +1827,7 @@ ostree_repo_checkout (OstreeRepo *self,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!resolve_rev (self, rev, FALSE, &resolved, error))
|
if (!ostree_repo_resolve_rev (self, rev, FALSE, &resolved, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
root = (OstreeRepoFile*)_ostree_repo_file_new_root (self, resolved);
|
root = (OstreeRepoFile*)_ostree_repo_file_new_root (self, resolved);
|
||||||
|
|
@ -2175,7 +2200,7 @@ ostree_repo_read_commit (OstreeRepo *self,
|
||||||
GFile *ret_root = NULL;
|
GFile *ret_root = NULL;
|
||||||
char *resolved_rev = NULL;
|
char *resolved_rev = NULL;
|
||||||
|
|
||||||
if (!resolve_rev (self, rev, FALSE, &resolved_rev, error))
|
if (!ostree_repo_resolve_rev (self, rev, FALSE, &resolved_rev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret_root = _ostree_repo_file_new_root (self, resolved_rev);
|
ret_root = _ostree_repo_file_new_root (self, resolved_rev);
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,7 @@ gboolean ostree_repo_store_object_trusted (OstreeRepo *self,
|
||||||
|
|
||||||
gboolean ostree_repo_resolve_rev (OstreeRepo *self,
|
gboolean ostree_repo_resolve_rev (OstreeRepo *self,
|
||||||
const char *rev,
|
const char *rev,
|
||||||
|
gboolean allow_noent,
|
||||||
char **out_resolved,
|
char **out_resolved,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,7 @@ compose_branch_on_dir (OstreeRepo *repo,
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
char *branchrev = NULL;
|
char *branchrev = NULL;
|
||||||
|
|
||||||
if (!ostree_repo_resolve_rev (repo, branch, &branchrev, error))
|
if (!ostree_repo_resolve_rev (repo, branch, FALSE, &branchrev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
destpath = g_file_get_path (destination);
|
destpath = g_file_get_path (destination);
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ ostree_builtin_log (int argc, char **argv, const char *repo_path, GError **error
|
||||||
if (!ot_util_spawn_pager (&pager, error))
|
if (!ot_util_spawn_pager (&pager, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_repo_resolve_rev (repo, rev, &resolved_rev, error))
|
if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
|
|
|
||||||
|
|
@ -263,6 +263,8 @@ ostree_builtin_pull (int argc, char **argv, const char *repo_path, GError **erro
|
||||||
char *baseurl = NULL;
|
char *baseurl = NULL;
|
||||||
char *refpath = NULL;
|
char *refpath = NULL;
|
||||||
char *temppath = NULL;
|
char *temppath = NULL;
|
||||||
|
char *remote_ref = NULL;
|
||||||
|
char *original_rev = NULL;
|
||||||
GKeyFile *config = NULL;
|
GKeyFile *config = NULL;
|
||||||
SoupURI *base_uri = NULL;
|
SoupURI *base_uri = NULL;
|
||||||
SoupURI *target_uri = NULL;
|
SoupURI *target_uri = NULL;
|
||||||
|
|
@ -288,6 +290,11 @@ ostree_builtin_pull (int argc, char **argv, const char *repo_path, GError **erro
|
||||||
remote = argv[1];
|
remote = argv[1];
|
||||||
branch = argv[2];
|
branch = argv[2];
|
||||||
|
|
||||||
|
remote_ref = g_strdup_printf ("%s/%s", remote, branch);
|
||||||
|
|
||||||
|
if (!ostree_repo_resolve_rev (repo, remote_ref, TRUE, &original_rev, error))
|
||||||
|
goto out;
|
||||||
|
|
||||||
config = ostree_repo_get_config (repo);
|
config = ostree_repo_get_config (repo);
|
||||||
|
|
||||||
key = g_strdup_printf ("remote \"%s\"", remote);
|
key = g_strdup_printf ("remote \"%s\"", remote);
|
||||||
|
|
@ -319,14 +326,23 @@ ostree_builtin_pull (int argc, char **argv, const char *repo_path, GError **erro
|
||||||
goto out;
|
goto out;
|
||||||
g_strchomp (rev);
|
g_strchomp (rev);
|
||||||
|
|
||||||
if (!ostree_validate_checksum_string (rev, error))
|
if (original_rev && strcmp (rev, original_rev) == 0)
|
||||||
goto out;
|
{
|
||||||
|
g_print ("No changes in %s\n", remote_ref);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!ostree_validate_checksum_string (rev, error))
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (!store_commit_recurse (repo, soup, base_uri, rev, error))
|
if (!store_commit_recurse (repo, soup, base_uri, rev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_repo_write_ref (repo, FALSE, branch, rev, error))
|
if (!ostree_repo_write_ref (repo, remote, branch, rev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
g_print ("remote %s is now %s\n", remote_ref, rev);
|
||||||
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
out:
|
out:
|
||||||
|
|
@ -337,6 +353,8 @@ ostree_builtin_pull (int argc, char **argv, const char *repo_path, GError **erro
|
||||||
g_free (temppath);
|
g_free (temppath);
|
||||||
g_free (key);
|
g_free (key);
|
||||||
g_free (rev);
|
g_free (rev);
|
||||||
|
g_free (remote_ref);
|
||||||
|
g_free (original_rev);
|
||||||
g_free (baseurl);
|
g_free (baseurl);
|
||||||
g_free (refpath);
|
g_free (refpath);
|
||||||
g_free (remote_branch_ref_path);
|
g_free (remote_branch_ref_path);
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ ostree_builtin_rev_parse (int argc, char **argv, const char *repo_path, GError *
|
||||||
}
|
}
|
||||||
rev = argv[1];
|
rev = argv[1];
|
||||||
|
|
||||||
if (!ostree_repo_resolve_rev (repo, rev, &resolved_rev, error))
|
if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
g_print ("%s\n", resolved_rev);
|
g_print ("%s\n", resolved_rev);
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ ostree_builtin_show (int argc, char **argv, const char *repo_path, GError **erro
|
||||||
}
|
}
|
||||||
else if (print_compose)
|
else if (print_compose)
|
||||||
{
|
{
|
||||||
if (!ostree_repo_resolve_rev (repo, rev, &resolved_rev, error))
|
if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!do_print_compose (repo, rev, resolved_rev, error))
|
if (!do_print_compose (repo, rev, resolved_rev, error))
|
||||||
|
|
@ -229,7 +229,7 @@ ostree_builtin_show (int argc, char **argv, const char *repo_path, GError **erro
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ostree_repo_resolve_rev (repo, rev, &resolved_rev, error))
|
if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!show_repo_meta (repo, rev, resolved_rev, error))
|
if (!show_repo_meta (repo, rev, resolved_rev, error))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue