Skip to content

Commit

Permalink
Add git-upload-archive
Browse files Browse the repository at this point in the history
This command implements the git archive protocol on the server
side. This command is not intended to be used by the end user.
Underlying git-archive command line options are sent over the
protocol from "git-archive --remote=...", just like upload-tar
currently does with "git-tar-tree=...".

As for "git-archive" command implementation, this new command
does not execute any existing "git-{tar,zip}-tree" but rely
on the archive API defined by "git-archive" patch. Hence we
get 2 good points:

 - "git-archive" and "git-upload-archive" share all option
   parsing code.

 - All kind of git-upload-{tar,zip} can be deprecated.

Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Franck Bui-Huu authored and Junio C Hamano committed Sep 9, 2006
1 parent ec06bff commit 39345a2
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ git-unpack-objects
git-update-index
git-update-ref
git-update-server-info
git-upload-archive
git-upload-pack
git-upload-tar
git-var
Expand Down
37 changes: 37 additions & 0 deletions Documentation/git-upload-archive.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
git-upload-archive(1)
====================

NAME
----
git-upload-archive - Send archive


SYNOPSIS
--------
'git-upload-archive' <directory>

DESCRIPTION
-----------
Invoked by 'git-archive --remote' and sends a generated archive to the
other end over the git protocol.

This command is usually not invoked directly by the end user. The UI
for the protocol is on the 'git-archive' side, and the program pair
is meant to be used to get an archive from a remote repository.

OPTIONS
-------
<directory>::
The repository to get a tar archive from.

Author
------
Written by Franck Bui-Huu.

Documentation
--------------
Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.

GIT
---
Part of the gitlink:git[7] suite
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ BUILTIN_OBJS = \
builtin-unpack-objects.o \
builtin-update-index.o \
builtin-update-ref.o \
builtin-upload-archive.o \
builtin-upload-tar.o \
builtin-verify-pack.o \
builtin-write-tree.o \
Expand Down
72 changes: 72 additions & 0 deletions builtin-upload-archive.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright (c) 2006 Franck Bui-Huu
*/
#include <time.h>
#include "cache.h"
#include "builtin.h"
#include "archive.h"
#include "pkt-line.h"

static const char upload_archive_usage[] =
"git-upload-archive <repo>";


int cmd_upload_archive(int argc, const char **argv, const char *prefix)
{
struct archiver ar;
const char *sent_argv[MAX_ARGS];
const char *arg_cmd = "argument ";
char *p, buf[4096];
int treeish_idx;
int sent_argc;
int len;

if (argc != 2)
usage(upload_archive_usage);

if (strlen(argv[1]) > sizeof(buf))
die("insanely long repository name");

strcpy(buf, argv[1]); /* enter-repo smudges its argument */

if (!enter_repo(buf, 0))
die("not a git archive");

/* put received options in sent_argv[] */
sent_argc = 1;
sent_argv[0] = "git-upload-archive";
for (p = buf;;) {
/* This will die if not enough free space in buf */
len = packet_read_line(0, p, (buf + sizeof buf) - p);
if (len == 0)
break; /* got a flush */
if (sent_argc > MAX_ARGS - 2)
die("Too many options (>29)");

if (p[len-1] == '\n') {
p[--len] = 0;
}
if (len < strlen(arg_cmd) ||
strncmp(arg_cmd, p, strlen(arg_cmd)))
die("'argument' token or flush expected");

len -= strlen(arg_cmd);
memmove(p, p + strlen(arg_cmd), len);
sent_argv[sent_argc++] = p;
p += len;
*p++ = 0;
}
sent_argv[sent_argc] = NULL;

/* parse all options sent by the client */
treeish_idx = parse_archive_args(sent_argc, sent_argv, &ar);

parse_treeish_arg(sent_argv + treeish_idx, &ar.args, prefix);
parse_pathspec_arg(sent_argv + treeish_idx + 1, &ar.args);

packet_write(1, "ACK\n");
packet_flush(1);

return ar.write_archive(&ar.args);
}

1 change: 1 addition & 0 deletions builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ extern int cmd_zip_tree(int argc, const char **argv, const char *prefix);
extern int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
extern int cmd_update_index(int argc, const char **argv, const char *prefix);
extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
extern int cmd_upload_archive(int argc, const char **argv, const char *prefix);
extern int cmd_upload_tar(int argc, const char **argv, const char *prefix);
extern int cmd_version(int argc, const char **argv, const char *prefix);
extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
Expand Down
7 changes: 7 additions & 0 deletions daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,14 @@ static int upload_pack(void)
return -1;
}

static int upload_archive(void)
{
execl_git_cmd("upload-archive", ".", NULL);
return -1;
}

static struct daemon_service daemon_service[] = {
{ "upload-archive", "uploadarch", upload_archive, 0, 1 },
{ "upload-pack", "uploadpack", upload_pack, 1, 1 },
};

Expand Down
1 change: 1 addition & 0 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
{ "unpack-objects", cmd_unpack_objects, RUN_SETUP },
{ "update-index", cmd_update_index, RUN_SETUP },
{ "update-ref", cmd_update_ref, RUN_SETUP },
{ "upload-archive", cmd_upload_archive },
{ "upload-tar", cmd_upload_tar },
{ "version", cmd_version },
{ "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER },
Expand Down

0 comments on commit 39345a2

Please sign in to comment.