mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	git: load into arbitrary dive tables
The git parser loads into the global dive table, even if it is called indirectly via parse_file(). However, parse_file() may be given a different table. Fix this by extending the git parser state. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									2042a47230
								
							
						
					
					
						commit
						ed3e68c36a
					
				
					 4 changed files with 13 additions and 7 deletions
				
			
		|  | @ -325,7 +325,7 @@ int parse_file(const char *filename, struct dive_table *table, struct trip_table | ||||||
| 	} | 	} | ||||||
| 	free(current_sha); | 	free(current_sha); | ||||||
| 	if (git) | 	if (git) | ||||||
| 		return git_load_dives(git, branch); | 		return git_load_dives(git, branch, table, trips, sites); | ||||||
| 
 | 
 | ||||||
| 	if ((ret = readfile(filename, &mem)) < 0) { | 	if ((ret = readfile(filename, &mem)) < 0) { | ||||||
| 		/* we don't want to display an error if this was the default file  */ | 		/* we don't want to display an error if this was the default file  */ | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ extern struct git_repository *is_git_repository(const char *filename, const char | ||||||
| extern int check_git_sha(const char *filename, git_repository **git_p, const char **branch_p); | extern int check_git_sha(const char *filename, git_repository **git_p, const char **branch_p); | ||||||
| extern int sync_with_remote(struct git_repository *repo, const char *remote, const char *branch, enum remote_transport rt); | extern int sync_with_remote(struct git_repository *repo, const char *remote, const char *branch, enum remote_transport rt); | ||||||
| extern int git_save_dives(struct git_repository *, const char *, const char *remote, bool select_only); | extern int git_save_dives(struct git_repository *, const char *, const char *remote, bool select_only); | ||||||
| extern int git_load_dives(struct git_repository *, const char *); | extern int git_load_dives(struct git_repository *repo, const char *branch, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites); | ||||||
| extern const char *get_sha(git_repository *repo, const char *branch); | extern const char *get_sha(git_repository *repo, const char *branch); | ||||||
| extern int do_git_save(git_repository *repo, const char *branch, const char *remote, bool select_only, bool create_empty); | extern int do_git_save(git_repository *repo, const char *branch, const char *remote, bool select_only, bool create_empty); | ||||||
| extern const char *saved_git_id; | extern const char *saved_git_id; | ||||||
|  |  | ||||||
|  | @ -34,6 +34,9 @@ struct git_parser_state { | ||||||
| 	dive_trip_t *active_trip; | 	dive_trip_t *active_trip; | ||||||
| 	struct picture *active_pic; | 	struct picture *active_pic; | ||||||
| 	struct dive_site *active_site; | 	struct dive_site *active_site; | ||||||
|  | 	struct dive_table *table; | ||||||
|  | 	struct trip_table *trips; | ||||||
|  | 	struct dive_site_table *sites; | ||||||
| 	int o2pressure_sensor; | 	int o2pressure_sensor; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -159,7 +162,7 @@ static void parse_dive_gps(char *line, struct membuffer *str, struct git_parser_ | ||||||
| 
 | 
 | ||||||
| 	parse_location(line, &location); | 	parse_location(line, &location); | ||||||
| 	if (!ds) { | 	if (!ds) { | ||||||
| 		ds = get_dive_site_by_gps(&location, &dive_site_table); | 		ds = get_dive_site_by_gps(&location, state->sites); | ||||||
| 		if (!ds) | 		if (!ds) | ||||||
| 			ds = create_dive_site_with_gps("", &location, &dive_site_table); | 			ds = create_dive_site_with_gps("", &location, &dive_site_table); | ||||||
| 		add_dive_to_dive_site(state->active_dive, ds); | 		add_dive_to_dive_site(state->active_dive, ds); | ||||||
|  | @ -1225,7 +1228,7 @@ static void finish_active_trip(struct git_parser_state *state) | ||||||
| 
 | 
 | ||||||
| 	if (trip) { | 	if (trip) { | ||||||
| 		state->active_trip = NULL; | 		state->active_trip = NULL; | ||||||
| 		insert_trip(trip, &trip_table); | 		insert_trip(trip, state->trips); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1235,7 +1238,7 @@ static void finish_active_dive(struct git_parser_state *state) | ||||||
| 
 | 
 | ||||||
| 	if (dive) { | 	if (dive) { | ||||||
| 		state->active_dive = NULL; | 		state->active_dive = NULL; | ||||||
| 		record_dive(dive); | 		record_dive_to_table(dive, state->table); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1729,11 +1732,14 @@ const char *get_sha(git_repository *repo, const char *branch) | ||||||
|  * If it is a git repository, we return zero for success, |  * If it is a git repository, we return zero for success, | ||||||
|  * or report an error and return 1 if the load failed. |  * or report an error and return 1 if the load failed. | ||||||
|  */ |  */ | ||||||
| int git_load_dives(struct git_repository *repo, const char *branch) | int git_load_dives(struct git_repository *repo, const char *branch, struct dive_table *table, struct trip_table *trips, struct dive_site_table *sites) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| 	struct git_parser_state state = { 0 }; | 	struct git_parser_state state = { 0 }; | ||||||
| 	state.repo = repo; | 	state.repo = repo; | ||||||
|  | 	state.table = table; | ||||||
|  | 	state.trips = trips; | ||||||
|  | 	state.sites = sites; | ||||||
| 
 | 
 | ||||||
| 	if (repo == dummy_git_repository) | 	if (repo == dummy_git_repository) | ||||||
| 		return report_error("Unable to open git repository at '%s'", branch); | 		return report_error("Unable to open git repository at '%s'", branch); | ||||||
|  |  | ||||||
|  | @ -693,7 +693,7 @@ void QMLManager::loadDivesWithValidCredentials() | ||||||
| 	} | 	} | ||||||
| 	if (git != dummy_git_repository) { | 	if (git != dummy_git_repository) { | ||||||
| 		appendTextToLog(QString("have repository and branch %1").arg(branch)); | 		appendTextToLog(QString("have repository and branch %1").arg(branch)); | ||||||
| 		error = git_load_dives(git, branch); | 		error = git_load_dives(git, branch, &dive_table, &trip_table, &dive_site_table); | ||||||
| 	} else { | 	} else { | ||||||
| 		appendTextToLog(QString("didn't receive valid git repo, try again")); | 		appendTextToLog(QString("didn't receive valid git repo, try again")); | ||||||
| 		error = parse_file(fileNamePrt.data(), &dive_table, &trip_table, &dive_site_table); | 		error = parse_file(fileNamePrt.data(), &dive_table, &trip_table, &dive_site_table); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue