Skip to content

Commit

Permalink
Merge branch 'jc/archive'
Browse files Browse the repository at this point in the history
* jc/archive:
  git-tar-tree: devolve git-tar-tree into a wrapper for git-archive
  git-archive: inline default_parse_extra()
  builtin-archive.c: rename remote_request() to extract_remote_arg()
  upload-archive: monitor child communication more carefully.
  Add sideband status report to git-archive protocol
  Prepare larger packet buffer for upload-pack protocol.
  Teach --exec to git-archive --remote
  Add --verbose to git-archive
  archive: force line buffered output to stderr
  Use xstrdup instead of strdup in builtin-{tar,zip}-tree.c
  Move sideband server side support into reusable form.
  Move sideband client side support into reusable form.
  archive: allow remote to have more formats than we understand.
  git-archive: make compression level of ZIP archives configurable
  Add git-upload-archive
  git-archive: wire up ZIP format.
  git-archive: wire up TAR format.
  Add git-archive
  • Loading branch information
Junio C Hamano committed Sep 17, 2006
2 parents 32f4aac + 87af29f commit 4d69065
Show file tree
Hide file tree
Showing 18 changed files with 892 additions and 142 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ git-apply
git-applymbox
git-applypatch
git-archimport
git-archive
git-bisect
git-branch
git-cat-file
Expand Down Expand Up @@ -118,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
100 changes: 100 additions & 0 deletions Documentation/git-archive.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
git-archive(1)
==============

NAME
----
git-archive - Creates a archive of the files in the named tree


SYNOPSIS
--------
'git-archive' --format=<fmt> [--list] [--prefix=<prefix>/] [<extra>]
[--remote=<repo>] <tree-ish> [path...]

DESCRIPTION
-----------
Creates an archive of the specified format containing the tree
structure for the named tree. If <prefix> is specified it is
prepended to the filenames in the archive.

'git-archive' behaves differently when given a tree ID versus when
given a commit ID or tag ID. In the first case the current time is
used as modification time of each file in the archive. In the latter
case the commit time as recorded in the referenced commit object is
used instead. Additionally the commit ID is stored in a global
extended pax header if the tar format is used; it can be extracted
using 'git-get-tar-commit-id'. In ZIP files it is stored as a file
comment.

OPTIONS
-------

--format=<fmt>::
Format of the resulting archive: 'tar', 'zip'...

--list::
Show all available formats.

--prefix=<prefix>/::
Prepend <prefix>/ to each filename in the archive.

<extra>::
This can be any options that the archiver backend understand.

--remote=<repo>::
Instead of making a tar archive from local repository,
retrieve a tar archive from a remote repository.

<tree-ish>::
The tree or commit to produce an archive for.

path::
If one or more paths are specified, include only these in the
archive, otherwise include all files and subdirectories.

CONFIGURATION
-------------
By default, file and directories modes are set to 0666 or 0777 in tar
archives. It is possible to change this by setting the "umask" variable
in the repository configuration as follows :

[tar]
umask = 002 ;# group friendly

The special umask value "user" indicates that the user's current umask
will be used instead. The default value remains 0, which means world
readable/writable files and directories.

EXAMPLES
--------
git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)::

Create a tar archive that contains the contents of the
latest commit on the current branch, and extracts it in
`/var/tmp/junk` directory.

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz::

Create a compressed tarball for v1.4.0 release.

git archive --format=tar --prefix=git-1.4.0/ v1.4.0{caret}\{tree\} | gzip >git-1.4.0.tar.gz::

Create a compressed tarball for v1.4.0 release, but without a
global extended pax header.

git archive --format=zip --prefix=git-docs/ HEAD:Documentation/ > git-1.4.0-docs.zip::

Put everything in the current head's Documentation/ directory
into 'git-1.4.0-docs.zip', with the prefix 'git-docs/'.

Author
------
Written by Franck Bui-Huu and Rene Scharfe.

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

GIT
---
Part of the gitlink:git[7] suite
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
8 changes: 5 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,8 @@ LIB_FILE=libgit.a
XDIFF_LIB=xdiff/lib.a

LIB_H = \
blob.h cache.h commit.h csum-file.h delta.h \
diff.h object.h pack.h pkt-line.h quote.h refs.h \
archive.h blob.h cache.h commit.h csum-file.h delta.h \
diff.h object.h pack.h pkt-line.h quote.h refs.h sideband.h \
run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h

Expand All @@ -247,7 +247,7 @@ DIFF_OBJS = \
LIB_OBJS = \
blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \
date.o diff-delta.o entry.o exec_cmd.o ident.o lockfile.o \
object.o pack-check.o patch-delta.o path.o pkt-line.o \
object.o pack-check.o patch-delta.o path.o pkt-line.o sideband.o \
quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \
server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \
tag.o tree.o usage.o config.o environment.o ctype.o copy.o \
Expand All @@ -258,6 +258,7 @@ LIB_OBJS = \
BUILTIN_OBJS = \
builtin-add.o \
builtin-apply.o \
builtin-archive.o \
builtin-cat-file.o \
builtin-checkout-index.o \
builtin-check-ref-format.o \
Expand Down Expand Up @@ -294,6 +295,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
47 changes: 47 additions & 0 deletions archive.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#ifndef ARCHIVE_H
#define ARCHIVE_H

#define MAX_EXTRA_ARGS 32
#define MAX_ARGS (MAX_EXTRA_ARGS + 32)

struct archiver_args {
const char *base;
struct tree *tree;
const unsigned char *commit_sha1;
time_t time;
const char **pathspec;
unsigned int verbose : 1;
void *extra;
};

typedef int (*write_archive_fn_t)(struct archiver_args *);

typedef void *(*parse_extra_args_fn_t)(int argc, const char **argv);

struct archiver {
const char *name;
struct archiver_args args;
write_archive_fn_t write_archive;
parse_extra_args_fn_t parse_extra;
};

extern struct archiver archivers[];

extern int parse_archive_args(int argc,
const char **argv,
struct archiver *ar);

extern void parse_treeish_arg(const char **treeish,
struct archiver_args *ar_args,
const char *prefix);

extern void parse_pathspec_arg(const char **pathspec,
struct archiver_args *args);
/*
* Archive-format specific backends.
*/
extern int write_tar_archive(struct archiver_args *);
extern int write_zip_archive(struct archiver_args *);
extern void *parse_extra_zip_args(int argc, const char **argv);

#endif /* ARCHIVE_H */
Loading

0 comments on commit 4d69065

Please sign in to comment.