mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Cloud storage: track the repository type and pass the information around
This is easier than having various parts of the code to the string comparison on the URL. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
39a0ac965b
commit
e81a67f9d3
1 changed files with 18 additions and 10 deletions
28
git-access.c
28
git-access.c
|
@ -35,6 +35,8 @@
|
|||
git_branch_create(out, repo, branch_name, target, force)
|
||||
#endif
|
||||
|
||||
enum remote_type { OTHER, HTTPS, SSH };
|
||||
|
||||
static char *get_local_dir(const char *remote, const char *branch)
|
||||
{
|
||||
SHA_CTX ctx;
|
||||
|
@ -99,7 +101,7 @@ static int reset_to_remote(git_repository *repo, git_reference *local, const git
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int update_remote(git_repository *repo, git_remote *origin, git_reference *local, git_reference *remote)
|
||||
static int update_remote(git_repository *repo, git_remote *origin, git_reference *local, git_reference *remote, enum remote_type rt)
|
||||
{
|
||||
git_push_options opts = GIT_PUSH_OPTIONS_INIT;
|
||||
git_strarray refspec;
|
||||
|
@ -116,7 +118,7 @@ static int update_remote(git_repository *repo, git_remote *origin, git_reference
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int try_to_update(git_repository *repo, git_remote *origin, git_reference *local, git_reference *remote)
|
||||
static int try_to_update(git_repository *repo, git_remote *origin, git_reference *local, git_reference *remote, enum remote_type rt)
|
||||
{
|
||||
git_oid base;
|
||||
const git_oid *local_id, *remote_id;
|
||||
|
@ -144,7 +146,7 @@ static int try_to_update(git_repository *repo, git_remote *origin, git_reference
|
|||
|
||||
/* Is the local repo the more recent one? See if we can update upstream */
|
||||
if (git_oid_equal(&base, remote_id))
|
||||
return update_remote(repo, origin, local, remote);
|
||||
return update_remote(repo, origin, local, remote, rt);
|
||||
|
||||
/* Merging a bare repository always needs user action */
|
||||
if (git_repository_is_bare(repo))
|
||||
|
@ -190,7 +192,7 @@ int credential_https_cb(git_cred **out,
|
|||
}
|
||||
#endif
|
||||
|
||||
static int check_remote_status(git_repository *repo, git_remote *origin, const char *branch)
|
||||
static int check_remote_status(git_repository *repo, git_remote *origin, const char *branch, enum remote_type rt)
|
||||
{
|
||||
git_reference *local_ref, *remote_ref;
|
||||
|
||||
|
@ -202,7 +204,7 @@ static int check_remote_status(git_repository *repo, git_remote *origin, const c
|
|||
return report_error("Git cache branch %s no longer has an upstream branch", branch);
|
||||
}
|
||||
|
||||
try_to_update(repo, origin, local_ref, remote_ref);
|
||||
try_to_update(repo, origin, local_ref, remote_ref, rt);
|
||||
git_reference_free(local_ref);
|
||||
git_reference_free(remote_ref);
|
||||
}
|
||||
|
@ -212,6 +214,7 @@ static git_repository *update_local_repo(const char *localdir, const char *remot
|
|||
int error;
|
||||
git_repository *repo = NULL;
|
||||
git_remote *origin;
|
||||
enum remote_type rt;
|
||||
|
||||
error = git_repository_open(&repo, localdir);
|
||||
if (error) {
|
||||
|
@ -231,22 +234,27 @@ static git_repository *update_local_repo(const char *localdir, const char *remot
|
|||
return repo;
|
||||
}
|
||||
|
||||
// NOTE! A fetch error is not fatal, we just report it
|
||||
if (strncmp(remote, "ssh://", 6) == 0)
|
||||
rt = SSH;
|
||||
else if (strncmp(remote, "https://", 8) == 0)
|
||||
rt = HTTPS;
|
||||
else
|
||||
rt = OTHER;
|
||||
#if USE_LIBGIT23_API
|
||||
git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;
|
||||
if (strncmp(remote, "ssh://", 6) == 0)
|
||||
if (rt == SSH)
|
||||
opts.callbacks.credentials = credential_ssh_cb;
|
||||
else if (strncmp(remote, "https://", 8) == 0)
|
||||
else if (rt == HTTPS)
|
||||
opts.callbacks.credentials = credential_https_cb;
|
||||
error = git_remote_fetch(origin, NULL, &opts, NULL);
|
||||
#else
|
||||
error = git_remote_fetch(origin, NULL, NULL, NULL);
|
||||
#endif
|
||||
|
||||
// NOTE! A fetch error is not fatal, we just report it
|
||||
if (error)
|
||||
report_error("Unable to fetch remote '%s'", remote);
|
||||
else
|
||||
check_remote_status(repo, origin, branch);
|
||||
check_remote_status(repo, origin, branch, rt);
|
||||
|
||||
git_remote_free(origin);
|
||||
return repo;
|
||||
|
|
Loading…
Add table
Reference in a new issue