rugged 0.23.0b2 → 0.23.0b4

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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_blob.c +39 -0
  3. data/ext/rugged/rugged_diff.c +7 -3
  4. data/ext/rugged/rugged_index.c +2 -2
  5. data/ext/rugged/rugged_remote.c +27 -148
  6. data/ext/rugged/rugged_remote_collection.c +134 -12
  7. data/ext/rugged/rugged_repo.c +74 -5
  8. data/ext/rugged/rugged_submodule.c +18 -208
  9. data/ext/rugged/rugged_submodule_collection.c +148 -0
  10. data/lib/rugged/version.rb +1 -1
  11. data/vendor/libgit2/AUTHORS +1 -0
  12. data/vendor/libgit2/CMakeLists.txt +33 -25
  13. data/vendor/libgit2/deps/winhttp/winhttp.def +29 -29
  14. data/vendor/libgit2/include/git2.h +1 -1
  15. data/vendor/libgit2/include/git2/blob.h +4 -6
  16. data/vendor/libgit2/include/git2/checkout.h +10 -1
  17. data/vendor/libgit2/include/git2/clone.h +6 -7
  18. data/vendor/libgit2/include/git2/commit.h +11 -0
  19. data/vendor/libgit2/include/git2/cred_helpers.h +2 -2
  20. data/vendor/libgit2/include/git2/describe.h +1 -1
  21. data/vendor/libgit2/include/git2/diff.h +68 -11
  22. data/vendor/libgit2/include/git2/errors.h +4 -1
  23. data/vendor/libgit2/include/git2/filter.h +16 -0
  24. data/vendor/libgit2/include/git2/index.h +38 -11
  25. data/vendor/libgit2/include/git2/odb.h +1 -1
  26. data/vendor/libgit2/include/git2/odb_backend.h +2 -2
  27. data/vendor/libgit2/include/git2/remote.h +300 -207
  28. data/vendor/libgit2/include/git2/reset.h +1 -0
  29. data/vendor/libgit2/include/git2/stash.h +135 -4
  30. data/vendor/libgit2/include/git2/status.h +1 -0
  31. data/vendor/libgit2/include/git2/submodule.h +46 -75
  32. data/vendor/libgit2/include/git2/sys/odb_backend.h +1 -1
  33. data/vendor/libgit2/include/git2/sys/stream.h +2 -0
  34. data/vendor/libgit2/include/git2/sys/transport.h +1 -21
  35. data/vendor/libgit2/include/git2/transport.h +27 -0
  36. data/vendor/libgit2/include/git2/types.h +20 -10
  37. data/vendor/libgit2/include/git2/version.h +3 -3
  38. data/vendor/libgit2/libgit2.pc.in +4 -2
  39. data/vendor/libgit2/src/attr.c +2 -1
  40. data/vendor/libgit2/src/attr_file.c +18 -37
  41. data/vendor/libgit2/src/blame.c +2 -2
  42. data/vendor/libgit2/src/blob.c +4 -3
  43. data/vendor/libgit2/src/branch.c +6 -3
  44. data/vendor/libgit2/src/buf_text.c +4 -6
  45. data/vendor/libgit2/src/buf_text.h +1 -2
  46. data/vendor/libgit2/src/buffer.c +8 -6
  47. data/vendor/libgit2/src/buffer.h +1 -1
  48. data/vendor/libgit2/src/cache.c +1 -0
  49. data/vendor/libgit2/src/checkout.c +34 -20
  50. data/vendor/libgit2/src/clone.c +29 -29
  51. data/vendor/libgit2/src/commit.c +65 -0
  52. data/vendor/libgit2/src/common.h +5 -0
  53. data/vendor/libgit2/src/config.c +20 -0
  54. data/vendor/libgit2/src/config.h +6 -0
  55. data/vendor/libgit2/src/config_file.c +2 -2
  56. data/vendor/libgit2/src/crlf.c +39 -17
  57. data/vendor/libgit2/src/curl_stream.c +257 -0
  58. data/vendor/libgit2/src/curl_stream.h +14 -0
  59. data/vendor/libgit2/src/diff.c +223 -88
  60. data/vendor/libgit2/src/diff.h +21 -1
  61. data/vendor/libgit2/src/diff_file.c +23 -13
  62. data/vendor/libgit2/src/diff_file.h +4 -2
  63. data/vendor/libgit2/src/diff_patch.c +266 -71
  64. data/vendor/libgit2/src/diff_patch.h +36 -0
  65. data/vendor/libgit2/src/diff_print.c +156 -126
  66. data/vendor/libgit2/src/diff_tform.c +32 -54
  67. data/vendor/libgit2/src/fetch.c +27 -10
  68. data/vendor/libgit2/src/fetch.h +2 -2
  69. data/vendor/libgit2/src/filebuf.c +1 -1
  70. data/vendor/libgit2/src/fileops.c +6 -2
  71. data/vendor/libgit2/src/filter.c +28 -7
  72. data/vendor/libgit2/src/fnmatch.c +5 -5
  73. data/vendor/libgit2/src/global.c +16 -0
  74. data/vendor/libgit2/src/ident.c +2 -2
  75. data/vendor/libgit2/src/ignore.c +1 -0
  76. data/vendor/libgit2/src/index.c +338 -80
  77. data/vendor/libgit2/src/index.h +4 -1
  78. data/vendor/libgit2/src/indexer.c +19 -5
  79. data/vendor/libgit2/src/iterator.c +118 -11
  80. data/vendor/libgit2/src/iterator.h +25 -0
  81. data/vendor/libgit2/src/merge.c +96 -106
  82. data/vendor/libgit2/src/merge.h +14 -4
  83. data/vendor/libgit2/src/netops.c +3 -3
  84. data/vendor/libgit2/src/odb.c +17 -9
  85. data/vendor/libgit2/src/odb.h +1 -1
  86. data/vendor/libgit2/src/odb_loose.c +2 -2
  87. data/vendor/libgit2/src/odb_pack.c +1 -1
  88. data/vendor/libgit2/src/openssl_stream.c +118 -27
  89. data/vendor/libgit2/src/pack-objects.c +28 -0
  90. data/vendor/libgit2/src/pack-objects.h +1 -0
  91. data/vendor/libgit2/src/pack.c +18 -10
  92. data/vendor/libgit2/src/path.c +16 -11
  93. data/vendor/libgit2/src/path.h +1 -1
  94. data/vendor/libgit2/src/push.c +26 -42
  95. data/vendor/libgit2/src/push.h +2 -34
  96. data/vendor/libgit2/src/rebase.c +1 -1
  97. data/vendor/libgit2/src/refs.c +1 -1
  98. data/vendor/libgit2/src/refspec.c +6 -0
  99. data/vendor/libgit2/src/remote.c +381 -274
  100. data/vendor/libgit2/src/remote.h +0 -4
  101. data/vendor/libgit2/src/repository.c +33 -12
  102. data/vendor/libgit2/src/repository.h +0 -1
  103. data/vendor/libgit2/src/reset.c +1 -0
  104. data/vendor/libgit2/src/stash.c +439 -17
  105. data/vendor/libgit2/src/status.c +6 -0
  106. data/vendor/libgit2/src/stransport_stream.c +58 -21
  107. data/vendor/libgit2/src/stream.h +15 -0
  108. data/vendor/libgit2/src/submodule.c +410 -664
  109. data/vendor/libgit2/src/submodule.h +0 -24
  110. data/vendor/libgit2/src/transaction.c +1 -0
  111. data/vendor/libgit2/src/transports/cred.c +55 -1
  112. data/vendor/libgit2/src/transports/http.c +18 -2
  113. data/vendor/libgit2/src/transports/local.c +60 -59
  114. data/vendor/libgit2/src/transports/smart.h +1 -1
  115. data/vendor/libgit2/src/transports/smart_protocol.c +11 -11
  116. data/vendor/libgit2/src/transports/ssh.c +46 -7
  117. data/vendor/libgit2/src/unix/posix.h +4 -0
  118. data/vendor/libgit2/src/util.c +9 -9
  119. data/vendor/libgit2/src/util.h +9 -0
  120. data/vendor/libgit2/src/win32/posix.h +3 -0
  121. data/vendor/libgit2/src/win32/posix_w32.c +38 -0
  122. data/vendor/libgit2/src/win32/w32_util.h +10 -0
  123. metadata +4 -3
  124. data/vendor/libgit2/include/git2/push.h +0 -94
@@ -20,6 +20,9 @@
20
20
  */
21
21
  GIT_BEGIN_DECL
22
22
 
23
+ /** Signature of a function which creates a transport */
24
+ typedef int (*git_transport_cb)(git_transport **out, git_remote *owner, void *param);
25
+
23
26
  /**
24
27
  * Type of SSH host fingerprint
25
28
  */
@@ -105,6 +108,13 @@ typedef enum {
105
108
  * it will ask via this credential type.
106
109
  */
107
110
  GIT_CREDTYPE_USERNAME = (1u << 5),
111
+
112
+ /**
113
+ * Credentials read from memory.
114
+ *
115
+ * Only available for libssh2+OpenSSL for now.
116
+ */
117
+ GIT_CREDTYPE_SSH_MEMORY = (1u << 6),
108
118
  } git_credtype_t;
109
119
 
110
120
  /* The base structure for all credential types */
@@ -287,6 +297,23 @@ GIT_EXTERN(int) git_cred_default_new(git_cred **out);
287
297
  */
288
298
  GIT_EXTERN(int) git_cred_username_new(git_cred **cred, const char *username);
289
299
 
300
+ /**
301
+ * Create a new ssh key credential object reading the keys from memory.
302
+ *
303
+ * @param out The newly created credential object.
304
+ * @param username username to use to authenticate.
305
+ * @param publickey The public key of the credential.
306
+ * @param privatekey The private key of the credential.
307
+ * @param passphrase The passphrase of the credential.
308
+ * @return 0 for success or an error code for failure
309
+ */
310
+ GIT_EXTERN(int) git_cred_ssh_key_memory_new(
311
+ git_cred **out,
312
+ const char *username,
313
+ const char *publickey,
314
+ const char *privatekey,
315
+ const char *passphrase);
316
+
290
317
  /**
291
318
  * Signature of a function which acquires a credential object.
292
319
  *
@@ -223,6 +223,12 @@ typedef struct git_refspec git_refspec;
223
223
  */
224
224
  typedef struct git_remote git_remote;
225
225
 
226
+ /**
227
+ * Interface which represents a transport to communicate with a
228
+ * remote.
229
+ */
230
+ typedef struct git_transport git_transport;
231
+
226
232
  /**
227
233
  * Preparation for a push operation. Can be used to configure what to
228
234
  * push and the level of parallelism of the packfile builder.
@@ -278,6 +284,11 @@ typedef int (*git_transport_message_cb)(const char *str, int len, void *payload)
278
284
  * Type of host certificate structure that is passed to the check callback
279
285
  */
280
286
  typedef enum git_cert_t {
287
+ /**
288
+ * No information about the certificate is available. This may
289
+ * happen when using curl.
290
+ */
291
+ GIT_CERT_NONE,
281
292
  /**
282
293
  * The `data` argument to the callback will be a pointer to
283
294
  * the DER-encoded data.
@@ -288,6 +299,13 @@ typedef enum git_cert_t {
288
299
  * `git_cert_hostkey` structure.
289
300
  */
290
301
  GIT_CERT_HOSTKEY_LIBSSH2,
302
+ /**
303
+ * The `data` argument to the callback will be a pointer to a
304
+ * `git_strarray` with `name:content` strings containing
305
+ * information about the certificate. This is used when using
306
+ * curl.
307
+ */
308
+ GIT_CERT_STRARRAY,
291
309
  } git_cert_t;
292
310
 
293
311
  /**
@@ -331,7 +349,6 @@ typedef struct git_submodule git_submodule;
331
349
  *
332
350
  * The values are:
333
351
  *
334
- * - GIT_SUBMODULE_UPDATE_RESET: reset to the on-disk value.
335
352
  * - GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is
336
353
  * updated, checkout the new detached HEAD to the submodule directory.
337
354
  * - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked
@@ -344,8 +361,6 @@ typedef struct git_submodule git_submodule;
344
361
  * when we don't want any particular update rule to be specified.
345
362
  */
346
363
  typedef enum {
347
- GIT_SUBMODULE_UPDATE_RESET = -1,
348
-
349
364
  GIT_SUBMODULE_UPDATE_CHECKOUT = 1,
350
365
  GIT_SUBMODULE_UPDATE_REBASE = 2,
351
366
  GIT_SUBMODULE_UPDATE_MERGE = 3,
@@ -368,7 +383,7 @@ typedef enum {
368
383
  *
369
384
  * The values are:
370
385
  *
371
- * - GIT_SUBMODULE_IGNORE_RESET: reset to the on-disk value.
386
+ * - GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration
372
387
  * - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an
373
388
  * untracked file, will mark the submodule as dirty. Ignored files are
374
389
  * still ignored, of course.
@@ -382,14 +397,12 @@ typedef enum {
382
397
  * when we don't want any particular ignore rule to be specified.
383
398
  */
384
399
  typedef enum {
385
- GIT_SUBMODULE_IGNORE_RESET = -1, /**< reset to on-disk value */
400
+ GIT_SUBMODULE_IGNORE_UNSPECIFIED = -1, /**< use the submodule's configuration */
386
401
 
387
402
  GIT_SUBMODULE_IGNORE_NONE = 1, /**< any change or untracked == dirty */
388
403
  GIT_SUBMODULE_IGNORE_UNTRACKED = 2, /**< dirty if tracked files change */
389
404
  GIT_SUBMODULE_IGNORE_DIRTY = 3, /**< only dirty if HEAD moved */
390
405
  GIT_SUBMODULE_IGNORE_ALL = 4, /**< never dirty */
391
-
392
- GIT_SUBMODULE_IGNORE_DEFAULT = 0
393
406
  } git_submodule_ignore_t;
394
407
 
395
408
  /**
@@ -397,15 +410,12 @@ typedef enum {
397
410
  *
398
411
  * Represent the value of `submodule.$name.fetchRecurseSubmodules`
399
412
  *
400
- * * GIT_SUBMODULE_RECURSE_RESET - reset to the on-disk value
401
413
  * * GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules
402
414
  * * GIT_SUBMODULE_RECURSE_YES - recurse into submodules
403
415
  * * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when
404
416
  * commit not already in local clone
405
417
  */
406
418
  typedef enum {
407
- GIT_SUBMODULE_RECURSE_RESET = -1,
408
-
409
419
  GIT_SUBMODULE_RECURSE_NO = 0,
410
420
  GIT_SUBMODULE_RECURSE_YES = 1,
411
421
  GIT_SUBMODULE_RECURSE_ONDEMAND = 2,
@@ -7,12 +7,12 @@
7
7
  #ifndef INCLUDE_git_version_h__
8
8
  #define INCLUDE_git_version_h__
9
9
 
10
- #define LIBGIT2_VERSION "0.22.0"
10
+ #define LIBGIT2_VERSION "0.23.0"
11
11
  #define LIBGIT2_VER_MAJOR 0
12
- #define LIBGIT2_VER_MINOR 22
12
+ #define LIBGIT2_VER_MINOR 23
13
13
  #define LIBGIT2_VER_REVISION 0
14
14
  #define LIBGIT2_VER_PATCH 0
15
15
 
16
- #define LIBGIT2_SOVERSION 22
16
+ #define LIBGIT2_SOVERSION 23
17
17
 
18
18
  #endif
@@ -4,7 +4,9 @@ includedir=@CMAKE_INSTALL_PREFIX@/@INCLUDE_INSTALL_DIR@
4
4
  Name: libgit2
5
5
  Description: The git library, take 2
6
6
  Version: @LIBGIT2_VERSION_STRING@
7
- Requires.private: @LIBGIT2_PC_REQUIRES@
8
- Libs.private: @LIBGIT2_PC_LIBS@
7
+
9
8
  Libs: -L${libdir} -lgit2
9
+ Libs.private: @LIBGIT2_PC_LIBS@
10
+ Requires.private: @LIBGIT2_PC_REQUIRES@
11
+
10
12
  Cflags: -I${includedir}
@@ -309,7 +309,8 @@ static int attr_setup(git_repository *repo, git_attr_session *attr_session)
309
309
  if (error == 0)
310
310
  error = preload_attr_file(
311
311
  repo, attr_session, GIT_ATTR_FILE__FROM_FILE, NULL, sys.ptr);
312
- else if (error != GIT_ENOTFOUND)
312
+
313
+ if (error != GIT_ENOTFOUND)
313
314
  return error;
314
315
 
315
316
  git_buf_free(&sys);
@@ -359,6 +359,7 @@ bool git_attr_fnmatch__match(
359
359
  git_attr_fnmatch *match,
360
360
  git_attr_path *path)
361
361
  {
362
+ const char *relpath = path->path;
362
363
  const char *filename;
363
364
  int flags = 0;
364
365
 
@@ -375,6 +376,8 @@ bool git_attr_fnmatch__match(
375
376
  if (git__prefixcmp(path->path, match->containing_dir))
376
377
  return 0;
377
378
  }
379
+
380
+ relpath += match->containing_dir_length;
378
381
  }
379
382
 
380
383
  if (match->flags & GIT_ATTR_FNMATCH_ICASE)
@@ -383,7 +386,7 @@ bool git_attr_fnmatch__match(
383
386
  flags |= FNM_LEADING_DIR;
384
387
 
385
388
  if (match->flags & GIT_ATTR_FNMATCH_FULLPATH) {
386
- filename = path->path;
389
+ filename = relpath;
387
390
  flags |= FNM_PATHNAME;
388
391
  } else {
389
392
  filename = path->basename;
@@ -393,35 +396,33 @@ bool git_attr_fnmatch__match(
393
396
  }
394
397
 
395
398
  if ((match->flags & GIT_ATTR_FNMATCH_DIRECTORY) && !path->is_dir) {
396
- int matchval;
397
- char *matchpath;
399
+ bool samename;
398
400
 
399
401
  /* for attribute checks or root ignore checks, fail match */
400
402
  if (!(match->flags & GIT_ATTR_FNMATCH_IGNORE) ||
401
403
  path->basename == path->path)
402
404
  return false;
403
405
 
404
- /* for ignore checks, use container of current item for check */
405
- path->basename[-1] = '\0';
406
406
  flags |= FNM_LEADING_DIR;
407
407
 
408
- if (match->containing_dir)
409
- matchpath = path->basename;
410
- else
411
- matchpath = path->path;
408
+ /* fail match if this is a file with same name as ignored folder */
409
+ samename = (match->flags & GIT_ATTR_FNMATCH_ICASE) ?
410
+ !strcasecmp(match->pattern, relpath) :
411
+ !strcmp(match->pattern, relpath);
412
412
 
413
- matchval = p_fnmatch(match->pattern, matchpath, flags);
414
- path->basename[-1] = '/';
415
- return (matchval != FNM_NOMATCH);
413
+ if (samename)
414
+ return false;
415
+
416
+ return (p_fnmatch(match->pattern, relpath, flags) != FNM_NOMATCH);
416
417
  }
417
418
 
418
419
  /* if path is a directory prefix of a negated pattern, then match */
419
420
  if ((match->flags & GIT_ATTR_FNMATCH_NEGATIVE) && path->is_dir) {
420
- size_t pathlen = strlen(path->path);
421
+ size_t pathlen = strlen(relpath);
421
422
  bool prefixed = (pathlen <= match->length) &&
422
423
  ((match->flags & GIT_ATTR_FNMATCH_ICASE) ?
423
- !strncasecmp(match->pattern, path->path, pathlen) :
424
- !strncmp(match->pattern, path->path, pathlen));
424
+ !strncasecmp(match->pattern, relpath, pathlen) :
425
+ !strncmp(match->pattern, relpath, pathlen));
425
426
 
426
427
  if (prefixed && git_path_at_end_of_segment(&match->pattern[pathlen]))
427
428
  return true;
@@ -640,7 +641,7 @@ int git_attr_fnmatch__parse(
640
641
  }
641
642
 
642
643
  if (context) {
643
- char *slash = strchr(context, '/');
644
+ char *slash = strrchr(context, '/');
644
645
  size_t len;
645
646
  if (slash) {
646
647
  /* include the slash for easier matching */
@@ -650,27 +651,7 @@ int git_attr_fnmatch__parse(
650
651
  }
651
652
  }
652
653
 
653
- if ((spec->flags & GIT_ATTR_FNMATCH_FULLPATH) != 0 &&
654
- context != NULL && git_path_root(pattern) < 0)
655
- {
656
- /* use context path minus the trailing filename */
657
- char *slash = strrchr(context, '/');
658
- size_t contextlen = slash ? slash - context + 1 : 0;
659
-
660
- /* given an unrooted fullpath match from a file inside a repo,
661
- * prefix the pattern with the relative directory of the source file
662
- */
663
- spec->pattern = git_pool_malloc(
664
- pool, (uint32_t)(contextlen + spec->length + 1));
665
- if (spec->pattern) {
666
- memcpy(spec->pattern, context, contextlen);
667
- memcpy(spec->pattern + contextlen, pattern, spec->length);
668
- spec->length += contextlen;
669
- spec->pattern[spec->length] = '\0';
670
- }
671
- } else {
672
- spec->pattern = git_pool_strndup(pool, pattern, spec->length);
673
- }
654
+ spec->pattern = git_pool_strndup(pool, pattern, spec->length);
674
655
 
675
656
  if (!spec->pattern) {
676
657
  *base = git__next_line(pattern);
@@ -496,8 +496,8 @@ int git_blame_buffer(
496
496
 
497
497
  /* Diff to the reference blob */
498
498
  git_diff_blob_to_buffer(reference->final_blob, blame->path,
499
- buffer, buffer_len, blame->path,
500
- &diffopts, NULL, buffer_hunk_cb, buffer_line_cb, blame);
499
+ buffer, buffer_len, blame->path, &diffopts,
500
+ NULL, NULL, buffer_hunk_cb, buffer_line_cb, blame);
501
501
 
502
502
  *out = blame;
503
503
  return 0;
@@ -74,12 +74,13 @@ static int write_file_stream(
74
74
  git_oid *id, git_odb *odb, const char *path, git_off_t file_size)
75
75
  {
76
76
  int fd, error;
77
- char buffer[4096];
77
+ char buffer[FILEIO_BUFSIZE];
78
78
  git_odb_stream *stream = NULL;
79
- ssize_t read_len = -1, written = 0;
79
+ ssize_t read_len = -1;
80
+ git_off_t written = 0;
80
81
 
81
82
  if ((error = git_odb_open_wstream(
82
- &stream, odb, (size_t)file_size, GIT_OBJ_BLOB)) < 0)
83
+ &stream, odb, file_size, GIT_OBJ_BLOB)) < 0)
83
84
  return error;
84
85
 
85
86
  if ((fd = git_futils_open_ro(path)) < 0) {
@@ -551,7 +551,7 @@ int git_branch_set_upstream(git_reference *branch, const char *upstream_name)
551
551
  git_remote *remote = NULL;
552
552
  git_config *config;
553
553
  const char *name, *shortname;
554
- int local;
554
+ int local, error;
555
555
  const git_refspec *fetchspec;
556
556
 
557
557
  name = git_reference_name(branch);
@@ -586,9 +586,12 @@ int git_branch_set_upstream(git_reference *branch, const char *upstream_name)
586
586
  * that.
587
587
  */
588
588
  if (local)
589
- git_buf_puts(&value, ".");
589
+ error = git_buf_puts(&value, ".");
590
590
  else
591
- git_branch_remote_name(&value, repo, git_reference_name(upstream));
591
+ error = git_branch_remote_name(&value, repo, git_reference_name(upstream));
592
+
593
+ if (error < 0)
594
+ goto on_error;
592
595
 
593
596
  if (git_buf_printf(&key, "branch.%s.remote", shortname) < 0)
594
597
  goto on_error;
@@ -131,17 +131,15 @@ int git_buf_text_lf_to_crlf(git_buf *tgt, const git_buf *src)
131
131
  for (; next; scan = next + 1, next = memchr(scan, '\n', end - scan)) {
132
132
  size_t copylen = next - scan;
133
133
 
134
- /* if we find mixed line endings, bail */
135
- if (next > start && next[-1] == '\r') {
136
- git_buf_free(tgt);
137
- return GIT_PASSTHROUGH;
138
- }
134
+ /* if we find mixed line endings, carry on */
135
+ if (copylen && next[-1] == '\r')
136
+ copylen--;
139
137
 
140
138
  GITERR_CHECK_ALLOC_ADD(&alloclen, copylen, 3);
141
139
  if (git_buf_grow_by(tgt, alloclen) < 0)
142
140
  return -1;
143
141
 
144
- if (next > scan) {
142
+ if (copylen) {
145
143
  memcpy(tgt->ptr + tgt->size, scan, copylen);
146
144
  tgt->size += copylen;
147
145
  }
@@ -58,8 +58,7 @@ extern void git_buf_text_unescape(git_buf *buf);
58
58
  /**
59
59
  * Replace all \r\n with \n.
60
60
  *
61
- * @return 0 on success, -1 on memory error, GIT_PASSTHROUGH if the
62
- * source buffer has mixed line endings.
61
+ * @return 0 on success, -1 on memory error
63
62
  */
64
63
  extern int git_buf_text_crlf_to_lf(git_buf *tgt, const git_buf *src);
65
64
 
@@ -33,7 +33,7 @@ void git_buf_init(git_buf *buf, size_t initial_size)
33
33
  }
34
34
 
35
35
  int git_buf_try_grow(
36
- git_buf *buf, size_t target_size, bool mark_oom, bool preserve_external)
36
+ git_buf *buf, size_t target_size, bool mark_oom)
37
37
  {
38
38
  char *new_ptr;
39
39
  size_t new_size;
@@ -41,6 +41,11 @@ int git_buf_try_grow(
41
41
  if (buf->ptr == git_buf__oom)
42
42
  return -1;
43
43
 
44
+ if (buf->asize == 0 && buf->size != 0) {
45
+ giterr_set(GITERR_INVALID, "cannot grow a borrowed buffer");
46
+ return GIT_EINVALID;
47
+ }
48
+
44
49
  if (!target_size)
45
50
  target_size = buf->size;
46
51
 
@@ -82,9 +87,6 @@ int git_buf_try_grow(
82
87
  return -1;
83
88
  }
84
89
 
85
- if (preserve_external && !buf->asize && buf->ptr != NULL && buf->size > 0)
86
- memcpy(new_ptr, buf->ptr, min(buf->size, new_size));
87
-
88
90
  buf->asize = new_size;
89
91
  buf->ptr = new_ptr;
90
92
 
@@ -98,7 +100,7 @@ int git_buf_try_grow(
98
100
 
99
101
  int git_buf_grow(git_buf *buffer, size_t target_size)
100
102
  {
101
- return git_buf_try_grow(buffer, target_size, true, true);
103
+ return git_buf_try_grow(buffer, target_size, true);
102
104
  }
103
105
 
104
106
  int git_buf_grow_by(git_buf *buffer, size_t additional_size)
@@ -110,7 +112,7 @@ int git_buf_grow_by(git_buf *buffer, size_t additional_size)
110
112
  return -1;
111
113
  }
112
114
 
113
- return git_buf_try_grow(buffer, newsize, true, true);
115
+ return git_buf_try_grow(buffer, newsize, true);
114
116
  }
115
117
 
116
118
  void git_buf_free(git_buf *buf)
@@ -59,7 +59,7 @@ extern int git_buf_grow_by(git_buf *buffer, size_t additional_size);
59
59
  * into the newly allocated buffer.
60
60
  */
61
61
  extern int git_buf_try_grow(
62
- git_buf *buf, size_t target_size, bool mark_oom, bool preserve_external);
62
+ git_buf *buf, size_t target_size, bool mark_oom);
63
63
 
64
64
  /**
65
65
  * Sanitizes git_buf structures provided from user input. Users of the
@@ -68,6 +68,7 @@ int git_cache_init(git_cache *cache)
68
68
  {
69
69
  memset(cache, 0, sizeof(*cache));
70
70
  cache->map = git_oidmap_alloc();
71
+ GITERR_CHECK_ALLOC(cache->map);
71
72
  if (git_rwlock_init(&cache->lock)) {
72
73
  giterr_set(GITERR_OS, "Failed to initialize cache rwlock");
73
74
  return -1;