diff options
-rw-r--r-- | dive.h | 1 | ||||
-rw-r--r-- | load-git.c | 6 | ||||
-rw-r--r-- | save-git.c | 29 |
3 files changed, 30 insertions, 6 deletions
@@ -689,6 +689,7 @@ extern int export_dives_uddf(const char *filename, const bool selected); struct git_oid; struct git_repository; +#define dummy_git_repository ((git_repository *) 3ul) /* Random bogus pointer, not NULL */ extern struct git_repository *is_git_repository(const char *filename, const char **branchp); extern int git_save_dives(struct git_repository *, const char *, bool select_only); extern int git_load_dives(struct git_repository *, const char *); diff --git a/load-git.c b/load-git.c index c861799b4..4040c1677 100644 --- a/load-git.c +++ b/load-git.c @@ -1243,7 +1243,11 @@ static int do_git_load(git_repository *repo, const char *branch) */ int git_load_dives(struct git_repository *repo, const char *branch) { - int ret = do_git_load(repo, branch); + int ret; + + if (repo == dummy_git_repository) + return report_error("Unable to open git repository at '%s'", branch); + ret = do_git_load(repo, branch); git_repository_free(repo); free((void *)branch); finish_active_dive(); diff --git a/save-git.c b/save-git.c index 745f26b01..74eab55bb 100644 --- a/save-git.c +++ b/save-git.c @@ -924,30 +924,45 @@ struct git_repository *is_git_repository(const char *filename, const char **bran if (!flen) return NULL; + /* + * This is the "point of no return": the name matches + * the git repository name rules, and we will no longer + * return NULL. + * + * We will either return "dummy_git_repository" and the + * branch pointer will have the _whole_ filename in it, + * or we will return a real git repository with the + * branch pointer being filled in with just the branch + * name. + * + * The actual git reading/writing routines can use this + * to generate proper error messages. + */ + *branchp = filename; loc = malloc(flen+1); if (!loc) - return NULL; + return dummy_git_repository; memcpy(loc, filename, flen); loc[flen] = 0; branch = malloc(blen+1); if (!branch) { free(loc); - return NULL; + return dummy_git_repository; } memcpy(branch, filename+flen+1, blen); branch[blen] = 0; if (stat(loc, &st) < 0 || !S_ISDIR(st.st_mode)) { free(loc); - return NULL; + return dummy_git_repository; } ret = git_repository_open(&repo, loc); free(loc); if (ret < 0) { free(branch); - return NULL; + return dummy_git_repository; } *branchp = branch; return repo; @@ -955,7 +970,11 @@ struct git_repository *is_git_repository(const char *filename, const char **bran int git_save_dives(struct git_repository *repo, const char *branch, bool select_only) { - int ret = do_git_save(repo, branch, select_only); + int ret; + + if (repo == dummy_git_repository) + return report_error("Unable to open git repository '%s'", branch); + ret = do_git_save(repo, branch, select_only); git_repository_free(repo); free((void *)branch); return ret; |