diff options
| author | Carlos Martín Nieto <cmn@dwim.me> | 2017-11-19 09:47:07 +0100 |
|---|---|---|
| committer | Carlos Martín Nieto <cmn@dwim.me> | 2017-12-26 17:32:38 +0000 |
| commit | 1b4fbf2e4167c958b7358423e1ee53aa26921eba (patch) | |
| tree | ecb0150e59f27f734597b3db5e35a51a73db37b1 /src | |
| parent | 3ccc1a4deb67212a3e3c69e91fb7a04975819b31 (diff) | |
| download | libgit2-1b4fbf2e4167c958b7358423e1ee53aa26921eba.tar.gz | |
remote: append to FETCH_HEAD rather than overwrite for each refspec
We treat each refspec on its own, but the code currently overwrites the contents
of FETCH_HEAD so we end up with the entries for the last refspec we processed.
Instead, truncate it before performing the updates and append to it when
updating the references.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fetchhead.c | 2 | ||||
| -rw-r--r-- | src/remote.c | 17 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/fetchhead.c b/src/fetchhead.c index ac25723d3..e55e7c85b 100644 --- a/src/fetchhead.c +++ b/src/fetchhead.c @@ -118,7 +118,7 @@ int git_fetchhead_write(git_repository *repo, git_vector *fetchhead_refs) if (git_buf_joinpath(&path, repo->gitdir, GIT_FETCH_HEAD_FILE) < 0) return -1; - if (git_filebuf_open(&file, path.ptr, GIT_FILEBUF_FORCE, GIT_REFS_FILE_MODE) < 0) { + if (git_filebuf_open(&file, path.ptr, GIT_FILEBUF_APPEND, GIT_REFS_FILE_MODE) < 0) { git_buf_free(&path); return -1; } diff --git a/src/remote.c b/src/remote.c index 303911760..4d675af82 100644 --- a/src/remote.c +++ b/src/remote.c @@ -1541,6 +1541,20 @@ cleanup: return error; } +static int truncate_fetch_head(const char *gitdir) +{ + git_buf path = GIT_BUF_INIT; + int error; + + if ((error = git_buf_joinpath(&path, gitdir, GIT_FETCH_HEAD_FILE)) < 0) + return error; + + error = git_futils_truncate(path.ptr, GIT_REFS_FILE_MODE); + git_buf_free(&path); + + return error; +} + int git_remote_update_tips( git_remote *remote, const git_remote_callbacks *callbacks, @@ -1571,6 +1585,9 @@ int git_remote_update_tips( else tagopt = download_tags; + if ((error = truncate_fetch_head(git_repository_path(remote->repo))) < 0) + goto out; + if (tagopt == GIT_REMOTE_DOWNLOAD_TAGS_ALL) { if ((error = update_tips_for_spec(remote, callbacks, update_fetchhead, tagopt, &tagspec, &refs, reflog_message)) < 0) goto out; |
