mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	core: convert git-access.c to C++
Had to make sha.h compatible with C++. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									c2a5e3eb73
								
							
						
					
					
						commit
						b8b55eedaf
					
				
					 5 changed files with 70 additions and 80 deletions
				
			
		|  | @ -58,7 +58,7 @@ SOURCES += subsurface-mobile-main.cpp \ | ||||||
| 	core/divelog.cpp \ | 	core/divelog.cpp \ | ||||||
| 	core/gas-model.c \ | 	core/gas-model.c \ | ||||||
| 	core/gaspressures.c \ | 	core/gaspressures.c \ | ||||||
| 	core/git-access.c \ | 	core/git-access.cpp \ | ||||||
| 	core/globals.cpp \ | 	core/globals.cpp \ | ||||||
| 	core/liquivision.c \ | 	core/liquivision.c \ | ||||||
| 	core/load-git.c \ | 	core/load-git.c \ | ||||||
|  |  | ||||||
|  | @ -107,7 +107,7 @@ set(SUBSURFACE_CORE_LIB_SRCS | ||||||
| 	gettext.h | 	gettext.h | ||||||
| 	gettextfromc.cpp | 	gettextfromc.cpp | ||||||
| 	gettextfromc.h | 	gettextfromc.h | ||||||
| 	git-access.c | 	git-access.cpp | ||||||
| 	git-access.h | 	git-access.h | ||||||
| 	globals.cpp | 	globals.cpp | ||||||
| 	globals.h | 	globals.h | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ static bool includes_string_caseinsensitive(const char *haystack, const char *ne | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void set_git_update_cb(int(*cb)(const char *)) | extern "C" void set_git_update_cb(int(*cb)(const char *)) | ||||||
| { | { | ||||||
| 	update_progress_cb = cb; | 	update_progress_cb = cb; | ||||||
| } | } | ||||||
|  | @ -66,7 +66,7 @@ void set_git_update_cb(int(*cb)(const char *)) | ||||||
| // proportional - some parts are based on compute performance, some on network speed)
 | // 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
 | // 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.
 | // to understand which parts of the process take how much time.
 | ||||||
| int git_storage_update_progress(const char *text) | extern "C" int git_storage_update_progress(const char *text) | ||||||
| { | { | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
| 	if (update_progress_cb) | 	if (update_progress_cb) | ||||||
|  | @ -76,10 +76,8 @@ int git_storage_update_progress(const char *text) | ||||||
| 
 | 
 | ||||||
| // the checkout_progress_cb doesn't allow canceling of the operation
 | // the checkout_progress_cb doesn't allow canceling of the operation
 | ||||||
| // map the git progress to 20% of overall progress
 | // map the git progress to 20% of overall progress
 | ||||||
| static void progress_cb(const char *path, size_t completed_steps, size_t total_steps, void *payload) | static void progress_cb(const char *, size_t completed_steps, size_t total_steps, void *) | ||||||
| { | { | ||||||
| 	UNUSED(path); |  | ||||||
| 	UNUSED(payload); |  | ||||||
| 	char buf[80]; | 	char buf[80]; | ||||||
| 	snprintf(buf, sizeof(buf),  translate("gettextFromC", "Checkout from storage (%lu/%lu)"), completed_steps, total_steps); | 	snprintf(buf, sizeof(buf),  translate("gettextFromC", "Checkout from storage (%lu/%lu)"), completed_steps, total_steps); | ||||||
| 	(void)git_storage_update_progress(buf); | 	(void)git_storage_update_progress(buf); | ||||||
|  | @ -88,10 +86,8 @@ static void progress_cb(const char *path, size_t completed_steps, size_t total_s | ||||||
| // this randomly assumes that 80% of the time is spent on the objects and 20% on the deltas
 | // this randomly assumes that 80% of the time is spent on the objects and 20% on the deltas
 | ||||||
| // map the git progress to 20% of overall progress
 | // map the git progress to 20% of overall progress
 | ||||||
| // if the user cancels the dialog this is passed back to libgit2
 | // if the user cancels the dialog this is passed back to libgit2
 | ||||||
| static int transfer_progress_cb(const git_transfer_progress *stats, void *payload) | static int transfer_progress_cb(const git_transfer_progress *stats, void *) | ||||||
| { | { | ||||||
| 	UNUSED(payload); |  | ||||||
| 
 |  | ||||||
| 	static int last_done = -1; | 	static int last_done = -1; | ||||||
| 	char buf[80]; | 	char buf[80]; | ||||||
| 	int done = 0; | 	int done = 0; | ||||||
|  | @ -119,16 +115,14 @@ static int transfer_progress_cb(const git_transfer_progress *stats, void *payloa | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // the initial push to sync the repos is mapped to 10% of overall progress
 | // the initial push to sync the repos is mapped to 10% of overall progress
 | ||||||
| static int push_transfer_progress_cb(unsigned int current, unsigned int total, size_t bytes, void *payload) | static int push_transfer_progress_cb(unsigned int current, unsigned int total, size_t, void *) | ||||||
| { | { | ||||||
| 	UNUSED(bytes); |  | ||||||
| 	UNUSED(payload); |  | ||||||
| 	char buf[80]; | 	char buf[80]; | ||||||
| 	snprintf(buf, sizeof(buf), translate("gettextFromC", "Transfer to storage (%d/%d)"), current, total); | 	snprintf(buf, sizeof(buf), translate("gettextFromC", "Transfer to storage (%d/%d)"), current, total); | ||||||
| 	return git_storage_update_progress(buf); | 	return git_storage_update_progress(buf); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| char *get_local_dir(const char *url, const char *branch) | extern "C" char *get_local_dir(const char *url, const char *branch) | ||||||
| { | { | ||||||
| 	SHA_CTX ctx; | 	SHA_CTX ctx; | ||||||
| 	unsigned char hash[20]; | 	unsigned char hash[20]; | ||||||
|  | @ -190,7 +184,7 @@ static int reset_to_remote(struct git_info *info, git_reference *local, const gi | ||||||
| 	if (verbose) | 	if (verbose) | ||||||
| 		SSRF_INFO("git storage: reset to remote\n"); | 		SSRF_INFO("git storage: reset to remote\n"); | ||||||
| 
 | 
 | ||||||
| 	// If it's not checked out (bare or not HEAD), just update the reference */
 | 	/* If it's not checked out (bare or not HEAD), just update the reference */ | ||||||
| 	if (git_repository_is_bare(info->repo) || git_branch_is_head(local) != 1) { | 	if (git_repository_is_bare(info->repo) || git_branch_is_head(local) != 1) { | ||||||
| 		git_reference *out; | 		git_reference *out; | ||||||
| 
 | 
 | ||||||
|  | @ -242,16 +236,12 @@ static bool exceeded_auth_attempts() | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int credential_ssh_cb(git_cred **out, | extern "C" int credential_ssh_cb(git_cred **out, | ||||||
| 		  const char *url, | 		  const char *, | ||||||
| 		  const char *username_from_url, | 		  const char *, | ||||||
| 		  unsigned int allowed_types, | 		  unsigned int allowed_types, | ||||||
| 		  void *payload) | 		  void *) | ||||||
| { | { | ||||||
| 	UNUSED(url); |  | ||||||
| 	UNUSED(payload); |  | ||||||
| 	UNUSED(username_from_url); |  | ||||||
| 
 |  | ||||||
| 	const char *username = prefs.cloud_storage_email_encoded; | 	const char *username = prefs.cloud_storage_email_encoded; | ||||||
| 	const char *passphrase = prefs.cloud_storage_password ? prefs.cloud_storage_password : ""; | 	const char *passphrase = prefs.cloud_storage_password ? prefs.cloud_storage_password : ""; | ||||||
| 
 | 
 | ||||||
|  | @ -281,17 +271,12 @@ int credential_ssh_cb(git_cred **out, | ||||||
| 	return GIT_EUSER; | 	return GIT_EUSER; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int credential_https_cb(git_cred **out, | extern "C" int credential_https_cb(git_cred **out, | ||||||
| 			const char *url, | 			const char *, | ||||||
| 			const char *username_from_url, | 			const char *, | ||||||
| 			unsigned int allowed_types, | 			unsigned int, | ||||||
| 			void *payload) | 			void *) | ||||||
| { | { | ||||||
| 	UNUSED(url); |  | ||||||
| 	UNUSED(username_from_url); |  | ||||||
| 	UNUSED(payload); |  | ||||||
| 	UNUSED(allowed_types); |  | ||||||
| 
 |  | ||||||
| 	if (exceeded_auth_attempts()) | 	if (exceeded_auth_attempts()) | ||||||
| 		return GIT_EUSER; | 		return GIT_EUSER; | ||||||
| 
 | 
 | ||||||
|  | @ -301,9 +286,8 @@ int credential_https_cb(git_cred **out, | ||||||
| 	return git_cred_userpass_plaintext_new(out, username, password); | 	return git_cred_userpass_plaintext_new(out, username, password); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int certificate_check_cb(git_cert *cert, int valid, const char *host, void *payload) | extern "C" int certificate_check_cb(git_cert *cert, int valid, const char *host, void *) | ||||||
| { | { | ||||||
| 	UNUSED(payload); |  | ||||||
| 	if (verbose) | 	if (verbose) | ||||||
| 		SSRF_INFO("git storage: certificate callback for host %s with validity %d\n", host, valid); | 		SSRF_INFO("git storage: certificate callback for host %s with validity %d\n", host, valid); | ||||||
| 	if ((same_string(host, CLOUD_HOST_GENERIC) || | 	if ((same_string(host, CLOUD_HOST_GENERIC) || | ||||||
|  | @ -322,10 +306,8 @@ int certificate_check_cb(git_cert *cert, int valid, const char *host, void *payl | ||||||
| 	return valid ? 0 : -1; | 	return valid ? 0 : -1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int update_remote(struct git_info *info, git_remote *origin, git_reference *local, git_reference *remote) | static int update_remote(struct git_info *info, git_remote *origin, git_reference *local, git_reference *) | ||||||
| { | { | ||||||
| 	UNUSED(remote); |  | ||||||
| 
 |  | ||||||
| 	git_push_options opts = GIT_PUSH_OPTIONS_INIT; | 	git_push_options opts = GIT_PUSH_OPTIONS_INIT; | ||||||
| 	git_strarray refspec; | 	git_strarray refspec; | ||||||
| 	const char *name = git_reference_name(local); | 	const char *name = git_reference_name(local); | ||||||
|  | @ -355,11 +337,10 @@ static int update_remote(struct git_info *info, git_remote *origin, git_referenc | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| extern int update_git_checkout(git_repository *repo, git_object *parent, git_tree *tree); | extern "C" int update_git_checkout(git_repository *repo, git_object *parent, git_tree *tree); | ||||||
| 
 | 
 | ||||||
| static int try_to_git_merge(struct git_info *info, git_reference **local_p, git_reference *remote, git_oid *base, const git_oid *local_id, const git_oid *remote_id) | static int try_to_git_merge(struct git_info *info, git_reference **local_p, git_reference *, git_oid *base, const git_oid *local_id, const git_oid *remote_id) | ||||||
| { | { | ||||||
| 	UNUSED(remote); |  | ||||||
| 	git_tree *local_tree, *remote_tree, *base_tree; | 	git_tree *local_tree, *remote_tree, *base_tree; | ||||||
| 	git_commit *local_commit, *remote_commit, *base_commit; | 	git_commit *local_commit, *remote_commit, *base_commit; | ||||||
| 	git_index *merged_index; | 	git_index *merged_index; | ||||||
|  | @ -437,6 +418,7 @@ static int try_to_git_merge(struct git_info *info, git_reference **local_p, git_ | ||||||
| 		git_index_conflict_iterator_free(iter); | 		git_index_conflict_iterator_free(iter); | ||||||
| 		report_error(translate("gettextFromC", "Remote storage and local data diverged. Cannot combine local and remote changes")); | 		report_error(translate("gettextFromC", "Remote storage and local data diverged. Cannot combine local and remote changes")); | ||||||
| 	} | 	} | ||||||
|  | 	{ | ||||||
| 		git_oid merge_oid, commit_oid; | 		git_oid merge_oid, commit_oid; | ||||||
| 		git_tree *merged_tree; | 		git_tree *merged_tree; | ||||||
| 		git_signature *author; | 		git_signature *author; | ||||||
|  | @ -470,6 +452,7 @@ static int try_to_git_merge(struct git_info *info, git_reference **local_p, git_ | ||||||
| 			SSRF_INFO("git storage: successfully merged repositories"); | 			SSRF_INFO("git storage: successfully merged repositories"); | ||||||
| 		free_buffer(&msg); | 		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")); | ||||||
|  | @ -630,7 +613,7 @@ static int check_remote_status(struct git_info *info, git_remote *origin) | ||||||
|  * we test as part of the tests, it's a helper to not leave loads of dead branches on |  * we test as part of the tests, it's a helper to not leave loads of dead branches on | ||||||
|  * the server) |  * the server) | ||||||
|  */ |  */ | ||||||
| void delete_remote_branch(git_repository *repo, const char *remote, const char *branch) | extern "C" void delete_remote_branch(git_repository *repo, const char *remote, const char *branch) | ||||||
| { | { | ||||||
| 	int error; | 	int error; | ||||||
| 	char *proxy_string; | 	char *proxy_string; | ||||||
|  | @ -676,7 +659,7 @@ void delete_remote_branch(git_repository *repo, const char *remote, const char * | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int sync_with_remote(struct git_info *info) | extern "C" int sync_with_remote(struct git_info *info) | ||||||
| { | { | ||||||
| 	int error; | 	int error; | ||||||
| 	git_remote *origin; | 	git_remote *origin; | ||||||
|  | @ -786,9 +769,8 @@ static bool update_local_repo(struct git_info *info) | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int repository_create_cb(git_repository **out, const char *path, int bare, void *payload) | static int repository_create_cb(git_repository **out, const char *path, int bare, void *) | ||||||
| { | { | ||||||
| 	UNUSED(payload); |  | ||||||
| 	char *proxy_string; | 	char *proxy_string; | ||||||
| 	git_config *conf; | 	git_config *conf; | ||||||
| 
 | 
 | ||||||
|  | @ -883,7 +865,7 @@ static bool create_local_repo(struct git_info *info) | ||||||
| 		SSRF_INFO("git storage: returned from git_clone() with return value %d\n", error); | 		SSRF_INFO("git storage: returned from git_clone() with return value %d\n", error); | ||||||
| 	if (error) { | 	if (error) { | ||||||
| 		SSRF_INFO("git storage: clone of %s failed", info->url); | 		SSRF_INFO("git storage: clone of %s failed", info->url); | ||||||
| 		char *msg = ""; | 		const char *msg = ""; | ||||||
| 		if (giterr_last()) { | 		if (giterr_last()) { | ||||||
| 			 msg = giterr_last()->message; | 			 msg = giterr_last()->message; | ||||||
| 			 SSRF_INFO("git storage: error message was %s\n", msg); | 			 SSRF_INFO("git storage: error message was %s\n", msg); | ||||||
|  | @ -1015,7 +997,7 @@ static void extract_username(struct git_info *info, char *url) | ||||||
| 	prefs.cloud_storage_email_encoded = strdup(info->username); | 	prefs.cloud_storage_email_encoded = strdup(info->username); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cleanup_git_info(struct git_info *info) | extern "C" void cleanup_git_info(struct git_info *info) | ||||||
| { | { | ||||||
| 	if (info->repo) | 	if (info->repo) | ||||||
| 		git_repository_free(info->repo); | 		git_repository_free(info->repo); | ||||||
|  | @ -1036,7 +1018,7 @@ void cleanup_git_info(struct git_info *info) | ||||||
|  *    https://host/repo[branch]
 |  *    https://host/repo[branch]
 | ||||||
|  *    file://repo[branch]
 |  *    file://repo[branch]
 | ||||||
|  */ |  */ | ||||||
| bool is_git_repository(const char *filename, struct git_info *info) | extern "C" bool is_git_repository(const char *filename, struct git_info *info) | ||||||
| { | { | ||||||
| 	int flen, blen; | 	int flen, blen; | ||||||
| 	int offset = 1; | 	int offset = 1; | ||||||
|  | @ -1135,7 +1117,7 @@ bool is_git_repository(const char *filename, struct git_info *info) | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool open_git_repository(struct git_info *info) | extern "C" bool open_git_repository(struct git_info *info) | ||||||
| { | { | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * If the repository is local, just open it. There's nothing | 	 * If the repository is local, just open it. There's nothing | ||||||
|  | @ -1163,7 +1145,7 @@ bool open_git_repository(struct git_info *info) | ||||||
| 	return get_remote_repo(info); | 	return get_remote_repo(info); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int git_create_local_repo(const char *filename) | extern "C" int git_create_local_repo(const char *filename) | ||||||
| { | { | ||||||
| 	git_repository *repo; | 	git_repository *repo; | ||||||
| 	char *path = strdup(filename); | 	char *path = strdup(filename); | ||||||
|  | @ -8,6 +8,10 @@ | ||||||
| #ifndef SHA1_H | #ifndef SHA1_H | ||||||
| #define SHA1_H | #define SHA1_H | ||||||
| 
 | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| typedef struct | typedef struct | ||||||
| { | { | ||||||
| 	unsigned long long size; | 	unsigned long long size; | ||||||
|  | @ -35,4 +39,8 @@ static inline void SHA1(const void *dataIn, unsigned long len, unsigned char has | ||||||
| 	SHA1_Final(hashout, &ctx); | 	SHA1_Final(hashout, &ctx); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #endif // SHA1_H
 | #endif // SHA1_H
 | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ static char *strndup (const char *s, size_t n) | ||||||
| 	size_t len = strlen(s); | 	size_t len = strlen(s); | ||||||
| 	if (n < len) | 	if (n < len) | ||||||
| 		len = n; | 		len = n; | ||||||
| 	if ((cpy = malloc(len + 1)) != | 	if ((cpy = (char *)malloc(len + 1)) != | ||||||
| 	    NULL) { | 	    NULL) { | ||||||
| 		cpy[len] = | 		cpy[len] = | ||||||
| 				'\0'; | 				'\0'; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue