rugged 0.28.4.1 → 0.28.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  }