rugged 0.28.4.1 → 0.28.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8640056720a4bfbe0c43e21c06c17c0841d24dc503c615d8f9401b30d5c3f369
4
- data.tar.gz: 3c6ed64df81ce243cab52ea4354ba25ba84b12be3349ee42b7a02caf2d253bff
3
+ metadata.gz: 9a520ac9fb1ac94fe6c890408004acaca2aacc597ae9b1ba5be720c09ef7aa65
4
+ data.tar.gz: 208ae60e1ad7b01bcfb2317a81267b5139e8874496c9a46f5410e1b87b2801f9
5
5
  SHA512:
6
- metadata.gz: ca08d563dd25581b77759b34ad37ab8f223710146a0c2945beb8fdafc6b182aef4cc28c5e77a358f1fe41ef80fe7ef4d639e219c359990de8eed5100caef10b2
7
- data.tar.gz: 14ab2fe07aef170e9b804f6c30b0d909f7398f48ac755003d9de7b0064d75fa5c1e550c50a0789b7e290017a392f3b4c1f3d8fe666e133e89dc484b1a0a40071
6
+ metadata.gz: 0b9ec4638789d9cccab65aba6208c6fe713dd289a228b050f4fc1887897930247f43daa64f43adcdf5955b77095b60b95d3bd70b846c69df119a7a1be46bab92
7
+ data.tar.gz: 10fb00b82a494e72e704eb1e2ab2eae9545ba972c98f5dfabcb523d5c7fdb523d7cb16d8c97dfb2bc428100c47e98a76a52ce366e1fb6a0a842b571b68c37e65
@@ -4,5 +4,5 @@
4
4
  # For full terms see the included LICENSE file.
5
5
 
6
6
  module Rugged
7
- Version = VERSION = '0.28.4.1'
7
+ Version = VERSION = '0.28.5'
8
8
  end
@@ -23,6 +23,7 @@ Dmitry Kovega
23
23
  Emeric Fermas
24
24
  Emmanuel Rodriguez
25
25
  Eric Myhre
26
+ Erik Aigner
26
27
  Florian Forster
27
28
  Holger Weiss
28
29
  Ingmar Vanhassel
@@ -7,10 +7,10 @@
7
7
  #ifndef INCLUDE_git_version_h__
8
8
  #define INCLUDE_git_version_h__
9
9
 
10
- #define LIBGIT2_VERSION "0.28.4"
10
+ #define LIBGIT2_VERSION "0.28.5"
11
11
  #define LIBGIT2_VER_MAJOR 0
12
12
  #define LIBGIT2_VER_MINOR 28
13
- #define LIBGIT2_VER_REVISION 4
13
+ #define LIBGIT2_VER_REVISION 5
14
14
  #define LIBGIT2_VER_PATCH 0
15
15
 
16
16
  #define LIBGIT2_SOVERSION 28
@@ -59,7 +59,7 @@ static int patch_image_init_fromstr(
59
59
  git_pool_init(&out->pool, sizeof(git_diff_line));
60
60
 
61
61
  for (start = in; start < in + in_len; start = end) {
62
- end = memchr(start, '\n', in_len);
62
+ end = memchr(start, '\n', in_len - (start - in));
63
63
 
64
64
  if (end == NULL)
65
65
  end = in + in_len;
@@ -199,23 +199,34 @@ static int apply_hunk(
199
199
 
200
200
  for (i = 0; i < hunk->line_count; i++) {
201
201
  size_t linenum = hunk->line_start + i;
202
- git_diff_line *line = git_array_get(patch->lines, linenum);
202
+ git_diff_line *line = git_array_get(patch->lines, linenum), *prev;
203
203
 
204
204
  if (!line) {
205
205
  error = apply_err("preimage does not contain line %"PRIuZ, linenum);
206
206
  goto done;
207
207
  }
208
208
 
209
- if (line->origin == GIT_DIFF_LINE_CONTEXT ||
210
- line->origin == GIT_DIFF_LINE_DELETION) {
211
- if ((error = git_vector_insert(&preimage.lines, line)) < 0)
212
- goto done;
213
- }
214
-
215
- if (line->origin == GIT_DIFF_LINE_CONTEXT ||
216
- line->origin == GIT_DIFF_LINE_ADDITION) {
217
- if ((error = git_vector_insert(&postimage.lines, line)) < 0)
218
- goto done;
209
+ switch (line->origin) {
210
+ case GIT_DIFF_LINE_CONTEXT_EOFNL:
211
+ case GIT_DIFF_LINE_DEL_EOFNL:
212
+ case GIT_DIFF_LINE_ADD_EOFNL:
213
+ prev = i ? git_array_get(patch->lines, linenum - 1) : NULL;
214
+ if (prev && prev->content[prev->content_len - 1] == '\n')
215
+ prev->content_len -= 1;
216
+ break;
217
+ case GIT_DIFF_LINE_CONTEXT:
218
+ if ((error = git_vector_insert(&preimage.lines, line)) < 0 ||
219
+ (error = git_vector_insert(&postimage.lines, line)) < 0)
220
+ goto done;
221
+ break;
222
+ case GIT_DIFF_LINE_DELETION:
223
+ if ((error = git_vector_insert(&preimage.lines, line)) < 0)
224
+ goto done;
225
+ break;
226
+ case GIT_DIFF_LINE_ADDITION:
227
+ if ((error = git_vector_insert(&postimage.lines, line)) < 0)
228
+ goto done;
229
+ break;
219
230
  }
220
231
  }
221
232
 
@@ -631,9 +642,12 @@ int git_apply_to_tree(
631
642
  for (i = 0; i < git_diff_num_deltas(diff); i++) {
632
643
  delta = git_diff_get_delta(diff, i);
633
644
 
634
- if ((error = git_index_remove(postimage,
635
- delta->old_file.path, 0)) < 0)
636
- goto done;
645
+ if (delta->status == GIT_DELTA_DELETED ||
646
+ delta->status == GIT_DELTA_RENAMED) {
647
+ if ((error = git_index_remove(postimage,
648
+ delta->old_file.path, 0)) < 0)
649
+ goto done;
650
+ }
637
651
  }
638
652
 
639
653
  if ((error = apply_deltas(repo, pre_reader, NULL, post_reader, postimage, diff, &opts)) < 0)
@@ -413,7 +413,7 @@ int git_attr_cache__init(git_repository *repo)
413
413
  git_config_free(cfg);
414
414
 
415
415
  /* insert default macros */
416
- return git_attr_add_macro(repo, "binary", "-diff -crlf -text");
416
+ return git_attr_add_macro(repo, "binary", "-diff -merge -text -crlf");
417
417
 
418
418
  cancel:
419
419
  attr_cache__free(cache);
@@ -408,7 +408,7 @@ on_error:
408
408
 
409
409
  static bool hunk_is_bufferblame(git_blame_hunk *hunk)
410
410
  {
411
- return git_oid_iszero(&hunk->final_commit_id);
411
+ return hunk && git_oid_iszero(&hunk->final_commit_id);
412
412
  }
413
413
 
414
414
  static int buffer_hunk_cb(
@@ -18,7 +18,8 @@ char git_buf__initbuf[1];
18
18
  char git_buf__oom[1];
19
19
 
20
20
  #define ENSURE_SIZE(b, d) \
21
- if ((d) > (b)->asize && git_buf_grow((b), (d)) < 0)\
21
+ if ((b)->ptr == git_buf__oom || \
22
+ ((d) > (b)->asize && git_buf_grow((b), (d)) < 0))\
22
23
  return -1;
23
24
 
24
25
 
@@ -58,20 +59,26 @@ int git_buf_try_grow(
58
59
  new_ptr = NULL;
59
60
  } else {
60
61
  new_size = buf->asize;
62
+ /*
63
+ * Grow the allocated buffer by 1.5 to allow
64
+ * re-use of memory holes resulting from the
65
+ * realloc. If this is still too small, then just
66
+ * use the target size.
67
+ */
68
+ if ((new_size = (new_size << 1) - (new_size >> 1)) < target_size)
69
+ new_size = target_size;
61
70
  new_ptr = buf->ptr;
62
71
  }
63
72
 
64
- /* grow the buffer size by 1.5, until it's big enough
65
- * to fit our target size */
66
- while (new_size < target_size)
67
- new_size = (new_size << 1) - (new_size >> 1);
68
-
69
73
  /* round allocation up to multiple of 8 */
70
74
  new_size = (new_size + 7) & ~7;
71
75
 
72
76
  if (new_size < buf->size) {
73
- if (mark_oom)
77
+ if (mark_oom) {
78
+ if (buf->ptr && buf->ptr != git_buf__initbuf)
79
+ git__free(buf->ptr);
74
80
  buf->ptr = git_buf__oom;
81
+ }
75
82
 
76
83
  git_error_set_oom();
77
84
  return -1;
@@ -30,7 +30,7 @@ static int write_cherrypick_head(
30
30
  int error = 0;
31
31
 
32
32
  if ((error = git_buf_joinpath(&file_path, repo->gitdir, GIT_CHERRYPICK_HEAD_FILE)) >= 0 &&
33
- (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_CHERRYPICK_FILE_MODE)) >= 0 &&
33
+ (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_CREATE_LEADING_DIRS, GIT_CHERRYPICK_FILE_MODE)) >= 0 &&
34
34
  (error = git_filebuf_printf(&file, "%s\n", commit_oidstr)) >= 0)
35
35
  error = git_filebuf_commit(&file);
36
36
 
@@ -51,7 +51,7 @@ static int write_merge_msg(
51
51
  int error = 0;
52
52
 
53
53
  if ((error = git_buf_joinpath(&file_path, repo->gitdir, GIT_MERGE_MSG_FILE)) < 0 ||
54
- (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_FORCE, GIT_CHERRYPICK_FILE_MODE)) < 0 ||
54
+ (error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_CREATE_LEADING_DIRS, GIT_CHERRYPICK_FILE_MODE)) < 0 ||
55
55
  (error = git_filebuf_printf(&file, "%s", commit_msg)) < 0)
56
56
  goto cleanup;
57
57
 
@@ -443,7 +443,7 @@ out:
443
443
  return error;
444
444
  }
445
445
 
446
- static int line_cb(
446
+ static int patchid_line_cb(
447
447
  const git_diff_delta *delta,
448
448
  const git_diff_hunk *hunk,
449
449
  const git_diff_line *line,
@@ -465,6 +465,14 @@ static int line_cb(
465
465
  break;
466
466
  case GIT_DIFF_LINE_CONTEXT:
467
467
  break;
468
+ case GIT_DIFF_LINE_CONTEXT_EOFNL:
469
+ case GIT_DIFF_LINE_ADD_EOFNL:
470
+ case GIT_DIFF_LINE_DEL_EOFNL:
471
+ /*
472
+ * Ignore EOF without newlines for patch IDs as whitespace is
473
+ * not supposed to be significant.
474
+ */
475
+ return 0;
468
476
  default:
469
477
  git_error_set(GIT_ERROR_PATCH, "invalid line origin for patch");
470
478
  return -1;
@@ -501,7 +509,7 @@ int git_diff_patchid(git_oid *out, git_diff *diff, git_diff_patchid_options *opt
501
509
  if ((error = git_hash_ctx_init(&args.ctx)) < 0)
502
510
  goto out;
503
511
 
504
- if ((error = git_diff_foreach(diff, file_cb, NULL, NULL, line_cb, &args)) < 0)
512
+ if ((error = git_diff_foreach(diff, file_cb, NULL, NULL, patchid_line_cb, &args)) < 0)
505
513
  goto out;
506
514
 
507
515
  if ((error = (flush_hunk(&args.result, &args.ctx))) < 0)
@@ -1262,29 +1262,31 @@ cleanup:
1262
1262
  return error;
1263
1263
  }
1264
1264
 
1265
- #define DIFF_FROM_ITERATORS(MAKE_FIRST, FLAGS_FIRST, MAKE_SECOND, FLAGS_SECOND) do { \
1266
- git_iterator *a = NULL, *b = NULL; \
1267
- char *pfx = (opts && !(opts->flags & GIT_DIFF_DISABLE_PATHSPEC_MATCH)) ? \
1268
- git_pathspec_prefix(&opts->pathspec) : NULL; \
1269
- git_iterator_options a_opts = GIT_ITERATOR_OPTIONS_INIT, \
1270
- b_opts = GIT_ITERATOR_OPTIONS_INIT; \
1271
- a_opts.flags = FLAGS_FIRST; \
1272
- a_opts.start = pfx; \
1273
- a_opts.end = pfx; \
1274
- b_opts.flags = FLAGS_SECOND; \
1275
- b_opts.start = pfx; \
1276
- b_opts.end = pfx; \
1277
- GIT_ERROR_CHECK_VERSION(opts, GIT_DIFF_OPTIONS_VERSION, "git_diff_options"); \
1278
- if (opts && (opts->flags & GIT_DIFF_DISABLE_PATHSPEC_MATCH)) { \
1279
- a_opts.pathlist.strings = opts->pathspec.strings; \
1280
- a_opts.pathlist.count = opts->pathspec.count; \
1281
- b_opts.pathlist.strings = opts->pathspec.strings; \
1282
- b_opts.pathlist.count = opts->pathspec.count; \
1283
- } \
1284
- if (!error && !(error = MAKE_FIRST) && !(error = MAKE_SECOND)) \
1285
- error = git_diff__from_iterators(&diff, repo, a, b, opts); \
1286
- git__free(pfx); git_iterator_free(a); git_iterator_free(b); \
1287
- } while (0)
1265
+ static int diff_prepare_iterator_opts(char **prefix, git_iterator_options *a, int aflags,
1266
+ git_iterator_options *b, int bflags,
1267
+ const git_diff_options *opts)
1268
+ {
1269
+ GIT_ERROR_CHECK_VERSION(opts, GIT_DIFF_OPTIONS_VERSION, "git_diff_options");
1270
+
1271
+ *prefix = NULL;
1272
+
1273
+ if (opts && (opts->flags & GIT_DIFF_DISABLE_PATHSPEC_MATCH)) {
1274
+ a->pathlist.strings = opts->pathspec.strings;
1275
+ a->pathlist.count = opts->pathspec.count;
1276
+ b->pathlist.strings = opts->pathspec.strings;
1277
+ b->pathlist.count = opts->pathspec.count;
1278
+ } else if (opts) {
1279
+ *prefix = git_pathspec_prefix(&opts->pathspec);
1280
+ GIT_ERROR_CHECK_ALLOC(prefix);
1281
+ }
1282
+
1283
+ a->flags = aflags;
1284
+ b->flags = bflags;
1285
+ a->start = b->start = *prefix;
1286
+ a->end = b->end = *prefix;
1287
+
1288
+ return 0;
1289
+ }
1288
1290
 
1289
1291
  int git_diff_tree_to_tree(
1290
1292
  git_diff **out,
@@ -1293,8 +1295,12 @@ int git_diff_tree_to_tree(
1293
1295
  git_tree *new_tree,
1294
1296
  const git_diff_options *opts)
1295
1297
  {
1296
- git_diff *diff = NULL;
1297
1298
  git_iterator_flag_t iflag = GIT_ITERATOR_DONT_IGNORE_CASE;
1299
+ git_iterator_options a_opts = GIT_ITERATOR_OPTIONS_INIT,
1300
+ b_opts = GIT_ITERATOR_OPTIONS_INIT;
1301
+ git_iterator *a = NULL, *b = NULL;
1302
+ git_diff *diff = NULL;
1303
+ char *prefix = NULL;
1298
1304
  int error = 0;
1299
1305
 
1300
1306
  assert(out && repo);
@@ -1308,13 +1314,19 @@ int git_diff_tree_to_tree(
1308
1314
  if (opts && (opts->flags & GIT_DIFF_IGNORE_CASE) != 0)
1309
1315
  iflag = GIT_ITERATOR_IGNORE_CASE;
1310
1316
 
1311
- DIFF_FROM_ITERATORS(
1312
- git_iterator_for_tree(&a, old_tree, &a_opts), iflag,
1313
- git_iterator_for_tree(&b, new_tree, &b_opts), iflag
1314
- );
1317
+ if ((error = diff_prepare_iterator_opts(&prefix, &a_opts, iflag, &b_opts, iflag, opts)) < 0 ||
1318
+ (error = git_iterator_for_tree(&a, old_tree, &a_opts)) < 0 ||
1319
+ (error = git_iterator_for_tree(&b, new_tree, &b_opts)) < 0 ||
1320
+ (error = git_diff__from_iterators(&diff, repo, a, b, opts)) < 0)
1321
+ goto out;
1315
1322
 
1316
- if (!error)
1317
- *out = diff;
1323
+ *out = diff;
1324
+ diff = NULL;
1325
+ out:
1326
+ git_iterator_free(a);
1327
+ git_iterator_free(b);
1328
+ git_diff_free(diff);
1329
+ git__free(prefix);
1318
1330
 
1319
1331
  return error;
1320
1332
  }
@@ -1337,9 +1349,13 @@ int git_diff_tree_to_index(
1337
1349
  git_index *index,
1338
1350
  const git_diff_options *opts)
1339
1351
  {
1340
- git_diff *diff = NULL;
1341
1352
  git_iterator_flag_t iflag = GIT_ITERATOR_DONT_IGNORE_CASE |
1342
1353
  GIT_ITERATOR_INCLUDE_CONFLICTS;
1354
+ git_iterator_options a_opts = GIT_ITERATOR_OPTIONS_INIT,
1355
+ b_opts = GIT_ITERATOR_OPTIONS_INIT;
1356
+ git_iterator *a = NULL, *b = NULL;
1357
+ git_diff *diff = NULL;
1358
+ char *prefix = NULL;
1343
1359
  bool index_ignore_case = false;
1344
1360
  int error = 0;
1345
1361
 
@@ -1352,17 +1368,23 @@ int git_diff_tree_to_index(
1352
1368
 
1353
1369
  index_ignore_case = index->ignore_case;
1354
1370
 
1355
- DIFF_FROM_ITERATORS(
1356
- git_iterator_for_tree(&a, old_tree, &a_opts), iflag,
1357
- git_iterator_for_index(&b, repo, index, &b_opts), iflag
1358
- );
1371
+ if ((error = diff_prepare_iterator_opts(&prefix, &a_opts, iflag, &b_opts, iflag, opts)) < 0 ||
1372
+ (error = git_iterator_for_tree(&a, old_tree, &a_opts)) < 0 ||
1373
+ (error = git_iterator_for_index(&b, repo, index, &b_opts)) < 0 ||
1374
+ (error = git_diff__from_iterators(&diff, repo, a, b, opts)) < 0)
1375
+ goto out;
1359
1376
 
1360
1377
  /* if index is in case-insensitive order, re-sort deltas to match */
1361
- if (!error && index_ignore_case)
1378
+ if (index_ignore_case)
1362
1379
  git_diff__set_ignore_case(diff, true);
1363
1380
 
1364
- if (!error)
1365
- *out = diff;
1381
+ *out = diff;
1382
+ diff = NULL;
1383
+ out:
1384
+ git_iterator_free(a);
1385
+ git_iterator_free(b);
1386
+ git_diff_free(diff);
1387
+ git__free(prefix);
1366
1388
 
1367
1389
  return error;
1368
1390
  }
@@ -1373,7 +1395,11 @@ int git_diff_index_to_workdir(
1373
1395
  git_index *index,
1374
1396
  const git_diff_options *opts)
1375
1397
  {
1398
+ git_iterator_options a_opts = GIT_ITERATOR_OPTIONS_INIT,
1399
+ b_opts = GIT_ITERATOR_OPTIONS_INIT;
1400
+ git_iterator *a = NULL, *b = NULL;
1376
1401
  git_diff *diff = NULL;
1402
+ char *prefix = NULL;
1377
1403
  int error = 0;
1378
1404
 
1379
1405
  assert(out && repo);
@@ -1383,20 +1409,24 @@ int git_diff_index_to_workdir(
1383
1409
  if (!index && (error = diff_load_index(&index, repo)) < 0)
1384
1410
  return error;
1385
1411
 
1386
- DIFF_FROM_ITERATORS(
1387
- git_iterator_for_index(&a, repo, index, &a_opts),
1388
- GIT_ITERATOR_INCLUDE_CONFLICTS,
1389
-
1390
- git_iterator_for_workdir(&b, repo, index, NULL, &b_opts),
1391
- GIT_ITERATOR_DONT_AUTOEXPAND
1392
- );
1393
-
1394
- if (!error && (diff->opts.flags & GIT_DIFF_UPDATE_INDEX) != 0 &&
1395
- ((git_diff_generated *)diff)->index_updated)
1396
- error = git_index_write(index);
1397
-
1398
- if (!error)
1399
- *out = diff;
1412
+ if ((error = diff_prepare_iterator_opts(&prefix, &a_opts, GIT_ITERATOR_INCLUDE_CONFLICTS,
1413
+ &b_opts, GIT_ITERATOR_DONT_AUTOEXPAND, opts)) < 0 ||
1414
+ (error = git_iterator_for_index(&a, repo, index, &a_opts)) < 0 ||
1415
+ (error = git_iterator_for_workdir(&b, repo, index, NULL, &b_opts)) < 0 ||
1416
+ (error = git_diff__from_iterators(&diff, repo, a, b, opts)) < 0)
1417
+ goto out;
1418
+
1419
+ if ((diff->opts.flags & GIT_DIFF_UPDATE_INDEX) && ((git_diff_generated *)diff)->index_updated)
1420
+ if ((error = git_index_write(index)) < 0)
1421
+ goto out;
1422
+
1423
+ *out = diff;
1424
+ diff = NULL;
1425
+ out:
1426
+ git_iterator_free(a);
1427
+ git_iterator_free(b);
1428
+ git_diff_free(diff);
1429
+ git__free(prefix);
1400
1430
 
1401
1431
  return error;
1402
1432
  }
@@ -1407,24 +1437,33 @@ int git_diff_tree_to_workdir(
1407
1437
  git_tree *old_tree,
1408
1438
  const git_diff_options *opts)
1409
1439
  {
1440
+ git_iterator_options a_opts = GIT_ITERATOR_OPTIONS_INIT,
1441
+ b_opts = GIT_ITERATOR_OPTIONS_INIT;
1442
+ git_iterator *a = NULL, *b = NULL;
1410
1443
  git_diff *diff = NULL;
1444
+ char *prefix = NULL;
1411
1445
  git_index *index;
1412
- int error = 0;
1446
+ int error;
1413
1447
 
1414
1448
  assert(out && repo);
1415
1449
 
1416
1450
  *out = NULL;
1417
1451
 
1418
- if ((error = git_repository_index__weakptr(&index, repo)))
1419
- return error;
1420
-
1421
- DIFF_FROM_ITERATORS(
1422
- git_iterator_for_tree(&a, old_tree, &a_opts), 0,
1423
- git_iterator_for_workdir(&b, repo, index, old_tree, &b_opts), GIT_ITERATOR_DONT_AUTOEXPAND
1424
- );
1425
-
1426
- if (!error)
1427
- *out = diff;
1452
+ if ((error = diff_prepare_iterator_opts(&prefix, &a_opts, 0,
1453
+ &b_opts, GIT_ITERATOR_DONT_AUTOEXPAND, opts) < 0) ||
1454
+ (error = git_repository_index__weakptr(&index, repo)) < 0 ||
1455
+ (error = git_iterator_for_tree(&a, old_tree, &a_opts)) < 0 ||
1456
+ (error = git_iterator_for_workdir(&b, repo, index, old_tree, &b_opts)) < 0 ||
1457
+ (error = git_diff__from_iterators(&diff, repo, a, b, opts)) < 0)
1458
+ goto out;
1459
+
1460
+ *out = diff;
1461
+ diff = NULL;
1462
+ out:
1463
+ git_iterator_free(a);
1464
+ git_iterator_free(b);
1465
+ git_diff_free(diff);
1466
+ git__free(prefix);
1428
1467
 
1429
1468
  return error;
1430
1469
  }
@@ -1468,24 +1507,35 @@ int git_diff_index_to_index(
1468
1507
  git_index *new_index,
1469
1508
  const git_diff_options *opts)
1470
1509
  {
1471
- git_diff *diff;
1472
- int error = 0;
1510
+ git_iterator_options a_opts = GIT_ITERATOR_OPTIONS_INIT,
1511
+ b_opts = GIT_ITERATOR_OPTIONS_INIT;
1512
+ git_iterator *a = NULL, *b = NULL;
1513
+ git_diff *diff = NULL;
1514
+ char *prefix = NULL;
1515
+ int error;
1473
1516
 
1474
1517
  assert(out && old_index && new_index);
1475
1518
 
1476
1519
  *out = NULL;
1477
1520
 
1478
- DIFF_FROM_ITERATORS(
1479
- git_iterator_for_index(&a, repo, old_index, &a_opts), GIT_ITERATOR_DONT_IGNORE_CASE,
1480
- git_iterator_for_index(&b, repo, new_index, &b_opts), GIT_ITERATOR_DONT_IGNORE_CASE
1481
- );
1521
+ if ((error = diff_prepare_iterator_opts(&prefix, &a_opts, GIT_ITERATOR_DONT_IGNORE_CASE,
1522
+ &b_opts, GIT_ITERATOR_DONT_IGNORE_CASE, opts) < 0) ||
1523
+ (error = git_iterator_for_index(&a, repo, old_index, &a_opts)) < 0 ||
1524
+ (error = git_iterator_for_index(&b, repo, new_index, &b_opts)) < 0 ||
1525
+ (error = git_diff__from_iterators(&diff, repo, a, b, opts)) < 0)
1526
+ goto out;
1482
1527
 
1483
1528
  /* if index is in case-insensitive order, re-sort deltas to match */
1484
- if (!error && (old_index->ignore_case || new_index->ignore_case))
1529
+ if (old_index->ignore_case || new_index->ignore_case)
1485
1530
  git_diff__set_ignore_case(diff, true);
1486
1531
 
1487
- if (!error)
1488
- *out = diff;
1532
+ *out = diff;
1533
+ diff = NULL;
1534
+ out:
1535
+ git_iterator_free(a);
1536
+ git_iterator_free(b);
1537
+ git_diff_free(diff);
1538
+ git__free(prefix);
1489
1539
 
1490
1540
  return error;
1491
1541
  }