From: Michael Rappazzo <rappazzo@gmail.com>
To: gitster@pobox.com, sunshine@sunshineco.com, dturner@twopensource.com
Cc: git@vger.kernel.org, Michael Rappazzo <rappazzo@gmail.com>
Subject: [PATCH v9 4/5] worktree: add details to the worktree struct
Date: Fri, 2 Oct 2015 07:55:34 -0400 [thread overview]
Message-ID: <1443786935-81131-5-git-send-email-rappazzo@gmail.com> (raw)
In-Reply-To: <1443786935-81131-1-git-send-email-rappazzo@gmail.com>
In addition to the absolute path in the worktree struct, add the location
of the git dir, the head ref (if not detached), the head revision sha1,
whether or not head is detached, and whether or not the worktree is a
bare repo.
Signed-off-by: Michael Rappazzo <rappazzo@gmail.com>
---
worktree.c | 55 ++++++++++++++++++++++++++++++++++++++++++++-----------
worktree.h | 4 ++++
2 files changed, 48 insertions(+), 11 deletions(-)
diff --git a/worktree.c b/worktree.c
index 11a3364..27af98a 100644
--- a/worktree.c
+++ b/worktree.c
@@ -9,6 +9,8 @@ void free_worktrees(struct worktree **worktrees)
for (i = 0; worktrees[i]; i++) {
free(worktrees[i]->path);
+ free(worktrees[i]->git_dir);
+ free(worktrees[i]->head_ref);
free(worktrees[i]);
}
free (worktrees);
@@ -48,6 +50,21 @@ static int parse_ref(char *path_to_ref, struct strbuf *ref, int *is_detached)
}
/**
+ * Add the head_sha1 and head_ref (if not detached) to the given worktree
+ */
+static void add_head_info(struct strbuf *head_ref, struct worktree *worktree)
+{
+ if (head_ref->len) {
+ if (worktree->is_detached) {
+ get_sha1_hex(head_ref->buf, worktree->head_sha1);
+ } else {
+ resolve_ref_unsafe(head_ref->buf, 0, worktree->head_sha1, NULL);
+ worktree->head_ref = strbuf_detach(head_ref, NULL);
+ }
+ }
+}
+
+/**
* get the main worktree
*/
static struct worktree *get_main_worktree(void)
@@ -57,19 +74,29 @@ static struct worktree *get_main_worktree(void)
struct strbuf worktree_path = STRBUF_INIT;
struct strbuf gitdir = STRBUF_INIT;
struct strbuf head_ref = STRBUF_INIT;
+ int is_bare = 0;
+ int is_detached = 0;
strbuf_addf(&gitdir, "%s", absolute_path(get_git_common_dir()));
strbuf_addbuf(&worktree_path, &gitdir);
- if (!strbuf_strip_suffix(&worktree_path, "/.git"))
+ is_bare = !strbuf_strip_suffix(&worktree_path, "/.git");
+ if (is_bare)
strbuf_strip_suffix(&worktree_path, "/.");
strbuf_addf(&path, "%s/HEAD", get_git_common_dir());
- if (parse_ref(path.buf, &head_ref, NULL) >= 0) {
- worktree = xmalloc(sizeof(struct worktree));
- worktree->path = strbuf_detach(&worktree_path, NULL);
- worktree->git_dir = strbuf_detach(&gitdir, NULL);
- }
+ if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
+ goto done;
+
+ worktree = xmalloc(sizeof(struct worktree));
+ worktree->path = strbuf_detach(&worktree_path, NULL);
+ worktree->git_dir = strbuf_detach(&gitdir, NULL);
+ worktree->is_bare = is_bare;
+ worktree->head_ref = NULL;
+ worktree->is_detached = is_detached;
+ add_head_info(&head_ref, worktree);
+
+done:
strbuf_release(&path);
strbuf_release(&gitdir);
strbuf_release(&worktree_path);
@@ -84,6 +111,7 @@ static struct worktree *get_linked_worktree(const char *id)
struct strbuf worktree_path = STRBUF_INIT;
struct strbuf gitdir = STRBUF_INIT;
struct strbuf head_ref = STRBUF_INIT;
+ int is_detached = 0;
if (!id)
die("Missing linked worktree name");
@@ -105,11 +133,16 @@ static struct worktree *get_linked_worktree(const char *id)
strbuf_reset(&path);
strbuf_addf(&path, "%s/worktrees/%s/HEAD", get_git_common_dir(), id);
- if (parse_ref(path.buf, &head_ref, NULL) >= 0) {
- worktree = xmalloc(sizeof(struct worktree));
- worktree->path = strbuf_detach(&worktree_path, NULL);
- worktree->git_dir = strbuf_detach(&gitdir, NULL);
- }
+ if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
+ goto done;
+
+ worktree = xmalloc(sizeof(struct worktree));
+ worktree->path = strbuf_detach(&worktree_path, NULL);
+ worktree->git_dir = strbuf_detach(&gitdir, NULL);
+ worktree->is_bare = 0;
+ worktree->head_ref = NULL;
+ worktree->is_detached = is_detached;
+ add_head_info(&head_ref, worktree);
done:
strbuf_release(&path);
diff --git a/worktree.h b/worktree.h
index 7022029..b4b3dda 100644
--- a/worktree.h
+++ b/worktree.h
@@ -4,6 +4,10 @@
struct worktree {
char *path;
char *git_dir;
+ char *head_ref;
+ unsigned char head_sha1[20];
+ int is_detached;
+ int is_bare;
};
/* Functions for acting on the information about worktrees. */
--
2.6.0
next prev parent reply other threads:[~2015-10-02 11:56 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-02 11:55 [PATCH v9 0/5] worktree: list functions and command Michael Rappazzo
2015-10-02 11:55 ` [PATCH v9 1/5] worktree: add top-level worktree.c Michael Rappazzo
2015-10-02 11:55 ` [PATCH v9 2/5] worktree: refactor find_linked_symref function Michael Rappazzo
2015-10-02 21:16 ` Junio C Hamano
2015-10-02 11:55 ` [PATCH v9 3/5] worktree: add a function to get worktree details Michael Rappazzo
2015-10-02 11:55 ` Michael Rappazzo [this message]
2015-10-02 11:55 ` [PATCH v9 5/5] worktree: add 'list' command Michael Rappazzo
2015-10-02 20:33 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1443786935-81131-5-git-send-email-rappazzo@gmail.com \
--to=rappazzo@gmail.com \
--cc=dturner@twopensource.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).