#ifndef TMP_OBJDIR_H
#define TMP_OBJDIR_H

/*
 * This API allows you to create a temporary object directory, advertise it to
 * sub-processes via GIT_OBJECT_DIRECTORY and GIT_ALTERNATE_OBJECT_DIRECTORIES,
 * and then either migrate its object into the main object directory, or remove
 * it. The library handles unexpected signal/exit death by cleaning up the
 * temporary directory.
 *
 * Example:
 *
 *	struct child_process child = CHILD_PROCESS_INIT;
 *	struct tmp_objdir *t = tmp_objdir_create(repo, "incoming");
 *	strvec_push(&child.args, cmd);
 *	strvec_pushv(&child.env, tmp_objdir_env(t));
 *	if (!run_command(&child)) && !tmp_objdir_migrate(t))
 *		printf("success!\n");
 *	else
 *		die("failed...tmp_objdir will clean up for us");
 *
 */

struct repository;
struct tmp_objdir;

/*
 * Create a new temporary object directory with the specified prefix;
 * returns NULL on failure.
 */
struct tmp_objdir *tmp_objdir_create(struct repository *r, const char *prefix);

/*
 * Return a list of environment strings, suitable for use with
 * child_process.env, that can be passed to child programs to make use of the
 * temporary object directory.
 */
const char **tmp_objdir_env(const struct tmp_objdir *);

/*
 * Finalize a temporary object directory by migrating its objects into the main
 * object database, removing the temporary directory, and freeing any
 * associated resources.
 */
int tmp_objdir_migrate(struct tmp_objdir *);

/*
 * Destroy a temporary object directory, discarding any objects it contains.
 */
int tmp_objdir_destroy(struct tmp_objdir *);

/*
 * Remove all objects from the temporary object directory, while leaving it
 * around so more objects can be added.
 */
void tmp_objdir_discard_objects(struct tmp_objdir *);

/*
 * Replaces the writable object store in the current process with the temporary
 * object directory and makes the former main object store an alternate.
 * If will_destroy is nonzero, the object directory may not be migrated. Returns
 * the newly installed primary source.
 */
struct odb_source *tmp_objdir_replace_primary_odb(struct tmp_objdir *,
						  int will_destroy);

#endif /* TMP_OBJDIR_H */
