Blame include/git2/odb_backend.h

Packit Service 20376f
/*
Packit Service 20376f
 * Copyright (C) the libgit2 contributors. All rights reserved.
Packit Service 20376f
 *
Packit Service 20376f
 * This file is part of libgit2, distributed under the GNU GPL v2 with
Packit Service 20376f
 * a Linking Exception. For full terms see the included COPYING file.
Packit Service 20376f
 */
Packit Service 20376f
#ifndef INCLUDE_git_odb_backend_h__
Packit Service 20376f
#define INCLUDE_git_odb_backend_h__
Packit Service 20376f
Packit Service 20376f
#include "common.h"
Packit Service 20376f
#include "types.h"
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * @file git2/backend.h
Packit Service 20376f
 * @brief Git custom backend functions
Packit Service 20376f
 * @defgroup git_odb Git object database routines
Packit Service 20376f
 * @ingroup Git
Packit Service 20376f
 * @{
Packit Service 20376f
 */
Packit Service 20376f
GIT_BEGIN_DECL
Packit Service 20376f
Packit Service 20376f
/*
Packit Service 20376f
 * Constructors for in-box ODB backends.
Packit Service 20376f
 */
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * Create a backend for the packfiles.
Packit Service 20376f
 *
Packit Service 20376f
 * @param out location to store the odb backend pointer
Packit Service 20376f
 * @param objects_dir the Git repository's objects directory
Packit Service 20376f
 *
Packit Service 20376f
 * @return 0 or an error code
Packit Service 20376f
 */
Packit Service 20376f
GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **out, const char *objects_dir);
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * Create a backend for loose objects
Packit Service 20376f
 *
Packit Service 20376f
 * @param out location to store the odb backend pointer
Packit Service 20376f
 * @param objects_dir the Git repository's objects directory
Packit Service 20376f
 * @param compression_level zlib compression level to use
Packit Service 20376f
 * @param do_fsync whether to do an fsync() after writing
Packit Service 20376f
 * @param dir_mode permissions to use creating a directory or 0 for defaults
Packit Service 20376f
 * @param file_mode permissions to use creating a file or 0 for defaults
Packit Service 20376f
 *
Packit Service 20376f
 * @return 0 or an error code
Packit Service 20376f
 */
Packit Service 20376f
GIT_EXTERN(int) git_odb_backend_loose(
Packit Service 20376f
	git_odb_backend **out,
Packit Service 20376f
	const char *objects_dir,
Packit Service 20376f
	int compression_level,
Packit Service 20376f
	int do_fsync,
Packit Service 20376f
	unsigned int dir_mode,
Packit Service 20376f
	unsigned int file_mode);
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * Create a backend out of a single packfile
Packit Service 20376f
 *
Packit Service 20376f
 * This can be useful for inspecting the contents of a single
Packit Service 20376f
 * packfile.
Packit Service 20376f
 *
Packit Service 20376f
 * @param out location to store the odb backend pointer
Packit Service 20376f
 * @param index_file path to the packfile's .idx file
Packit Service 20376f
 *
Packit Service 20376f
 * @return 0 or an error code
Packit Service 20376f
 */
Packit Service 20376f
GIT_EXTERN(int) git_odb_backend_one_pack(git_odb_backend **out, const char *index_file);
Packit Service 20376f
Packit Service 20376f
/** Streaming mode */
Packit Service 20376f
typedef enum {
Packit Service 20376f
	GIT_STREAM_RDONLY = (1 << 1),
Packit Service 20376f
	GIT_STREAM_WRONLY = (1 << 2),
Packit Service 20376f
	GIT_STREAM_RW = (GIT_STREAM_RDONLY | GIT_STREAM_WRONLY),
Packit Service 20376f
} git_odb_stream_t;
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * A stream to read/write from a backend.
Packit Service 20376f
 *
Packit Service 20376f
 * This represents a stream of data being written to or read from a
Packit Service 20376f
 * backend. When writing, the frontend functions take care of
Packit Service 20376f
 * calculating the object's id and all `finalize_write` needs to do is
Packit Service 20376f
 * store the object with the id it is passed.
Packit Service 20376f
 */
Packit Service 20376f
struct git_odb_stream {
Packit Service 20376f
	git_odb_backend *backend;
Packit Service 20376f
	unsigned int mode;
Packit Service 20376f
	void *hash_ctx;
Packit Service 20376f
Packit Service 20376f
	git_off_t declared_size;
Packit Service 20376f
	git_off_t received_bytes;
Packit Service 20376f
Packit Service 20376f
	/**
Packit Service 20376f
	 * Write at most `len` bytes into `buffer` and advance the stream.
Packit Service 20376f
	 */
Packit Service 20376f
	int (*read)(git_odb_stream *stream, char *buffer, size_t len);
Packit Service 20376f
Packit Service 20376f
	/**
Packit Service 20376f
	 * Write `len` bytes from `buffer` into the stream.
Packit Service 20376f
	 */
Packit Service 20376f
	int (*write)(git_odb_stream *stream, const char *buffer, size_t len);
Packit Service 20376f
Packit Service 20376f
	/**
Packit Service 20376f
	 * Store the contents of the stream as an object with the id
Packit Service 20376f
	 * specified in `oid`.
Packit Service 20376f
	 *
Packit Service 20376f
	 * This method might not be invoked if:
Packit Service 20376f
	 * - an error occurs earlier with the `write` callback,
Packit Service 20376f
	 * - the object referred to by `oid` already exists in any backend, or
Packit Service 20376f
	 * - the final number of received bytes differs from the size declared
Packit Service 20376f
	 *   with `git_odb_open_wstream()`
Packit Service 20376f
	 */
Packit Service 20376f
	int (*finalize_write)(git_odb_stream *stream, const git_oid *oid);
Packit Service 20376f
Packit Service 20376f
	/**
Packit Service 20376f
	 * Free the stream's memory.
Packit Service 20376f
	 *
Packit Service 20376f
	 * This method might be called without a call to `finalize_write` if
Packit Service 20376f
	 * an error occurs or if the object is already present in the ODB.
Packit Service 20376f
	 */
Packit Service 20376f
	void (*free)(git_odb_stream *stream);
Packit Service 20376f
};
Packit Service 20376f
Packit Service 20376f
/** A stream to write a pack file to the ODB */
Packit Service 20376f
struct git_odb_writepack {
Packit Service 20376f
	git_odb_backend *backend;
Packit Service 20376f
Packit Service 20376f
	int (*append)(git_odb_writepack *writepack, const void *data, size_t size, git_transfer_progress *stats);
Packit Service 20376f
	int (*commit)(git_odb_writepack *writepack, git_transfer_progress *stats);
Packit Service 20376f
	void (*free)(git_odb_writepack *writepack);
Packit Service 20376f
};
Packit Service 20376f
Packit Service 20376f
GIT_END_DECL
Packit Service 20376f
Packit Service 20376f
#endif