rugged 0.22.0b5 → 0.22.1b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -3
  3. data/ext/rugged/extconf.rb +21 -5
  4. data/ext/rugged/rugged.c +1 -0
  5. data/ext/rugged/rugged.h +8 -0
  6. data/ext/rugged/rugged_backend.c +34 -0
  7. data/ext/rugged/rugged_branch_collection.c +1 -0
  8. data/ext/rugged/rugged_remote.c +37 -86
  9. data/ext/rugged/rugged_remote_collection.c +2 -1
  10. data/ext/rugged/rugged_repo.c +149 -24
  11. data/ext/rugged/rugged_revwalk.c +1 -2
  12. data/ext/rugged/rugged_submodule.c +1 -1
  13. data/ext/rugged/rugged_tree.c +69 -5
  14. data/lib/rugged/version.rb +1 -1
  15. data/vendor/libgit2/CMakeLists.txt +2 -1
  16. data/vendor/libgit2/include/git2.h +0 -1
  17. data/vendor/libgit2/include/git2/checkout.h +8 -0
  18. data/vendor/libgit2/include/git2/merge.h +8 -0
  19. data/vendor/libgit2/include/git2/push.h +0 -110
  20. data/vendor/libgit2/include/git2/remote.h +30 -1
  21. data/vendor/libgit2/include/git2/revert.h +1 -1
  22. data/vendor/libgit2/include/git2/submodule.h +80 -1
  23. data/vendor/libgit2/include/git2/sys/index.h +2 -2
  24. data/vendor/libgit2/include/git2/{threads.h → sys/openssl.h} +10 -12
  25. data/vendor/libgit2/include/git2/sys/refs.h +11 -0
  26. data/vendor/libgit2/include/git2/tree.h +1 -1
  27. data/vendor/libgit2/include/git2/version.h +3 -3
  28. data/vendor/libgit2/src/attr_file.c +3 -1
  29. data/vendor/libgit2/src/buffer.c +2 -1
  30. data/vendor/libgit2/src/checkout.c +135 -39
  31. data/vendor/libgit2/src/checkout.h +7 -0
  32. data/vendor/libgit2/src/config_file.c +5 -7
  33. data/vendor/libgit2/src/crlf.c +2 -0
  34. data/vendor/libgit2/src/describe.c +6 -2
  35. data/vendor/libgit2/src/diff.c +1 -0
  36. data/vendor/libgit2/src/fileops.c +87 -19
  37. data/vendor/libgit2/src/fileops.h +18 -0
  38. data/vendor/libgit2/src/global.c +1 -1
  39. data/vendor/libgit2/src/ident.c +2 -0
  40. data/vendor/libgit2/src/index.c +4 -4
  41. data/vendor/libgit2/src/merge.c +3 -1
  42. data/vendor/libgit2/src/notes.c +1 -1
  43. data/vendor/libgit2/src/pack.c +1 -0
  44. data/vendor/libgit2/src/path.c +17 -12
  45. data/vendor/libgit2/src/path.h +17 -3
  46. data/vendor/libgit2/src/push.h +110 -0
  47. data/vendor/libgit2/src/rebase.c +4 -2
  48. data/vendor/libgit2/src/remote.c +237 -16
  49. data/vendor/libgit2/src/remote.h +2 -0
  50. data/vendor/libgit2/src/repository.c +7 -3
  51. data/vendor/libgit2/src/submodule.c +229 -18
  52. data/vendor/libgit2/src/transports/local.c +61 -2
  53. data/vendor/libgit2/src/transports/smart_protocol.c +5 -3
  54. data/vendor/libgit2/src/tree.c +2 -2
  55. data/vendor/libgit2/src/util.h +13 -2
  56. data/vendor/libgit2/src/win32/mingw-compat.h +2 -0
  57. data/vendor/libgit2/src/win32/path_w32.h +2 -0
  58. metadata +4 -4
  59. data/vendor/libgit2/cmake/Modules/FindLIBSSH2.cmake +0 -44
@@ -42,7 +42,7 @@ typedef struct git_index_reuc_entry {
42
42
  * @param index an existing index object
43
43
  * @return integer of count of current filename conflict entries
44
44
  */
45
- GIT_EXTERN(unsigned int) git_index_name_entrycount(git_index *index);
45
+ GIT_EXTERN(size_t) git_index_name_entrycount(git_index *index);
46
46
 
47
47
  /**
48
48
  * Get a filename conflict entry from the index.
@@ -90,7 +90,7 @@ GIT_EXTERN(void) git_index_name_clear(git_index *index);
90
90
  * @param index an existing index object
91
91
  * @return integer of count of current resolve undo entries
92
92
  */
93
- GIT_EXTERN(unsigned int) git_index_reuc_entrycount(git_index *index);
93
+ GIT_EXTERN(size_t) git_index_reuc_entrycount(git_index *index);
94
94
 
95
95
  /**
96
96
  * Finds the resolve undo entry that points to the given path in the Git
@@ -4,37 +4,35 @@
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
- #ifndef INCLUDE_git_threads_h__
8
- #define INCLUDE_git_threads_h__
7
+ #ifndef INCLUDE_git_openssl_h__
8
+ #define INCLUDE_git_openssl_h__
9
9
 
10
- #include "common.h"
10
+ #include "git2/common.h"
11
11
 
12
- /**
13
- * @file git2/threads.h
14
- * @brief Library level thread functions
15
- * @defgroup git_thread Threading functions
16
- * @ingroup Git
17
- * @{
18
- */
19
12
  GIT_BEGIN_DECL
20
13
 
21
14
  /**
22
15
  * Initialize the OpenSSL locks
23
16
  *
24
17
  * OpenSSL requires the application to determine how it performs
25
- * locking. This is a convenience function which libgit2 provides for
18
+ * locking.
19
+ *
20
+ * This is a last-resort convenience function which libgit2 provides for
26
21
  * allocating and initializing the locks as well as setting the
27
22
  * locking function to use the system's native locking functions.
28
23
  *
29
24
  * The locking function will be cleared and the memory will be freed
30
25
  * when you call git_threads_sutdown().
31
26
  *
27
+ * If your programming language has an OpenSSL package/bindings, it
28
+ * likely sets up locking. You should very strongly prefer that over
29
+ * this function.
30
+ *
32
31
  * @return 0 on success, -1 if there are errors or if libgit2 was not
33
32
  * built with OpenSSL and threading support.
34
33
  */
35
34
  GIT_EXTERN(int) git_openssl_set_locking(void);
36
35
 
37
- /** @} */
38
36
  GIT_END_DECL
39
37
  #endif
40
38
 
@@ -11,6 +11,15 @@
11
11
  #include "git2/types.h"
12
12
  #include "git2/oid.h"
13
13
 
14
+ /**
15
+ * @file git2/sys/refs.h
16
+ * @brief Low-level Git ref creation
17
+ * @defgroup git_backend Git custom backend APIs
18
+ * @ingroup Git
19
+ * @{
20
+ */
21
+ GIT_BEGIN_DECL
22
+
14
23
  /**
15
24
  * Create a new direct reference from an OID.
16
25
  *
@@ -35,4 +44,6 @@ GIT_EXTERN(git_reference *) git_reference__alloc_symbolic(
35
44
  const char *name,
36
45
  const char *target);
37
46
 
47
+ /** @} */
48
+ GIT_END_DECL
38
49
  #endif
@@ -251,7 +251,7 @@ GIT_EXTERN(int) git_tree_entry_to_object(
251
251
  * @param source Source tree to initialize the builder (optional)
252
252
  * @return 0 on success; error code otherwise
253
253
  */
254
- GIT_EXTERN(int) git_treebuilder_create(
254
+ GIT_EXTERN(int) git_treebuilder_new(
255
255
  git_treebuilder **out, git_repository *repo, const git_tree *source);
256
256
 
257
257
  /**
@@ -7,11 +7,11 @@
7
7
  #ifndef INCLUDE_git_version_h__
8
8
  #define INCLUDE_git_version_h__
9
9
 
10
- #define LIBGIT2_VERSION "0.21.0"
10
+ #define LIBGIT2_VERSION "0.22.0"
11
11
  #define LIBGIT2_VER_MAJOR 0
12
- #define LIBGIT2_VER_MINOR 21
12
+ #define LIBGIT2_VER_MINOR 22
13
13
  #define LIBGIT2_VER_REVISION 0
14
14
 
15
- #define LIBGIT2_SOVERSION 21
15
+ #define LIBGIT2_SOVERSION 22
16
16
 
17
17
  #endif
@@ -781,8 +781,10 @@ int git_attr_assignment__parse(
781
781
 
782
782
  error = git_vector_insert_sorted(
783
783
  assigns, massign, &merge_assignments);
784
- if (error < 0 && error != GIT_EEXISTS)
784
+ if (error < 0 && error != GIT_EEXISTS) {
785
+ git_attr_assignment__free(assign);
785
786
  return error;
787
+ }
786
788
  }
787
789
  }
788
790
  }
@@ -67,7 +67,8 @@ int git_buf_try_grow(
67
67
 
68
68
  if (!new_ptr) {
69
69
  if (mark_oom) {
70
- if (buf->ptr) git__free(buf->ptr);
70
+ if (buf->ptr && (buf->ptr != git_buf__initbuf))
71
+ git__free(buf->ptr);
71
72
  buf->ptr = git_buf__oom;
72
73
  }
73
74
  return -1;
@@ -67,6 +67,8 @@ typedef struct {
67
67
  bool reload_submodules;
68
68
  size_t total_steps;
69
69
  size_t completed_steps;
70
+ git_checkout_perfdata perfdata;
71
+ git_buf last_mkdir;
70
72
  } checkout_data;
71
73
 
72
74
  typedef struct {
@@ -1101,7 +1103,7 @@ static int checkout_conflicts_mark_directoryfile(
1101
1103
  goto done;
1102
1104
  }
1103
1105
 
1104
- prefixed = git_path_equal_or_prefixed(path, entry->path);
1106
+ prefixed = git_path_equal_or_prefixed(path, entry->path, NULL);
1105
1107
 
1106
1108
  if (prefixed == GIT_PATH_EQUAL)
1107
1109
  continue;
@@ -1289,50 +1291,140 @@ fail:
1289
1291
  return error;
1290
1292
  }
1291
1293
 
1294
+ static int checkout_mkdir(
1295
+ checkout_data *data,
1296
+ const char *path,
1297
+ const char *base,
1298
+ mode_t mode,
1299
+ unsigned int flags)
1300
+ {
1301
+ struct git_futils_mkdir_perfdata mkdir_perfdata = {0};
1302
+
1303
+ int error = git_futils_mkdir_withperf(
1304
+ path, base, mode, flags, &mkdir_perfdata);
1305
+
1306
+ data->perfdata.mkdir_calls += mkdir_perfdata.mkdir_calls;
1307
+ data->perfdata.stat_calls += mkdir_perfdata.stat_calls;
1308
+ data->perfdata.chmod_calls += mkdir_perfdata.chmod_calls;
1309
+
1310
+ return error;
1311
+ }
1312
+
1313
+ static bool should_remove_existing(checkout_data *data)
1314
+ {
1315
+ int ignorecase = 0;
1316
+
1317
+ git_repository__cvar(&ignorecase, data->repo, GIT_CVAR_IGNORECASE);
1318
+
1319
+ return (ignorecase &&
1320
+ (data->strategy & GIT_CHECKOUT_DONT_REMOVE_EXISTING) == 0);
1321
+ }
1322
+
1323
+ #define MKDIR_NORMAL \
1324
+ GIT_MKDIR_PATH | GIT_MKDIR_VERIFY_DIR
1325
+ #define MKDIR_REMOVE_EXISTING \
1326
+ MKDIR_NORMAL | GIT_MKDIR_REMOVE_FILES | GIT_MKDIR_REMOVE_SYMLINKS
1327
+
1328
+ static int mkpath2file(
1329
+ checkout_data *data, const char *path, unsigned int mode)
1330
+ {
1331
+ git_buf *mkdir_path = &data->tmp;
1332
+ struct stat st;
1333
+ bool remove_existing = should_remove_existing(data);
1334
+ int error;
1335
+
1336
+ if ((error = git_buf_sets(mkdir_path, path)) < 0)
1337
+ return error;
1338
+
1339
+ git_buf_rtruncate_at_char(mkdir_path, '/');
1340
+
1341
+ if (!data->last_mkdir.size ||
1342
+ data->last_mkdir.size != mkdir_path->size ||
1343
+ memcmp(mkdir_path->ptr, data->last_mkdir.ptr, mkdir_path->size) != 0) {
1344
+
1345
+ if ((error = checkout_mkdir(
1346
+ data, mkdir_path->ptr, data->opts.target_directory, mode,
1347
+ remove_existing ? MKDIR_REMOVE_EXISTING : MKDIR_NORMAL)) < 0)
1348
+ return error;
1349
+
1350
+ git_buf_swap(&data->last_mkdir, mkdir_path);
1351
+ }
1352
+
1353
+ if (remove_existing) {
1354
+ data->perfdata.stat_calls++;
1355
+
1356
+ if (p_lstat(path, &st) == 0) {
1357
+
1358
+ /* Some file, symlink or folder already exists at this name.
1359
+ * We would have removed it in remove_the_old unless we're on
1360
+ * a case inensitive filesystem (or the user has asked us not
1361
+ * to). Remove the similarly named file to write the new.
1362
+ */
1363
+ error = git_futils_rmdir_r(path, NULL, GIT_RMDIR_REMOVE_FILES);
1364
+ } else if (errno != ENOENT) {
1365
+ giterr_set(GITERR_OS, "Failed to stat file '%s'", path);
1366
+ return GIT_EEXISTS;
1367
+ } else {
1368
+ giterr_clear();
1369
+ }
1370
+ }
1371
+
1372
+ return error;
1373
+ }
1374
+
1292
1375
  static int buffer_to_file(
1376
+ checkout_data *data,
1293
1377
  struct stat *st,
1294
1378
  git_buf *buf,
1295
1379
  const char *path,
1296
- mode_t dir_mode,
1297
- int file_open_flags,
1298
1380
  mode_t file_mode)
1299
1381
  {
1300
1382
  int error;
1301
1383
 
1302
- if ((error = git_futils_mkpath2file(path, dir_mode)) < 0)
1384
+ if ((error = mkpath2file(data, path, data->opts.dir_mode)) < 0)
1303
1385
  return error;
1304
1386
 
1305
1387
  if ((error = git_futils_writebuffer(
1306
- buf, path, file_open_flags, file_mode)) < 0)
1388
+ buf, path, data->opts.file_open_flags, file_mode)) < 0)
1307
1389
  return error;
1308
1390
 
1309
- if (st != NULL && (error = p_stat(path, st)) < 0)
1310
- giterr_set(GITERR_OS, "Error statting '%s'", path);
1391
+ if (st) {
1392
+ data->perfdata.stat_calls++;
1311
1393
 
1312
- else if (GIT_PERMS_IS_EXEC(file_mode) &&
1313
- (error = p_chmod(path, file_mode)) < 0)
1314
- giterr_set(GITERR_OS, "Failed to set permissions on '%s'", path);
1394
+ if ((error = p_stat(path, st)) < 0) {
1395
+ giterr_set(GITERR_OS, "Error statting '%s'", path);
1396
+ return error;
1397
+ }
1398
+ }
1399
+
1400
+ if (GIT_PERMS_IS_EXEC(file_mode)) {
1401
+ data->perfdata.chmod_calls++;
1402
+
1403
+ if ((error = p_chmod(path, file_mode)) < 0)
1404
+ giterr_set(GITERR_OS, "Failed to set permissions on '%s'", path);
1405
+ }
1315
1406
 
1316
1407
  return error;
1317
1408
  }
1318
1409
 
1319
1410
  static int blob_content_to_file(
1411
+ checkout_data *data,
1320
1412
  struct stat *st,
1321
1413
  git_blob *blob,
1322
1414
  const char *path,
1323
1415
  const char * hint_path,
1324
- mode_t entry_filemode,
1325
- git_checkout_options *opts)
1416
+ mode_t entry_filemode)
1326
1417
  {
1327
- int error = 0;
1328
- mode_t file_mode = opts->file_mode ? opts->file_mode : entry_filemode;
1418
+ mode_t file_mode = data->opts.file_mode ?
1419
+ data->opts.file_mode : entry_filemode;
1329
1420
  git_buf out = GIT_BUF_INIT;
1330
1421
  git_filter_list *fl = NULL;
1422
+ int error = 0;
1331
1423
 
1332
1424
  if (hint_path == NULL)
1333
1425
  hint_path = path;
1334
1426
 
1335
- if (!opts->disable_filters)
1427
+ if (!data->opts.disable_filters)
1336
1428
  error = git_filter_list_load(
1337
1429
  &fl, git_blob_owner(blob), blob, hint_path,
1338
1430
  GIT_FILTER_TO_WORKTREE, GIT_FILTER_OPT_DEFAULT);
@@ -1343,9 +1435,7 @@ static int blob_content_to_file(
1343
1435
  git_filter_list_free(fl);
1344
1436
 
1345
1437
  if (!error) {
1346
- error = buffer_to_file(
1347
- st, &out, path, opts->dir_mode, opts->file_open_flags, file_mode);
1348
-
1438
+ error = buffer_to_file(data, st, &out, path, file_mode);
1349
1439
  st->st_mode = entry_filemode;
1350
1440
 
1351
1441
  git_buf_free(&out);
@@ -1355,29 +1445,30 @@ static int blob_content_to_file(
1355
1445
  }
1356
1446
 
1357
1447
  static int blob_content_to_link(
1448
+ checkout_data *data,
1358
1449
  struct stat *st,
1359
1450
  git_blob *blob,
1360
- const char *path,
1361
- mode_t dir_mode,
1362
- int can_symlink)
1451
+ const char *path)
1363
1452
  {
1364
1453
  git_buf linktarget = GIT_BUF_INIT;
1365
1454
  int error;
1366
1455
 
1367
- if ((error = git_futils_mkpath2file(path, dir_mode)) < 0)
1456
+ if ((error = mkpath2file(data, path, data->opts.dir_mode)) < 0)
1368
1457
  return error;
1369
1458
 
1370
1459
  if ((error = git_blob__getbuf(&linktarget, blob)) < 0)
1371
1460
  return error;
1372
1461
 
1373
- if (can_symlink) {
1462
+ if (data->can_symlink) {
1374
1463
  if ((error = p_symlink(git_buf_cstr(&linktarget), path)) < 0)
1375
- giterr_set(GITERR_OS, "Could not create symlink %s\n", path);
1464
+ giterr_set(GITERR_OS, "Could not create symlink %s", path);
1376
1465
  } else {
1377
1466
  error = git_futils_fake_symlink(git_buf_cstr(&linktarget), path);
1378
1467
  }
1379
1468
 
1380
1469
  if (!error) {
1470
+ data->perfdata.stat_calls++;
1471
+
1381
1472
  if ((error = p_lstat(path, st)) < 0)
1382
1473
  giterr_set(GITERR_CHECKOUT, "Could not stat symlink %s", path);
1383
1474
 
@@ -1421,6 +1512,7 @@ static int checkout_submodule_update_index(
1421
1512
  if (git_buf_puts(&data->path, file->path) < 0)
1422
1513
  return -1;
1423
1514
 
1515
+ data->perfdata.stat_calls++;
1424
1516
  if (p_stat(git_buf_cstr(&data->path), &st) < 0) {
1425
1517
  giterr_set(
1426
1518
  GITERR_CHECKOUT, "Could not stat submodule %s\n", file->path);
@@ -1436,15 +1528,17 @@ static int checkout_submodule(
1436
1528
  checkout_data *data,
1437
1529
  const git_diff_file *file)
1438
1530
  {
1531
+ bool remove_existing = should_remove_existing(data);
1439
1532
  int error = 0;
1440
1533
 
1441
1534
  /* Until submodules are supported, UPDATE_ONLY means do nothing here */
1442
1535
  if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0)
1443
1536
  return 0;
1444
1537
 
1445
- if ((error = git_futils_mkdir(
1446
- file->path, data->opts.target_directory,
1447
- data->opts.dir_mode, GIT_MKDIR_PATH)) < 0)
1538
+ if ((error = checkout_mkdir(
1539
+ data,
1540
+ file->path, data->opts.target_directory, data->opts.dir_mode,
1541
+ remove_existing ? MKDIR_REMOVE_EXISTING : MKDIR_NORMAL)) < 0)
1448
1542
  return error;
1449
1543
 
1450
1544
  if ((error = git_submodule_lookup(NULL, data->repo, file->path)) < 0) {
@@ -1481,10 +1575,13 @@ static void report_progress(
1481
1575
  data->opts.progress_payload);
1482
1576
  }
1483
1577
 
1484
- static int checkout_safe_for_update_only(const char *path, mode_t expected_mode)
1578
+ static int checkout_safe_for_update_only(
1579
+ checkout_data *data, const char *path, mode_t expected_mode)
1485
1580
  {
1486
1581
  struct stat st;
1487
1582
 
1583
+ data->perfdata.stat_calls++;
1584
+
1488
1585
  if (p_lstat(path, &st) < 0) {
1489
1586
  /* if doesn't exist, then no error and no update */
1490
1587
  if (errno == ENOENT || errno == ENOTDIR)
@@ -1517,11 +1614,9 @@ static int checkout_write_content(
1517
1614
  return error;
1518
1615
 
1519
1616
  if (S_ISLNK(mode))
1520
- error = blob_content_to_link(
1521
- st, blob, full_path, data->opts.dir_mode, data->can_symlink);
1617
+ error = blob_content_to_link(data, st, blob, full_path);
1522
1618
  else
1523
- error = blob_content_to_file(
1524
- st, blob, full_path, hint_path, mode, &data->opts);
1619
+ error = blob_content_to_file(data, st, blob, full_path, hint_path, mode);
1525
1620
 
1526
1621
  git_blob_free(blob);
1527
1622
 
@@ -1552,7 +1647,7 @@ static int checkout_blob(
1552
1647
 
1553
1648
  if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0) {
1554
1649
  int rval = checkout_safe_for_update_only(
1555
- git_buf_cstr(&data->path), file->mode);
1650
+ data, git_buf_cstr(&data->path), file->mode);
1556
1651
  if (rval <= 0)
1557
1652
  return rval;
1558
1653
  }
@@ -1807,7 +1902,7 @@ static int checkout_write_entry(
1807
1902
  }
1808
1903
 
1809
1904
  if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0 &&
1810
- (error = checkout_safe_for_update_only(git_buf_cstr(&data->path), side->mode)) <= 0)
1905
+ (error = checkout_safe_for_update_only(data, git_buf_cstr(&data->path), side->mode)) <= 0)
1811
1906
  return error;
1812
1907
 
1813
1908
  return checkout_write_content(data,
@@ -1906,7 +2001,7 @@ static int checkout_write_merge(
1906
2001
  goto done;
1907
2002
 
1908
2003
  if ((data->strategy & GIT_CHECKOUT_UPDATE_ONLY) != 0 &&
1909
- (error = checkout_safe_for_update_only(git_buf_cstr(&path_workdir), result.mode)) <= 0)
2004
+ (error = checkout_safe_for_update_only(data, git_buf_cstr(&path_workdir), result.mode)) <= 0)
1910
2005
  goto done;
1911
2006
 
1912
2007
  if (!data->opts.disable_filters) {
@@ -1922,7 +2017,7 @@ static int checkout_write_merge(
1922
2017
  out_data.size = result.len;
1923
2018
  }
1924
2019
 
1925
- if ((error = git_futils_mkpath2file(path_workdir.ptr, 0755)) < 0 ||
2020
+ if ((error = mkpath2file(data, path_workdir.ptr, data->opts.dir_mode)) < 0 ||
1926
2021
  (error = git_filebuf_open(&output, git_buf_cstr(&path_workdir), GIT_FILEBUF_DO_NOT_BUFFER, result.mode)) < 0 ||
1927
2022
  (error = git_filebuf_write(&output, out_data.ptr, out_data.size)) < 0 ||
1928
2023
  (error = git_filebuf_commit(&output)) < 0)
@@ -2157,8 +2252,9 @@ static int checkout_data_init(
2157
2252
  if (!data->opts.target_directory)
2158
2253
  data->opts.target_directory = git_repository_workdir(repo);
2159
2254
  else if (!git_path_isdir(data->opts.target_directory) &&
2160
- (error = git_futils_mkdir(data->opts.target_directory, NULL,
2161
- GIT_DIR_MODE, GIT_MKDIR_VERIFY_DIR)) < 0)
2255
+ (error = checkout_mkdir(data,
2256
+ data->opts.target_directory, NULL,
2257
+ GIT_DIR_MODE, GIT_MKDIR_VERIFY_DIR)) < 0)
2162
2258
  goto cleanup;
2163
2259
 
2164
2260
  /* refresh config and index content unless NO_REFRESH is given */
@@ -2474,7 +2570,7 @@ int git_checkout_tree(
2474
2570
  if ((error = git_repository_index(&index, repo)) < 0)
2475
2571
  return error;
2476
2572
 
2477
- if (!(error = git_iterator_for_tree(&tree_i, tree, 0, NULL, NULL)))
2573
+ if (!(error = git_iterator_for_tree(&tree_i, tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)))
2478
2574
  error = git_checkout_iterator(tree_i, index, opts);
2479
2575
 
2480
2576
  git_iterator_free(tree_i);