core: Add --union mode to checkout

This is another step towards ostbuild using this instead of the
"compose" builtin.
This commit is contained in:
Colin Walters committed 2012-03-06 11:59:06 -05:00
1 parent 83fb6d56e1
commit 76bc35186e
6 files changed
+210 -21

No files matched your search

+65 -1
View File
@@ -915,6 +915,9 @@ ostree_create_temp_file_from_input (GFile *dir,
/* 128 attempts seems reasonable... */
for (i = 0; i < 128; i++)
{
if (g_cancellable_set_error_if_cancelled (cancellable, error))
goto out;
g_free (possible_name);
possible_name = subst_xxxxxx (tmp_name->str);
g_clear_object (&possible_file);
@@ -941,7 +944,7 @@ ostree_create_temp_file_from_input (GFile *dir,
break;
}
}
if (i == 128)
if (i >= 128)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Exhausted 128 attempts to create a temporary file");
@@ -990,3 +993,64 @@ ostree_create_temp_regular_file (GFile *dir,
g_clear_object (&ret_stream);
return ret;
}
gboolean
ostree_create_temp_hardlink (GFile *dir,
GFile *src,
const char *prefix,
const char *suffix,
GFile **out_file,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
GString *tmp_name = NULL;
char *possible_name = NULL;
GFile *possible_file = NULL;
int i = 0;
tmp_name = create_tmp_string (ot_gfile_get_path_cached (dir),
prefix, suffix);
/* 128 attempts seems reasonable... */
for (i = 0; i < 128; i++)
{
if (g_cancellable_set_error_if_cancelled (cancellable, error))
goto out;
g_free (possible_name);
possible_name = subst_xxxxxx (tmp_name->str);
g_clear_object (&possible_file);
possible_file = g_file_get_child (dir, possible_name);
if (link (ot_gfile_get_path_cached (src), ot_gfile_get_path_cached (possible_file)) < 0)
{
if (errno == EEXIST)
continue;
else
{
ot_util_set_error_from_errno (error, errno);
goto out;
}
}
else
{
break;
}
}
if (i >= 128)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Exhausted 128 attempts to create a temporary file");
goto out;
}
ret = TRUE;
ot_transfer_out_value(out_file, &possible_file);
out:
if (tmp_name)
g_string_free (tmp_name, TRUE);
g_free (possible_name);
g_clear_object (&possible_file);
return ret;
}