rugged 0.23.0b2 → 0.23.0b4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/rugged/rugged_blob.c +39 -0
- data/ext/rugged/rugged_diff.c +7 -3
- data/ext/rugged/rugged_index.c +2 -2
- data/ext/rugged/rugged_remote.c +27 -148
- data/ext/rugged/rugged_remote_collection.c +134 -12
- data/ext/rugged/rugged_repo.c +74 -5
- data/ext/rugged/rugged_submodule.c +18 -208
- data/ext/rugged/rugged_submodule_collection.c +148 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/AUTHORS +1 -0
- data/vendor/libgit2/CMakeLists.txt +33 -25
- data/vendor/libgit2/deps/winhttp/winhttp.def +29 -29
- data/vendor/libgit2/include/git2.h +1 -1
- data/vendor/libgit2/include/git2/blob.h +4 -6
- data/vendor/libgit2/include/git2/checkout.h +10 -1
- data/vendor/libgit2/include/git2/clone.h +6 -7
- data/vendor/libgit2/include/git2/commit.h +11 -0
- data/vendor/libgit2/include/git2/cred_helpers.h +2 -2
- data/vendor/libgit2/include/git2/describe.h +1 -1
- data/vendor/libgit2/include/git2/diff.h +68 -11
- data/vendor/libgit2/include/git2/errors.h +4 -1
- data/vendor/libgit2/include/git2/filter.h +16 -0
- data/vendor/libgit2/include/git2/index.h +38 -11
- data/vendor/libgit2/include/git2/odb.h +1 -1
- data/vendor/libgit2/include/git2/odb_backend.h +2 -2
- data/vendor/libgit2/include/git2/remote.h +300 -207
- data/vendor/libgit2/include/git2/reset.h +1 -0
- data/vendor/libgit2/include/git2/stash.h +135 -4
- data/vendor/libgit2/include/git2/status.h +1 -0
- data/vendor/libgit2/include/git2/submodule.h +46 -75
- data/vendor/libgit2/include/git2/sys/odb_backend.h +1 -1
- data/vendor/libgit2/include/git2/sys/stream.h +2 -0
- data/vendor/libgit2/include/git2/sys/transport.h +1 -21
- data/vendor/libgit2/include/git2/transport.h +27 -0
- data/vendor/libgit2/include/git2/types.h +20 -10
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/libgit2.pc.in +4 -2
- data/vendor/libgit2/src/attr.c +2 -1
- data/vendor/libgit2/src/attr_file.c +18 -37
- data/vendor/libgit2/src/blame.c +2 -2
- data/vendor/libgit2/src/blob.c +4 -3
- data/vendor/libgit2/src/branch.c +6 -3
- data/vendor/libgit2/src/buf_text.c +4 -6
- data/vendor/libgit2/src/buf_text.h +1 -2
- data/vendor/libgit2/src/buffer.c +8 -6
- data/vendor/libgit2/src/buffer.h +1 -1
- data/vendor/libgit2/src/cache.c +1 -0
- data/vendor/libgit2/src/checkout.c +34 -20
- data/vendor/libgit2/src/clone.c +29 -29
- data/vendor/libgit2/src/commit.c +65 -0
- data/vendor/libgit2/src/common.h +5 -0
- data/vendor/libgit2/src/config.c +20 -0
- data/vendor/libgit2/src/config.h +6 -0
- data/vendor/libgit2/src/config_file.c +2 -2
- data/vendor/libgit2/src/crlf.c +39 -17
- data/vendor/libgit2/src/curl_stream.c +257 -0
- data/vendor/libgit2/src/curl_stream.h +14 -0
- data/vendor/libgit2/src/diff.c +223 -88
- data/vendor/libgit2/src/diff.h +21 -1
- data/vendor/libgit2/src/diff_file.c +23 -13
- data/vendor/libgit2/src/diff_file.h +4 -2
- data/vendor/libgit2/src/diff_patch.c +266 -71
- data/vendor/libgit2/src/diff_patch.h +36 -0
- data/vendor/libgit2/src/diff_print.c +156 -126
- data/vendor/libgit2/src/diff_tform.c +32 -54
- data/vendor/libgit2/src/fetch.c +27 -10
- data/vendor/libgit2/src/fetch.h +2 -2
- data/vendor/libgit2/src/filebuf.c +1 -1
- data/vendor/libgit2/src/fileops.c +6 -2
- data/vendor/libgit2/src/filter.c +28 -7
- data/vendor/libgit2/src/fnmatch.c +5 -5
- data/vendor/libgit2/src/global.c +16 -0
- data/vendor/libgit2/src/ident.c +2 -2
- data/vendor/libgit2/src/ignore.c +1 -0
- data/vendor/libgit2/src/index.c +338 -80
- data/vendor/libgit2/src/index.h +4 -1
- data/vendor/libgit2/src/indexer.c +19 -5
- data/vendor/libgit2/src/iterator.c +118 -11
- data/vendor/libgit2/src/iterator.h +25 -0
- data/vendor/libgit2/src/merge.c +96 -106
- data/vendor/libgit2/src/merge.h +14 -4
- data/vendor/libgit2/src/netops.c +3 -3
- data/vendor/libgit2/src/odb.c +17 -9
- data/vendor/libgit2/src/odb.h +1 -1
- data/vendor/libgit2/src/odb_loose.c +2 -2
- data/vendor/libgit2/src/odb_pack.c +1 -1
- data/vendor/libgit2/src/openssl_stream.c +118 -27
- data/vendor/libgit2/src/pack-objects.c +28 -0
- data/vendor/libgit2/src/pack-objects.h +1 -0
- data/vendor/libgit2/src/pack.c +18 -10
- data/vendor/libgit2/src/path.c +16 -11
- data/vendor/libgit2/src/path.h +1 -1
- data/vendor/libgit2/src/push.c +26 -42
- data/vendor/libgit2/src/push.h +2 -34
- data/vendor/libgit2/src/rebase.c +1 -1
- data/vendor/libgit2/src/refs.c +1 -1
- data/vendor/libgit2/src/refspec.c +6 -0
- data/vendor/libgit2/src/remote.c +381 -274
- data/vendor/libgit2/src/remote.h +0 -4
- data/vendor/libgit2/src/repository.c +33 -12
- data/vendor/libgit2/src/repository.h +0 -1
- data/vendor/libgit2/src/reset.c +1 -0
- data/vendor/libgit2/src/stash.c +439 -17
- data/vendor/libgit2/src/status.c +6 -0
- data/vendor/libgit2/src/stransport_stream.c +58 -21
- data/vendor/libgit2/src/stream.h +15 -0
- data/vendor/libgit2/src/submodule.c +410 -664
- data/vendor/libgit2/src/submodule.h +0 -24
- data/vendor/libgit2/src/transaction.c +1 -0
- data/vendor/libgit2/src/transports/cred.c +55 -1
- data/vendor/libgit2/src/transports/http.c +18 -2
- data/vendor/libgit2/src/transports/local.c +60 -59
- data/vendor/libgit2/src/transports/smart.h +1 -1
- data/vendor/libgit2/src/transports/smart_protocol.c +11 -11
- data/vendor/libgit2/src/transports/ssh.c +46 -7
- data/vendor/libgit2/src/unix/posix.h +4 -0
- data/vendor/libgit2/src/util.c +9 -9
- data/vendor/libgit2/src/util.h +9 -0
- data/vendor/libgit2/src/win32/posix.h +3 -0
- data/vendor/libgit2/src/win32/posix_w32.c +38 -0
- data/vendor/libgit2/src/win32/w32_util.h +10 -0
- metadata +4 -3
- data/vendor/libgit2/include/git2/push.h +0 -94
@@ -150,6 +150,15 @@ static int checkout_notify(
|
|
150
150
|
}
|
151
151
|
}
|
152
152
|
|
153
|
+
GIT_INLINE(bool) is_workdir_base_or_new(
|
154
|
+
const git_oid *workdir_id,
|
155
|
+
const git_diff_file *baseitem,
|
156
|
+
const git_diff_file *newitem)
|
157
|
+
{
|
158
|
+
return (git_oid__cmp(&baseitem->id, workdir_id) == 0 ||
|
159
|
+
git_oid__cmp(&newitem->id, workdir_id) == 0);
|
160
|
+
}
|
161
|
+
|
153
162
|
static bool checkout_is_workdir_modified(
|
154
163
|
checkout_data *data,
|
155
164
|
const git_diff_file *baseitem,
|
@@ -171,7 +180,7 @@ static bool checkout_is_workdir_modified(
|
|
171
180
|
return true;
|
172
181
|
}
|
173
182
|
|
174
|
-
if (git_submodule_status(&sm_status,
|
183
|
+
if (git_submodule_status(&sm_status, data->repo, wditem->path, GIT_SUBMODULE_IGNORE_UNSPECIFIED) < 0 ||
|
175
184
|
GIT_SUBMODULE_STATUS_IS_WD_DIRTY(sm_status))
|
176
185
|
rval = true;
|
177
186
|
else if ((sm_oid = git_submodule_wd_id(sm)) == NULL)
|
@@ -193,8 +202,7 @@ static bool checkout_is_workdir_modified(
|
|
193
202
|
if (wditem->mtime.seconds == ie->mtime.seconds &&
|
194
203
|
wditem->mtime.nanoseconds == ie->mtime.nanoseconds &&
|
195
204
|
wditem->file_size == ie->file_size)
|
196
|
-
return (
|
197
|
-
git_oid_cmp(&newitem->id, &ie->id) != 0);
|
205
|
+
return !is_workdir_base_or_new(&ie->id, baseitem, newitem);
|
198
206
|
}
|
199
207
|
|
200
208
|
/* depending on where base is coming from, we may or may not know
|
@@ -203,10 +211,13 @@ static bool checkout_is_workdir_modified(
|
|
203
211
|
if (baseitem->size && wditem->file_size != baseitem->size)
|
204
212
|
return true;
|
205
213
|
|
206
|
-
if (git_diff__oid_for_entry(&oid, data->diff, wditem, NULL) < 0)
|
214
|
+
if (git_diff__oid_for_entry(&oid, data->diff, wditem, wditem->mode, NULL) < 0)
|
207
215
|
return false;
|
208
216
|
|
209
|
-
|
217
|
+
/* Allow the checkout if the workdir is not modified *or* if the checkout
|
218
|
+
* target's contents are already in the working directory.
|
219
|
+
*/
|
220
|
+
return !is_workdir_base_or_new(&oid, baseitem, newitem);
|
210
221
|
}
|
211
222
|
|
212
223
|
#define CHECKOUT_ACTION_IF(FLAG,YES,NO) \
|
@@ -1292,7 +1303,7 @@ static int checkout_get_actions(
|
|
1292
1303
|
(int)counts[CHECKOUT_ACTION__CONFLICT],
|
1293
1304
|
counts[CHECKOUT_ACTION__CONFLICT] == 1 ?
|
1294
1305
|
"conflict prevents" : "conflicts prevent");
|
1295
|
-
error =
|
1306
|
+
error = GIT_ECONFLICT;
|
1296
1307
|
goto fail;
|
1297
1308
|
}
|
1298
1309
|
|
@@ -1849,11 +1860,6 @@ static int checkout_create_submodules(
|
|
1849
1860
|
git_diff_delta *delta;
|
1850
1861
|
size_t i;
|
1851
1862
|
|
1852
|
-
/* initial reload of submodules if .gitmodules was changed */
|
1853
|
-
if (data->reload_submodules &&
|
1854
|
-
(error = git_submodule_reload_all(data->repo, 1)) < 0)
|
1855
|
-
return error;
|
1856
|
-
|
1857
1863
|
git_vector_foreach(&data->diff->deltas, i, delta) {
|
1858
1864
|
if (actions[i] & CHECKOUT_ACTION__DEFER_REMOVE) {
|
1859
1865
|
/* this has a blocker directory that should only be removed iff
|
@@ -1874,8 +1880,7 @@ static int checkout_create_submodules(
|
|
1874
1880
|
}
|
1875
1881
|
}
|
1876
1882
|
|
1877
|
-
|
1878
|
-
return git_submodule_reload_all(data->repo, 1);
|
1883
|
+
return 0;
|
1879
1884
|
}
|
1880
1885
|
|
1881
1886
|
static int checkout_lookup_head_tree(git_tree **out, git_repository *repo)
|
@@ -2062,7 +2067,7 @@ static int checkout_write_merge(
|
|
2062
2067
|
|
2063
2068
|
if (result.path == NULL || result.mode == 0) {
|
2064
2069
|
giterr_set(GITERR_CHECKOUT, "Could not merge contents of file");
|
2065
|
-
error =
|
2070
|
+
error = GIT_ECONFLICT;
|
2066
2071
|
goto done;
|
2067
2072
|
}
|
2068
2073
|
|
@@ -2357,7 +2362,7 @@ static int checkout_data_init(
|
|
2357
2362
|
/* cannot checkout if unresolved conflicts exist */
|
2358
2363
|
if ((data->opts.checkout_strategy & GIT_CHECKOUT_FORCE) == 0 &&
|
2359
2364
|
git_index_has_conflicts(data->index)) {
|
2360
|
-
error =
|
2365
|
+
error = GIT_ECONFLICT;
|
2361
2366
|
giterr_set(GITERR_CHECKOUT,
|
2362
2367
|
"unresolved conflicts exist in the index");
|
2363
2368
|
goto cleanup;
|
@@ -2397,7 +2402,7 @@ static int checkout_data_init(
|
|
2397
2402
|
&data->can_symlink, repo, GIT_CVAR_SYMLINKS)) < 0)
|
2398
2403
|
goto cleanup;
|
2399
2404
|
|
2400
|
-
if (!data->opts.baseline) {
|
2405
|
+
if (!data->opts.baseline && !data->opts.baseline_index) {
|
2401
2406
|
data->opts_free_baseline = true;
|
2402
2407
|
|
2403
2408
|
error = checkout_lookup_head_tree(&data->opts.baseline, repo);
|
@@ -2501,12 +2506,21 @@ int git_checkout_iterator(
|
|
2501
2506
|
(error = git_iterator_for_workdir_ext(
|
2502
2507
|
&workdir, data.repo, data.opts.target_directory, index, NULL,
|
2503
2508
|
iterflags | GIT_ITERATOR_DONT_AUTOEXPAND,
|
2504
|
-
data.pfx, data.pfx)) < 0
|
2505
|
-
(error = git_iterator_for_tree(
|
2506
|
-
&baseline, data.opts.baseline,
|
2507
|
-
iterflags, data.pfx, data.pfx)) < 0)
|
2509
|
+
data.pfx, data.pfx)) < 0)
|
2508
2510
|
goto cleanup;
|
2509
2511
|
|
2512
|
+
if (data.opts.baseline_index) {
|
2513
|
+
if ((error = git_iterator_for_index(
|
2514
|
+
&baseline, data.opts.baseline_index,
|
2515
|
+
iterflags, data.pfx, data.pfx)) < 0)
|
2516
|
+
goto cleanup;
|
2517
|
+
} else {
|
2518
|
+
if ((error = git_iterator_for_tree(
|
2519
|
+
&baseline, data.opts.baseline,
|
2520
|
+
iterflags, data.pfx, data.pfx)) < 0)
|
2521
|
+
goto cleanup;
|
2522
|
+
}
|
2523
|
+
|
2510
2524
|
/* Should not have case insensitivity mismatch */
|
2511
2525
|
assert(git_iterator_ignore_case(workdir) == git_iterator_ignore_case(baseline));
|
2512
2526
|
|
data/vendor/libgit2/src/clone.c
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
#include "repository.h"
|
25
25
|
#include "odb.h"
|
26
26
|
|
27
|
-
static int clone_local_into(git_repository *repo, git_remote *remote, const git_checkout_options *co_opts, const char *branch, int link);
|
27
|
+
static int clone_local_into(git_repository *repo, git_remote *remote, const git_fetch_options *fetch_opts, const git_checkout_options *co_opts, const char *branch, int link);
|
28
28
|
|
29
29
|
static int create_branch(
|
30
30
|
git_reference **branch,
|
@@ -242,13 +242,9 @@ static int default_remote_create(
|
|
242
242
|
const char *url,
|
243
243
|
void *payload)
|
244
244
|
{
|
245
|
-
|
246
|
-
git_remote_callbacks *callbacks = payload;
|
247
|
-
|
248
|
-
if ((error = git_remote_create(out, repo, name, url)) < 0)
|
249
|
-
return error;
|
245
|
+
GIT_UNUSED(payload);
|
250
246
|
|
251
|
-
return
|
247
|
+
return git_remote_create(out, repo, name, url);
|
252
248
|
}
|
253
249
|
|
254
250
|
/*
|
@@ -277,15 +273,12 @@ static int create_and_configure_origin(
|
|
277
273
|
|
278
274
|
if (!remote_create) {
|
279
275
|
remote_create = default_remote_create;
|
280
|
-
payload =
|
276
|
+
payload = NULL;
|
281
277
|
}
|
282
278
|
|
283
279
|
if ((error = remote_create(&origin, repo, "origin", url, payload)) < 0)
|
284
280
|
goto on_error;
|
285
281
|
|
286
|
-
if ((error = git_remote_save(origin)) < 0)
|
287
|
-
goto on_error;
|
288
|
-
|
289
282
|
*out = origin;
|
290
283
|
return 0;
|
291
284
|
|
@@ -328,12 +321,12 @@ static int checkout_branch(git_repository *repo, git_remote *remote, const git_c
|
|
328
321
|
return error;
|
329
322
|
}
|
330
323
|
|
331
|
-
static int clone_into(git_repository *repo, git_remote *_remote, const git_checkout_options *co_opts, const char *branch)
|
324
|
+
static int clone_into(git_repository *repo, git_remote *_remote, const git_fetch_options *opts, const git_checkout_options *co_opts, const char *branch)
|
332
325
|
{
|
333
326
|
int error;
|
334
327
|
git_buf reflog_message = GIT_BUF_INIT;
|
328
|
+
git_fetch_options fetch_opts;
|
335
329
|
git_remote *remote;
|
336
|
-
const git_remote_callbacks *callbacks;
|
337
330
|
|
338
331
|
assert(repo && _remote);
|
339
332
|
|
@@ -345,18 +338,12 @@ static int clone_into(git_repository *repo, git_remote *_remote, const git_check
|
|
345
338
|
if ((error = git_remote_dup(&remote, _remote)) < 0)
|
346
339
|
return error;
|
347
340
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
goto cleanup;
|
352
|
-
|
353
|
-
if ((error = git_remote_add_fetch(remote, "refs/tags/*:refs/tags/*")) < 0)
|
354
|
-
goto cleanup;
|
355
|
-
|
356
|
-
git_remote_set_update_fetchhead(remote, 0);
|
341
|
+
memcpy(&fetch_opts, opts, sizeof(git_fetch_options));
|
342
|
+
fetch_opts.update_fetchhead = 0;
|
343
|
+
fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;
|
357
344
|
git_buf_printf(&reflog_message, "clone: from %s", git_remote_url(remote));
|
358
345
|
|
359
|
-
if ((error = git_remote_fetch(remote, NULL, git_buf_cstr(&reflog_message))) != 0)
|
346
|
+
if ((error = git_remote_fetch(remote, NULL, &fetch_opts, git_buf_cstr(&reflog_message))) != 0)
|
360
347
|
goto cleanup;
|
361
348
|
|
362
349
|
error = checkout_branch(repo, remote, co_opts, branch, git_buf_cstr(&reflog_message));
|
@@ -439,11 +426,11 @@ int git_clone(
|
|
439
426
|
|
440
427
|
if (clone_local == 1)
|
441
428
|
error = clone_local_into(
|
442
|
-
repo, origin, &options.checkout_opts,
|
429
|
+
repo, origin, &options.fetch_opts, &options.checkout_opts,
|
443
430
|
options.checkout_branch, link);
|
444
431
|
else if (clone_local == 0)
|
445
432
|
error = clone_into(
|
446
|
-
repo, origin, &options.checkout_opts,
|
433
|
+
repo, origin, &options.fetch_opts, &options.checkout_opts,
|
447
434
|
options.checkout_branch);
|
448
435
|
else
|
449
436
|
error = -1;
|
@@ -506,7 +493,7 @@ static bool can_link(const char *src, const char *dst, int link)
|
|
506
493
|
#endif
|
507
494
|
}
|
508
495
|
|
509
|
-
static int clone_local_into(git_repository *repo, git_remote *remote, const git_checkout_options *co_opts, const char *branch, int link)
|
496
|
+
static int clone_local_into(git_repository *repo, git_remote *remote, const git_fetch_options *fetch_opts, const git_checkout_options *co_opts, const char *branch, int link)
|
510
497
|
{
|
511
498
|
int error, flags;
|
512
499
|
git_repository *src;
|
@@ -545,13 +532,26 @@ static int clone_local_into(git_repository *repo, git_remote *remote, const git_
|
|
545
532
|
if (can_link(git_repository_path(src), git_repository_path(repo), link))
|
546
533
|
flags |= GIT_CPDIR_LINK_FILES;
|
547
534
|
|
548
|
-
|
549
|
-
|
535
|
+
error = git_futils_cp_r(git_buf_cstr(&src_odb), git_buf_cstr(&dst_odb),
|
536
|
+
flags, GIT_OBJECT_DIR_MODE);
|
537
|
+
|
538
|
+
/*
|
539
|
+
* can_link() doesn't catch all variations, so if we hit an
|
540
|
+
* error and did want to link, let's try again without trying
|
541
|
+
* to link.
|
542
|
+
*/
|
543
|
+
if (error < 0 && link) {
|
544
|
+
flags &= ~GIT_CPDIR_LINK_FILES;
|
545
|
+
error = git_futils_cp_r(git_buf_cstr(&src_odb), git_buf_cstr(&dst_odb),
|
546
|
+
flags, GIT_OBJECT_DIR_MODE);
|
547
|
+
}
|
548
|
+
|
549
|
+
if (error < 0)
|
550
550
|
goto cleanup;
|
551
551
|
|
552
552
|
git_buf_printf(&reflog_message, "clone: from %s", git_remote_url(remote));
|
553
553
|
|
554
|
-
if ((error = git_remote_fetch(remote, NULL, git_buf_cstr(&reflog_message))) != 0)
|
554
|
+
if ((error = git_remote_fetch(remote, NULL, fetch_opts, git_buf_cstr(&reflog_message))) != 0)
|
555
555
|
goto cleanup;
|
556
556
|
|
557
557
|
error = checkout_branch(repo, remote, co_opts, branch, git_buf_cstr(&reflog_message));
|
data/vendor/libgit2/src/commit.c
CHANGED
@@ -309,6 +309,7 @@ int git_commit__parse(void *_commit, git_odb_object *odb_obj)
|
|
309
309
|
const char *buffer_end = buffer_start + git_odb_object_size(odb_obj);
|
310
310
|
git_oid parent_id;
|
311
311
|
size_t header_len;
|
312
|
+
git_signature dummy_sig;
|
312
313
|
|
313
314
|
buffer = buffer_start;
|
314
315
|
|
@@ -337,6 +338,15 @@ int git_commit__parse(void *_commit, git_odb_object *odb_obj)
|
|
337
338
|
if (git_signature__parse(commit->author, &buffer, buffer_end, "author ", '\n') < 0)
|
338
339
|
return -1;
|
339
340
|
|
341
|
+
/* Some tools create multiple author fields, ignore the extra ones */
|
342
|
+
while ((size_t)(buffer_end - buffer) >= strlen("author ") && !git__prefixcmp(buffer, "author ")) {
|
343
|
+
if (git_signature__parse(&dummy_sig, &buffer, buffer_end, "author ", '\n') < 0)
|
344
|
+
return -1;
|
345
|
+
|
346
|
+
git__free(dummy_sig.name);
|
347
|
+
git__free(dummy_sig.email);
|
348
|
+
}
|
349
|
+
|
340
350
|
/* Always parse the committer; we need the commit time */
|
341
351
|
commit->committer = git__malloc(sizeof(git_signature));
|
342
352
|
GITERR_CHECK_ALLOC(commit->committer);
|
@@ -508,3 +518,58 @@ int git_commit_nth_gen_ancestor(
|
|
508
518
|
*ancestor = parent;
|
509
519
|
return 0;
|
510
520
|
}
|
521
|
+
|
522
|
+
int git_commit_header_field(git_buf *out, const git_commit *commit, const char *field)
|
523
|
+
{
|
524
|
+
const char *buf = commit->raw_header;
|
525
|
+
const char *h, *eol;
|
526
|
+
|
527
|
+
git_buf_sanitize(out);
|
528
|
+
while ((h = strchr(buf, '\n')) && h[1] != '\0' && h[1] != '\n') {
|
529
|
+
h++;
|
530
|
+
if (git__prefixcmp(h, field)) {
|
531
|
+
buf = h;
|
532
|
+
continue;
|
533
|
+
}
|
534
|
+
|
535
|
+
h += strlen(field);
|
536
|
+
eol = strchr(h, '\n');
|
537
|
+
if (h[0] != ' ') {
|
538
|
+
buf = h;
|
539
|
+
continue;
|
540
|
+
}
|
541
|
+
if (!eol)
|
542
|
+
goto malformed;
|
543
|
+
|
544
|
+
h++; /* skip the SP */
|
545
|
+
|
546
|
+
git_buf_put(out, h, eol - h);
|
547
|
+
if (git_buf_oom(out))
|
548
|
+
goto oom;
|
549
|
+
|
550
|
+
/* If the next line starts with SP, it's multi-line, we must continue */
|
551
|
+
while (eol[1] == ' ') {
|
552
|
+
git_buf_putc(out, '\n');
|
553
|
+
h = eol + 2;
|
554
|
+
eol = strchr(h, '\n');
|
555
|
+
if (!eol)
|
556
|
+
goto malformed;
|
557
|
+
|
558
|
+
git_buf_put(out, h, eol - h);
|
559
|
+
}
|
560
|
+
|
561
|
+
if (git_buf_oom(out))
|
562
|
+
goto oom;
|
563
|
+
|
564
|
+
return 0;
|
565
|
+
}
|
566
|
+
|
567
|
+
return GIT_ENOTFOUND;
|
568
|
+
|
569
|
+
malformed:
|
570
|
+
giterr_set(GITERR_OBJECT, "malformed header");
|
571
|
+
return -1;
|
572
|
+
oom:
|
573
|
+
giterr_set_oom();
|
574
|
+
return -1;
|
575
|
+
}
|
data/vendor/libgit2/src/common.h
CHANGED
@@ -68,6 +68,11 @@
|
|
68
68
|
|
69
69
|
#include <regex.h>
|
70
70
|
|
71
|
+
#define DEFAULT_BUFSIZE 65536
|
72
|
+
#define FILEIO_BUFSIZE DEFAULT_BUFSIZE
|
73
|
+
#define FILTERIO_BUFSIZE DEFAULT_BUFSIZE
|
74
|
+
#define NETIO_BUFSIZE DEFAULT_BUFSIZE
|
75
|
+
|
71
76
|
/**
|
72
77
|
* Check a pointer allocation result, returning -1 if it failed.
|
73
78
|
*/
|
data/vendor/libgit2/src/config.c
CHANGED
@@ -1194,6 +1194,26 @@ fail_parse:
|
|
1194
1194
|
return -1;
|
1195
1195
|
}
|
1196
1196
|
|
1197
|
+
int git_config_lookup_map_enum(git_cvar_t *type_out, const char **str_out,
|
1198
|
+
const git_cvar_map *maps, size_t map_n, int enum_val)
|
1199
|
+
{
|
1200
|
+
size_t i;
|
1201
|
+
|
1202
|
+
for (i = 0; i < map_n; i++) {
|
1203
|
+
const git_cvar_map *m = &maps[i];
|
1204
|
+
|
1205
|
+
if (m->map_value != enum_val)
|
1206
|
+
continue;
|
1207
|
+
|
1208
|
+
*type_out = m->cvar_type;
|
1209
|
+
*str_out = m->str_match;
|
1210
|
+
return 0;
|
1211
|
+
}
|
1212
|
+
|
1213
|
+
giterr_set(GITERR_CONFIG, "invalid enum value");
|
1214
|
+
return GIT_ENOTFOUND;
|
1215
|
+
}
|
1216
|
+
|
1197
1217
|
int git_config_parse_bool(int *out, const char *value)
|
1198
1218
|
{
|
1199
1219
|
if (git__parse_bool(out, value) == 0)
|
data/vendor/libgit2/src/config.h
CHANGED
@@ -82,4 +82,10 @@ extern int git_config__get_int_force(
|
|
82
82
|
extern int git_config__cvar(
|
83
83
|
int *out, git_config *config, git_cvar_cached cvar);
|
84
84
|
|
85
|
+
/**
|
86
|
+
* The opposite of git_config_lookup_map_value, we take an enum value
|
87
|
+
* and map it to the string or bool value on the config.
|
88
|
+
*/
|
89
|
+
int git_config_lookup_map_enum(git_cvar_t *type_out, const char **str_out,
|
90
|
+
const git_cvar_map *maps, size_t map_n, int enum_val);
|
85
91
|
#endif
|
@@ -156,7 +156,7 @@ int git_config_file_normalize_section(char *start, char *end)
|
|
156
156
|
if (end && scan >= end)
|
157
157
|
break;
|
158
158
|
if (isalnum(*scan))
|
159
|
-
*scan = (char)
|
159
|
+
*scan = (char)git__tolower(*scan);
|
160
160
|
else if (*scan != '-' || scan == start)
|
161
161
|
return GIT_EINVALIDSPEC;
|
162
162
|
}
|
@@ -1083,7 +1083,7 @@ static int parse_section_header(struct reader *reader, char **section_out)
|
|
1083
1083
|
goto fail_parse;
|
1084
1084
|
}
|
1085
1085
|
|
1086
|
-
name[name_length++] = (char)
|
1086
|
+
name[name_length++] = (char)git__tolower(c);
|
1087
1087
|
|
1088
1088
|
} while ((c = line[pos++]) != ']');
|
1089
1089
|
|
data/vendor/libgit2/src/crlf.c
CHANGED
@@ -193,28 +193,29 @@ static const char *line_ending(struct crlf_attrs *ca)
|
|
193
193
|
case GIT_CRLF_CRLF:
|
194
194
|
return "\r\n";
|
195
195
|
|
196
|
+
case GIT_CRLF_GUESS:
|
197
|
+
if (ca->auto_crlf == GIT_AUTO_CRLF_FALSE)
|
198
|
+
return "\n";
|
199
|
+
break;
|
200
|
+
|
196
201
|
case GIT_CRLF_AUTO:
|
197
202
|
case GIT_CRLF_TEXT:
|
198
|
-
case GIT_CRLF_GUESS:
|
199
203
|
break;
|
200
204
|
|
201
205
|
default:
|
202
206
|
goto line_ending_error;
|
203
207
|
}
|
204
208
|
|
205
|
-
|
206
|
-
case GIT_EOL_UNSET:
|
207
|
-
return GIT_EOL_NATIVE == GIT_EOL_CRLF ? "\r\n" : "\n";
|
208
|
-
|
209
|
-
case GIT_EOL_CRLF:
|
209
|
+
if (ca->auto_crlf == GIT_AUTO_CRLF_TRUE)
|
210
210
|
return "\r\n";
|
211
|
-
|
212
|
-
case GIT_EOL_LF:
|
211
|
+
else if (ca->auto_crlf == GIT_AUTO_CRLF_INPUT)
|
213
212
|
return "\n";
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
213
|
+
else if (ca->eol == GIT_EOL_UNSET)
|
214
|
+
return GIT_EOL_NATIVE == GIT_EOL_CRLF ? "\r\n" : "\n";
|
215
|
+
else if (ca->eol == GIT_EOL_LF)
|
216
|
+
return "\n";
|
217
|
+
else if (ca->eol == GIT_EOL_CRLF)
|
218
|
+
return "\r\n";
|
218
219
|
|
219
220
|
line_ending_error:
|
220
221
|
giterr_set(GITERR_INVALID, "Invalid input to line ending filter");
|
@@ -224,16 +225,14 @@ line_ending_error:
|
|
224
225
|
static int crlf_apply_to_workdir(
|
225
226
|
struct crlf_attrs *ca, git_buf *to, const git_buf *from)
|
226
227
|
{
|
228
|
+
git_buf_text_stats stats;
|
227
229
|
const char *workdir_ending = NULL;
|
230
|
+
bool is_binary;
|
228
231
|
|
229
232
|
/* Empty file? Nothing to do. */
|
230
233
|
if (git_buf_len(from) == 0)
|
231
234
|
return 0;
|
232
235
|
|
233
|
-
/* Don't filter binary files */
|
234
|
-
if (git_buf_text_is_binary(from))
|
235
|
-
return GIT_PASSTHROUGH;
|
236
|
-
|
237
236
|
/* Determine proper line ending */
|
238
237
|
workdir_ending = line_ending(ca);
|
239
238
|
if (!workdir_ending)
|
@@ -243,6 +242,29 @@ static int crlf_apply_to_workdir(
|
|
243
242
|
if (strcmp(workdir_ending, "\r\n") != 0)
|
244
243
|
return GIT_PASSTHROUGH;
|
245
244
|
|
245
|
+
/* If there are no LFs, or all LFs are part of a CRLF, nothing to do */
|
246
|
+
is_binary = git_buf_text_gather_stats(&stats, from, false);
|
247
|
+
|
248
|
+
if (stats.lf == 0 || stats.lf == stats.crlf)
|
249
|
+
return GIT_PASSTHROUGH;
|
250
|
+
|
251
|
+
if (ca->crlf_action == GIT_CRLF_AUTO ||
|
252
|
+
ca->crlf_action == GIT_CRLF_GUESS) {
|
253
|
+
|
254
|
+
/* If we have any existing CR or CRLF line endings, do nothing */
|
255
|
+
if (ca->crlf_action == GIT_CRLF_GUESS &&
|
256
|
+
stats.cr > 0 && stats.crlf > 0)
|
257
|
+
return GIT_PASSTHROUGH;
|
258
|
+
|
259
|
+
/* If we have bare CR characters, do nothing */
|
260
|
+
if (stats.cr != stats.crlf)
|
261
|
+
return GIT_PASSTHROUGH;
|
262
|
+
|
263
|
+
/* Don't filter binary files */
|
264
|
+
if (is_binary)
|
265
|
+
return GIT_PASSTHROUGH;
|
266
|
+
}
|
267
|
+
|
246
268
|
return git_buf_text_lf_to_crlf(to, from);
|
247
269
|
}
|
248
270
|
|
@@ -278,7 +300,7 @@ static int crlf_check(
|
|
278
300
|
return GIT_PASSTHROUGH;
|
279
301
|
|
280
302
|
if (ca.crlf_action == GIT_CRLF_GUESS ||
|
281
|
-
(ca.crlf_action == GIT_CRLF_AUTO &&
|
303
|
+
((ca.crlf_action == GIT_CRLF_AUTO || ca.crlf_action == GIT_CRLF_TEXT) &&
|
282
304
|
git_filter_source_mode(src) == GIT_FILTER_SMUDGE)) {
|
283
305
|
|
284
306
|
error = git_repository__cvar(
|