Ejemplo n.º 1
0
static int write_file_stream(
	git_oid *oid, git_odb *odb, const char *path, git_off_t file_size)
{
	int fd, error;
	char buffer[4096];
	git_odb_stream *stream = NULL;
	ssize_t read_len = -1, written = 0;

	if ((error = git_odb_open_wstream(
			&stream, odb, (size_t)file_size, GIT_OBJ_BLOB)) < 0)
		return error;

	if ((fd = git_futils_open_ro(path)) < 0) {
		git_odb_stream_free(stream);
		return -1;
	}

	while (!error && (read_len = p_read(fd, buffer, sizeof(buffer))) > 0) {
		error = git_odb_stream_write(stream, buffer, read_len);
		written += read_len;
	}

	p_close(fd);

	if (written != file_size || read_len < 0) {
		giterr_set(GITERR_OS, "Failed to read file into stream");
		error = -1;
	}

	if (!error)
		error = git_odb_stream_finalize_write(oid, stream);

	git_odb_stream_free(stream);
	return error;
}
Ejemplo n.º 2
0
int git_blob_create_frombuffer(git_oid *oid, git_repository *repo, const void *buffer, size_t len)
{
	int error;
	git_odb *odb;
	git_odb_stream *stream;

	if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 ||
		(error = git_odb_open_wstream(&stream, odb, len, GIT_OBJ_BLOB)) < 0)
		return error;

	if ((error = git_odb_stream_write(stream, buffer, len)) == 0)
		error = git_odb_stream_finalize_write(oid, stream);

	git_odb_stream_free(stream);
	return error;
}
Ejemplo n.º 3
0
static void writefile(git_oid *oid)
{
	static git_odb_stream *stream;
	git_buf buf = GIT_BUF_INIT;
	size_t i;

	for (i = 0; i < 3041; i++)
		cl_git_pass(git_buf_puts(&buf, "Hello, world.\n"));

	cl_git_pass(git_odb_open_wstream(&stream, odb, LARGEFILE_SIZE, GIT_OBJ_BLOB));
	for (i = 0; i < 126103; i++)
		cl_git_pass(git_odb_stream_write(stream, buf.ptr, buf.size));

	cl_git_pass(git_odb_stream_finalize_write(oid, stream));

	git_odb_stream_free(stream);
	git_buf_dispose(&buf);
}
Ejemplo n.º 4
0
PyObject *
Repository_write(Repository *self, PyObject *args)
{
    int err;
    git_oid oid;
    git_odb *odb;
    git_odb_stream* stream;
    int type_id;
    const char* buffer;
    Py_ssize_t buflen;
    git_otype type;

    if (!PyArg_ParseTuple(args, "Is#", &type_id, &buffer, &buflen))
        return NULL;

    type = int_to_loose_object_type(type_id);
    if (type == GIT_OBJ_BAD)
        return PyErr_Format(PyExc_ValueError, "%d", type_id);

    err = git_repository_odb(&odb, self->repo);
    if (err < 0)
        return Error_set(err);

    err = git_odb_open_wstream(&stream, odb, buflen, type);
    git_odb_free(odb);
    if (err < 0)
        return Error_set(err);

    err = git_odb_stream_write(stream, buffer, buflen);
    if (err) {
        git_odb_stream_free(stream);
        return Error_set(err);
    }

    err = git_odb_stream_finalize_write(&oid, stream);
    git_odb_stream_free(stream);
    if (err)
        return Error_set(err);

    return git_oid_to_python(&oid);
}
Ejemplo n.º 5
0
int git_tag_create_frombuffer(git_oid *oid, git_repository *repo, const char *buffer, int allow_ref_overwrite)
{
    git_tag tag;
    int error;
    git_odb *odb;
    git_odb_stream *stream;
    git_odb_object *target_obj;

    git_reference *new_ref = NULL;
    git_buf ref_name = GIT_BUF_INIT;

    assert(oid && buffer);

    memset(&tag, 0, sizeof(tag));

    if (git_repository_odb__weakptr(&odb, repo) < 0)
        return -1;

    /* validate the buffer */
    if (tag_parse(&tag, buffer, buffer + strlen(buffer)) < 0)
        return -1;

    /* validate the target */
    if (git_odb_read(&target_obj, odb, &tag.target) < 0)
        goto on_error;

    if (tag.type != target_obj->cached.type) {
        giterr_set(GITERR_TAG, "The type for the given target is invalid");
        goto on_error;
    }

    error = retrieve_tag_reference_oid(oid, &ref_name, repo, tag.tag_name);
    if (error < 0 && error != GIT_ENOTFOUND)
        goto on_error;

    /* We don't need these objects after this */
    git_signature_free(tag.tagger);
    git__free(tag.tag_name);
    git__free(tag.message);
    git_odb_object_free(target_obj);

    /** Ensure the tag name doesn't conflict with an already existing
     *	reference unless overwriting has explicitly been requested **/
    if (error == 0 && !allow_ref_overwrite) {
        giterr_set(GITERR_TAG, "Tag already exists");
        return GIT_EEXISTS;
    }

    /* write the buffer */
    if ((error = git_odb_open_wstream(
                     &stream, odb, strlen(buffer), GIT_OBJ_TAG)) < 0)
        return error;

    if (!(error = git_odb_stream_write(stream, buffer, strlen(buffer))))
        error = git_odb_stream_finalize_write(oid, stream);

    git_odb_stream_free(stream);

    if (error < 0) {
        git_buf_free(&ref_name);
        return error;
    }

    error = git_reference_create(
                &new_ref, repo, ref_name.ptr, oid, allow_ref_overwrite, NULL);

    git_reference_free(new_ref);
    git_buf_free(&ref_name);

    return error;

on_error:
    git_signature_free(tag.tagger);
    git__free(tag.tag_name);
    git__free(tag.message);
    git_odb_object_free(target_obj);
    return -1;
}