diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2016-01-04 17:48:34 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2016-01-04 17:55:37 -0800 |
commit | 3bfa8de2f7022370f6ab497a378be51018b49f35 (patch) | |
tree | 6d8373300f8a3efa4343916caaad500d6a7d9501 /subsurface-core/file.c | |
parent | 72ce77a5ee5127c374a56d3de741b808432b6ce5 (diff) | |
download | subsurface-3bfa8de2f7022370f6ab497a378be51018b49f35.tar.gz |
Cloud storage: fix potential crash when avoiding reloading dive list
If we loaded the dive list from cache and then try to figure out if the remote
repository had anything different, we were being super stupid if the SHA was
identical... we had already cleared the dive list by the time we decided that
we didn't need to load things. Granted, the model was still populated (oops),
but the backend data structure was cleared and accesses to it (e.g., when
drawing the profile) would cause things to crash.
The helper function duplicates some code, but trying to not duplicate the code
made things even harder to read.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'subsurface-core/file.c')
-rw-r--r-- | subsurface-core/file.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/subsurface-core/file.c b/subsurface-core/file.c index 62b38eddb..644956dbd 100644 --- a/subsurface-core/file.c +++ b/subsurface-core/file.c @@ -432,6 +432,33 @@ static int parse_file_buffer(const char *filename, struct memblock *mem) return parse_xml_buffer(filename, mem->buffer, mem->size, &dive_table, NULL); } +int check_git_sha(const char *filename) +{ + struct git_repository *git; + const char *branch = NULL; + + git = is_git_repository(filename, &branch, NULL, false); + if (prefs.cloud_git_url && + strstr(filename, prefs.cloud_git_url) + && git == dummy_git_repository) + /* opening the cloud storage repository failed for some reason, + * so we don't know if there is additional data in the remote */ + return 1; + + /* if this is a git repository, do we already have this exact state loaded ? + * get the SHA and compare with what we currently have */ + if (git && git != dummy_git_repository) { + const char *sha = get_sha(git, branch); + if (!same_string(sha, "") && + same_string(sha, saved_git_id) && + !unsaved_changes()) { + fprintf(stderr, "already have loaded SHA %s - don't load again\n", sha); + return 0; + } + } + return 1; +} + int parse_file(const char *filename) { struct git_repository *git; |