commit - 4969d6d8e51089879be8070985a01a7a56414faf
commit + 7f1f93af7593347c6efde1bc79997fbff2b64ef2
blob - d572937e718edddeb55f37e39b7d17d49e696105
blob + cab65a3f7e04a20a205739e81a819921eea06c5a
--- lib/diff.c
+++ lib/diff.c
NULL);
}
-const struct got_error *
-got_diff_blob_file(struct got_blob_object *blob1, FILE *f2, size_t size2,
+static const struct got_error *
+alloc_changes(struct got_diff_changes **changes)
+{
+ *changes = calloc(1, sizeof(**changes));
+ if (*changes == NULL)
+ return got_error_from_errno("calloc");
+ SIMPLEQ_INIT(&(*changes)->entries);
+ return NULL;
+}
+
+static const struct got_error *
+diff_blob_file(struct got_diff_changes **changes,
+ struct got_blob_object *blob1, FILE *f2, size_t size2,
const char *label2, int diff_context, FILE *outfile)
{
struct got_diff_state ds;
size_t size1;
int res, flags = 0;
+ if (changes)
+ *changes = NULL;
+
size1 = 0;
if (blob1) {
f1 = got_opentemp();
args.diff_context = diff_context;
flags |= D_PROTOTYPE;
- fprintf(outfile, "blob - %s\n", idstr1);
- fprintf(outfile, "file + %s\n", f2 == NULL ? "/dev/null" : label2);
- err = got_diffreg(&res, f1, f2, flags, &args, &ds, outfile, NULL);
+ if (outfile) {
+ fprintf(outfile, "blob - %s\n", idstr1);
+ fprintf(outfile, "file + %s\n",
+ f2 == NULL ? "/dev/null" : label2);
+ }
+ if (changes) {
+ err = alloc_changes(changes);
+ if (err)
+ return err;
+ }
+ err = got_diffreg(&res, f1, f2, flags, &args, &ds, outfile,
+ changes ? *changes : NULL);
done:
if (f1 && fclose(f1) != 0 && err == NULL)
err = got_error_from_errno("fclose");
}
const struct got_error *
+got_diff_blob_file(struct got_blob_object *blob1, FILE *f2, size_t size2,
+ const char *label2, int diff_context, FILE *outfile)
+{
+ return diff_blob_file(NULL, blob1, f2, size2, label2, diff_context,
+ outfile);
+}
+
+const struct got_error *
+got_diff_blob_file_lines_changed(struct got_diff_changes **changes,
+ struct got_blob_object *blob1, FILE *f2, size_t size2,
+ const char *label2, int diff_context)
+{
+ return diff_blob_file(changes, blob1, f2, size2, label2, diff_context,
+ NULL);
+}
+
+const struct got_error *
got_diff_blob_lines_changed(struct got_diff_changes **changes,
struct got_blob_object *blob1, struct got_blob_object *blob2)
{
const struct got_error *err = NULL;
- *changes = calloc(1, sizeof(**changes));
- if (*changes == NULL)
- return got_error_from_errno("calloc");
- SIMPLEQ_INIT(&(*changes)->entries);
+ err = alloc_changes(changes);
+ if (err)
+ return err;
err = diff_blobs(blob1, blob2, NULL, NULL, 3, NULL, *changes);
if (err) {
blob - b8fe79b227efaf7231763dafa65b8c766be7ef0d
blob + c9a2662dc807dc6277cf292b6f634361856790ad
--- lib/got_lib_diff.h
+++ lib/got_lib_diff.h
FILE *, int, struct got_diff_args *, struct got_diff_state *, FILE *,
struct got_diff_changes *);
+const struct got_error *got_diff_blob_file_lines_changed(struct got_diff_changes **,
+ struct got_blob_object *, FILE *, size_t, const char *, int);
const struct got_error *got_diff_blob_lines_changed(struct got_diff_changes **,
struct got_blob_object *, struct got_blob_object *);
void got_diff_free_changes(struct got_diff_changes *);