Hi,
Junio C Hamano wrote:
> I've been toying with an idea along this line.
Heh. Just for fun, here's an uglier version:
struct wcb_data {
int had_buffer;
int using_buffer;
};
#define WITH_COMMIT_BUFFER_DATA_INIT { 0, 0 }
extern void acquire_commit_buffer(struct commit *, struct wcb_data *);
extern void done_with_commit_buffer(struct commit *, struct wcb_data *);
/*
* usage:
* struct wcb_data buf = WITH_COMMIT_BUFFER_INIT;
*
* with_commit_buffer(commit, buf) {
* ...
* }
*/
#define with_commit_buffer(commit, i) \
for (acquire_commit_buffer(commit, &i); \
i.using_buffer; \
done_with_commit_buffer(commit, &i))
void acquire_commit_buffer(struct commit *commit, struct wcb_data *i)
{
enum object_type type;
unsigned long size;
assert(!i->using_buffer);
i->using_buffer = 1;
i->had_buffer = !!commit->buffer;
if (i->had_buffer)
return;
commit->buffer = read_sha1_file(commit->object.sha1, &type,
&size);
if (!commit->buffer)
die("unable to read commit %s",
sha1_to_hex(commit->object.sha1));
}
void done_with_commit_buffer(struct commit *commit, struct wcb_data *i)
{
assert(i->using_buffer);
i->using_buffer = 0;
if (!i->had_buffer) {
free(commit->buffer);
commit->buffer = NULL;
}
}
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html