rugged 1.5.1 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +2 -2
  3. data/ext/rugged/rugged_blame.c +2 -0
  4. data/ext/rugged/rugged_blob.c +3 -0
  5. data/ext/rugged/rugged_commit.c +1 -0
  6. data/ext/rugged/rugged_config.c +2 -0
  7. data/ext/rugged/rugged_diff.c +1 -0
  8. data/ext/rugged/rugged_index.c +2 -0
  9. data/ext/rugged/rugged_patch.c +1 -0
  10. data/ext/rugged/rugged_rebase.c +1 -0
  11. data/ext/rugged/rugged_reference.c +1 -0
  12. data/ext/rugged/rugged_remote.c +1 -0
  13. data/ext/rugged/rugged_repo.c +5 -2
  14. data/ext/rugged/rugged_revwalk.c +5 -1
  15. data/ext/rugged/rugged_submodule.c +1 -0
  16. data/ext/rugged/rugged_tag.c +1 -0
  17. data/ext/rugged/rugged_tree.c +4 -0
  18. data/lib/rugged/index.rb +1 -1
  19. data/lib/rugged/tree.rb +1 -1
  20. data/lib/rugged/version.rb +1 -1
  21. data/vendor/libgit2/CMakeLists.txt +5 -1
  22. data/vendor/libgit2/COPYING +30 -0
  23. data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
  24. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +2 -0
  25. data/vendor/libgit2/include/git2/common.h +13 -6
  26. data/vendor/libgit2/include/git2/deprecated.h +6 -0
  27. data/vendor/libgit2/include/git2/diff.h +1 -1
  28. data/vendor/libgit2/include/git2/experimental.h +20 -0
  29. data/vendor/libgit2/include/git2/indexer.h +29 -0
  30. data/vendor/libgit2/include/git2/object.h +28 -2
  31. data/vendor/libgit2/include/git2/odb.h +58 -7
  32. data/vendor/libgit2/include/git2/odb_backend.h +106 -18
  33. data/vendor/libgit2/include/git2/oid.h +115 -15
  34. data/vendor/libgit2/include/git2/repository.h +20 -1
  35. data/vendor/libgit2/include/git2/stash.h +60 -6
  36. data/vendor/libgit2/include/git2/strarray.h +0 -13
  37. data/vendor/libgit2/include/git2/sys/odb_backend.h +1 -1
  38. data/vendor/libgit2/include/git2/sys/transport.h +12 -0
  39. data/vendor/libgit2/include/git2/version.h +4 -4
  40. data/vendor/libgit2/include/git2.h +1 -0
  41. data/vendor/libgit2/src/CMakeLists.txt +0 -6
  42. data/vendor/libgit2/src/cli/CMakeLists.txt +6 -2
  43. data/vendor/libgit2/src/cli/cmd_hash_object.c +27 -8
  44. data/vendor/libgit2/src/cli/opt.c +1 -1
  45. data/vendor/libgit2/src/libgit2/CMakeLists.txt +25 -15
  46. data/vendor/libgit2/src/libgit2/annotated_commit.c +1 -1
  47. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  48. data/vendor/libgit2/src/libgit2/attr_file.c +1 -1
  49. data/vendor/libgit2/src/libgit2/attrcache.c +1 -1
  50. data/vendor/libgit2/src/libgit2/blame.c +2 -0
  51. data/vendor/libgit2/src/libgit2/blob.c +4 -2
  52. data/vendor/libgit2/src/libgit2/blob.h +2 -2
  53. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  54. data/vendor/libgit2/src/libgit2/cherrypick.c +3 -3
  55. data/vendor/libgit2/src/libgit2/clone.c +31 -2
  56. data/vendor/libgit2/src/libgit2/commit.c +52 -17
  57. data/vendor/libgit2/src/libgit2/commit.h +25 -7
  58. data/vendor/libgit2/src/libgit2/commit_graph.c +47 -32
  59. data/vendor/libgit2/src/libgit2/commit_graph.h +3 -0
  60. data/vendor/libgit2/src/libgit2/commit_list.c +6 -2
  61. data/vendor/libgit2/src/libgit2/config.c +1 -1
  62. data/vendor/libgit2/src/libgit2/config_file.c +2 -2
  63. data/vendor/libgit2/src/libgit2/describe.c +8 -8
  64. data/vendor/libgit2/src/libgit2/diff.c +5 -1
  65. data/vendor/libgit2/src/libgit2/diff_file.c +15 -6
  66. data/vendor/libgit2/src/libgit2/diff_generate.c +17 -12
  67. data/vendor/libgit2/src/libgit2/diff_print.c +5 -5
  68. data/vendor/libgit2/src/libgit2/diff_tform.c +4 -0
  69. data/vendor/libgit2/src/libgit2/email.c +2 -2
  70. data/vendor/libgit2/src/libgit2/experimental.h.in +13 -0
  71. data/vendor/libgit2/src/libgit2/fetch.c +3 -6
  72. data/vendor/libgit2/src/libgit2/fetchhead.c +4 -4
  73. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  74. data/vendor/libgit2/src/libgit2/index.c +11 -9
  75. data/vendor/libgit2/src/libgit2/indexer.c +107 -44
  76. data/vendor/libgit2/src/libgit2/iterator.c +4 -2
  77. data/vendor/libgit2/src/libgit2/libgit2.c +19 -0
  78. data/vendor/libgit2/src/libgit2/merge.c +3 -3
  79. data/vendor/libgit2/src/libgit2/midx.c +16 -15
  80. data/vendor/libgit2/src/libgit2/mwindow.c +5 -2
  81. data/vendor/libgit2/src/libgit2/mwindow.h +4 -1
  82. data/vendor/libgit2/src/libgit2/notes.c +5 -5
  83. data/vendor/libgit2/src/libgit2/object.c +89 -25
  84. data/vendor/libgit2/src/libgit2/object.h +12 -3
  85. data/vendor/libgit2/src/libgit2/odb.c +194 -50
  86. data/vendor/libgit2/src/libgit2/odb.h +43 -4
  87. data/vendor/libgit2/src/libgit2/odb_loose.c +128 -70
  88. data/vendor/libgit2/src/libgit2/odb_pack.c +96 -44
  89. data/vendor/libgit2/src/libgit2/oid.c +134 -76
  90. data/vendor/libgit2/src/libgit2/oid.h +183 -9
  91. data/vendor/libgit2/src/libgit2/pack-objects.c +15 -4
  92. data/vendor/libgit2/src/libgit2/pack.c +90 -66
  93. data/vendor/libgit2/src/libgit2/pack.h +29 -15
  94. data/vendor/libgit2/src/libgit2/parse.c +4 -3
  95. data/vendor/libgit2/src/libgit2/patch_parse.c +5 -5
  96. data/vendor/libgit2/src/libgit2/push.c +13 -3
  97. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  98. data/vendor/libgit2/src/libgit2/rebase.c +19 -18
  99. data/vendor/libgit2/src/libgit2/refdb_fs.c +70 -39
  100. data/vendor/libgit2/src/libgit2/reflog.c +7 -5
  101. data/vendor/libgit2/src/libgit2/reflog.h +1 -2
  102. data/vendor/libgit2/src/libgit2/refs.c +2 -0
  103. data/vendor/libgit2/src/libgit2/remote.c +38 -37
  104. data/vendor/libgit2/src/libgit2/remote.h +40 -0
  105. data/vendor/libgit2/src/libgit2/repository.c +212 -36
  106. data/vendor/libgit2/src/libgit2/repository.h +9 -0
  107. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  108. data/vendor/libgit2/src/libgit2/revert.c +4 -4
  109. data/vendor/libgit2/src/libgit2/revparse.c +23 -7
  110. data/vendor/libgit2/src/libgit2/revwalk.c +5 -1
  111. data/vendor/libgit2/src/libgit2/stash.c +201 -26
  112. data/vendor/libgit2/src/libgit2/strarray.c +1 -0
  113. data/vendor/libgit2/src/libgit2/strarray.h +25 -0
  114. data/vendor/libgit2/src/libgit2/streams/openssl.c +1 -1
  115. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +7 -3
  116. data/vendor/libgit2/src/libgit2/streams/socket.c +4 -1
  117. data/vendor/libgit2/src/libgit2/submodule.c +6 -2
  118. data/vendor/libgit2/src/libgit2/sysdir.c +294 -7
  119. data/vendor/libgit2/src/libgit2/sysdir.h +39 -9
  120. data/vendor/libgit2/src/libgit2/tag.c +29 -10
  121. data/vendor/libgit2/src/libgit2/tag.h +2 -2
  122. data/vendor/libgit2/src/libgit2/threadstate.h +1 -1
  123. data/vendor/libgit2/src/libgit2/transports/http.c +8 -7
  124. data/vendor/libgit2/src/libgit2/transports/httpclient.c +9 -0
  125. data/vendor/libgit2/src/libgit2/transports/httpclient.h +10 -0
  126. data/vendor/libgit2/src/libgit2/transports/local.c +14 -0
  127. data/vendor/libgit2/src/libgit2/transports/smart.c +35 -0
  128. data/vendor/libgit2/src/libgit2/transports/smart.h +10 -1
  129. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +153 -41
  130. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +42 -12
  131. data/vendor/libgit2/src/libgit2/transports/ssh.c +62 -65
  132. data/vendor/libgit2/src/libgit2/transports/winhttp.c +9 -4
  133. data/vendor/libgit2/src/libgit2/tree-cache.c +4 -4
  134. data/vendor/libgit2/src/libgit2/tree.c +22 -16
  135. data/vendor/libgit2/src/libgit2/tree.h +2 -2
  136. data/vendor/libgit2/src/libgit2/worktree.c +5 -0
  137. data/vendor/libgit2/src/util/CMakeLists.txt +7 -1
  138. data/vendor/libgit2/src/util/fs_path.c +1 -1
  139. data/vendor/libgit2/src/util/futils.c +0 -3
  140. data/vendor/libgit2/src/util/git2_util.h +2 -2
  141. data/vendor/libgit2/src/util/hash/openssl.c +4 -3
  142. data/vendor/libgit2/src/util/hash/rfc6234/sha.h +0 -112
  143. data/vendor/libgit2/src/util/hash.h +13 -0
  144. data/vendor/libgit2/src/util/net.c +338 -84
  145. data/vendor/libgit2/src/util/net.h +7 -0
  146. data/vendor/libgit2/src/util/posix.h +2 -0
  147. data/vendor/libgit2/src/util/rand.c +4 -0
  148. data/vendor/libgit2/src/util/regexp.c +3 -3
  149. data/vendor/libgit2/src/util/thread.h +20 -19
  150. data/vendor/libgit2/src/util/util.h +1 -0
  151. metadata +7 -5
  152. data/vendor/libgit2/src/util/win32/findfile.c +0 -286
  153. data/vendor/libgit2/src/util/win32/findfile.h +0 -22
  154. /data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +0 -0
@@ -25,6 +25,7 @@
25
25
  #include "merge.h"
26
26
  #include "diff.h"
27
27
  #include "diff_generate.h"
28
+ #include "strarray.h"
28
29
 
29
30
  static int create_error(int error, const char *msg)
30
31
  {
@@ -193,6 +194,30 @@ static int stash_to_index(
193
194
  return git_index_add(index, &entry);
194
195
  }
195
196
 
197
+ static int stash_update_index_from_paths(
198
+ git_repository *repo,
199
+ git_index *index,
200
+ const git_strarray *paths)
201
+ {
202
+ unsigned int status_flags;
203
+ size_t i;
204
+ int error = 0;
205
+
206
+ for (i = 0; i < paths->count; i++) {
207
+ git_status_file(&status_flags, repo, paths->strings[i]);
208
+
209
+ if (status_flags & (GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_DELETED)) {
210
+ if ((error = git_index_remove(index, paths->strings[i], 0)) < 0)
211
+ return error;
212
+ } else {
213
+ if ((error = stash_to_index(repo, index, paths->strings[i])) < 0)
214
+ return error;
215
+ }
216
+ }
217
+
218
+ return error;
219
+ }
220
+
196
221
  static int stash_update_index_from_diff(
197
222
  git_repository *repo,
198
223
  git_index *index,
@@ -388,24 +413,79 @@ cleanup:
388
413
  return error;
389
414
  }
390
415
 
391
- static int commit_worktree(
416
+ static int build_stash_commit_from_tree(
392
417
  git_oid *w_commit_oid,
393
418
  git_repository *repo,
394
419
  const git_signature *stasher,
395
420
  const char *message,
396
421
  git_commit *i_commit,
397
422
  git_commit *b_commit,
398
- git_commit *u_commit)
423
+ git_commit *u_commit,
424
+ const git_tree *tree)
399
425
  {
400
426
  const git_commit *parents[] = { NULL, NULL, NULL };
401
- git_index *i_index = NULL, *r_index = NULL;
402
- git_tree *w_tree = NULL;
403
- int error = 0, ignorecase;
404
427
 
405
428
  parents[0] = b_commit;
406
429
  parents[1] = i_commit;
407
430
  parents[2] = u_commit;
408
431
 
432
+ return git_commit_create(
433
+ w_commit_oid,
434
+ repo,
435
+ NULL,
436
+ stasher,
437
+ stasher,
438
+ NULL,
439
+ message,
440
+ tree,
441
+ u_commit ? 3 : 2,
442
+ parents);
443
+ }
444
+
445
+ static int build_stash_commit_from_index(
446
+ git_oid *w_commit_oid,
447
+ git_repository *repo,
448
+ const git_signature *stasher,
449
+ const char *message,
450
+ git_commit *i_commit,
451
+ git_commit *b_commit,
452
+ git_commit *u_commit,
453
+ git_index *index)
454
+ {
455
+ git_tree *tree;
456
+ int error;
457
+
458
+ if ((error = build_tree_from_index(&tree, repo, index)) < 0)
459
+ goto cleanup;
460
+
461
+ error = build_stash_commit_from_tree(
462
+ w_commit_oid,
463
+ repo,
464
+ stasher,
465
+ message,
466
+ i_commit,
467
+ b_commit,
468
+ u_commit,
469
+ tree);
470
+
471
+ cleanup:
472
+ git_tree_free(tree);
473
+ return error;
474
+ }
475
+
476
+ static int commit_worktree(
477
+ git_oid *w_commit_oid,
478
+ git_repository *repo,
479
+ const git_signature *stasher,
480
+ const char *message,
481
+ git_commit *i_commit,
482
+ git_commit *b_commit,
483
+ git_commit *u_commit)
484
+ {
485
+ git_index *i_index = NULL, *r_index = NULL;
486
+ git_tree *w_tree = NULL;
487
+ int error = 0, ignorecase;
488
+
409
489
  if ((error = git_repository_index(&r_index, repo) < 0) ||
410
490
  (error = git_index_new(&i_index)) < 0 ||
411
491
  (error = git_index__fill(i_index, &r_index->entries) < 0) ||
@@ -417,17 +497,16 @@ static int commit_worktree(
417
497
  if ((error = build_workdir_tree(&w_tree, repo, i_index, b_commit)) < 0)
418
498
  goto cleanup;
419
499
 
420
- error = git_commit_create(
500
+ error = build_stash_commit_from_tree(
421
501
  w_commit_oid,
422
502
  repo,
423
- NULL,
424
503
  stasher,
425
- stasher,
426
- NULL,
427
504
  message,
428
- w_tree,
429
- u_commit ? 3 : 2,
430
- parents);
505
+ i_commit,
506
+ b_commit,
507
+ u_commit,
508
+ w_tree
509
+ );
431
510
 
432
511
  cleanup:
433
512
  git_tree_free(w_tree);
@@ -520,6 +599,54 @@ static int ensure_there_are_changes_to_stash(git_repository *repo, uint32_t flag
520
599
  return error;
521
600
  }
522
601
 
602
+ static int has_changes_cb(
603
+ const char *path,
604
+ unsigned int status,
605
+ void *payload)
606
+ {
607
+ GIT_UNUSED(path);
608
+ GIT_UNUSED(status);
609
+ GIT_UNUSED(payload);
610
+
611
+ if (status == GIT_STATUS_CURRENT)
612
+ return GIT_ENOTFOUND;
613
+
614
+ return 0;
615
+ }
616
+
617
+ static int ensure_there_are_changes_to_stash_paths(
618
+ git_repository *repo,
619
+ uint32_t flags,
620
+ const git_strarray *paths)
621
+ {
622
+ int error;
623
+ git_status_options opts = GIT_STATUS_OPTIONS_INIT;
624
+
625
+ opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
626
+ opts.flags = GIT_STATUS_OPT_EXCLUDE_SUBMODULES |
627
+ GIT_STATUS_OPT_INCLUDE_UNMODIFIED |
628
+ GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH;
629
+
630
+ if (flags & GIT_STASH_INCLUDE_UNTRACKED)
631
+ opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED |
632
+ GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
633
+
634
+ if (flags & GIT_STASH_INCLUDE_IGNORED)
635
+ opts.flags |= GIT_STATUS_OPT_INCLUDE_IGNORED |
636
+ GIT_STATUS_OPT_RECURSE_IGNORED_DIRS;
637
+
638
+ git_strarray_copy(&opts.pathspec, paths);
639
+
640
+ error = git_status_foreach_ext(repo, &opts, has_changes_cb, NULL);
641
+
642
+ git_strarray_dispose(&opts.pathspec);
643
+
644
+ if (error == GIT_ENOTFOUND)
645
+ return create_error(GIT_ENOTFOUND, "one of the files does not have any changes to stash.");
646
+
647
+ return error;
648
+ }
649
+
523
650
  static int reset_index_and_workdir(git_repository *repo, git_commit *commit, uint32_t flags)
524
651
  {
525
652
  git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
@@ -540,14 +667,36 @@ int git_stash_save(
540
667
  const char *message,
541
668
  uint32_t flags)
542
669
  {
543
- git_index *index = NULL;
670
+ git_stash_save_options opts = GIT_STASH_SAVE_OPTIONS_INIT;
671
+
672
+ GIT_ASSERT_ARG(stasher);
673
+
674
+ opts.stasher = stasher;
675
+ opts.message = message;
676
+ opts.flags = flags;
677
+
678
+ return git_stash_save_with_opts(out, repo, &opts);
679
+ }
680
+
681
+ int git_stash_save_with_opts(
682
+ git_oid *out,
683
+ git_repository *repo,
684
+ const git_stash_save_options *opts)
685
+ {
686
+ git_index *index = NULL, *paths_index = NULL;
544
687
  git_commit *b_commit = NULL, *i_commit = NULL, *u_commit = NULL;
545
688
  git_str msg = GIT_STR_INIT;
689
+ git_tree *tree = NULL;
690
+ git_reference *head = NULL;
691
+ bool has_paths = false;
692
+
546
693
  int error;
547
694
 
548
695
  GIT_ASSERT_ARG(out);
549
696
  GIT_ASSERT_ARG(repo);
550
- GIT_ASSERT_ARG(stasher);
697
+ GIT_ASSERT_ARG(opts && opts->stasher);
698
+
699
+ has_paths = opts->paths.count > 0;
551
700
 
552
701
  if ((error = git_repository__ensure_not_bare(repo, "stash save")) < 0)
553
702
  return error;
@@ -555,44 +704,63 @@ int git_stash_save(
555
704
  if ((error = retrieve_base_commit_and_message(&b_commit, &msg, repo)) < 0)
556
705
  goto cleanup;
557
706
 
558
- if ((error = ensure_there_are_changes_to_stash(repo, flags)) < 0)
707
+ if (!has_paths &&
708
+ (error = ensure_there_are_changes_to_stash(repo, opts->flags)) < 0)
709
+ goto cleanup;
710
+ else if (has_paths &&
711
+ (error = ensure_there_are_changes_to_stash_paths(
712
+ repo, opts->flags, &opts->paths)) < 0)
559
713
  goto cleanup;
560
714
 
561
715
  if ((error = git_repository_index(&index, repo)) < 0)
562
716
  goto cleanup;
563
717
 
564
- if ((error = commit_index(&i_commit, repo, index, stasher,
718
+ if ((error = commit_index(&i_commit, repo, index, opts->stasher,
565
719
  git_str_cstr(&msg), b_commit)) < 0)
566
720
  goto cleanup;
567
721
 
568
- if ((flags & (GIT_STASH_INCLUDE_UNTRACKED | GIT_STASH_INCLUDE_IGNORED)) &&
569
- (error = commit_untracked(&u_commit, repo, stasher,
570
- git_str_cstr(&msg), i_commit, flags)) < 0)
722
+ if ((opts->flags & (GIT_STASH_INCLUDE_UNTRACKED | GIT_STASH_INCLUDE_IGNORED)) &&
723
+ (error = commit_untracked(&u_commit, repo, opts->stasher,
724
+ git_str_cstr(&msg), i_commit, opts->flags)) < 0)
571
725
  goto cleanup;
572
726
 
573
- if ((error = prepare_worktree_commit_message(&msg, message)) < 0)
727
+ if ((error = prepare_worktree_commit_message(&msg, opts->message)) < 0)
574
728
  goto cleanup;
575
729
 
576
- if ((error = commit_worktree(out, repo, stasher, git_str_cstr(&msg),
577
- i_commit, b_commit, u_commit)) < 0)
578
- goto cleanup;
730
+ if (!has_paths) {
731
+ if ((error = commit_worktree(out, repo, opts->stasher, git_str_cstr(&msg),
732
+ i_commit, b_commit, u_commit)) < 0)
733
+ goto cleanup;
734
+ } else {
735
+ if ((error = git_index_new(&paths_index)) < 0 ||
736
+ (error = retrieve_head(&head, repo)) < 0 ||
737
+ (error = git_reference_peel((git_object**)&tree, head, GIT_OBJECT_TREE)) < 0 ||
738
+ (error = git_index_read_tree(paths_index, tree)) < 0 ||
739
+ (error = stash_update_index_from_paths(repo, paths_index, &opts->paths)) < 0 ||
740
+ (error = build_stash_commit_from_index(out, repo, opts->stasher, git_str_cstr(&msg),
741
+ i_commit, b_commit, u_commit, paths_index)) < 0)
742
+ goto cleanup;
743
+ }
579
744
 
580
745
  git_str_rtrim(&msg);
581
746
 
582
747
  if ((error = update_reflog(out, repo, git_str_cstr(&msg))) < 0)
583
748
  goto cleanup;
584
749
 
585
- if ((error = reset_index_and_workdir(repo, (flags & GIT_STASH_KEEP_INDEX) ? i_commit : b_commit,
586
- flags)) < 0)
750
+ if (!(opts->flags & GIT_STASH_KEEP_ALL) &&
751
+ (error = reset_index_and_workdir(repo,
752
+ (opts->flags & GIT_STASH_KEEP_INDEX) ? i_commit : b_commit,opts->flags)) < 0)
587
753
  goto cleanup;
588
754
 
589
755
  cleanup:
590
-
591
756
  git_str_dispose(&msg);
592
757
  git_commit_free(i_commit);
593
758
  git_commit_free(b_commit);
594
759
  git_commit_free(u_commit);
760
+ git_tree_free(tree);
761
+ git_reference_free(head);
595
762
  git_index_free(index);
763
+ git_index_free(paths_index);
596
764
 
597
765
  return error;
598
766
  }
@@ -777,6 +945,13 @@ int git_stash_apply_options_init(git_stash_apply_options *opts, unsigned int ver
777
945
  return 0;
778
946
  }
779
947
 
948
+ int git_stash_save_options_init(git_stash_save_options *opts, unsigned int version)
949
+ {
950
+ GIT_INIT_STRUCTURE_FROM_TEMPLATE(
951
+ opts, version, git_stash_save_options, GIT_STASH_SAVE_OPTIONS_INIT);
952
+ return 0;
953
+ }
954
+
780
955
  #ifndef GIT_DEPRECATE_HARD
781
956
  int git_stash_apply_init_options(git_stash_apply_options *opts, unsigned int version)
782
957
  {
@@ -8,6 +8,7 @@
8
8
  #include "util.h"
9
9
 
10
10
  #include "common.h"
11
+ #include "strarray.h"
11
12
 
12
13
  int git_strarray_copy(git_strarray *tgt, const git_strarray *src)
13
14
  {
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+ #ifndef INCLUDE_strarray_h__
8
+ #define INCLUDE_strarray_h__
9
+
10
+ #include "common.h"
11
+ #include "git2/strarray.h"
12
+
13
+ /**
14
+ * Copy a string array object from source to target.
15
+ *
16
+ * Note: target is overwritten and hence should be empty, otherwise its
17
+ * contents are leaked. Call git_strarray_free() if necessary.
18
+ *
19
+ * @param tgt target
20
+ * @param src source
21
+ * @return 0 on success, < 0 on allocation failure
22
+ */
23
+ extern int git_strarray_copy(git_strarray *tgt, const git_strarray *src);
24
+
25
+ #endif
@@ -198,7 +198,7 @@ static int openssl_ensure_initialized(void)
198
198
  if ((error = git_openssl_stream_dynamic_init()) == 0)
199
199
  error = openssl_init();
200
200
 
201
- openssl_initialized = true;
201
+ openssl_initialized = !error;
202
202
  }
203
203
 
204
204
  error |= git_mutex_unlock(&openssl_mutex);
@@ -91,7 +91,7 @@ int (*sk_num)(const void *sk);
91
91
  void *(*sk_value)(const void *sk, int i);
92
92
  void (*sk_free)(void *sk);
93
93
 
94
- void *openssl_handle;
94
+ static void *openssl_handle;
95
95
 
96
96
  GIT_INLINE(void *) openssl_sym(int *err, const char *name, bool required)
97
97
  {
@@ -125,7 +125,8 @@ int git_openssl_stream_dynamic_init(void)
125
125
  (openssl_handle = dlopen("libssl.1.1.dylib", RTLD_NOW)) == NULL &&
126
126
  (openssl_handle = dlopen("libssl.so.1.0.0", RTLD_NOW)) == NULL &&
127
127
  (openssl_handle = dlopen("libssl.1.0.0.dylib", RTLD_NOW)) == NULL &&
128
- (openssl_handle = dlopen("libssl.so.10", RTLD_NOW)) == NULL) {
128
+ (openssl_handle = dlopen("libssl.so.10", RTLD_NOW)) == NULL &&
129
+ (openssl_handle = dlopen("libssl.so.3", RTLD_NOW)) == NULL) {
129
130
  git_error_set(GIT_ERROR_SSL, "could not load ssl libraries");
130
131
  return -1;
131
132
  }
@@ -175,7 +176,6 @@ int git_openssl_stream_dynamic_init(void)
175
176
 
176
177
  SSL_connect = (int (*)(SSL *))openssl_sym(&err, "SSL_connect", true);
177
178
  SSL_ctrl = (long (*)(SSL *, int, long, void *))openssl_sym(&err, "SSL_ctrl", true);
178
- SSL_get_peer_certificate = (X509 *(*)(const SSL *))openssl_sym(&err, "SSL_get_peer_certificate", true);
179
179
  SSL_library_init = (int (*)(void))openssl_sym(&err, "SSL_library_init", false);
180
180
  SSL_free = (void (*)(SSL *))openssl_sym(&err, "SSL_free", true);
181
181
  SSL_get_error = (int (*)(SSL *, int))openssl_sym(&err, "SSL_get_error", true);
@@ -187,6 +187,10 @@ int git_openssl_stream_dynamic_init(void)
187
187
  SSL_shutdown = (int (*)(SSL *ssl))openssl_sym(&err, "SSL_shutdown", true);
188
188
  SSL_write = (int (*)(SSL *, const void *, int))openssl_sym(&err, "SSL_write", true);
189
189
 
190
+ if (!(SSL_get_peer_certificate = (X509 *(*)(const SSL *))openssl_sym(&err, "SSL_get_peer_certificate", false))) {
191
+ SSL_get_peer_certificate = (X509 *(*)(const SSL *))openssl_sym(&err, "SSL_get1_peer_certificate", true);
192
+ }
193
+
190
194
  SSL_CTX_ctrl = (long (*)(SSL_CTX *, int, long, void *))openssl_sym(&err, "SSL_CTX_ctrl", true);
191
195
  SSL_CTX_free = (void (*)(SSL_CTX *))openssl_sym(&err, "SSL_CTX_free", true);
192
196
  SSL_CTX_new = (SSL_CTX *(*)(const SSL_METHOD *))openssl_sym(&err, "SSL_CTX_new", true);
@@ -135,9 +135,12 @@ static ssize_t socket_write(git_stream *stream, const char *data, size_t len, in
135
135
  git_socket_stream *st = (git_socket_stream *) stream;
136
136
  ssize_t written;
137
137
 
138
+ GIT_ASSERT(flags == 0);
139
+ GIT_UNUSED(flags);
140
+
138
141
  errno = 0;
139
142
 
140
- if ((written = p_send(st->s, data, len, flags)) < 0) {
143
+ if ((written = p_send(st->s, data, len, 0)) < 0) {
141
144
  net_set_error("error sending data");
142
145
  return -1;
143
146
  }
@@ -1338,7 +1338,11 @@ int git_submodule_update(git_submodule *sm, int init, git_submodule_update_optio
1338
1338
  /* Get the status of the submodule to determine if it is already initialized */
1339
1339
  if ((error = git_submodule_status(&submodule_status, sm->repo, sm->name, GIT_SUBMODULE_IGNORE_UNSPECIFIED)) < 0)
1340
1340
  goto done;
1341
-
1341
+
1342
+ /* If the submodule is configured but hasn't been added, skip it */
1343
+ if (submodule_status == GIT_SUBMODULE_STATUS_IN_CONFIG)
1344
+ goto done;
1345
+
1342
1346
  /*
1343
1347
  * If submodule work dir is not already initialized, check to see
1344
1348
  * what we need to do (initialize, clone, return error...)
@@ -1389,7 +1393,7 @@ int git_submodule_update(git_submodule *sm, int init, git_submodule_update_optio
1389
1393
  */
1390
1394
  clone_options.checkout_opts.checkout_strategy = GIT_CHECKOUT_NONE;
1391
1395
 
1392
- if ((error = git_clone(&sub_repo, submodule_url, sm->path, &clone_options)) < 0 ||
1396
+ if ((error = git_clone__submodule(&sub_repo, submodule_url, sm->path, &clone_options)) < 0 ||
1393
1397
  (error = git_repository_set_head_detached(sub_repo, git_submodule_index_id(sm))) < 0 ||
1394
1398
  (error = git_checkout_head(sub_repo, &update_options.checkout_opts)) != 0)
1395
1399
  goto done;