commit - 9b058f456d15d60a89334ce3e7f0a7c22e182c55
commit + e6e73e5504113b6c75f1b2e3dec3e22af8f41996
blob - 2dceeed3a7a54bee61a491f92527df8295059f95
blob + fcf17481c5332a3d73388d4c75c513aea5c28d7e
--- got/got.c
+++ got/got.c
struct got_blob_object *blob = NULL;
char *commit_id_str = NULL;
struct blame_cb_args bca;
- int ch, obj_type, i, fd = -1, fd1 = -1;
+ int ch, obj_type, i, fd1 = -1, fd2 = -1, fd3 = -1;
off_t filesize;
int *pack_fds = NULL;
+ FILE *f1 = NULL, *f2 = NULL;
- fd = got_opentempfd();
- if (fd == -1)
+ fd1 = got_opentempfd();
+ if (fd1 == -1)
return got_error_from_errno("got_opentempfd");
memset(&bca, 0, sizeof(bca));
goto done;
}
- error = got_object_open_as_blob(&blob, repo, obj_id, 8192, fd);
+ error = got_object_open_as_blob(&blob, repo, obj_id, 8192, fd1);
if (error)
goto done;
bca.f = got_opentemp();
}
bca.repo = repo;
- fd1 = got_opentempfd();
- if (fd1 == -1) {
+ fd2 = got_opentempfd();
+ if (fd2 == -1) {
error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
+ fd3 = got_opentempfd();
+ if (fd3 == -1) {
+ error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
+ f1 = got_opentemp();
+ if (f1 == NULL) {
+ error = got_error_from_errno("got_opentemp");
+ goto done;
+ }
+ f2 = got_opentemp();
+ if (f2 == NULL) {
+ error = got_error_from_errno("got_opentemp");
goto done;
}
error = got_blame(link_target ? link_target : in_repo_path, commit_id,
- repo, blame_cb, &bca, check_cancelled, NULL, fd1);
+ repo, blame_cb, &bca, check_cancelled, NULL, fd2, fd3, f1, f2);
done:
free(in_repo_path);
free(link_target);
free(obj_id);
if (commit)
got_object_commit_close(commit);
- if (fd != -1 && close(fd) == -1 && error == NULL)
- error = got_error_from_errno("close");
+
if (fd1 != -1 && close(fd1) == -1 && error == NULL)
error = got_error_from_errno("close");
+ if (fd2 != -1 && close(fd2) == -1 && error == NULL)
+ error = got_error_from_errno("close");
+ if (fd3 != -1 && close(fd3) == -1 && error == NULL)
+ error = got_error_from_errno("close");
+ if (f1 && fclose(f1) == EOF && error == NULL)
+ error = got_error_from_errno("fclose");
+ if (f2 && fclose(f2) == EOF && error == NULL)
+ error = got_error_from_errno("fclose");
+
if (blob)
got_object_blob_close(blob);
if (worktree)
blob - eb1c8f8f3ddec6a14375a8af819bc150fecf1abc
blob + 80bd351ec9bb5cf498aee6074d91b588a3566650
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
struct got_blob_object *blob = NULL;
char *path = NULL, *in_repo_path = NULL;
struct gw_blame_cb_args bca;
- int i, obj_type, fd = -1, fd1 = -1;
+ int i, obj_type, fd1 = -1, fd2 = -1, fd3 = -1;
off_t filesize;
+ FILE *f1 = NULL, *f2 = NULL;
- fd = got_opentempfd();
- if (fd == -1)
+ fd1 = got_opentempfd();
+ if (fd1 == -1)
return got_error_from_errno("got_opentempfd");
+ fd2 = got_opentempfd();
+ if (fd2 == -1) {
+ error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
+ fd3 = got_opentempfd();
+ if (fd3 == -1) {
+ error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
memset(&bca, 0, sizeof(bca));
}
error = got_object_open_as_blob(&blob, gw_trans->repo, obj_id, 8192,
- fd);
+ fd1);
if (error)
goto done;
fd1 = got_opentempfd();
if (fd1 == -1) {
+ error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
+
+ f1 = got_opentemp();
+ if (f1 == NULL) {
error = got_error_from_errno("got_opentempfd");
goto done;
}
+ f2 = got_opentemp();
+ if (f2 == NULL) {
+ error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
error = got_blame(in_repo_path, commit_id, gw_trans->repo, gw_blame_cb,
- &bca, NULL, NULL, fd1);
+ &bca, NULL, NULL, fd2, fd3, f1, f2);
done:
free(in_repo_path);
free(commit_id);
free(obj_id);
free(path);
- if (fd != -1 && close(fd) == -1 && error == NULL)
- error = got_error_from_errno("close");
if (fd1 != -1 && close(fd1) == -1 && error == NULL)
+ error = got_error_from_errno("close");
+ if (fd2 != -1 && close(fd2) == -1 && error == NULL)
+ error = got_error_from_errno("close");
+ if (fd3 != -1 && close(fd3) == -1 && error == NULL)
error = got_error_from_errno("close");
+ if (f1 && fclose(f1) == EOF && error == NULL)
+ error = got_error_from_errno("fclose");
+ if (f2 && fclose(f2) == EOF && error == NULL)
+ error = got_error_from_errno("fclose");
if (blob) {
free(bca.line_offsets);
blob - 56e2d804dc17e77e5b5660bcd248453a942fcbb4
blob + 5d01c0034c2587d4dffbfd407a94631f1cfe7e7c
--- include/got_blame.h
+++ include/got_blame.h
*/
const struct got_error *got_blame(const char *,
struct got_object_id *, struct got_repository *,
- got_blame_cb, void *, got_cancel_cb, void *, int);
+ got_blame_cb, void *, got_cancel_cb, void *, int, int, FILE *, FILE *);
blob - 68e7392e8e977dcd4362e7961374a990f1dba55c
blob + f08e9f18773211db7d75c2ee3de198ad23a08e01
--- lib/blame.c
+++ lib/blame.c
*/
FILE *f1; /* older version from commit N-1. */
FILE *f2; /* newer version from commit N. */
+ int fd;
unsigned char *map1;
unsigned char *map2;
off_t size1;
struct got_object_id *pblob_id = NULL;
struct got_blob_object *pblob = NULL;
struct diff_result *diff_result = NULL;
- int fd = -1;
err = got_object_open_as_commit(&commit, repo, id);
if (err)
return NULL;
}
- fd = got_opentempfd();
- if (fd == -1) {
- err = got_error_from_errno("got_opentempfd");
- goto done;
- }
-
err = got_object_open_as_commit(&pcommit, repo, &pid->id);
if (err)
goto done;
goto done;
}
- err = got_object_open_as_blob(&pblob, repo, pblob_id, 8192, fd);
+ err = got_object_open_as_blob(&pblob, repo, pblob_id, 8192, blame->fd);
if (err)
goto done;
- blame->f1 = got_opentemp();
- if (blame->f1 == NULL) {
- err = got_error_from_errno("got_opentemp");
- goto done;
- }
-
err = blame_prepare_file(blame->f1, &blame->map1, &blame->size1,
&blame->nlines1, &blame->line_offsets1, blame->data1,
blame->cfg, pblob);
if (pcommit)
got_object_commit_close(pcommit);
free(pblob_id);
- if (fd != -1 && close(fd) == -1 && err == NULL)
- err = got_error_from_errno("close");
if (pblob)
got_object_blob_close(pblob);
return err;
if (munmap(blame->map2, blame->size2) == -1 && err == NULL)
err = got_error_from_errno("munmap");
}
- if (blame->f1 && fclose(blame->f1) == EOF && err == NULL)
- err = got_error_from_errno("fclose");
- if (blame->f2 && fclose(blame->f2) == EOF && err == NULL)
- err = got_error_from_errno("fclose");
free(blame->lines);
free(blame->line_offsets1);
free(blame->line_offsets2);
}
static const struct got_error *
-close_file2_and_reuse_file1(struct got_blame *blame)
+flip_files(struct got_blame *blame)
{
+ const struct got_error *err = NULL;
struct diff_data *d;
+ FILE *tmp;
free(blame->line_offsets2);
blame->line_offsets2 = blame->line_offsets1;
return got_error_from_errno("munmap");
blame->map2 = blame->map1;
blame->map1 = NULL;
-
}
blame->size2 = blame->size1;
- blame->size1 = 0;
- if (fclose(blame->f2) == EOF)
- return got_error_from_errno("fclose");
+ err = got_opentemp_truncate(blame->f2);
+ if (err)
+ return err;
+ tmp = blame->f2;
blame->f2 = blame->f1;
- blame->f1 = NULL;
+ blame->f1 = tmp;
+ blame->size1 = 0;
blame->nlines2 = blame->nlines1;
blame->nlines1 = 0;
blame_open(struct got_blame **blamep, const char *path,
struct got_object_id *start_commit_id, struct got_repository *repo,
got_blame_cb cb, void *arg, got_cancel_cb cancel_cb, void *cancel_arg,
- int fd)
+ int fd1, int fd2, FILE *f1, FILE *f2)
{
const struct got_error *err = NULL;
struct got_commit_object *start_commit = NULL, *last_commit = NULL;
if (err)
goto done;
- err = got_object_open_as_blob(&blob, repo, obj_id, 8192, fd);
+ err = got_object_open_as_blob(&blob, repo, obj_id, 8192, fd1);
if (err)
goto done;
goto done;
}
- blame->f2 = got_opentemp();
- if (blame->f2 == NULL) {
- err = got_error_from_errno("got_opentemp");
- goto done;
- }
+ blame->f1 = f1;
+ blame->f2 = f2;
+ blame->fd = fd2;
+
err = got_diff_get_config(&blame->cfg, GOT_DIFF_ALGORITHM_PATIENCE,
blame_atomize_file, blame);
if (err)
if (blame->nannotated == blame->nlines)
break;
- err = close_file2_and_reuse_file1(blame);
+ err = flip_files(blame);
if (err)
goto done;
}
const struct got_error *
got_blame(const char *path, struct got_object_id *commit_id,
struct got_repository *repo, got_blame_cb cb, void *arg,
- got_cancel_cb cancel_cb, void* cancel_arg, int fd)
+ got_cancel_cb cancel_cb, void* cancel_arg, int fd1, int fd2, FILE *f1,
+ FILE *f2)
{
const struct got_error *err = NULL, *close_err = NULL;
struct got_blame *blame;
return got_error_from_errno2("asprintf", path);
err = blame_open(&blame, abspath, commit_id, repo, cb, arg,
- cancel_cb, cancel_arg, fd);
+ cancel_cb, cancel_arg, fd1, fd2, f1, f2);
free(abspath);
if (blame)
close_err = blame_close(blame);
blob - 6a0c6dbff39ee1a8db173cbc3fa1fbf0918eecab
blob + b458f29d2fc7c248f6f3bb6668d560ec46596515
--- tog/tog.c
+++ tog/tog.c
const struct got_error *err, *close_err;
struct tog_blame_thread_args *ta = arg;
struct tog_blame_cb_args *a = ta->cb_args;
- int errcode, fd = -1;
+ int errcode, fd1 = -1, fd2 = -1;
+ FILE *f1 = NULL, *f2 = NULL;
- fd = got_opentempfd();
- if (fd == -1)
+ fd1 = got_opentempfd();
+ if (fd1 == -1)
return (void *)got_error_from_errno("got_opentempfd");
+
+ fd2 = got_opentempfd();
+ if (fd2 == -1) {
+ err = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
+ f1 = got_opentemp();
+ if (f1 == NULL) {
+ err = (void *)got_error_from_errno("got_opentemp");
+ goto done;
+ }
+ f2 = got_opentemp();
+ if (f2 == NULL) {
+ err = (void *)got_error_from_errno("got_opentemp");
+ goto done;
+ }
+
err = block_signals_used_by_main_thread();
if (err)
- return (void *)err;
+ goto done;
err = got_blame(ta->path, a->commit_id, ta->repo,
- blame_cb, ta->cb_args, ta->cancel_cb, ta->cancel_arg, fd);
+ blame_cb, ta->cb_args, ta->cancel_cb, ta->cancel_arg, fd1, fd2, f1,
+ f2);
if (err && err->code == GOT_ERR_CANCELLED)
err = NULL;
errcode = pthread_mutex_lock(&tog_mutex);
- if (errcode)
- return (void *)got_error_set_errno(errcode,
- "pthread_mutex_lock");
+ if (errcode) {
+ err = got_error_set_errno(errcode, "pthread_mutex_lock");
+ goto done;
+ }
close_err = got_repo_close(ta->repo);
if (err == NULL)
if (errcode && err == NULL)
err = got_error_set_errno(errcode, "pthread_mutex_unlock");
- if (fd != -1 && close(fd) == -1 && err == NULL)
+done:
+ if (fd1 != -1 && close(fd1) == -1 && err == NULL)
err = got_error_from_errno("close");
+ if (fd2 != -1 && close(fd2) == -1 && err == NULL)
+ err = got_error_from_errno("close");
+ if (f1 && fclose(f1) == EOF && err == NULL)
+ err = got_error_from_errno("fclose");
+ if (f2 && fclose(f2) == EOF && err == NULL)
+ err = got_error_from_errno("fclose");
return (void *)err;
}