rugged 1.0.1 → 1.1.0
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_commit.c +1 -1
- data/lib/rugged/commit.rb +16 -2
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +31 -69
- data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
- data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +25 -32
- data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +20 -28
- data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +6 -5
- data/vendor/libgit2/deps/ntlmclient/compat.h +8 -1
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +8 -11
- data/vendor/libgit2/deps/pcre/LICENCE +93 -0
- data/vendor/libgit2/deps/pcre/pcre.h +2 -2
- data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
- data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
- data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
- data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
- data/vendor/libgit2/deps/zlib/deflate.c +1 -0
- data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
- data/vendor/libgit2/include/git2/blame.h +2 -0
- data/vendor/libgit2/include/git2/common.h +15 -3
- data/vendor/libgit2/include/git2/deprecated.h +42 -2
- data/vendor/libgit2/include/git2/errors.h +2 -1
- data/vendor/libgit2/include/git2/index.h +1 -2
- data/vendor/libgit2/include/git2/pack.h +1 -1
- data/vendor/libgit2/include/git2/strarray.h +6 -10
- data/vendor/libgit2/include/git2/version.h +4 -4
- data/vendor/libgit2/src/CMakeLists.txt +53 -41
- data/vendor/libgit2/src/apply.c +5 -1
- data/vendor/libgit2/src/assert_safe.h +58 -0
- data/vendor/libgit2/src/attr_file.c +8 -3
- data/vendor/libgit2/src/attrcache.c +2 -3
- data/vendor/libgit2/src/blame.c +2 -0
- data/vendor/libgit2/src/blame_git.c +6 -3
- data/vendor/libgit2/src/blob.c +2 -0
- data/vendor/libgit2/src/branch.c +19 -21
- data/vendor/libgit2/src/buffer.c +6 -3
- data/vendor/libgit2/src/cache.c +1 -22
- data/vendor/libgit2/src/checkout.c +49 -72
- data/vendor/libgit2/src/cherrypick.c +2 -0
- data/vendor/libgit2/src/clone.c +78 -18
- data/vendor/libgit2/src/common.h +1 -0
- data/vendor/libgit2/src/config.c +3 -7
- data/vendor/libgit2/src/config_entries.c +35 -27
- data/vendor/libgit2/src/config_parse.c +1 -1
- data/vendor/libgit2/src/config_snapshot.c +2 -1
- data/vendor/libgit2/src/describe.c +5 -1
- data/vendor/libgit2/src/diff.c +12 -11
- data/vendor/libgit2/src/diff_file.c +3 -1
- data/vendor/libgit2/src/diff_generate.c +10 -11
- data/vendor/libgit2/src/diff_parse.c +2 -3
- data/vendor/libgit2/src/diff_print.c +63 -60
- data/vendor/libgit2/src/diff_stats.c +12 -11
- data/vendor/libgit2/src/diff_tform.c +2 -3
- data/vendor/libgit2/src/errors.c +2 -0
- data/vendor/libgit2/src/fetch.c +2 -0
- data/vendor/libgit2/src/filter.c +3 -3
- data/vendor/libgit2/src/futils.c +3 -3
- data/vendor/libgit2/src/futils.h +3 -3
- data/vendor/libgit2/src/global.c +3 -1
- data/vendor/libgit2/src/idxmap.c +0 -22
- data/vendor/libgit2/src/index.c +12 -7
- data/vendor/libgit2/src/indexer.c +10 -4
- data/vendor/libgit2/src/iterator.c +4 -4
- data/vendor/libgit2/src/merge.c +13 -7
- data/vendor/libgit2/src/merge_file.c +4 -6
- data/vendor/libgit2/src/midx.c +418 -0
- data/vendor/libgit2/src/midx.h +83 -0
- data/vendor/libgit2/src/mwindow.c +124 -51
- data/vendor/libgit2/src/net.c +6 -1
- data/vendor/libgit2/src/object.c +2 -1
- data/vendor/libgit2/src/odb.c +9 -6
- data/vendor/libgit2/src/odb_loose.c +3 -3
- data/vendor/libgit2/src/odb_mempack.c +2 -0
- data/vendor/libgit2/src/oid.c +2 -0
- data/vendor/libgit2/src/pack-objects.c +29 -21
- data/vendor/libgit2/src/pack.c +47 -28
- data/vendor/libgit2/src/pack.h +19 -2
- data/vendor/libgit2/src/patch_generate.c +1 -3
- data/vendor/libgit2/src/patch_parse.c +4 -2
- data/vendor/libgit2/src/path.c +4 -4
- data/vendor/libgit2/src/pathspec.c +4 -3
- data/vendor/libgit2/src/pool.c +21 -15
- data/vendor/libgit2/src/pool.h +9 -1
- data/vendor/libgit2/src/proxy.c +2 -0
- data/vendor/libgit2/src/push.c +2 -0
- data/vendor/libgit2/src/rebase.c +2 -0
- data/vendor/libgit2/src/refdb.c +135 -0
- data/vendor/libgit2/src/refdb.h +69 -0
- data/vendor/libgit2/src/refdb_fs.c +19 -81
- data/vendor/libgit2/src/reflog.c +2 -6
- data/vendor/libgit2/src/refs.c +60 -188
- data/vendor/libgit2/src/refs.h +1 -19
- data/vendor/libgit2/src/regexp.c +2 -2
- data/vendor/libgit2/src/remote.c +32 -17
- data/vendor/libgit2/src/repository.c +168 -79
- data/vendor/libgit2/src/repository.h +10 -27
- data/vendor/libgit2/src/revert.c +2 -0
- data/vendor/libgit2/src/revparse.c +5 -4
- data/vendor/libgit2/src/revwalk.c +3 -5
- data/vendor/libgit2/src/settings.c +9 -0
- data/vendor/libgit2/src/sortedcache.c +2 -3
- data/vendor/libgit2/src/stash.c +2 -0
- data/vendor/libgit2/src/status.c +2 -0
- data/vendor/libgit2/src/strarray.c +63 -0
- data/vendor/libgit2/src/streams/openssl.c +12 -6
- data/vendor/libgit2/src/streams/registry.c +5 -3
- data/vendor/libgit2/src/submodule.c +6 -4
- data/vendor/libgit2/src/sysdir.c +4 -20
- data/vendor/libgit2/src/sysdir.h +0 -11
- data/vendor/libgit2/src/tag.c +2 -0
- data/vendor/libgit2/src/thread-utils.h +139 -21
- data/vendor/libgit2/src/transaction.c +2 -1
- data/vendor/libgit2/src/transports/credential.c +2 -0
- data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
- data/vendor/libgit2/src/transports/httpclient.c +6 -8
- data/vendor/libgit2/src/transports/local.c +2 -2
- data/vendor/libgit2/src/transports/smart.c +2 -2
- data/vendor/libgit2/src/transports/winhttp.c +18 -7
- data/vendor/libgit2/src/unix/posix.h +13 -1
- data/vendor/libgit2/src/util.c +25 -58
- data/vendor/libgit2/src/util.h +2 -2
- data/vendor/libgit2/src/win32/git2.rc +18 -3
- data/vendor/libgit2/src/win32/path_w32.c +2 -2
- data/vendor/libgit2/src/worktree.c +4 -0
- metadata +27 -25
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
- data/vendor/libgit2/src/refdb_fs.h +0 -19
data/vendor/libgit2/src/pool.h
CHANGED
@@ -81,7 +81,7 @@ typedef struct {
|
|
81
81
|
* Of course, you can use this in other ways, but those are the
|
82
82
|
* two most common patterns.
|
83
83
|
*/
|
84
|
-
extern
|
84
|
+
extern int git_pool_init(git_pool *pool, size_t item_size);
|
85
85
|
|
86
86
|
/**
|
87
87
|
* Free all items in pool
|
@@ -135,4 +135,12 @@ extern uint32_t git_pool__open_pages(git_pool *pool);
|
|
135
135
|
#endif
|
136
136
|
extern bool git_pool__ptr_in_pool(git_pool *pool, void *ptr);
|
137
137
|
|
138
|
+
/**
|
139
|
+
* This function is being called by our global setup routines to
|
140
|
+
* initialize the system pool size.
|
141
|
+
*
|
142
|
+
* @return 0 on success, <0 on failure
|
143
|
+
*/
|
144
|
+
extern int git_pool_global_init(void);
|
145
|
+
|
138
146
|
#endif
|
data/vendor/libgit2/src/proxy.c
CHANGED
@@ -16,10 +16,12 @@ int git_proxy_options_init(git_proxy_options *opts, unsigned int version)
|
|
16
16
|
return 0;
|
17
17
|
}
|
18
18
|
|
19
|
+
#ifndef GIT_DEPRECATE_HARD
|
19
20
|
int git_proxy_init_options(git_proxy_options *opts, unsigned int version)
|
20
21
|
{
|
21
22
|
return git_proxy_options_init(opts, version);
|
22
23
|
}
|
24
|
+
#endif
|
23
25
|
|
24
26
|
int git_proxy_options_dup(git_proxy_options *tgt, const git_proxy_options *src)
|
25
27
|
{
|
data/vendor/libgit2/src/push.c
CHANGED
@@ -555,7 +555,9 @@ int git_push_options_init(git_push_options *opts, unsigned int version)
|
|
555
555
|
return 0;
|
556
556
|
}
|
557
557
|
|
558
|
+
#ifndef GIT_DEPRECATE_HARD
|
558
559
|
int git_push_init_options(git_push_options *opts, unsigned int version)
|
559
560
|
{
|
560
561
|
return git_push_options_init(opts, version);
|
561
562
|
}
|
563
|
+
#endif
|
data/vendor/libgit2/src/rebase.c
CHANGED
@@ -501,10 +501,12 @@ int git_rebase_options_init(git_rebase_options *opts, unsigned int version)
|
|
501
501
|
return 0;
|
502
502
|
}
|
503
503
|
|
504
|
+
#ifndef GIT_DEPRECATE_HARD
|
504
505
|
int git_rebase_init_options(git_rebase_options *opts, unsigned int version)
|
505
506
|
{
|
506
507
|
return git_rebase_options_init(opts, version);
|
507
508
|
}
|
509
|
+
#endif
|
508
510
|
|
509
511
|
static int rebase_ensure_not_in_progress(git_repository *repo)
|
510
512
|
{
|
data/vendor/libgit2/src/refdb.c
CHANGED
@@ -17,6 +17,9 @@
|
|
17
17
|
#include "reflog.h"
|
18
18
|
#include "posix.h"
|
19
19
|
|
20
|
+
#define DEFAULT_NESTING_LEVEL 5
|
21
|
+
#define MAX_NESTING_LEVEL 10
|
22
|
+
|
20
23
|
int git_refdb_new(git_refdb **out, git_repository *repo)
|
21
24
|
{
|
22
25
|
git_refdb *db;
|
@@ -134,6 +137,59 @@ int git_refdb_lookup(git_reference **out, git_refdb *db, const char *ref_name)
|
|
134
137
|
return 0;
|
135
138
|
}
|
136
139
|
|
140
|
+
int git_refdb_resolve(
|
141
|
+
git_reference **out,
|
142
|
+
git_refdb *db,
|
143
|
+
const char *ref_name,
|
144
|
+
int max_nesting)
|
145
|
+
{
|
146
|
+
git_reference *ref = NULL;
|
147
|
+
int error = 0, nesting;
|
148
|
+
|
149
|
+
*out = NULL;
|
150
|
+
|
151
|
+
if (max_nesting > MAX_NESTING_LEVEL)
|
152
|
+
max_nesting = MAX_NESTING_LEVEL;
|
153
|
+
else if (max_nesting < 0)
|
154
|
+
max_nesting = DEFAULT_NESTING_LEVEL;
|
155
|
+
|
156
|
+
if ((error = git_refdb_lookup(&ref, db, ref_name)) < 0)
|
157
|
+
goto out;
|
158
|
+
|
159
|
+
for (nesting = 0; nesting < max_nesting; nesting++) {
|
160
|
+
git_reference *resolved;
|
161
|
+
|
162
|
+
if (ref->type == GIT_REFERENCE_DIRECT)
|
163
|
+
break;
|
164
|
+
|
165
|
+
if ((error = git_refdb_lookup(&resolved, db, git_reference_symbolic_target(ref))) < 0) {
|
166
|
+
/* If we found a symbolic reference with a nonexistent target, return it. */
|
167
|
+
if (error == GIT_ENOTFOUND) {
|
168
|
+
error = 0;
|
169
|
+
*out = ref;
|
170
|
+
ref = NULL;
|
171
|
+
}
|
172
|
+
goto out;
|
173
|
+
}
|
174
|
+
|
175
|
+
git_reference_free(ref);
|
176
|
+
ref = resolved;
|
177
|
+
}
|
178
|
+
|
179
|
+
if (ref->type != GIT_REFERENCE_DIRECT && max_nesting != 0) {
|
180
|
+
git_error_set(GIT_ERROR_REFERENCE,
|
181
|
+
"cannot resolve reference (>%u levels deep)", max_nesting);
|
182
|
+
error = -1;
|
183
|
+
goto out;
|
184
|
+
}
|
185
|
+
|
186
|
+
*out = ref;
|
187
|
+
ref = NULL;
|
188
|
+
out:
|
189
|
+
git_reference_free(ref);
|
190
|
+
return error;
|
191
|
+
}
|
192
|
+
|
137
193
|
int git_refdb_iterator(git_reference_iterator **out, git_refdb *db, const char *glob)
|
138
194
|
{
|
139
195
|
int error;
|
@@ -231,6 +287,85 @@ int git_refdb_reflog_read(git_reflog **out, git_refdb *db, const char *name)
|
|
231
287
|
return 0;
|
232
288
|
}
|
233
289
|
|
290
|
+
int git_refdb_should_write_reflog(int *out, git_refdb *db, const git_reference *ref)
|
291
|
+
{
|
292
|
+
int error, logall;
|
293
|
+
|
294
|
+
error = git_repository__configmap_lookup(&logall, db->repo, GIT_CONFIGMAP_LOGALLREFUPDATES);
|
295
|
+
if (error < 0)
|
296
|
+
return error;
|
297
|
+
|
298
|
+
/* Defaults to the opposite of the repo being bare */
|
299
|
+
if (logall == GIT_LOGALLREFUPDATES_UNSET)
|
300
|
+
logall = !git_repository_is_bare(db->repo);
|
301
|
+
|
302
|
+
*out = 0;
|
303
|
+
switch (logall) {
|
304
|
+
case GIT_LOGALLREFUPDATES_FALSE:
|
305
|
+
*out = 0;
|
306
|
+
break;
|
307
|
+
|
308
|
+
case GIT_LOGALLREFUPDATES_TRUE:
|
309
|
+
/* Only write if it already has a log,
|
310
|
+
* or if it's under heads/, remotes/ or notes/
|
311
|
+
*/
|
312
|
+
*out = git_refdb_has_log(db, ref->name) ||
|
313
|
+
!git__prefixcmp(ref->name, GIT_REFS_HEADS_DIR) ||
|
314
|
+
!git__strcmp(ref->name, GIT_HEAD_FILE) ||
|
315
|
+
!git__prefixcmp(ref->name, GIT_REFS_REMOTES_DIR) ||
|
316
|
+
!git__prefixcmp(ref->name, GIT_REFS_NOTES_DIR);
|
317
|
+
break;
|
318
|
+
|
319
|
+
case GIT_LOGALLREFUPDATES_ALWAYS:
|
320
|
+
*out = 1;
|
321
|
+
break;
|
322
|
+
}
|
323
|
+
|
324
|
+
return 0;
|
325
|
+
}
|
326
|
+
|
327
|
+
int git_refdb_should_write_head_reflog(int *out, git_refdb *db, const git_reference *ref)
|
328
|
+
{
|
329
|
+
git_reference *head = NULL, *resolved = NULL;
|
330
|
+
const char *name;
|
331
|
+
int error;
|
332
|
+
|
333
|
+
*out = 0;
|
334
|
+
|
335
|
+
if (ref->type == GIT_REFERENCE_SYMBOLIC) {
|
336
|
+
error = 0;
|
337
|
+
goto out;
|
338
|
+
}
|
339
|
+
|
340
|
+
if ((error = git_refdb_lookup(&head, db, GIT_HEAD_FILE)) < 0)
|
341
|
+
goto out;
|
342
|
+
|
343
|
+
if (git_reference_type(head) == GIT_REFERENCE_DIRECT)
|
344
|
+
goto out;
|
345
|
+
|
346
|
+
/* Go down the symref chain until we find the branch */
|
347
|
+
if ((error = git_refdb_resolve(&resolved, db, git_reference_symbolic_target(head), -1)) < 0) {
|
348
|
+
if (error != GIT_ENOTFOUND)
|
349
|
+
goto out;
|
350
|
+
error = 0;
|
351
|
+
name = git_reference_symbolic_target(head);
|
352
|
+
} else if (git_reference_type(resolved) == GIT_REFERENCE_SYMBOLIC) {
|
353
|
+
name = git_reference_symbolic_target(resolved);
|
354
|
+
} else {
|
355
|
+
name = git_reference_name(resolved);
|
356
|
+
}
|
357
|
+
|
358
|
+
if (strcmp(name, ref->name))
|
359
|
+
goto out;
|
360
|
+
|
361
|
+
*out = 1;
|
362
|
+
|
363
|
+
out:
|
364
|
+
git_reference_free(resolved);
|
365
|
+
git_reference_free(head);
|
366
|
+
return error;
|
367
|
+
}
|
368
|
+
|
234
369
|
int git_refdb_has_log(git_refdb *db, const char *refname)
|
235
370
|
{
|
236
371
|
assert(db && refname);
|
data/vendor/libgit2/src/refdb.h
CHANGED
@@ -30,6 +30,31 @@ int git_refdb_lookup(
|
|
30
30
|
git_refdb *refdb,
|
31
31
|
const char *ref_name);
|
32
32
|
|
33
|
+
/**
|
34
|
+
* Resolve the reference by following symbolic references.
|
35
|
+
*
|
36
|
+
* Given a reference name, this function will follow any symbolic references up
|
37
|
+
* to `max_nesting` deep and return the resolved direct reference. If any of
|
38
|
+
* the intermediate symbolic references points to a non-existing reference,
|
39
|
+
* then that symbolic reference is returned instead with an error code of `0`.
|
40
|
+
* If the given reference is a direct reference already, it is returned
|
41
|
+
* directly.
|
42
|
+
*
|
43
|
+
* If `max_nesting` is `0`, the reference will not be resolved. If it's
|
44
|
+
* negative, it will be set to the default resolve depth which is `5`.
|
45
|
+
*
|
46
|
+
* @param out Pointer to store the result in.
|
47
|
+
* @param db The refdb to use for resolving the reference.
|
48
|
+
* @param ref_name The reference name to lookup and resolve.
|
49
|
+
* @param max_nesting The maximum nesting depth.
|
50
|
+
* @return `0` on success, a negative error code otherwise.
|
51
|
+
*/
|
52
|
+
int git_refdb_resolve(
|
53
|
+
git_reference **out,
|
54
|
+
git_refdb *db,
|
55
|
+
const char *ref_name,
|
56
|
+
int max_nesting);
|
57
|
+
|
33
58
|
int git_refdb_rename(
|
34
59
|
git_reference **out,
|
35
60
|
git_refdb *db,
|
@@ -50,6 +75,50 @@ int git_refdb_delete(git_refdb *refdb, const char *ref_name, const git_oid *old_
|
|
50
75
|
int git_refdb_reflog_read(git_reflog **out, git_refdb *db, const char *name);
|
51
76
|
int git_refdb_reflog_write(git_reflog *reflog);
|
52
77
|
|
78
|
+
/**
|
79
|
+
* Determine whether a reflog entry should be created for the given reference.
|
80
|
+
*
|
81
|
+
* Whether or not writing to a reference should create a reflog entry is
|
82
|
+
* dependent on a number of things. Most importantly, there's the
|
83
|
+
* "core.logAllRefUpdates" setting that controls in which situations a
|
84
|
+
* reference should get a corresponding reflog entry. The following values for
|
85
|
+
* it are understood:
|
86
|
+
*
|
87
|
+
* - "false": Do not log reference updates.
|
88
|
+
*
|
89
|
+
* - "true": Log normal reference updates. This will write entries for
|
90
|
+
* references in "refs/heads", "refs/remotes", "refs/notes" and
|
91
|
+
* "HEAD" or if the reference already has a log entry.
|
92
|
+
*
|
93
|
+
* - "always": Always create a reflog entry.
|
94
|
+
*
|
95
|
+
* If unset, the value will default to "true" for non-bare repositories and
|
96
|
+
* "false" for bare ones.
|
97
|
+
*
|
98
|
+
* @param out pointer to which the result will be written, `1` means a reflog
|
99
|
+
* entry should be written, `0` means none should be written.
|
100
|
+
* @param db The refdb to decide this for.
|
101
|
+
* @param ref The reference one wants to check.
|
102
|
+
* @return `0` on success, a negative error code otherwise.
|
103
|
+
*/
|
104
|
+
int git_refdb_should_write_reflog(int *out, git_refdb *db, const git_reference *ref);
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Determine whether a reflog entry should be created for HEAD if creating one
|
108
|
+
* for the given reference
|
109
|
+
*
|
110
|
+
* In case the given reference is being pointed to by HEAD, then creating a
|
111
|
+
* reflog entry for this reference also requires us to create a corresponding
|
112
|
+
* reflog entry for HEAD. This function can be used to determine that scenario.
|
113
|
+
*
|
114
|
+
* @param out pointer to which the result will be written, `1` means a reflog
|
115
|
+
* entry should be written, `0` means none should be written.
|
116
|
+
* @param db The refdb to decide this for.
|
117
|
+
* @param ref The reference one wants to check.
|
118
|
+
* @return `0` on success, a negative error code otherwise.
|
119
|
+
*/
|
120
|
+
int git_refdb_should_write_head_reflog(int *out, git_refdb *db, const git_reference *ref);
|
121
|
+
|
53
122
|
int git_refdb_has_log(git_refdb *db, const char *refname);
|
54
123
|
int git_refdb_ensure_log(git_refdb *refdb, const char *refname);
|
55
124
|
|
@@ -5,8 +5,6 @@
|
|
5
5
|
* a Linking Exception. For full terms see the included COPYING file.
|
6
6
|
*/
|
7
7
|
|
8
|
-
#include "refdb_fs.h"
|
9
|
-
|
10
8
|
#include "refs.h"
|
11
9
|
#include "hash.h"
|
12
10
|
#include "repository.h"
|
@@ -685,7 +683,8 @@ static int refdb_fs_backend__iterator(
|
|
685
683
|
iter = git__calloc(1, sizeof(refdb_fs_iter));
|
686
684
|
GIT_ERROR_CHECK_ALLOC(iter);
|
687
685
|
|
688
|
-
git_pool_init(&iter->pool, 1)
|
686
|
+
if ((error = git_pool_init(&iter->pool, 1)) < 0)
|
687
|
+
goto out;
|
689
688
|
|
690
689
|
if ((error = git_vector_init(&iter->loose, 8, NULL)) < 0)
|
691
690
|
goto out;
|
@@ -1129,44 +1128,6 @@ cleanup:
|
|
1129
1128
|
}
|
1130
1129
|
|
1131
1130
|
static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, const git_oid *old, const git_oid *new, const git_signature *author, const char *message);
|
1132
|
-
static int has_reflog(git_repository *repo, const char *name);
|
1133
|
-
|
1134
|
-
static int should_write_reflog(int *write, git_repository *repo, const char *name)
|
1135
|
-
{
|
1136
|
-
int error, logall;
|
1137
|
-
|
1138
|
-
error = git_repository__configmap_lookup(&logall, repo, GIT_CONFIGMAP_LOGALLREFUPDATES);
|
1139
|
-
if (error < 0)
|
1140
|
-
return error;
|
1141
|
-
|
1142
|
-
/* Defaults to the opposite of the repo being bare */
|
1143
|
-
if (logall == GIT_LOGALLREFUPDATES_UNSET)
|
1144
|
-
logall = !git_repository_is_bare(repo);
|
1145
|
-
|
1146
|
-
*write = 0;
|
1147
|
-
switch (logall) {
|
1148
|
-
case GIT_LOGALLREFUPDATES_FALSE:
|
1149
|
-
*write = 0;
|
1150
|
-
break;
|
1151
|
-
|
1152
|
-
case GIT_LOGALLREFUPDATES_TRUE:
|
1153
|
-
/* Only write if it already has a log,
|
1154
|
-
* or if it's under heads/, remotes/ or notes/
|
1155
|
-
*/
|
1156
|
-
*write = has_reflog(repo, name) ||
|
1157
|
-
!git__prefixcmp(name, GIT_REFS_HEADS_DIR) ||
|
1158
|
-
!git__strcmp(name, GIT_HEAD_FILE) ||
|
1159
|
-
!git__prefixcmp(name, GIT_REFS_REMOTES_DIR) ||
|
1160
|
-
!git__prefixcmp(name, GIT_REFS_NOTES_DIR);
|
1161
|
-
break;
|
1162
|
-
|
1163
|
-
case GIT_LOGALLREFUPDATES_ALWAYS:
|
1164
|
-
*write = 1;
|
1165
|
-
break;
|
1166
|
-
}
|
1167
|
-
|
1168
|
-
return 0;
|
1169
|
-
}
|
1170
1131
|
|
1171
1132
|
static int cmp_old_ref(int *cmp, git_refdb_backend *backend, const char *name,
|
1172
1133
|
const git_oid *old_id, const char *old_target)
|
@@ -1220,54 +1181,28 @@ out:
|
|
1220
1181
|
*/
|
1221
1182
|
static int maybe_append_head(refdb_fs_backend *backend, const git_reference *ref, const git_signature *who, const char *message)
|
1222
1183
|
{
|
1223
|
-
|
1184
|
+
git_reference *head = NULL;
|
1185
|
+
git_refdb *refdb = NULL;
|
1186
|
+
int error, write_reflog;
|
1224
1187
|
git_oid old_id;
|
1225
|
-
git_reference *tmp = NULL, *head = NULL, *peeled = NULL;
|
1226
|
-
const char *name;
|
1227
1188
|
|
1228
|
-
if (
|
1229
|
-
|
1189
|
+
if ((error = git_repository_refdb(&refdb, backend->repo)) < 0 ||
|
1190
|
+
(error = git_refdb_should_write_head_reflog(&write_reflog, refdb, ref)) < 0)
|
1191
|
+
goto out;
|
1192
|
+
if (!write_reflog)
|
1193
|
+
goto out;
|
1230
1194
|
|
1231
1195
|
/* if we can't resolve, we use {0}*40 as old id */
|
1232
1196
|
if (git_reference_name_to_id(&old_id, backend->repo, ref->name) < 0)
|
1233
1197
|
memset(&old_id, 0, sizeof(old_id));
|
1234
1198
|
|
1235
|
-
if ((error = git_reference_lookup(&head, backend->repo, GIT_HEAD_FILE)) < 0
|
1236
|
-
|
1237
|
-
|
1238
|
-
if (git_reference_type(head) == GIT_REFERENCE_DIRECT)
|
1239
|
-
goto cleanup;
|
1240
|
-
|
1241
|
-
if ((error = git_reference_lookup(&tmp, backend->repo, GIT_HEAD_FILE)) < 0)
|
1242
|
-
goto cleanup;
|
1243
|
-
|
1244
|
-
/* Go down the symref chain until we find the branch */
|
1245
|
-
while (git_reference_type(tmp) == GIT_REFERENCE_SYMBOLIC) {
|
1246
|
-
error = git_reference_lookup(&peeled, backend->repo, git_reference_symbolic_target(tmp));
|
1247
|
-
if (error < 0)
|
1248
|
-
break;
|
1249
|
-
|
1250
|
-
git_reference_free(tmp);
|
1251
|
-
tmp = peeled;
|
1252
|
-
}
|
1253
|
-
|
1254
|
-
if (error == GIT_ENOTFOUND) {
|
1255
|
-
error = 0;
|
1256
|
-
name = git_reference_symbolic_target(tmp);
|
1257
|
-
} else if (error < 0) {
|
1258
|
-
goto cleanup;
|
1259
|
-
} else {
|
1260
|
-
name = git_reference_name(tmp);
|
1261
|
-
}
|
1262
|
-
|
1263
|
-
if (strcmp(name, ref->name))
|
1264
|
-
goto cleanup;
|
1265
|
-
|
1266
|
-
error = reflog_append(backend, head, &old_id, git_reference_target(ref), who, message);
|
1199
|
+
if ((error = git_reference_lookup(&head, backend->repo, GIT_HEAD_FILE)) < 0 ||
|
1200
|
+
(error = reflog_append(backend, head, &old_id, git_reference_target(ref), who, message)) < 0)
|
1201
|
+
goto out;
|
1267
1202
|
|
1268
|
-
|
1269
|
-
git_reference_free(tmp);
|
1203
|
+
out:
|
1270
1204
|
git_reference_free(head);
|
1205
|
+
git_refdb_free(refdb);
|
1271
1206
|
return error;
|
1272
1207
|
}
|
1273
1208
|
|
@@ -1336,7 +1271,10 @@ static int refdb_fs_backend__write_tail(
|
|
1336
1271
|
}
|
1337
1272
|
|
1338
1273
|
if (update_reflog) {
|
1339
|
-
|
1274
|
+
git_refdb *refdb;
|
1275
|
+
|
1276
|
+
if ((error = git_repository_refdb__weakptr(&refdb, backend->repo)) < 0 ||
|
1277
|
+
(error = git_refdb_should_write_reflog(&should_write, refdb, ref)) < 0)
|
1340
1278
|
goto on_error;
|
1341
1279
|
|
1342
1280
|
if (should_write) {
|
data/vendor/libgit2/src/reflog.c
CHANGED
@@ -12,12 +12,8 @@
|
|
12
12
|
#include "signature.h"
|
13
13
|
#include "refdb.h"
|
14
14
|
|
15
|
-
#include
|
16
|
-
|
17
|
-
git_reflog_entry *git_reflog_entry__alloc(void)
|
18
|
-
{
|
19
|
-
return git__calloc(1, sizeof(git_reflog_entry));
|
20
|
-
}
|
15
|
+
#include "git2/sys/refdb_backend.h"
|
16
|
+
#include "git2/sys/reflog.h"
|
21
17
|
|
22
18
|
void git_reflog_entry__free(git_reflog_entry *entry)
|
23
19
|
{
|