commit 4e99b47e5866daf36b7280aa372ca5e7046ac586 from: Stefan Sperling date: Fri Oct 04 13:32:57 2019 UTC show temporary branch in 'got branch -l' during rebase and histedit commit - 50284065f7c4b702704a3089a4fbda407631acba commit + 4e99b47e5866daf36b7280aa372ca5e7046ac586 blob - 212005d9592126ec098f1b8aa4bc9d16f95910b0 blob + 6950da9faa544e63ac44b6ff455ff315b08686be --- got/got.c +++ got/got.c @@ -3213,43 +3213,82 @@ usage_branch(void) } static const struct got_error * +list_branch(struct got_repository *repo, struct got_worktree *worktree, + struct got_reference *ref) +{ + const struct got_error *err = NULL; + const char *refname, *marker = " "; + char *refstr; + + refname = got_ref_get_name(ref); + if (worktree && strcmp(refname, + got_worktree_get_head_ref_name(worktree)) == 0) { + struct got_object_id *id = NULL; + + err = got_ref_resolve(&id, repo, ref); + if (err) + return err; + if (got_object_id_cmp(id, + got_worktree_get_base_commit_id(worktree)) == 0) + marker = "* "; + else + marker = "~ "; + free(id); + } + + if (strncmp(refname, "refs/heads/", 11) == 0) + refname += 11; + if (strncmp(refname, "refs/got/worktree/", 18) == 0) + refname += 18; + + refstr = got_ref_to_str(ref); + if (refstr == NULL) + return got_error_from_errno("got_ref_to_str"); + + printf("%s%s: %s\n", marker, refname, refstr); + free(refstr); + return NULL; +} + +static const struct got_error * list_branches(struct got_repository *repo, struct got_worktree *worktree) { static const struct got_error *err = NULL; struct got_reflist_head refs; struct got_reflist_entry *re; + struct got_reference *temp_ref = NULL; + int rebase_in_progress, histedit_in_progress; SIMPLEQ_INIT(&refs); + if (worktree) { + err = got_worktree_rebase_in_progress(&rebase_in_progress, + worktree); + if (err) + return err; + + err = got_worktree_histedit_in_progress(&histedit_in_progress, + worktree); + if (err) + return err; + + if (rebase_in_progress || histedit_in_progress) { + err = got_ref_open(&temp_ref, repo, + got_worktree_get_head_ref_name(worktree), 0); + if (err) + return err; + list_branch(repo, worktree, temp_ref); + got_ref_close(temp_ref); + } + } + err = got_ref_list(&refs, repo, "refs/heads", got_ref_cmp_by_name, NULL); if (err) return err; - SIMPLEQ_FOREACH(re, &refs, entry) { - const char *refname, *marker = " "; - char *refstr; - refname = got_ref_get_name(re->ref); - if (worktree && strcmp(refname, - got_worktree_get_head_ref_name(worktree)) == 0) { - struct got_object_id *id = NULL; - err = got_ref_resolve(&id, repo, re->ref); - if (err) - return err; - if (got_object_id_cmp(id, - got_worktree_get_base_commit_id(worktree)) == 0) - marker = "* "; - else - marker = "~ "; - free(id); - } - refname += strlen("refs/heads/"); - refstr = got_ref_to_str(re->ref); - if (refstr == NULL) - return got_error_from_errno("got_ref_to_str"); - printf("%s%s: %s\n", marker, refname, refstr); - free(refstr); - } + SIMPLEQ_FOREACH(re, &refs, entry) + list_branch(repo, worktree, re->ref); got_ref_list_free(&refs); return NULL;