rugged 1.0.1 → 1.1.0

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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_commit.c +1 -1
  3. data/lib/rugged/commit.rb +16 -2
  4. data/lib/rugged/version.rb +1 -1
  5. data/vendor/libgit2/CMakeLists.txt +31 -69
  6. data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
  7. data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
  8. data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
  9. data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
  10. data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
  11. data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
  12. data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
  13. data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
  14. data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
  15. data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
  16. data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
  17. data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
  18. data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
  19. data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
  20. data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
  21. data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
  22. data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
  23. data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +25 -32
  24. data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +20 -28
  25. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
  26. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +6 -5
  27. data/vendor/libgit2/deps/ntlmclient/compat.h +8 -1
  28. data/vendor/libgit2/deps/ntlmclient/ntlm.c +8 -11
  29. data/vendor/libgit2/deps/pcre/LICENCE +93 -0
  30. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  31. data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
  32. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
  33. data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
  34. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
  35. data/vendor/libgit2/deps/zlib/deflate.c +1 -0
  36. data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
  37. data/vendor/libgit2/include/git2/blame.h +2 -0
  38. data/vendor/libgit2/include/git2/common.h +15 -3
  39. data/vendor/libgit2/include/git2/deprecated.h +42 -2
  40. data/vendor/libgit2/include/git2/errors.h +2 -1
  41. data/vendor/libgit2/include/git2/index.h +1 -2
  42. data/vendor/libgit2/include/git2/pack.h +1 -1
  43. data/vendor/libgit2/include/git2/strarray.h +6 -10
  44. data/vendor/libgit2/include/git2/version.h +4 -4
  45. data/vendor/libgit2/src/CMakeLists.txt +53 -41
  46. data/vendor/libgit2/src/apply.c +5 -1
  47. data/vendor/libgit2/src/assert_safe.h +58 -0
  48. data/vendor/libgit2/src/attr_file.c +8 -3
  49. data/vendor/libgit2/src/attrcache.c +2 -3
  50. data/vendor/libgit2/src/blame.c +2 -0
  51. data/vendor/libgit2/src/blame_git.c +6 -3
  52. data/vendor/libgit2/src/blob.c +2 -0
  53. data/vendor/libgit2/src/branch.c +19 -21
  54. data/vendor/libgit2/src/buffer.c +6 -3
  55. data/vendor/libgit2/src/cache.c +1 -22
  56. data/vendor/libgit2/src/checkout.c +49 -72
  57. data/vendor/libgit2/src/cherrypick.c +2 -0
  58. data/vendor/libgit2/src/clone.c +78 -18
  59. data/vendor/libgit2/src/common.h +1 -0
  60. data/vendor/libgit2/src/config.c +3 -7
  61. data/vendor/libgit2/src/config_entries.c +35 -27
  62. data/vendor/libgit2/src/config_parse.c +1 -1
  63. data/vendor/libgit2/src/config_snapshot.c +2 -1
  64. data/vendor/libgit2/src/describe.c +5 -1
  65. data/vendor/libgit2/src/diff.c +12 -11
  66. data/vendor/libgit2/src/diff_file.c +3 -1
  67. data/vendor/libgit2/src/diff_generate.c +10 -11
  68. data/vendor/libgit2/src/diff_parse.c +2 -3
  69. data/vendor/libgit2/src/diff_print.c +63 -60
  70. data/vendor/libgit2/src/diff_stats.c +12 -11
  71. data/vendor/libgit2/src/diff_tform.c +2 -3
  72. data/vendor/libgit2/src/errors.c +2 -0
  73. data/vendor/libgit2/src/fetch.c +2 -0
  74. data/vendor/libgit2/src/filter.c +3 -3
  75. data/vendor/libgit2/src/futils.c +3 -3
  76. data/vendor/libgit2/src/futils.h +3 -3
  77. data/vendor/libgit2/src/global.c +3 -1
  78. data/vendor/libgit2/src/idxmap.c +0 -22
  79. data/vendor/libgit2/src/index.c +12 -7
  80. data/vendor/libgit2/src/indexer.c +10 -4
  81. data/vendor/libgit2/src/iterator.c +4 -4
  82. data/vendor/libgit2/src/merge.c +13 -7
  83. data/vendor/libgit2/src/merge_file.c +4 -6
  84. data/vendor/libgit2/src/midx.c +418 -0
  85. data/vendor/libgit2/src/midx.h +83 -0
  86. data/vendor/libgit2/src/mwindow.c +124 -51
  87. data/vendor/libgit2/src/net.c +6 -1
  88. data/vendor/libgit2/src/object.c +2 -1
  89. data/vendor/libgit2/src/odb.c +9 -6
  90. data/vendor/libgit2/src/odb_loose.c +3 -3
  91. data/vendor/libgit2/src/odb_mempack.c +2 -0
  92. data/vendor/libgit2/src/oid.c +2 -0
  93. data/vendor/libgit2/src/pack-objects.c +29 -21
  94. data/vendor/libgit2/src/pack.c +47 -28
  95. data/vendor/libgit2/src/pack.h +19 -2
  96. data/vendor/libgit2/src/patch_generate.c +1 -3
  97. data/vendor/libgit2/src/patch_parse.c +4 -2
  98. data/vendor/libgit2/src/path.c +4 -4
  99. data/vendor/libgit2/src/pathspec.c +4 -3
  100. data/vendor/libgit2/src/pool.c +21 -15
  101. data/vendor/libgit2/src/pool.h +9 -1
  102. data/vendor/libgit2/src/proxy.c +2 -0
  103. data/vendor/libgit2/src/push.c +2 -0
  104. data/vendor/libgit2/src/rebase.c +2 -0
  105. data/vendor/libgit2/src/refdb.c +135 -0
  106. data/vendor/libgit2/src/refdb.h +69 -0
  107. data/vendor/libgit2/src/refdb_fs.c +19 -81
  108. data/vendor/libgit2/src/reflog.c +2 -6
  109. data/vendor/libgit2/src/refs.c +60 -188
  110. data/vendor/libgit2/src/refs.h +1 -19
  111. data/vendor/libgit2/src/regexp.c +2 -2
  112. data/vendor/libgit2/src/remote.c +32 -17
  113. data/vendor/libgit2/src/repository.c +168 -79
  114. data/vendor/libgit2/src/repository.h +10 -27
  115. data/vendor/libgit2/src/revert.c +2 -0
  116. data/vendor/libgit2/src/revparse.c +5 -4
  117. data/vendor/libgit2/src/revwalk.c +3 -5
  118. data/vendor/libgit2/src/settings.c +9 -0
  119. data/vendor/libgit2/src/sortedcache.c +2 -3
  120. data/vendor/libgit2/src/stash.c +2 -0
  121. data/vendor/libgit2/src/status.c +2 -0
  122. data/vendor/libgit2/src/strarray.c +63 -0
  123. data/vendor/libgit2/src/streams/openssl.c +12 -6
  124. data/vendor/libgit2/src/streams/registry.c +5 -3
  125. data/vendor/libgit2/src/submodule.c +6 -4
  126. data/vendor/libgit2/src/sysdir.c +4 -20
  127. data/vendor/libgit2/src/sysdir.h +0 -11
  128. data/vendor/libgit2/src/tag.c +2 -0
  129. data/vendor/libgit2/src/thread-utils.h +139 -21
  130. data/vendor/libgit2/src/transaction.c +2 -1
  131. data/vendor/libgit2/src/transports/credential.c +2 -0
  132. data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
  133. data/vendor/libgit2/src/transports/httpclient.c +6 -8
  134. data/vendor/libgit2/src/transports/local.c +2 -2
  135. data/vendor/libgit2/src/transports/smart.c +2 -2
  136. data/vendor/libgit2/src/transports/winhttp.c +18 -7
  137. data/vendor/libgit2/src/unix/posix.h +13 -1
  138. data/vendor/libgit2/src/util.c +25 -58
  139. data/vendor/libgit2/src/util.h +2 -2
  140. data/vendor/libgit2/src/win32/git2.rc +18 -3
  141. data/vendor/libgit2/src/win32/path_w32.c +2 -2
  142. data/vendor/libgit2/src/worktree.c +4 -0
  143. metadata +27 -25
  144. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
  145. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
  146. data/vendor/libgit2/src/refdb_fs.h +0 -19
@@ -27,9 +27,6 @@
27
27
 
28
28
  bool git_reference__enable_symbolic_ref_target_validation = true;
29
29
 
30
- #define DEFAULT_NESTING_LEVEL 5
31
- #define MAX_NESTING_LEVEL 10
32
-
33
30
  enum {
34
31
  GIT_PACKREF_HAS_PEEL = 1,
35
32
  GIT_PACKREF_WAS_LOOSE = 2
@@ -214,89 +211,32 @@ int git_reference_lookup_resolved(
214
211
  const char *name,
215
212
  int max_nesting)
216
213
  {
217
- git_refname_t scan_name;
218
- git_reference_t scan_type;
219
- int error = 0, nesting;
220
- git_reference *ref = NULL;
214
+ git_refname_t normalized;
221
215
  git_refdb *refdb;
216
+ int error = 0;
222
217
 
223
218
  assert(ref_out && repo && name);
224
219
 
225
- *ref_out = NULL;
226
-
227
- if (max_nesting > MAX_NESTING_LEVEL)
228
- max_nesting = MAX_NESTING_LEVEL;
229
- else if (max_nesting < 0)
230
- max_nesting = DEFAULT_NESTING_LEVEL;
231
-
232
- scan_type = GIT_REFERENCE_SYMBOLIC;
233
-
234
- if ((error = reference_normalize_for_repo(scan_name, repo, name, true)) < 0)
220
+ if ((error = reference_normalize_for_repo(normalized, repo, name, true)) < 0 ||
221
+ (error = git_repository_refdb__weakptr(&refdb, repo)) < 0 ||
222
+ (error = git_refdb_resolve(ref_out, refdb, normalized, max_nesting)) < 0)
235
223
  return error;
236
224
 
237
- if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0)
238
- return error;
239
-
240
- for (nesting = max_nesting;
241
- nesting >= 0 && scan_type == GIT_REFERENCE_SYMBOLIC;
242
- nesting--)
243
- {
244
- if (nesting != max_nesting) {
245
- strncpy(scan_name, ref->target.symbolic, sizeof(scan_name));
246
- git_reference_free(ref);
247
- }
248
-
249
- if ((error = git_refdb_lookup(&ref, refdb, scan_name)) < 0)
250
- return error;
251
-
252
- scan_type = ref->type;
253
- }
254
-
255
- if (scan_type != GIT_REFERENCE_DIRECT && max_nesting != 0) {
256
- git_error_set(GIT_ERROR_REFERENCE,
257
- "cannot resolve reference (>%u levels deep)", max_nesting);
258
- git_reference_free(ref);
259
- return -1;
225
+ /*
226
+ * The resolved reference may be a symbolic reference in case its
227
+ * target doesn't exist. If the user asked us to resolve (e.g.
228
+ * `max_nesting != 0`), then we need to return an error in case we got
229
+ * a symbolic reference back.
230
+ */
231
+ if (max_nesting && git_reference_type(*ref_out) == GIT_REFERENCE_SYMBOLIC) {
232
+ git_reference_free(*ref_out);
233
+ *ref_out = NULL;
234
+ return GIT_ENOTFOUND;
260
235
  }
261
236
 
262
- *ref_out = ref;
263
237
  return 0;
264
238
  }
265
239
 
266
- int git_reference__read_head(
267
- git_reference **out,
268
- git_repository *repo,
269
- const char *path)
270
- {
271
- git_buf reference = GIT_BUF_INIT;
272
- char *name = NULL;
273
- int error;
274
-
275
- if ((error = git_futils_readbuffer(&reference, path)) < 0)
276
- goto out;
277
- git_buf_rtrim(&reference);
278
-
279
- if (git__strncmp(reference.ptr, GIT_SYMREF, strlen(GIT_SYMREF)) == 0) {
280
- git_buf_consume(&reference, reference.ptr + strlen(GIT_SYMREF));
281
-
282
- name = git_path_basename(path);
283
-
284
- if ((*out = git_reference__alloc_symbolic(name, reference.ptr)) == NULL) {
285
- error = -1;
286
- goto out;
287
- }
288
- } else {
289
- if ((error = git_reference_lookup(out, repo, reference.ptr)) < 0)
290
- goto out;
291
- }
292
-
293
- out:
294
- git__free(name);
295
- git_buf_dispose(&reference);
296
-
297
- return error;
298
- }
299
-
300
240
  int git_reference_dwim(git_reference **out, git_repository *repo, const char *refname)
301
241
  {
302
242
  int error = 0, i;
@@ -480,7 +420,7 @@ static int reference__create(
480
420
  return 0;
481
421
  }
482
422
 
483
- int configured_ident(git_signature **out, const git_repository *repo)
423
+ static int refs_configured_ident(git_signature **out, const git_repository *repo)
484
424
  {
485
425
  if (repo->ident_name && repo->ident_email)
486
426
  return git_signature_now(out, repo->ident_name, repo->ident_email);
@@ -494,7 +434,7 @@ int git_reference__log_signature(git_signature **out, git_repository *repo)
494
434
  int error;
495
435
  git_signature *who;
496
436
 
497
- if(((error = configured_ident(&who, repo)) < 0) &&
437
+ if(((error = refs_configured_ident(&who, repo)) < 0) &&
498
438
  ((error = git_signature_default(&who, repo)) < 0) &&
499
439
  ((error = git_signature_now(&who, "unknown", "unknown")) < 0))
500
440
  return error;
@@ -631,84 +571,33 @@ int git_reference_symbolic_set_target(
631
571
  typedef struct {
632
572
  const char *old_name;
633
573
  git_refname_t new_name;
634
- } rename_cb_data;
574
+ } refs_update_head_payload;
635
575
 
636
- static int update_wt_heads(git_repository *repo, const char *path, void *payload)
576
+ static int refs_update_head(git_repository *worktree, void *_payload)
637
577
  {
638
- rename_cb_data *data = (rename_cb_data *) payload;
639
- git_reference *head = NULL;
640
- char *gitdir = NULL;
578
+ refs_update_head_payload *payload = (refs_update_head_payload *)_payload;
579
+ git_reference *head = NULL, *updated = NULL;
641
580
  int error;
642
581
 
643
- if ((error = git_reference__read_head(&head, repo, path)) < 0) {
644
- git_error_set(GIT_ERROR_REFERENCE, "could not read HEAD when renaming references");
582
+ if ((error = git_reference_lookup(&head, worktree, GIT_HEAD_FILE)) < 0)
645
583
  goto out;
646
- }
647
-
648
- if ((gitdir = git_path_dirname(path)) == NULL) {
649
- error = -1;
650
- goto out;
651
- }
652
584
 
653
585
  if (git_reference_type(head) != GIT_REFERENCE_SYMBOLIC ||
654
- git__strcmp(head->target.symbolic, data->old_name) != 0) {
655
- error = 0;
586
+ git__strcmp(git_reference_symbolic_target(head), payload->old_name) != 0)
656
587
  goto out;
657
- }
658
588
 
659
- /* Update HEAD it was pointing to the reference being renamed */
660
- if ((error = git_repository_create_head(gitdir, data->new_name)) < 0) {
589
+ /* Update HEAD if it was pointing to the reference being renamed */
590
+ if ((error = git_reference_symbolic_set_target(&updated, head, payload->new_name, NULL)) < 0) {
661
591
  git_error_set(GIT_ERROR_REFERENCE, "failed to update HEAD after renaming reference");
662
592
  goto out;
663
593
  }
664
594
 
665
595
  out:
596
+ git_reference_free(updated);
666
597
  git_reference_free(head);
667
- git__free(gitdir);
668
-
669
- return error;
670
- }
671
-
672
- static int reference__rename(git_reference **out, git_reference *ref, const char *new_name, int force,
673
- const git_signature *signature, const char *message)
674
- {
675
- git_repository *repo;
676
- git_refname_t normalized;
677
- bool should_head_be_updated = false;
678
- int error = 0;
679
-
680
- assert(ref && new_name && signature);
681
-
682
- repo = git_reference_owner(ref);
683
-
684
- if ((error = reference_normalize_for_repo(
685
- normalized, repo, new_name, true)) < 0)
686
- return error;
687
-
688
- /* Check if we have to update HEAD. */
689
- if ((error = git_branch_is_head(ref)) < 0)
690
- return error;
691
-
692
- should_head_be_updated = (error > 0);
693
-
694
- if ((error = git_refdb_rename(out, ref->db, ref->name, normalized, force, signature, message)) < 0)
695
- return error;
696
-
697
- /* Update HEAD if it was pointing to the reference being renamed */
698
- if (should_head_be_updated) {
699
- error = git_repository_set_head(ref->db->repo, normalized);
700
- } else {
701
- rename_cb_data payload;
702
- payload.old_name = ref->name;
703
- memcpy(&payload.new_name, &normalized, sizeof(normalized));
704
-
705
- error = git_repository_foreach_head(repo, update_wt_heads, 0, &payload);
706
- }
707
-
708
598
  return error;
709
599
  }
710
600
 
711
-
712
601
  int git_reference_rename(
713
602
  git_reference **out,
714
603
  git_reference *ref,
@@ -716,17 +605,28 @@ int git_reference_rename(
716
605
  int force,
717
606
  const char *log_message)
718
607
  {
719
- git_signature *who;
608
+ refs_update_head_payload payload;
609
+ git_signature *signature = NULL;
610
+ git_repository *repo;
720
611
  int error;
721
612
 
722
613
  assert(out && ref);
723
614
 
724
- if ((error = git_reference__log_signature(&who, ref->db->repo)) < 0)
725
- return error;
615
+ repo = git_reference_owner(ref);
726
616
 
727
- error = reference__rename(out, ref, new_name, force, who, log_message);
728
- git_signature_free(who);
617
+ if ((error = git_reference__log_signature(&signature, repo)) < 0 ||
618
+ (error = reference_normalize_for_repo(payload.new_name, repo, new_name, true)) < 0 ||
619
+ (error = git_refdb_rename(out, ref->db, ref->name, payload.new_name, force, signature, log_message)) < 0)
620
+ goto out;
729
621
 
622
+ payload.old_name = ref->name;
623
+
624
+ /* We may have to update any HEAD that was pointing to the renamed reference. */
625
+ if ((error = git_repository_foreach_worktree(repo, refs_update_head, &payload)) < 0)
626
+ goto out;
627
+
628
+ out:
629
+ git_signature_free(signature);
730
630
  return error;
731
631
  }
732
632
 
@@ -1154,40 +1054,6 @@ int git_reference_cmp(
1154
1054
  return git_oid__cmp(&ref1->target.oid, &ref2->target.oid);
1155
1055
  }
1156
1056
 
1157
- /**
1158
- * Get the end of a chain of references. If the final one is not
1159
- * found, we return the reference just before that.
1160
- */
1161
- static int get_terminal(git_reference **out, git_repository *repo, const char *ref_name, int nesting)
1162
- {
1163
- git_reference *ref;
1164
- int error = 0;
1165
-
1166
- if (nesting > MAX_NESTING_LEVEL) {
1167
- git_error_set(GIT_ERROR_REFERENCE, "reference chain too deep (%d)", nesting);
1168
- return GIT_ENOTFOUND;
1169
- }
1170
-
1171
- /* set to NULL to let the caller know that they're at the end of the chain */
1172
- if ((error = git_reference_lookup(&ref, repo, ref_name)) < 0) {
1173
- *out = NULL;
1174
- return error;
1175
- }
1176
-
1177
- if (git_reference_type(ref) == GIT_REFERENCE_DIRECT) {
1178
- *out = ref;
1179
- error = 0;
1180
- } else {
1181
- error = get_terminal(out, repo, git_reference_symbolic_target(ref), nesting + 1);
1182
- if (error == GIT_ENOTFOUND && !*out)
1183
- *out = ref;
1184
- else
1185
- git_reference_free(ref);
1186
- }
1187
-
1188
- return error;
1189
- }
1190
-
1191
1057
  /*
1192
1058
  * Starting with the reference given by `ref_name`, follows symbolic
1193
1059
  * references until a direct reference is found and updated the OID
@@ -1202,31 +1068,37 @@ int git_reference__update_terminal(
1202
1068
  {
1203
1069
  git_reference *ref = NULL, *ref2 = NULL;
1204
1070
  git_signature *who = NULL;
1071
+ git_refdb *refdb = NULL;
1205
1072
  const git_signature *to_use;
1206
1073
  int error = 0;
1207
1074
 
1208
1075
  if (!sig && (error = git_reference__log_signature(&who, repo)) < 0)
1209
- return error;
1076
+ goto out;
1210
1077
 
1211
1078
  to_use = sig ? sig : who;
1212
- error = get_terminal(&ref, repo, ref_name, 0);
1213
1079
 
1214
- /* found a dangling symref */
1215
- if (error == GIT_ENOTFOUND && ref) {
1216
- assert(git_reference_type(ref) == GIT_REFERENCE_SYMBOLIC);
1217
- git_error_clear();
1080
+ if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0)
1081
+ goto out;
1082
+
1083
+ if ((error = git_refdb_resolve(&ref, refdb, ref_name, -1)) < 0) {
1084
+ if (error == GIT_ENOTFOUND) {
1085
+ git_error_clear();
1086
+ error = reference__create(&ref2, repo, ref_name, oid, NULL, 0, to_use,
1087
+ log_message, NULL, NULL);
1088
+ }
1089
+ goto out;
1090
+ }
1091
+
1092
+ /* In case the resolved reference is symbolic, then it's a dangling symref. */
1093
+ if (git_reference_type(ref) == GIT_REFERENCE_SYMBOLIC) {
1218
1094
  error = reference__create(&ref2, repo, ref->target.symbolic, oid, NULL, 0, to_use,
1219
1095
  log_message, NULL, NULL);
1220
- } else if (error == GIT_ENOTFOUND) {
1221
- git_error_clear();
1222
- error = reference__create(&ref2, repo, ref_name, oid, NULL, 0, to_use,
1223
- log_message, NULL, NULL);
1224
- } else if (error == 0) {
1225
- assert(git_reference_type(ref) == GIT_REFERENCE_DIRECT);
1096
+ } else {
1226
1097
  error = reference__create(&ref2, repo, ref->name, oid, NULL, 1, to_use,
1227
1098
  log_message, &ref->target.oid, NULL);
1228
1099
  }
1229
1100
 
1101
+ out:
1230
1102
  git_reference_free(ref2);
1231
1103
  git_reference_free(ref);
1232
1104
  git_signature_free(who);
@@ -45,7 +45,6 @@ extern bool git_reference__enable_symbolic_ref_target_validation;
45
45
  #define GIT_REBASE_APPLY_DIR "rebase-apply/"
46
46
  #define GIT_REBASE_APPLY_REBASING_FILE GIT_REBASE_APPLY_DIR "rebasing"
47
47
  #define GIT_REBASE_APPLY_APPLYING_FILE GIT_REBASE_APPLY_DIR "applying"
48
- #define GIT_REFS_HEADS_MASTER_FILE GIT_REFS_HEADS_DIR "master"
49
48
 
50
49
  #define GIT_SEQUENCER_DIR "sequencer/"
51
50
  #define GIT_SEQUENCER_HEAD_FILE GIT_SEQUENCER_DIR "head"
@@ -90,6 +89,7 @@ int git_reference__is_valid_name(const char *refname, unsigned int flags);
90
89
  int git_reference__is_branch(const char *ref_name);
91
90
  int git_reference__is_remote(const char *ref_name);
92
91
  int git_reference__is_tag(const char *ref_name);
92
+ int git_reference__is_note(const char *ref_name);
93
93
  const char *git_reference__shorthand(const char *name);
94
94
 
95
95
  /**
@@ -115,24 +115,6 @@ int git_reference_lookup_resolved(
115
115
  const char *name,
116
116
  int max_deref);
117
117
 
118
- /**
119
- * Read reference from a file.
120
- *
121
- * This function will read in the file at `path`. If it is a
122
- * symref, it will return a new unresolved symbolic reference
123
- * with the given name pointing to the reference pointed to by
124
- * the file. If it is not a symbolic reference, it will return
125
- * the resolved reference.
126
- *
127
- * Note that because the refdb is not involved for symbolic references, they
128
- * won't be owned, hence you should either not make the returned reference
129
- * 'externally visible', or perform the lookup before returning it to the user.
130
- */
131
- int git_reference__read_head(
132
- git_reference **out,
133
- git_repository *repo,
134
- const char *path);
135
-
136
118
  int git_reference__log_signature(git_signature **out, git_repository *repo);
137
119
 
138
120
  /** Update a reference after a commit. */
@@ -12,7 +12,7 @@
12
12
  int git_regexp_compile(git_regexp *r, const char *pattern, int flags)
13
13
  {
14
14
  int erroffset, cflags = 0;
15
- const char *error;
15
+ const char *error = NULL;
16
16
 
17
17
  if (flags & GIT_REGEXP_ICASE)
18
18
  cflags |= PCRE_CASELESS;
@@ -41,7 +41,7 @@ int git_regexp_match(const git_regexp *r, const char *string)
41
41
 
42
42
  int git_regexp_search(const git_regexp *r, const char *string, size_t nmatches, git_regmatch *matches)
43
43
  {
44
- int static_ovec[9], *ovec;
44
+ int static_ovec[9] = {0}, *ovec;
45
45
  int error;
46
46
  size_t i;
47
47
 
@@ -195,10 +195,12 @@ int git_remote_create_options_init(git_remote_create_options *opts, unsigned int
195
195
  return 0;
196
196
  }
197
197
 
198
+ #ifndef GIT_DEPRECATE_HARD
198
199
  int git_remote_create_init_options(git_remote_create_options *opts, unsigned int version)
199
200
  {
200
201
  return git_remote_create_options_init(opts, version);
201
202
  }
203
+ #endif
202
204
 
203
205
  int git_remote_create_with_opts(git_remote **out, const char *url, const git_remote_create_options *opts)
204
206
  {
@@ -686,7 +688,7 @@ int git_remote__urlfordirection(git_buf *url_out, struct git_remote *remote, int
686
688
  return resolve_url(url_out, url, direction, callbacks);
687
689
  }
688
690
 
689
- int set_transport_callbacks(git_transport *t, const git_remote_callbacks *cbs)
691
+ static int remote_transport_set_callbacks(git_transport *t, const git_remote_callbacks *cbs)
690
692
  {
691
693
  if (!t->set_callbacks || !cbs)
692
694
  return 0;
@@ -744,7 +746,7 @@ int git_remote__connect(git_remote *remote, git_direction direction, const git_r
744
746
  if ((error = set_transport_custom_headers(t, conn->custom_headers)) != 0)
745
747
  goto on_error;
746
748
 
747
- if ((error = set_transport_callbacks(t, callbacks)) < 0 ||
749
+ if ((error = remote_transport_set_callbacks(t, callbacks)) < 0 ||
748
750
  (error = t->connect(t, url.ptr, credentials, payload, conn->proxy, direction, flags)) != 0)
749
751
  goto on_error;
750
752
 
@@ -1237,7 +1239,7 @@ static int prune_candidates(git_vector *candidates, git_remote *remote)
1237
1239
  }
1238
1240
 
1239
1241
  out:
1240
- git_strarray_free(&arr);
1242
+ git_strarray_dispose(&arr);
1241
1243
  return error;
1242
1244
  }
1243
1245
 
@@ -2373,29 +2375,36 @@ int git_remote_default_branch(git_buf *out, git_remote *remote)
2373
2375
  const git_remote_head *guess = NULL;
2374
2376
  const git_oid *head_id;
2375
2377
  size_t heads_len, i;
2378
+ git_buf local_default = GIT_BUF_INIT;
2376
2379
  int error;
2377
2380
 
2378
2381
  assert(out);
2379
2382
 
2380
2383
  if ((error = git_remote_ls(&heads, &heads_len, remote)) < 0)
2381
- return error;
2384
+ goto done;
2382
2385
 
2383
- if (heads_len == 0)
2384
- return GIT_ENOTFOUND;
2385
-
2386
- if (strcmp(heads[0]->name, GIT_HEAD_FILE))
2387
- return GIT_ENOTFOUND;
2386
+ if (heads_len == 0 || strcmp(heads[0]->name, GIT_HEAD_FILE)) {
2387
+ error = GIT_ENOTFOUND;
2388
+ goto done;
2389
+ }
2388
2390
 
2389
2391
  git_buf_sanitize(out);
2392
+
2390
2393
  /* the first one must be HEAD so if that has the symref info, we're done */
2391
- if (heads[0]->symref_target)
2392
- return git_buf_puts(out, heads[0]->symref_target);
2394
+ if (heads[0]->symref_target) {
2395
+ error = git_buf_puts(out, heads[0]->symref_target);
2396
+ goto done;
2397
+ }
2393
2398
 
2394
2399
  /*
2395
2400
  * If there's no symref information, we have to look over them
2396
- * and guess. We return the first match unless the master
2397
- * branch is a candidate. Then we return the master branch.
2401
+ * and guess. We return the first match unless the default
2402
+ * branch is a candidate. Then we return the default branch.
2398
2403
  */
2404
+
2405
+ if ((error = git_repository_initialbranch(&local_default, remote->repo)) < 0)
2406
+ goto done;
2407
+
2399
2408
  head_id = &heads[0]->oid;
2400
2409
 
2401
2410
  for (i = 1; i < heads_len; i++) {
@@ -2410,16 +2419,22 @@ int git_remote_default_branch(git_buf *out, git_remote *remote)
2410
2419
  continue;
2411
2420
  }
2412
2421
 
2413
- if (!git__strcmp(GIT_REFS_HEADS_MASTER_FILE, heads[i]->name)) {
2422
+ if (!git__strcmp(local_default.ptr, heads[i]->name)) {
2414
2423
  guess = heads[i];
2415
2424
  break;
2416
2425
  }
2417
2426
  }
2418
2427
 
2419
- if (!guess)
2420
- return GIT_ENOTFOUND;
2428
+ if (!guess) {
2429
+ error = GIT_ENOTFOUND;
2430
+ goto done;
2431
+ }
2432
+
2433
+ error = git_buf_puts(out, guess->name);
2421
2434
 
2422
- return git_buf_puts(out, guess->name);
2435
+ done:
2436
+ git_buf_dispose(&local_default);
2437
+ return error;
2423
2438
  }
2424
2439
 
2425
2440
  int git_remote_upload(git_remote *remote, const git_strarray *refspecs, const git_push_options *opts)