Skip to content

Commit

Permalink
provide a helper to free commit buffer
Browse files Browse the repository at this point in the history
This converts two lines into one at each caller. But more
importantly, it abstracts the concept of freeing the buffer,
which will make it easier to change later.

Note that we also need to provide a "detach" mechanism for a
tricky case in index-pack. We are passed a buffer for the
object generated by processing the incoming pack. If we are
not using --strict, we just calculate the sha1 on that
buffer and return, leaving the caller to free it.  But if we
are using --strict, we actually attach that buffer to an
object, pass the object to the fsck functions, and then
detach the buffer from the object again (so that the caller
can free it as usual).  In this case, we don't want to free
the buffer ourselves, but just make sure it is no longer
associated with the commit.

Note that we are making the assumption here that the
attach/detach process does not impact the buffer at all
(e.g., it is never reallocated or modified). That holds true
now, and we have no plans to change that. However, as we
abstract the commit_buffer code, this dependency becomes
less obvious. So when we detach, let's also make sure that
we get back the same buffer that we gave to the
commit_buffer code.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Jun 13, 2014
1 parent d74a4e5 commit 0fb370d
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 9 deletions.
3 changes: 1 addition & 2 deletions builtin/fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,7 @@ static int fsck_obj(struct object *obj)
if (obj->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *) obj;

free(commit->buffer);
commit->buffer = NULL;
free_commit_buffer(commit);

if (!commit->parents && show_root)
printf("root %s\n", sha1_to_hex(commit->object.sha1));
Expand Down
3 changes: 2 additions & 1 deletion builtin/index-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,8 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
}
if (obj->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *) obj;
commit->buffer = NULL;
if (detach_commit_buffer(commit) != data)
die("BUG: parse_object_buffer transmogrified our buffer");
}
obj->flags |= FLAG_CHECKED;
}
Expand Down
6 changes: 2 additions & 4 deletions builtin/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,7 @@ static int cmd_log_walk(struct rev_info *rev)
rev->max_count++;
if (!rev->reflog_info) {
/* we allow cycles in reflog ancestry */
free(commit->buffer);
commit->buffer = NULL;
free_commit_buffer(commit);
}
free_commit_list(commit->parents);
commit->parents = NULL;
Expand Down Expand Up @@ -1508,8 +1507,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
reopen_stdout(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
die(_("Failed to create output files"));
shown = log_tree_commit(&rev, commit);
free(commit->buffer);
commit->buffer = NULL;
free_commit_buffer(commit);

/* We put one extra blank line between formatted
* patches and this flag is used by log-tree code
Expand Down
3 changes: 1 addition & 2 deletions builtin/rev-list.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,7 @@ static void finish_commit(struct commit *commit, void *data)
free_commit_list(commit->parents);
commit->parents = NULL;
}
free(commit->buffer);
commit->buffer = NULL;
free_commit_buffer(commit);
}

static void finish_object(struct object *obj,
Expand Down
13 changes: 13 additions & 0 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,19 @@ int unregister_shallow(const unsigned char *sha1)
return 0;
}

void free_commit_buffer(struct commit *commit)
{
free(commit->buffer);
commit->buffer = NULL;
}

const void *detach_commit_buffer(struct commit *commit)
{
void *ret = commit->buffer;
commit->buffer = NULL;
return ret;
}

int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size)
{
const char *tail = buffer;
Expand Down
11 changes: 11 additions & 0 deletions commit.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,17 @@ int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long s
int parse_commit(struct commit *item);
void parse_commit_or_die(struct commit *item);

/*
* Free any cached object buffer associated with the commit.
*/
void free_commit_buffer(struct commit *);

/*
* Disassociate any cached object buffer from the commit, but do not free it.
* The buffer (or NULL, if none) is returned.
*/
const void *detach_commit_buffer(struct commit *);

/* Find beginning and length of commit subject. */
int find_commit_subject(const char *commit_buffer, const char **subject);

Expand Down

0 comments on commit 0fb370d

Please sign in to comment.