commit - 945f922947fbf90d4ae30e870a0d0262cf12bea8
commit + 10f173fee1a4dcc3566febc4acb5adfe892745b3
blob - 6629cdc24c5c18fdad568f4d00ff57c91a49268a
blob + 6a3561fd9a97335e82546809332e4456c2726802
--- got/got.c
+++ got/got.c
};
static const struct got_error *
-blame_cb(void *arg, int nlines, int lineno, struct got_object_id *id)
+blame_cb(void *arg, int nlines, int lineno,
+ struct got_commit_object *commit, struct got_object_id *id)
{
const struct got_error *err = NULL;
struct blame_cb_args *a = arg;
struct blame_line *bline;
char *line = NULL;
size_t linesize = 0;
- struct got_commit_object *commit = NULL;
off_t offset;
struct tm tm;
time_t committer_time;
err = got_object_id_str(&bline->id_str, id);
if (err)
return err;
-
- err = got_object_open_as_commit(&commit, a->repo, id);
- if (err)
- goto done;
bline->committer = strdup(got_object_commit_get_committer(commit));
if (bline->committer == NULL) {
bline = &a->lines[a->lineno_cur - 1];
}
done:
- if (commit)
- got_object_commit_close(commit);
free(line);
return err;
}
blob - 12227984c432e81f5a1b01973031aec64920a2f6
blob + 07511661d626d729b112e4029c656459d3294e78
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
struct got_object_id *);
static const struct got_error *gw_apply_unveil(const char *);
static const struct got_error *gw_blame_cb(void *, int, int,
+ struct got_commit_object *,
struct got_object_id *);
static const struct got_error *gw_load_got_paths(struct gw_trans *);
static const struct got_error *gw_load_got_path(struct gw_trans *,
};
static const struct got_error *
-gw_blame_cb(void *arg, int nlines, int lineno, struct got_object_id *id)
+gw_blame_cb(void *arg, int nlines, int lineno,
+ struct got_commit_object *commit, struct got_object_id *id)
{
const struct got_error *err = NULL;
struct gw_blame_cb_args *a = arg;
struct blame_line *bline;
char *line = NULL;
size_t linesize = 0;
- struct got_commit_object *commit = NULL;
off_t offset;
struct tm tm;
time_t committer_time;
if (err)
return err;
- err = got_object_open_as_commit(&commit, a->repo, id);
- if (err)
- goto done;
-
bline->committer = strdup(got_object_commit_get_committer(commit));
if (bline->committer == NULL) {
err = got_error_from_errno("strdup");
free(href_diff);
}
done:
- if (commit)
- got_object_commit_close(commit);
free(line);
if (err == NULL && kerr != KCGI_OK)
err = gw_kcgi_error(kerr);
blob - c4c15ba2906056d4efdd0378fb21aa0e70cf83f7
blob + e360955ca287d181a8ff24dbf66100470e96de18
--- include/got_blame.h
+++ include/got_blame.h
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+typedef const struct got_error *(*got_blame_cb)(void *, int, int,
+ struct got_commit_object *, struct got_object_id *);
+
/*
* Blame the blob at the specified path in the specified commit and invoke
* a callback whenever an annotation has been computed for a line.
*/
const struct got_error *got_blame(const char *,
struct got_object_id *, struct got_repository *,
- const struct got_error *(*cb)(void *, int, int, struct got_object_id *),
- void *, got_cancel_cb, void *);
+ got_blame_cb, void *, got_cancel_cb, void *);
blob - 34906057730bd12ea25ac3bb7f300ed8cac6ce46
blob + cdadafcf0845e11bc89d10c2dd0f13a50fbb05a3
--- lib/blame.c
+++ lib/blame.c
};
static const struct got_error *
-annotate_line(struct got_blame *blame, int lineno, struct got_object_id *id,
- const struct got_error *(*cb)(void *, int, int, struct got_object_id *),
- void *arg)
+annotate_line(struct got_blame *blame, int lineno,
+ struct got_commit_object *commit, struct got_object_id *id,
+ got_blame_cb cb, void *arg)
{
const struct got_error *err = NULL;
struct got_blame_line *line;
line->annotated = 1;
blame->nannotated++;
if (cb)
- err = cb(arg, blame->nlines, lineno + 1, id);
+ err = cb(arg, blame->nlines, lineno + 1, commit, id);
return err;
}
static const struct got_error *
blame_changes(struct got_blame *blame, struct diff_result *diff_result,
- struct got_object_id *commit_id,
- const struct got_error *(*cb)(void *, int, int, struct got_object_id *),
- void *arg)
+ struct got_commit_object *commit, struct got_object_id *commit_id,
+ got_blame_cb cb, void *arg)
{
const struct got_error *err = NULL;
int i;
for (j = 0; j < right_count; j++) {
int ln = blame->linemap2[idx2++];
- err = annotate_line(blame, ln, commit_id, cb, arg);
+ err = annotate_line(blame, ln, commit, commit_id,
+ cb, arg);
if (err)
return err;
if (blame->nlines == blame->nannotated)
static const struct got_error *
blame_commit(struct got_blame *blame, struct got_object_id *id,
const char *path, struct got_repository *repo,
- const struct got_error *(*cb)(void *, int, int, struct got_object_id *),
- void *arg)
+ got_blame_cb cb, void *arg)
{
const struct got_error *err = NULL;
struct got_commit_object *commit = NULL, *pcommit = NULL;
goto done;
}
}
- err = blame_changes(blame, diff_result, id, cb, arg);
+ err = blame_changes(blame, diff_result, commit, id, cb, arg);
if (err)
goto done;
} else if (cb)
- err = cb(arg, blame->nlines, -1, id);
+ err = cb(arg, blame->nlines, -1, commit, id);
done:
if (diff_result)
diff_result_free(diff_result);
static const struct got_error *
blame_open(struct got_blame **blamep, const char *path,
struct got_object_id *start_commit_id, struct got_repository *repo,
- const struct got_error *(*cb)(void *, int, int, struct got_object_id *),
- void *arg, got_cancel_cb cancel_cb, void *cancel_arg)
+ got_blame_cb cb, void *arg, got_cancel_cb cancel_cb, void *cancel_arg)
{
const struct got_error *err = NULL;
- struct got_commit_object *start_commit = NULL;
+ struct got_commit_object *start_commit = NULL, *last_commit = NULL;
struct got_object_id *obj_id = NULL;
struct got_blob_object *blob = NULL;
struct got_blame *blame = NULL;
if (id && blame->nannotated < blame->nlines) {
/* Annotate remaining non-annotated lines with last commit. */
+ err = got_object_open_as_commit(&last_commit, repo, id);
+ if (err)
+ goto done;
for (lineno = 0; lineno < blame->nlines; lineno++) {
- err = annotate_line(blame, lineno, id, cb, arg);
+ err = annotate_line(blame, lineno, last_commit, id,
+ cb, arg);
if (err)
goto done;
}
got_object_blob_close(blob);
if (start_commit)
got_object_commit_close(start_commit);
+ if (last_commit)
+ got_object_commit_close(last_commit);
if (err) {
if (blame)
blame_close(blame);
const struct got_error *
got_blame(const char *path, struct got_object_id *commit_id,
- struct got_repository *repo,
- const struct got_error *(*cb)(void *, int, int, struct got_object_id *),
- void *arg, got_cancel_cb cancel_cb, void* cancel_arg)
+ struct got_repository *repo, got_blame_cb cb, void *arg,
+ got_cancel_cb cancel_cb, void* cancel_arg)
{
const struct got_error *err = NULL, *close_err = NULL;
struct got_blame *blame;
blob - 0c1f8bdddecfa08d332b9877c8b557307fcb4770
blob + b2a87544f6845b696f3c74b2ec602f4961a4b4b5
--- tog/tog.c
+++ tog/tog.c
}
static const struct got_error *
-blame_cb(void *arg, int nlines, int lineno, struct got_object_id *id)
+blame_cb(void *arg, int nlines, int lineno,
+ struct got_commit_object *commit, struct got_object_id *id)
{
const struct got_error *err = NULL;
struct tog_blame_cb_args *a = arg;