mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-06 08:47:46 +00:00
Migrate code to git_filter_blob_contents.
Also removes the unnecessary check for filter length, since git_filters_apply does the right thing when there are none, and it's more efficient than this.
This commit is contained in:
parent
41ad70d0a8
commit
9587895f57
@ -32,49 +32,12 @@ typedef struct tree_walk_data
|
|||||||
} tree_walk_data;
|
} tree_walk_data;
|
||||||
|
|
||||||
|
|
||||||
static int unfiltered_blob_contents(git_buf *out, git_repository *repo, const git_oid *blob_id)
|
|
||||||
{
|
|
||||||
int retcode = GIT_ERROR;
|
|
||||||
git_blob *blob;
|
|
||||||
|
|
||||||
if (!(retcode = git_blob_lookup(&blob, repo, blob_id)))
|
|
||||||
retcode = git_blob__getbuf(out, blob);
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int filtered_blob_contents(git_buf *out, git_repository *repo, const git_oid *oid, const char *path)
|
|
||||||
{
|
|
||||||
int retcode = GIT_ERROR;
|
|
||||||
|
|
||||||
git_buf unfiltered = GIT_BUF_INIT;
|
|
||||||
if (!unfiltered_blob_contents(&unfiltered, repo, oid)) {
|
|
||||||
git_vector filters = GIT_VECTOR_INIT;
|
|
||||||
int filter_count = git_filters_load(&filters, repo,
|
|
||||||
path, GIT_FILTER_TO_WORKTREE);
|
|
||||||
if (filter_count >= 0) {
|
|
||||||
git_buf_clear(out);
|
|
||||||
if (!filter_count) {
|
|
||||||
git_buf_put(out, git_buf_cstr(&unfiltered), git_buf_len(&unfiltered));
|
|
||||||
retcode = 0;
|
|
||||||
} else {
|
|
||||||
retcode = git_filters_apply(out, &unfiltered, &filters);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
git_filters_free(&filters);
|
|
||||||
}
|
|
||||||
|
|
||||||
git_buf_free(&unfiltered);
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf, const git_oid *id, int mode)
|
static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf, const git_oid *id, int mode)
|
||||||
{
|
{
|
||||||
int retcode = GIT_ERROR;
|
int retcode = GIT_ERROR;
|
||||||
|
|
||||||
git_buf filteredcontents = GIT_BUF_INIT;
|
git_buf filteredcontents = GIT_BUF_INIT;
|
||||||
if (!filtered_blob_contents(&filteredcontents, repo, id, git_buf_cstr(fnbuf))) {
|
if (!git_filter_blob_contents(&filteredcontents, repo, id, git_buf_cstr(fnbuf))) {
|
||||||
int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf),
|
int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf),
|
||||||
GIT_DIR_MODE, mode);
|
GIT_DIR_MODE, mode);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
|
33
src/filter.c
33
src/filter.c
@ -11,6 +11,7 @@
|
|||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
#include "repository.h"
|
#include "repository.h"
|
||||||
#include "git2/config.h"
|
#include "git2/config.h"
|
||||||
|
#include "blob.h"
|
||||||
|
|
||||||
/* Tweaked from Core Git. I wonder what we could use this for... */
|
/* Tweaked from Core Git. I wonder what we could use this for... */
|
||||||
void git_text_gather_stats(git_text_stats *stats, const git_buf *text)
|
void git_text_gather_stats(git_text_stats *stats, const git_buf *text)
|
||||||
@ -163,3 +164,35 @@ int git_filters_apply(git_buf *dest, git_buf *source, git_vector *filters)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int unfiltered_blob_contents(git_buf *out, git_repository *repo, const git_oid *blob_id)
|
||||||
|
{
|
||||||
|
int retcode = GIT_ERROR;
|
||||||
|
git_blob *blob;
|
||||||
|
|
||||||
|
if (!(retcode = git_blob_lookup(&blob, repo, blob_id)))
|
||||||
|
retcode = git_blob__getbuf(out, blob);
|
||||||
|
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int git_filter_blob_contents(git_buf *out, git_repository *repo, const git_oid *oid, const char *path)
|
||||||
|
{
|
||||||
|
int retcode = GIT_ERROR;
|
||||||
|
|
||||||
|
git_buf unfiltered = GIT_BUF_INIT;
|
||||||
|
if (!unfiltered_blob_contents(&unfiltered, repo, oid)) {
|
||||||
|
git_vector filters = GIT_VECTOR_INIT;
|
||||||
|
if (git_filters_load(&filters,
|
||||||
|
repo, path, GIT_FILTER_TO_WORKTREE) >= 0) {
|
||||||
|
git_buf_clear(out);
|
||||||
|
retcode = git_filters_apply(out, &unfiltered, &filters);
|
||||||
|
}
|
||||||
|
|
||||||
|
git_filters_free(&filters);
|
||||||
|
}
|
||||||
|
|
||||||
|
git_buf_free(&unfiltered);
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
12
src/filter.h
12
src/filter.h
@ -119,4 +119,16 @@ extern void git_text_gather_stats(git_text_stats *stats, const git_buf *text);
|
|||||||
*/
|
*/
|
||||||
extern int git_text_is_binary(git_text_stats *stats);
|
extern int git_text_is_binary(git_text_stats *stats);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the content of a blob after all filters have been run.
|
||||||
|
*
|
||||||
|
* @param out buffer to receive the contents
|
||||||
|
* @param repo repository containing the blob
|
||||||
|
* @param oid object id for the blob
|
||||||
|
* @param path path to the blob's output file, relative to the workdir root
|
||||||
|
* @return 0 on success, an error code otherwise
|
||||||
|
*/
|
||||||
|
extern int git_filter_blob_contents(git_buf *out, git_repository *repo, const git_oid *oid, const char *path);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user