From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 15/32] unpack_trees: only unpack $GIT_DIR/narrow subtree in narrow repository
Date: Wed, 25 Aug 2010 08:20:05 +1000 [thread overview]
Message-ID: <1282688422-7738-16-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1282688422-7738-1-git-send-email-pclouds@gmail.com>
By definition, narrow repository is incomplete. It does not even have
enough tree for a single commit. So populating a full index is
impossible.
Because of this, unpack_trees() is modified to only unpack trees
within $GIT_DIR/narrow, which narrow repo has all needed trees. This
makes the resulting index unsuitable for creating commits later on.
This is the reason index version is increased to 4, to avoid older
git from using it.
The resulting tree objects created from the index is only part of the
full tree. Manipulation will be needed at commit time to create proper
tree for commits.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
t/t1013-read-tree-narrow.sh | 72 +++++++++++++++++++++++++++++++++++++++++++
unpack-trees.c | 70 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 141 insertions(+), 1 deletions(-)
create mode 100755 t/t1013-read-tree-narrow.sh
diff --git a/t/t1013-read-tree-narrow.sh b/t/t1013-read-tree-narrow.sh
new file mode 100755
index 0000000..1921985
--- /dev/null
+++ b/t/t1013-read-tree-narrow.sh
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+test_description='read-tree in narrow mode'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+ test_tick &&
+ test_commit 1 &&
+ mkdir t1 t2 t1/t12 &&
+ echo 0 > f0 &&
+ echo 10 > t1/f10 &&
+ echo 120 > t1/t12/f120 &&
+ echo 20 > t2/f20
+ git add t1 t2 f0 && git commit -m initial &&
+ HEAD=`git rev-parse HEAD` &&
+ git rev-parse HEAD | git pack-objects --revs --narrow-tree=t1/t12 pack &&
+ test_create_repo narrow &&
+ mv pack-* narrow/.git/objects/pack &&
+ cd narrow &&
+ echo $HEAD >.git/refs/heads/master &&
+ echo "ref: refs/heads/master" >.git/HEAD &&
+ echo t1/t12 >.git/narrow
+'
+
+test_expect_failure ls-tree '
+ git ls-tree -r HEAD &&
+ git ls-files --stage >result &&
+ echo "100644 blob 52bd8e43afb01d0c9747f1fedf2fc94684ee4cc4 t1/t12/f120" >expected &&
+ test_cmp expected result
+'
+
+test_expect_success read-tree '
+ git read-tree HEAD &&
+ git ls-files --stage >result &&
+ echo "100644 52bd8e43afb01d0c9747f1fedf2fc94684ee4cc4 0 t1/t12/f120" >expected &&
+ test_cmp expected result
+'
+
+test_expect_success checkout '
+ git checkout . &&
+ test_cmp ../t1/t12/f120 t1/t12/f120
+'
+
+cat <<EOF >diff.expected
+diff --git a/t1/t12/f120 b/t1/t12/f120
+index 52bd8e4..645fb94 100644
+--- a/t1/t12/f120
++++ b/t1/t12/f120
+@@ -1 +1,2 @@
+ 120
++modified
+EOF
+
+test_expect_success diff '
+ echo modified >> t1/t12/f120 &&
+ git diff >result &&
+ test_cmp diff.expected result
+'
+
+test_expect_success 'diff HEAD' '
+ git diff HEAD >result &&
+ test_cmp diff.expected result
+'
+
+test_expect_success 'diff --cached' '
+ git add -u . &&
+ git diff --cached >result &&
+ test_cmp diff.expected result
+'
+
+test_done
diff --git a/unpack-trees.c b/unpack-trees.c
index f561d88..661fcb7 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -713,7 +713,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
* N-way merge "len" trees. Returns 0 on success, -1 on failure to manipulate the
* resulting index, -2 on failure to reflect the changes to the work tree.
*/
-int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options *o)
+static int unpack_trees_1(unsigned len, struct tree_desc *t, struct unpack_trees_options *o)
{
int i, ret;
static struct cache_entry *dfc;
@@ -839,6 +839,74 @@ return_failed:
goto done;
}
+static int find_tree_desc(struct tree_desc *desc, unsigned char *newsha1, const char *path)
+{
+ struct name_entry entry;
+ const char *slash;
+ int len;
+
+ slash = strchr(path, '/');
+ len = slash ? slash - path : strlen(path);
+
+ while (tree_entry(desc, &entry)) {
+ if (!S_ISDIR(entry.mode))
+ continue;
+ if (!strncmp(entry.path, path, len)) {
+ if (slash)
+ return find_tree(entry.sha1, newsha1, slash+1);
+ else {
+ hashcpy(newsha1, entry.sha1);
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options *o)
+{
+ if (!get_narrow_prefix())
+ return unpack_trees_1(len, t, o);
+ else {
+ struct tree_desc *t2;
+ struct unpack_trees_options o2;
+ char *prefix = NULL;
+ void **buf;
+ int i, ret;
+ t2 = xmalloc(sizeof(*t2)*len);
+ buf = xmalloc(sizeof(*buf)*len);
+ for (i = 0; i < len; i++) {
+ unsigned char sha1[20];
+ unsigned long size;
+ enum object_type type;
+
+ if (!find_tree_desc(t+i, sha1, get_narrow_prefix()))
+ return -1;
+ buf[i] = read_sha1_file(sha1, &type, &size);
+ if (type != OBJ_TREE)
+ return -1;
+ init_tree_desc(t2+i, buf[i], size);
+ }
+ o2 = *o;
+ if (!o->prefix)
+ o2.prefix = xstrdup(get_narrow_prefix());
+ else {
+ prefix = xmalloc(strlen(get_narrow_prefix()) + strlen(o->prefix)+1);
+ strcpy(prefix, o->prefix);
+ strcat(prefix, get_narrow_prefix());
+ o2.prefix = prefix;
+ }
+ ret = unpack_trees_1(len, t2, &o2);
+ for (i = 0; i < len; i++) {
+ free(buf[i]);
+ }
+ free(prefix);
+ free(t2);
+ free(buf);
+ return ret;
+ }
+}
+
/* Here come the merge functions */
static int reject_merge(struct cache_entry *ce, struct unpack_trees_options *o)
--
1.7.1.rc1.69.g24c2f7
next prev parent reply other threads:[~2010-08-24 22:23 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-24 22:19 [RFD PATCH 00/32] subtree clone v2 Nguyễn Thái Ngọc Duy
2010-08-24 22:19 ` [PATCH 01/32] add const to ce_write() Nguyễn Thái Ngọc Duy
2010-08-24 22:19 ` [PATCH 02/32] cache-tree: abstract out write_sha1_file from cache_tree_update() Nguyễn Thái Ngọc Duy
2010-08-24 22:41 ` Jonathan Nieder
2010-08-24 22:19 ` [PATCH 03/32] cache-tree: ignore CE_REMOVE entries in verify_cache() Nguyễn Thái Ngọc Duy
2010-08-24 23:15 ` Jonathan Nieder
2010-08-25 0:23 ` Nguyen Thai Ngoc Duy
2010-08-25 0:48 ` Jonathan Nieder
2010-08-24 22:19 ` [PATCH 04/32] move do_compress() from pack-objects.c to pack-write.c Nguyễn Thái Ngọc Duy
2010-08-24 23:25 ` Jonathan Nieder
2010-08-25 3:19 ` Nguyen Thai Ngoc Duy
2010-08-24 22:19 ` [PATCH 05/32] pack-write: add functions for creating simple packs Nguyễn Thái Ngọc Duy
2010-08-24 22:19 ` [PATCH 06/32] tree.c: Add {set,clear}_tree_marks Nguyễn Thái Ngọc Duy
2010-08-24 22:19 ` [PATCH 07/32] tree.c: find_subtree() to search for a tree Nguyễn Thái Ngọc Duy
2010-08-25 3:35 ` Elijah Newren
2010-08-25 3:43 ` Nguyen Thai Ngoc Duy
2010-08-25 5:35 ` Elijah Newren
2010-08-24 22:19 ` [PATCH 08/32] Add $GIT_DIR/narrow check Nguyễn Thái Ngọc Duy
2010-08-24 22:19 ` [PATCH 09/32] index: make narrow index incompatible with older git Nguyễn Thái Ngọc Duy
2010-08-24 23:43 ` Jonathan Nieder
2010-08-25 0:25 ` Nguyen Thai Ngoc Duy
2010-08-24 22:20 ` [PATCH 10/32] rev-list: support traversing in narrow repository mode Nguyễn Thái Ngọc Duy
2010-08-25 4:11 ` Elijah Newren
2010-08-24 22:20 ` [PATCH 11/32] rev-list: support --narrow-tree Nguyễn Thái Ngọc Duy
2010-08-25 3:59 ` Elijah Newren
2010-08-25 22:11 ` Nguyen Thai Ngoc Duy
2010-08-24 22:20 ` [PATCH 12/32] pack-objects: " Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 13/32] upload-pack: support narrow-tree capability Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 14/32] fetch-pack: support --narrow-tree Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` Nguyễn Thái Ngọc Duy [this message]
2010-08-25 5:04 ` [PATCH 15/32] unpack_trees: only unpack $GIT_DIR/narrow subtree in narrow repository Elijah Newren
2010-08-25 5:38 ` Nguyen Thai Ngoc Duy
2010-08-24 22:20 ` [PATCH 16/32] cache-tree: only cache tree within narrow area Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 17/32] tree-diff: add narrow versions of diff_{root_,}tree_sha1 Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 18/32] log-tree: use narrow version of diff_tree_sha1 Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 19/32] clone: support --narrow option Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 20/32] narrow-tree: add join_narrow_tree to do tree fixup for commits Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 21/32] commit: add narrow's commit_tree version Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 22/32] commit: use commit_narrow_tree() to support narrow repo Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 23/32] commit-tree: require --narrow-base in " Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 24/32] merge: refuse to merge if narrow bases are different Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 25/32] merge: prepare commit properly in narrow mode Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 26/32] Add upload-narrow-base command Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 27/32] rev-list: traverse some more trees to make upload-narrow-base happy Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 28/32] narrow-tree: add oldest_narrow_base() Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 29/32] Add command fetch-narrow-base Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 30/32] merge: support merging when narrow bases are different Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 31/32] send-pack: do not use thin pack in narrow mode Nguyễn Thái Ngọc Duy
2010-08-24 22:20 ` [PATCH 32/32] daemon: support upload-narrow-base Nguyễn Thái Ngọc Duy
2010-08-24 22:37 ` [RFD PATCH 00/32] subtree clone v2 Jonathan Nieder
2010-08-24 22:47 ` Nguyen Thai Ngoc Duy
2010-08-24 23:09 ` Jonathan Nieder
2010-08-25 0:20 ` Nguyen Thai Ngoc Duy
2010-08-25 4:37 ` Elijah Newren
2010-08-25 5:21 ` Nguyen Thai Ngoc Duy
2010-08-25 5:31 ` Elijah Newren
2010-08-25 6:21 ` Nguyen Thai Ngoc Duy
2010-08-25 13:06 ` Elijah Newren
2010-08-25 22:13 ` Nguyen Thai Ngoc Duy
2010-08-26 2:50 ` Elijah Newren
2010-08-26 3:52 ` Nguyen Thai Ngoc Duy
2010-08-26 4:39 ` Elijah Newren
2010-08-26 4:45 ` Nguyen Thai Ngoc Duy
2010-08-25 5:21 ` Elijah Newren
2010-08-25 19:27 ` Junio C Hamano
2010-08-25 20:43 ` Elijah Newren
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=1282688422-7738-16-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
/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).