From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Jeff King" <peff@peff.net>, "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH v2 2/3] fetch-pack: use index-pack --unpack-limit instead of unpack-objects
Date: Fri, 6 Sep 2013 07:46:02 +0700 [thread overview]
Message-ID: <1378428363-14086-2-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1378428363-14086-1-git-send-email-pclouds@gmail.com>
Current code peeks into the transfered pack's header, if the number of
objects is under a limit, unpack-objects is called to handle the rest,
otherwise index-pack is. This patch makes index-pack handle both
cases. After the next patch, unpack-objects will no longer be used. It
may be removed in future.
Now we only have two code paths to maintain regarding pack reading
(sha1_file.c and index-pack.c). When .pack v4 comes, we don't need to
duplicate work in index-pack and unpack-objects.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
fetch-pack.c | 86 +++++++++++++++++++++++++-----------------------------------
1 file changed, 35 insertions(+), 51 deletions(-)
diff --git a/fetch-pack.c b/fetch-pack.c
index f5d99c1..44d029f 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -682,16 +682,16 @@ static int sideband_demux(int in, int out, void *data)
}
static int get_pack(struct fetch_pack_args *args,
- int xd[2], char **pack_lockfile)
+ int xd[2], char **pack_lockfile_p)
{
struct async demux;
- const char *argv[22];
+ const char *argv[23];
char keep_arg[256];
- char hdr_arg[256];
+ char unpack_limit_arg[256];
const char **av;
- int do_keep = args->keep_pack;
struct child_process cmd;
int ret;
+ char *pack_lockfile;
memset(&demux, 0, sizeof(demux));
if (use_sideband) {
@@ -711,54 +711,33 @@ static int get_pack(struct fetch_pack_args *args,
memset(&cmd, 0, sizeof(cmd));
cmd.argv = argv;
+ cmd.out = -1;
av = argv;
- *hdr_arg = 0;
- if (!args->keep_pack && unpack_limit) {
- struct pack_header header;
-
- if (read_pack_header(demux.out, &header))
- die("protocol error: bad pack header");
- snprintf(hdr_arg, sizeof(hdr_arg),
- "--pack_header=%"PRIu32",%"PRIu32,
- ntohl(header.hdr_version), ntohl(header.hdr_entries));
- if (ntohl(header.hdr_entries) < unpack_limit)
- do_keep = 0;
- else
- do_keep = 1;
- }
if (alternate_shallow_file) {
*av++ = "--shallow-file";
*av++ = alternate_shallow_file;
}
- if (do_keep) {
- if (pack_lockfile)
- cmd.out = -1;
- *av++ = "index-pack";
- *av++ = "--stdin";
- if (!args->quiet && !args->no_progress)
- *av++ = "-v";
- if (args->use_thin_pack)
- *av++ = "--fix-thin";
- if (args->lock_pack || unpack_limit) {
- int s = sprintf(keep_arg,
- "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
- if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
- strcpy(keep_arg + s, "localhost");
- *av++ = keep_arg;
- }
- if (args->check_self_contained_and_connected)
- *av++ = "--check-self-contained-and-connected";
- }
- else {
- *av++ = "unpack-objects";
- if (args->quiet || args->no_progress)
- *av++ = "-q";
- args->check_self_contained_and_connected = 0;
- }
- if (*hdr_arg)
- *av++ = hdr_arg;
+ *av++ = "index-pack";
+ *av++ = "--stdin";
+ if (!args->quiet && !args->no_progress)
+ *av++ = "-v";
+ if (args->use_thin_pack)
+ *av++ = "--fix-thin";
+ if (args->lock_pack || unpack_limit) {
+ int s = sprintf(keep_arg,
+ "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
+ if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
+ strcpy(keep_arg + s, "localhost");
+ *av++ = keep_arg;
+ }
+ if (!args->keep_pack) {
+ sprintf(unpack_limit_arg, "--unpack-limit=%u", unpack_limit);
+ *av++ = unpack_limit_arg;
+ }
+ if (args->check_self_contained_and_connected)
+ *av++ = "--check-self-contained-and-connected";
if (fetch_fsck_objects >= 0
? fetch_fsck_objects
: transfer_fsck_objects >= 0
@@ -771,20 +750,26 @@ static int get_pack(struct fetch_pack_args *args,
cmd.git_cmd = 1;
if (start_command(&cmd))
die("fetch-pack: unable to fork off %s", argv[0]);
- if (do_keep && pack_lockfile) {
- *pack_lockfile = index_pack_lockfile(cmd.out);
- close(cmd.out);
- }
-
+ pack_lockfile = index_pack_lockfile(cmd.out);
+ close(cmd.out);
ret = finish_command(&cmd);
+
if (!ret || (args->check_self_contained_and_connected && ret == 1))
args->self_contained_and_connected =
args->check_self_contained_and_connected &&
ret == 0;
else
die("%s failed", argv[0]);
+
if (use_sideband && finish_async(&demux))
die("error in sideband demultiplexer");
+
+ if (pack_lockfile)
+ reprepare_packed_git();
+
+ if (pack_lockfile_p)
+ *pack_lockfile_p = pack_lockfile;
+
return 0;
}
@@ -997,6 +982,5 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
commit_lock_file(&shallow_lock);
}
- reprepare_packed_git();
return ref_cpy;
}
--
1.8.2.83.gc99314b
next prev parent reply other threads:[~2013-09-06 0:43 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-02 3:05 [PATCH] {fetch,receive}-pack: drop unpack-objects, delay loosing objects until the end Nguyễn Thái Ngọc Duy
2013-09-02 4:38 ` Eric Sunshine
2013-09-03 6:49 ` Jeff King
2013-09-03 11:56 ` Duy Nguyen
2013-09-03 17:25 ` Jeff King
2013-09-06 0:46 ` [PATCH v2 1/3] index-pack: add --unpack-limit to unpack objects Nguyễn Thái Ngọc Duy
2013-09-06 0:46 ` Nguyễn Thái Ngọc Duy [this message]
2013-09-08 4:45 ` [PATCH v2 2/3] fetch-pack: use index-pack --unpack-limit instead of unpack-objects Jeff King
2013-09-06 0:46 ` [PATCH v2 3/3] receive-pack: " Nguyễn Thái Ngọc Duy
2013-09-08 4:44 ` [PATCH v2 1/3] index-pack: add --unpack-limit to unpack objects Jeff King
2013-09-08 6:28 ` Duy Nguyen
2013-09-08 6:35 ` Jeff King
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=1378428363-14086-2-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.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).