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 1/2] upload-pack: support subtree packing
Date: Tue, 27 Jul 2010 06:36:09 +0700 [thread overview]
Message-ID: <1280187370-23675-2-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1280187370-23675-1-git-send-email-pclouds@gmail.com>
This patch adds a new capability "subtree", which supports two new
requests "subtree" and "commit-subtree".
"subtree" asks upload-pack to create a pack that contains only blobs
from the given tree prefix (and necessary commits/trees to reach
those blobs).
"commit-tree" asks upload-pack to create a pack that contains trees of
the given prefix (and necessary commits/trees to reach those trees)
With "subtree" request, Git client may then rewrite commits to create
a valid commit tree again, so that users can work on it independently.
When users want to push from such a tree, "commit-tree" may then be
used to re-match what users have and what is in upstream, recreate
proper push commits.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
upload-pack.c | 31 ++++++++++++++++++++++++++++++-
1 files changed, 30 insertions(+), 1 deletions(-)
diff --git a/upload-pack.c b/upload-pack.c
index dc464d7..f97296a 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -41,6 +41,8 @@ static int use_sideband;
static int debug_fd;
static int advertise_refs;
static int stateless_rpc;
+static char *subtree;
+static int commit_subtree;
static void reset_timeout(void)
{
@@ -89,6 +91,17 @@ static void show_object(struct object *obj, const struct name_path *path, const
*/
const char *name = path_name(path, component);
const char *ep = strchr(name, '\n');
+ if (subtree) {
+ int len = strlen(name);
+ /* parent trees should always be kept */
+ if (obj->type == OBJ_TREE && !prefixcmp(subtree, name) && subtree[len] == '/')
+ ; /* in */
+ else if (commit_subtree)
+ goto out;
+ else if (prefixcmp(name, subtree))
+ goto out;
+ }
+
if (ep) {
fprintf(pack_pipe, "%s %.*s\n", sha1_to_hex(obj->sha1),
(int) (ep - name),
@@ -97,6 +110,7 @@ static void show_object(struct object *obj, const struct name_path *path, const
else
fprintf(pack_pipe, "%s %s\n",
sha1_to_hex(obj->sha1), name);
+out:
free((char *)name);
}
@@ -504,6 +518,21 @@ static void receive_needs(void)
if (debug_fd)
write_in_full(debug_fd, line, len);
+ if (!prefixcmp(line, "subtree ")) {
+ int len = strlen(line+8);
+ subtree = malloc(len+1);
+ memcpy(subtree, line+8, len-1);
+ subtree[len-1] = '\0'; /* \n */
+ continue;
+ }
+ if (!prefixcmp(line, "commit-subtree ")) {
+ int len = strlen(line+15);
+ subtree = malloc(len+1);
+ memcpy(subtree, line+15, len-1);
+ subtree[len-1] = '\0'; /* \n */
+ commit_subtree = 1;
+ continue;
+ }
if (!prefixcmp(line, "shallow ")) {
unsigned char sha1[20];
struct object *object;
@@ -623,7 +652,7 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo
{
static const char *capabilities = "multi_ack thin-pack side-band"
" side-band-64k ofs-delta shallow no-progress"
- " include-tag multi_ack_detailed";
+ " include-tag multi_ack_detailed subtree";
struct object *o = parse_object(sha1);
if (!o)
--
1.7.1.rc1.69.g24c2f7
next prev parent reply other threads:[~2010-07-27 13:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-26 23:36 [PATCH 0/2] Subtree clone? Nguyễn Thái Ngọc Duy
2010-07-26 23:36 ` Nguyễn Thái Ngọc Duy [this message]
2010-07-27 13:15 ` [PATCH 1/2] upload-pack: support subtree packing Ævar Arnfjörð Bjarmason
2010-07-27 14:46 ` Shawn O. Pearce
2010-07-27 18:51 ` Configurable callbacks for missing objects (we Re: upload-pack: support subtree packing) Avery Pennarun
2010-07-27 22:32 ` Nguyen Thai Ngoc Duy
2010-07-28 1:53 ` Elijah Newren
2010-07-28 2:00 ` Avery Pennarun
2010-07-27 22:29 ` [PATCH 1/2] upload-pack: support subtree packing Nguyen Thai Ngoc Duy
2010-07-26 23:36 ` [PATCH 2/2] fetch-pack: support --subtree and --commit-subtree options Nguyễn Thái Ngọc Duy
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=1280187370-23675-2-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.