commit 69844fbab193c41fa361eefe874f37ed2f7d26a3 from: Stefan Sperling date: Thu Jul 11 13:18:52 2019 UTC ensure all rebase-related refs get deleted when rebase is done commit - 2f7f4a8a4e943489e2a24501fe1160d536edb62e commit + 69844fbab193c41fa361eefe874f37ed2f7d26a3 blob - c2920bff83d18f2cd093f31e9d8960b62b6ba815 blob + b663092ccba6c65a0aa8d9f43ae52c922f8bc886 --- lib/worktree.c +++ lib/worktree.c @@ -3872,8 +3872,69 @@ const struct got_error * got_worktree_rebase_postpone(struct got_worktree *worktree) { return lock_worktree(worktree, LOCK_SH); +} + +static const struct got_error * +delete_ref(const char *name, struct got_repository *repo) +{ + const struct got_error *err; + struct got_reference *ref; + + err = got_ref_open(&ref, repo, name, 0); + if (err) { + if (err->code == GOT_ERR_NOT_REF) + return NULL; + return err; + } + + err = got_ref_delete(ref, repo); + got_ref_close(ref); + return err; } +static const struct got_error * +delete_rebase_refs(struct got_worktree *worktree, struct got_repository *repo) +{ + const struct got_error *err; + char *tmp_branch_name = NULL, *new_base_branch_ref_name = NULL; + char *branch_ref_name = NULL, *commit_ref_name = NULL; + + err = get_rebase_tmp_ref_name(&tmp_branch_name, worktree); + if (err) + goto done; + err = delete_ref(tmp_branch_name, repo); + if (err) + goto done; + + err = get_newbase_symref_name(&new_base_branch_ref_name, worktree); + if (err) + goto done; + err = delete_ref(new_base_branch_ref_name, repo); + if (err) + goto done; + + err = get_rebase_branch_symref_name(&branch_ref_name, worktree); + if (err) + goto done; + err = delete_ref(branch_ref_name, repo); + if (err) + goto done; + + err = get_rebase_commit_ref_name(&commit_ref_name, worktree); + if (err) + goto done; + err = delete_ref(commit_ref_name, repo); + if (err) + goto done; + +done: + free(tmp_branch_name); + free(new_base_branch_ref_name); + free(branch_ref_name); + free(commit_ref_name); + return err; +} + const struct got_error * got_worktree_rebase_complete(struct got_worktree *worktree, struct got_reference *new_base_branch, struct got_reference *tmp_branch, @@ -3899,13 +3960,7 @@ got_worktree_rebase_complete(struct got_worktree *work if (err) goto done; - err = got_ref_delete(tmp_branch, repo); - if (err) - goto done; - - err = got_ref_delete(new_base_branch, repo); - if (err) - goto done; + err = delete_rebase_refs(worktree, repo); done: free(new_head_commit_id); unlockerr = lock_worktree(worktree, LOCK_SH); @@ -4006,8 +4061,10 @@ got_worktree_rebase_abort(struct got_worktree *worktre err = revert_file(worktree, fileindex, pe->path, progress_cb, progress_arg, repo); if (err) - break; + goto done; } + + err = delete_rebase_refs(worktree, repo); done: got_ref_close(resolved); free(commit_id);