From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: Nicolas Pitre <nico@fluxnic.net>
Cc: git@vger.kernel.org, "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 5/9] pv4_tree_desc: allow decode_entries to return v4 trees, one at a time
Date: Wed, 9 Oct 2013 21:46:12 +0700 [thread overview]
Message-ID: <1381329976-32082-6-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1381329976-32082-1-git-send-email-pclouds@gmail.com>
When PV4_TREE_CANONICAL is passed, decode_entries() generates <count>
tree entries in canonical format. When this flag is not passed _and_
count is 1, decode_entries fills struct name_entry and saves
sha1_index.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
packv4-parse.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
packv4-parse.h | 10 ++++++++++
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/packv4-parse.c b/packv4-parse.c
index f5c486e..f222456 100644
--- a/packv4-parse.c
+++ b/packv4-parse.c
@@ -365,6 +365,12 @@ static int copy_canonical_tree_entries(struct pv4_tree_desc *v4, off_t offset,
while (start--)
update_tree_entry(desc);
+ if (!(v4->flags & PV4_TREE_CANONICAL)) {
+ v4->sha1_index = 0;
+ v4->pathlen = tree_entry_len(&desc->entry);
+ return 0;
+ }
+
from = desc->buffer;
while (count--)
update_tree_entry(desc);
@@ -462,6 +468,33 @@ static int generate_tree_entry(struct pv4_tree_desc *desc,
return 0;
}
+static int get_tree_entry_v4(struct pv4_tree_desc *desc,
+ const unsigned char **bufp,
+ int what)
+{
+ const unsigned char *path;
+
+ path = get_pathref(desc->p, what >> 1, &desc->pathlen);
+ if (!path)
+ return -1;
+ desc->v2.entry.mode = (path[0] << 8) | path[1];
+ desc->v2.entry.path = (const char *)path + 2;
+
+ if (**bufp) {
+ desc->sha1_index = decode_varint(bufp);
+ if (desc->sha1_index < 1 ||
+ desc->sha1_index - 1 > desc->p->num_objects)
+ return error("bad index in get_sha1ref");
+ desc->v2.entry.sha1 = desc->p->sha1_table + (desc->sha1_index - 1) * 20;
+ } else {
+ desc->sha1_index = 0;
+ desc->v2.entry.sha1 = *bufp + 1;
+ *bufp += 21;
+ }
+
+ return 0;
+}
+
static int decode_entries(struct pv4_tree_desc *desc, off_t obj_offset,
unsigned int start, unsigned int count)
{
@@ -561,8 +594,14 @@ static int decode_entries(struct pv4_tree_desc *desc, off_t obj_offset,
/*
* This is an actual tree entry to recreate.
*/
- if (generate_tree_entry(desc, &scp, what))
- return -1;
+ if (desc->flags & PV4_TREE_CANONICAL) {
+ if (generate_tree_entry(desc, &scp, what))
+ return -1;
+ } else if (count == 1) {
+ if (get_tree_entry_v4(desc, &scp, what))
+ return -1;
+ } else
+ die("generating multiple v4 entries is not supported");
count--;
curpos++;
} else if (what & 1) {
@@ -668,6 +707,7 @@ void *pv4_get_tree(struct packed_git *p, struct pack_window **w_curs,
int ret;
memset(&desc, 0, sizeof(desc));
+ desc.flags = PV4_TREE_CANONICAL;
desc.p = p;
desc.w_curs = *w_curs;
strbuf_init(&desc.buf, size);
diff --git a/packv4-parse.h b/packv4-parse.h
index 04b9a59..fe0ea38 100644
--- a/packv4-parse.h
+++ b/packv4-parse.h
@@ -24,10 +24,20 @@ void *pv4_get_commit(struct packed_git *p, struct pack_window **w_curs,
void *pv4_get_tree(struct packed_git *p, struct pack_window **w_curs,
off_t obj_offset, unsigned long size);
+/*
+ * These are private flags, never pass them directly to
+ * pv4_tree_desc_*
+ */
+#define PV4_TREE_CANONICAL 0x800
+
struct pv4_tree_desc {
+ unsigned flags;
+
/* v4 entry */
struct packed_git *p;
struct pack_window *w_curs;
+ unsigned int sha1_index;
+ int pathlen;
/* v2 entry */
struct tree_desc v2;
--
1.8.2.83.gc99314b
next prev parent reply other threads:[~2013-10-09 14:43 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-09 14:46 [BAD PATCH 0/9] v4-aware tree walker API Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` [PATCH 1/9] sha1_file: provide real packed type in object_info_extended Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` [PATCH 2/9] pack v4: move v2 tree entry generation code out of decode_entries Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` [PATCH 3/9] pv4_tree_desc: introduce new struct for pack v4 tree walker Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` [PATCH 4/9] pv4_tree_desc: use struct tree_desc from pv4_tree_desc Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` Nguyễn Thái Ngọc Duy [this message]
2013-10-09 14:46 ` [PATCH 6/9] pv4_tree_desc: complete interface Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` [PATCH 7/9] pv4_tree_desc: don't bother looking for v4 trees if no v4 packs are present Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` [PATCH 8/9] pv4_tree_desc: avoid lookup_object() when possible Nguyễn Thái Ngọc Duy
2013-10-09 14:46 ` [PATCH 9/9] list-object.c: take "advantage" of new pv4_tree_desc interface Nguyễn Thái Ngọc Duy
2013-10-09 16:51 ` [BAD PATCH 0/9] v4-aware tree walker API Nicolas Pitre
2013-10-11 12:22 ` Duy Nguyen
2013-10-11 13:05 ` Duy Nguyen
2013-10-12 14:42 ` Nicolas Pitre
2013-10-12 15:59 ` Duy Nguyen
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=1381329976-32082-6-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=nico@fluxnic.net \
/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).