diff options
Diffstat (limited to 'core/git-access.c')
-rw-r--r-- | core/git-access.c | 85 |
1 files changed, 42 insertions, 43 deletions
diff --git a/core/git-access.c b/core/git-access.c index e190e4d5f..d7f971c54 100644 --- a/core/git-access.c +++ b/core/git-access.c @@ -25,9 +25,9 @@ bool is_subsurface_cloud = false; -int (*update_progress_cb)(bool, const char *) = NULL; +int (*update_progress_cb)(const char *) = NULL; -void set_git_update_cb(int(*cb)(bool, const char *)) +void set_git_update_cb(int(*cb)(const char *)) { update_progress_cb = cb; } @@ -38,11 +38,11 @@ void set_git_update_cb(int(*cb)(bool, const char *)) // proportional - some parts are based on compute performance, some on network speed) // they also provide information where in the process we are so we can analyze the log // to understand which parts of the process take how much time. -int git_storage_update_progress(bool reset, const char *text) +int git_storage_update_progress(const char *text) { int ret = 0; if (update_progress_cb) - ret = (*update_progress_cb)(reset, text); + ret = (*update_progress_cb)(text); return ret; } @@ -52,12 +52,9 @@ static void progress_cb(const char *path, size_t completed_steps, size_t total_s { (void) path; (void) payload; - static size_t last_percent = -1; - - if (total_steps && 20 * completed_steps / total_steps > last_percent) { - (void)git_storage_update_progress(false, "checkout_progress_cb"); - last_percent = 20 * completed_steps / total_steps; - } + char buf[80]; + snprintf(buf, sizeof(buf), translate("gettextFromC", "Checkout from storage (%lu/%lu)"), completed_steps, total_steps); + (void)git_storage_update_progress(buf); } // this randomly assumes that 80% of the time is spent on the objects and 20% on the deltas @@ -66,21 +63,29 @@ static void progress_cb(const char *path, size_t completed_steps, size_t total_s static int transfer_progress_cb(const git_transfer_progress *stats, void *payload) { (void) payload; - static int last_percent = -1; - int percent = 0; - if (stats->total_objects) - percent = 16 * stats->received_objects / stats->total_objects; - if (stats->total_deltas) - percent += 4 * stats->indexed_deltas / stats->total_deltas; + static int last_done = -1; + char buf[80]; + int done = 0; + int total = 0; + + if (stats->total_objects) { + total = 60; + done = 60 * stats->received_objects / stats->total_objects; + } + if (stats->total_deltas) { + total += 20; + done += 20 * stats->indexed_deltas / stats->total_deltas; + } /* for debugging this is useful char buf[100]; snprintf(buf, 100, "transfer cb rec_obj %d tot_obj %d idx_delta %d total_delta %d local obj %d", stats->received_objects, stats->total_objects, stats->indexed_deltas, stats->total_deltas, stats->local_objects); - return git_storage_update_progress(false, buf); + return git_storage_update_progress(buf); */ - if (percent > last_percent) { - last_percent = percent; - return git_storage_update_progress(false, "transfer cb"); + if (done > last_done) { + last_done = done; + snprintf(buf, sizeof(buf), translate("gettextFromC", "Transfer from storage (%d/%d)"), done, total); + return git_storage_update_progress(buf); } return 0; } @@ -90,16 +95,9 @@ static int push_transfer_progress_cb(unsigned int current, unsigned int total, s { (void) bytes; (void) payload; - static int last_percent = -1; - int percent = 0; - - if (total != 0) - percent = 5 * current / total; - if (percent > last_percent) { - last_percent = percent; - return git_storage_update_progress(false, "push trasfer cb"); - } - return 0; + char buf[80]; + snprintf(buf, sizeof(buf), translate("gettextFromC", "Transfer to storage (%d/%d)"), current, total); + return git_storage_update_progress("push trasfer cb"); } char *get_local_dir(const char *remote, const char *branch) @@ -434,7 +432,7 @@ static int try_to_update(git_repository *repo, git_remote *origin, git_reference if (verbose) fprintf(stderr, "git storage: try to update\n"); - git_storage_update_progress(false, "try to update"); + git_storage_update_progress("try to update"); if (!git_reference_cmp(local, remote)) return 0; @@ -468,7 +466,7 @@ static int try_to_update(git_repository *repo, git_remote *origin, git_reference } /* Is the remote strictly newer? Use it */ if (git_oid_equal(&base, local_id)) { - git_storage_update_progress(false, "fast forward to remote"); + git_storage_update_progress("fast forward to remote"); return reset_to_remote(repo, local, remote_id); } @@ -476,7 +474,7 @@ static int try_to_update(git_repository *repo, git_remote *origin, git_reference if (git_oid_equal(&base, remote_id)) { if (verbose) fprintf(stderr, "local is newer than remote, update remote\n"); - git_storage_update_progress(false, "git_update_remote, local was newer"); + git_storage_update_progress("git_update_remote, local was newer"); return update_remote(repo, origin, local, remote, rt); } /* Merging a bare repository always needs user action */ @@ -494,7 +492,7 @@ static int try_to_update(git_repository *repo, git_remote *origin, git_reference return report_error("Local and remote do not match, local branch not HEAD - cannot update"); } /* Ok, let's try to merge these */ - git_storage_update_progress(false, "try to merge"); + git_storage_update_progress("try to merge"); ret = try_to_git_merge(repo, &local, remote, &base, local_id, remote_id); if (ret == 0) return update_remote(repo, origin, local, remote, rt); @@ -516,7 +514,7 @@ static int check_remote_status(git_repository *repo, git_remote *origin, const c if (verbose) fprintf(stderr, "git storage: check remote status\n"); - git_storage_update_progress(false, "git check remote status"); + git_storage_update_progress("git check remote status"); if (git_branch_lookup(&local_ref, repo, branch, GIT_BRANCH_LOCAL)) { if (is_subsurface_cloud) @@ -537,7 +535,7 @@ static int check_remote_status(git_repository *repo, git_remote *origin, const c else if (rt == RT_HTTPS) opts.callbacks.credentials = credential_https_cb; opts.callbacks.certificate_check = certificate_check_cb; - git_storage_update_progress(false, "git remote push (no remote existed)"); + git_storage_update_progress("git remote push (no remote existed)"); error = git_remote_push(origin, &refspec, &opts); } else { error = try_to_update(repo, origin, local_ref, remote_ref, remote, branch, rt); @@ -561,7 +559,7 @@ int sync_with_remote(git_repository *repo, const char *remote, const char *branc } if (verbose) fprintf(stderr, "sync with remote %s[%s]\n", remote, branch); - git_storage_update_progress(false, "sync with remote"); + git_storage_update_progress("sync with remote"); git_repository_config(&conf, repo); if (rt == RT_HTTPS && getProxyString(&proxy_string)) { if (verbose) @@ -588,7 +586,7 @@ int sync_with_remote(git_repository *repo, const char *remote, const char *branc if (rt == RT_HTTPS && !canReachCloudServer()) { // this is not an error, just a warning message, so return 0 report_error("Cannot connect to cloud server, working with local copy"); - git_storage_update_progress(false, "can't reach cloud server, working with local copy"); + git_storage_update_progress("can't reach cloud server, working with local copy"); return 0; } if (verbose) @@ -601,7 +599,7 @@ int sync_with_remote(git_repository *repo, const char *remote, const char *branc else if (rt == RT_HTTPS) opts.callbacks.credentials = credential_https_cb; opts.callbacks.certificate_check = certificate_check_cb; - git_storage_update_progress(false, "git fetch remote"); + git_storage_update_progress("git fetch remote"); error = git_remote_fetch(origin, NULL, &opts, NULL); // NOTE! A fetch error is not fatal, we just report it if (error) { @@ -616,7 +614,7 @@ int sync_with_remote(git_repository *repo, const char *remote, const char *branc error = check_remote_status(repo, origin, remote, branch, rt); } git_remote_free(origin); - git_storage_update_progress(false, "done with sync with remote"); + git_storage_update_progress("done with sync with remote"); return error; } @@ -636,9 +634,10 @@ static git_repository *update_local_repo(const char *localdir, const char *remot report_error("Unable to open git cache repository at %s: %s", localdir, giterr_last()->message); return NULL; } - if (!prefs.git_local_only) + if (!prefs.git_local_only) { + git_storage_update_progress("update remote repo"); sync_with_remote(repo, remote, branch, rt); - + } return repo; } @@ -774,7 +773,7 @@ static struct git_repository *get_remote_repo(const char *localdir, const char * if (verbose > 1) { fprintf(stderr, "git_remote_repo: accessing %s\n", remote); } - git_storage_update_progress(false, "start git interaction"); + git_storage_update_progress("start git interaction"); /* Do we already have a local cache? */ if (!subsurface_stat(localdir, &st)) { if (!S_ISDIR(st.st_mode)) { |