cloud-storage: create consistent commit message for merges

This never made sense and I think I just forgot to complete this code
when I first worked on it. Now we can see which version of Subsurface or
Subsurface-mobile created a merge.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2020-04-09 17:05:55 -07:00
parent 7a238b6146
commit 53fb533a99
3 changed files with 11 additions and 5 deletions

View file

@ -349,6 +349,7 @@ static int try_to_git_merge(git_repository *repo, git_reference **local_p, git_r
git_commit *local_commit, *remote_commit, *base_commit; git_commit *local_commit, *remote_commit, *base_commit;
git_index *merged_index; git_index *merged_index;
git_merge_options merge_options; git_merge_options merge_options;
struct membuffer msg = { 0, 0, NULL};
if (verbose) { if (verbose) {
char outlocal[41], outremote[41]; char outlocal[41], outremote[41];
@ -430,10 +431,12 @@ static int try_to_git_merge(git_repository *repo, git_reference **local_p, git_r
goto write_error; goto write_error;
if (git_tree_lookup(&merged_tree, repo, &merge_oid)) if (git_tree_lookup(&merged_tree, repo, &merge_oid))
goto write_error; goto write_error;
if (git_signature_default(&author, repo) < 0) if (get_authorship(repo, &author) < 0)
if (git_signature_now(&author, "Subsurface", "noemail@given") < 0) goto write_error;
goto write_error; const char *user_agent = subsurface_user_agent();
if (git_commit_create_v(&commit_oid, repo, NULL, author, author, NULL, "automatic merge", merged_tree, 2, local_commit, remote_commit)) put_format(&msg, "Automatic merge\n\nCreated by %s\n", user_agent);
free((void *)user_agent);
if (git_commit_create_v(&commit_oid, repo, NULL, author, author, NULL, mb_cstring(&msg), merged_tree, 2, local_commit, remote_commit))
goto write_error; goto write_error;
if (git_commit_lookup(&commit, repo, &commit_oid)) if (git_commit_lookup(&commit, repo, &commit_oid))
goto write_error; goto write_error;
@ -450,12 +453,14 @@ static int try_to_git_merge(git_repository *repo, git_reference **local_p, git_r
git_signature_free(author); git_signature_free(author);
if (verbose) if (verbose)
fprintf(stderr, "Successfully merged repositories"); fprintf(stderr, "Successfully merged repositories");
free_buffer(&msg);
return 0; return 0;
diverged_error: diverged_error:
return report_error(translate("gettextFromC", "Remote storage and local data diverged")); return report_error(translate("gettextFromC", "Remote storage and local data diverged"));
write_error: write_error:
free_buffer(&msg);
return report_error(translate("gettextFromC", "Remote storage and local data diverged. Error: writing the data failed (%s)"), giterr_last()->message); return report_error(translate("gettextFromC", "Remote storage and local data diverged. Error: writing the data failed (%s)"), giterr_last()->message);
} }

View file

@ -31,6 +31,7 @@ void set_git_update_cb(int(*)(const char *));
int git_storage_update_progress(const char *text); int git_storage_update_progress(const char *text);
char *get_local_dir(const char *remote, const char *branch); char *get_local_dir(const char *remote, const char *branch);
int git_create_local_repo(const char *filename); int git_create_local_repo(const char *filename);
int get_authorship(git_repository *repo, git_signature **authorp);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1020,7 +1020,7 @@ int update_git_checkout(git_repository *repo, git_object *parent, git_tree *tree
return git_checkout_tree(repo, (git_object *) tree, &opts); return git_checkout_tree(repo, (git_object *) tree, &opts);
} }
static int get_authorship(git_repository *repo, git_signature **authorp) int get_authorship(git_repository *repo, git_signature **authorp)
{ {
if (git_signature_default(authorp, repo) == 0) if (git_signature_default(authorp, repo) == 0)
return 0; return 0;