Skip to content

Commit

Permalink
Teach fetch-pack/upload-pack about --include-tag
Browse files Browse the repository at this point in the history
The new protocol extension "include-tag" allows the client side
of the connection (fetch-pack) to request that the server side of the
native git protocol (upload-pack / pack-objects) use --include-tag
as it prepares the packfile, thus ensuring that an annotated tag object
will be included in the resulting packfile if the object it refers to
was also included into the packfile.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
spearce authored and gitster committed Mar 5, 2008
1 parent f0a24aa commit 348e390
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 6 deletions.
8 changes: 7 additions & 1 deletion Documentation/git-fetch-pack.txt
Expand Up @@ -8,7 +8,7 @@ git-fetch-pack - Receive missing objects from another repository

SYNOPSIS
--------
'git-fetch-pack' [--all] [--quiet|-q] [--keep|-k] [--thin] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]
'git-fetch-pack' [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]

DESCRIPTION
-----------
Expand Down Expand Up @@ -45,6 +45,12 @@ OPTIONS
Spend extra cycles to minimize the number of objects to be sent.
Use it on slower connection.

\--include-tag::
If the remote side supports it, annotated tags objects will
be downloaded on the same connection as the other objects if
the object the tag references is downloaded. The caller must
otherwise determine the tags this option made available.

\--upload-pack=<git-upload-pack>::
Use this to specify the path to 'git-upload-pack' on the
remote side, if is not found on your $PATH.
Expand Down
9 changes: 7 additions & 2 deletions builtin-fetch-pack.c
Expand Up @@ -18,7 +18,7 @@ static struct fetch_pack_args args = {
};

static const char fetch_pack_usage[] =
"git-fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";
"git-fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";

#define COMPLETE (1U << 0)
#define COMMON (1U << 1)
Expand Down Expand Up @@ -174,13 +174,14 @@ static int find_common(int fd[2], unsigned char *result_sha1,
}

if (!fetching)
packet_write(fd[1], "want %s%s%s%s%s%s%s\n",
packet_write(fd[1], "want %s%s%s%s%s%s%s%s\n",
sha1_to_hex(remote),
(multi_ack ? " multi_ack" : ""),
(use_sideband == 2 ? " side-band-64k" : ""),
(use_sideband == 1 ? " side-band" : ""),
(args.use_thin_pack ? " thin-pack" : ""),
(args.no_progress ? " no-progress" : ""),
(args.include_tag ? " include-tag" : ""),
" ofs-delta");
else
packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
Expand Down Expand Up @@ -680,6 +681,10 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
args.use_thin_pack = 1;
continue;
}
if (!strcmp("--include-tag", arg)) {
args.include_tag = 1;
continue;
}
if (!strcmp("--all", arg)) {
args.fetch_all = 1;
continue;
Expand Down
3 changes: 2 additions & 1 deletion fetch-pack.h
Expand Up @@ -12,7 +12,8 @@ struct fetch_pack_args
use_thin_pack:1,
fetch_all:1,
verbose:1,
no_progress:1;
no_progress:1,
include_tag:1;
};

struct ref *fetch_pack(struct fetch_pack_args *args,
Expand Down
10 changes: 8 additions & 2 deletions upload-pack.c
Expand Up @@ -27,7 +27,8 @@ static const char upload_pack_usage[] = "git-upload-pack [--strict] [--timeout=n
static unsigned long oldest_have;

static int multi_ack, nr_our_refs;
static int use_thin_pack, use_ofs_delta, no_progress;
static int use_thin_pack, use_ofs_delta, use_include_tag;
static int no_progress;
static struct object_array have_obj;
static struct object_array want_obj;
static unsigned int timeout;
Expand Down Expand Up @@ -162,6 +163,8 @@ static void create_pack_file(void)
argv[arg++] = "--progress";
if (use_ofs_delta)
argv[arg++] = "--delta-base-offset";
if (use_include_tag)
argv[arg++] = "--include-tag";
argv[arg++] = NULL;

memset(&pack_objects, 0, sizeof(pack_objects));
Expand Down Expand Up @@ -494,6 +497,8 @@ static void receive_needs(void)
use_sideband = DEFAULT_PACKET_MAX;
if (strstr(line+45, "no-progress"))
no_progress = 1;
if (strstr(line+45, "include-tag"))
use_include_tag = 1;

/* We have sent all our refs already, and the other end
* should have chosen out of them; otherwise they are
Expand Down Expand Up @@ -565,7 +570,8 @@ static void receive_needs(void)
static int send_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
{
static const char *capabilities = "multi_ack thin-pack side-band"
" side-band-64k ofs-delta shallow no-progress";
" side-band-64k ofs-delta shallow no-progress"
" include-tag";
struct object *o = parse_object(sha1);

if (!o)
Expand Down

0 comments on commit 348e390

Please sign in to comment.