Commits on May 3, 2012
  1. archive: delegate blob reading to backend

    pclouds committed with gitster May 3, 2012
    archive-tar.c and archive-zip.c now perform conversion check, with
    help of sha1_file_to_archive() from archive.c
    
    This gives backends more freedom in dealing with (streaming) large
    blobs.
    
    Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Jun 22, 2011
  1. upload-archive: allow user to turn off filters

    peff committed with gitster Jun 22, 2011
    Some tar filters may be very expensive to run, so sites do
    not want to expose them via upload-archive. This patch lets
    users configure tar.<filter>.remote to turn them off.
    
    By default, gzip filters are left on, as they are about as
    expensive as creating zip archives.
    
    Signed-off-by: Jeff King <peff@peff.net>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  2. archive: move file extension format-guessing lower

    peff committed with gitster Jun 22, 2011
    The process for guessing an archive output format based on
    the filename is something like this:
    
      a. parse --output in cmd_archive; check the filename
         against a static set of mapping heuristics (right now
         it just matches ".zip" for zip files).
    
      b. if found, stick a fake "--format=zip" at the beginning
         of the arguments list (if the user did specify a
         --format manually, the later option will override our
         fake one)
    
      c. if it's a remote call, ship the arguments to the remote
         (including the fake), which will call write_archive on
         their end
    
      d. if it's local, ship the arguments to write_archive
         locally
    
    There are two problems:
    
      1. The set of mappings is static and at too high a level.
         The write_archive level is going to check config for
         user-defined formats, some of which will specify
         extensions. We need to delay lookup until those are
         parsed, so we can match against them.
    
      2. For a remote archive call, our set of mappings (or
         formats) may not match the remote side's. This is OK in
         practice right now, because all versions of git
         understand "zip" and "tar". But as new formats are
         added, there is going to be a mismatch between what the
         client can do and what the remote server can do.
    
    To fix (1), this patch refactors the location guessing to
    happen at the write_archive level, instead of the
    cmd_archive level. So instead of sticking a fake --format
    field in the argv list, we actually pass a "name hint" down
    the callchain; this hint is used at the appropriate time to
    guess the format (if one hasn't been given already).
    
    This patch leaves (2) unfixed. The name_hint is converted to
    a "--format" option as before, and passed to the remote.
    This means the local side's idea of how extensions map to
    formats will take precedence.
    
    Another option would be to pass the name hint to the remote
    side and let the remote choose. This isn't a good idea for
    two reasons:
    
      1. There's no room in the protocol for passing that
         information. We can pass a new argument, but older
         versions of git on the server will choke on it.
    
      2. Letting the remote side decide creates a silent
         inconsistency in user experience. Consider the case
         that the locally installed git knows about the "tar.gz"
         format, but a remote server doesn't.
    
         Running "git archive -o foo.tar.gz" will use the tar.gz
         format. If we use --remote, and the local side chooses
         the format, then we send "--format=tar.gz" to the
         remote, which will complain about the unknown format.
         But if we let the remote side choose the format, then
         it will realize that it doesn't know about "tar.gz" and
         output uncompressed tar without even issuing a warning.
    
    Signed-off-by: Jeff King <peff@peff.net>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  3. archive: pass archiver struct to write_archive callback

    peff committed with gitster Jun 22, 2011
    The current archivers are very static; when you are in the
    write_tar_archive function, you know you are writing a tar.
    However, to facilitate runtime-configurable archivers
    that will share a common write function we need to tell the
    function which archiver was used.
    
    As a convenience, we also provide an opaque data pointer in
    the archiver struct so that individual archivers can put
    something useful there when they register themselves.
    Technically they could just use the "name" field to look in
    an internal map of names to data, but this is much simpler.
    
    Signed-off-by: Jeff King <peff@peff.net>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  4. archive: refactor list of archive formats

    peff committed with gitster Jun 22, 2011
    Most of the tar and zip code was nicely split out into two
    abstracted files which knew only about their specific
    formats. The entry point to this code was a single "write
    archive" function.
    
    However, as these basic formats grow more complex (e.g., by
    handling multiple file extensions and format names), a
    static list of the entry point functions won't be enough.
    Instead, let's provide a way for the tar and zip code to
    tell the main archive code what they support by registering
    archiver names and functions.
    
    Signed-off-by: Jeff King <peff@peff.net>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Apr 18, 2009
  1. archive: do not read .gitattributes in working directory

    pclouds committed with gitster Apr 17, 2009
    The old behaviour still remains with --worktree-attributes, and it is
    always on for the legacy "git tar-tree".
    
    Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Jul 26, 2008
  1. archive: declare struct archiver where it's needed

    Rene Scharfe committed with gitster Jul 25, 2008
    Move the declaration of struct archiver to archive.c, as this is the only
    file left where it is used.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  2. archive: define MAX_ARGS where it's needed

    Rene Scharfe committed with gitster Jul 25, 2008
    MAX_EXTRA_ARGS is not used anymore, so remove it.  MAX_ARGS is used only
    in builtin-upload-archive.c, so define it there.  Also report the actual
    value we're comparing against when the number of args is too big.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  3. archive: move parameter parsing code to archive.c

    Rene Scharfe committed with gitster Jul 25, 2008
    write_archive() in archive.c is the only callsite for the command line
    parsing functions located in builtin-archive.c.  Move them to the place
    where they are used, un-export them and make them static, as hinted at
    by Stephan.
    
    Cc: Stephan Beyer <s-beyer@gmx.net>
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  4. archive: add write_archive()

    Rene Scharfe committed with gitster Jul 25, 2008
    Both archive and upload-archive have to parse command line arguments and
    then call the archiver specific write function.  Move the duplicate code
    to a new function, write_archive().
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Jul 19, 2008
  1. archive: make zip compression level independent from core git

    René Scharfe committed with gitster Jul 18, 2008
    zlib_compression_level is the compression level used for git's object store.
    It's 1 by default, which is the fastest setting.  This variable is also used
    as the default compression level for ZIP archives created by git archive.
    
    For archives, however, zlib's own default of 6 is more appropriate, as it's
    favouring small size over speed -- archive creation is not that performance
    critical most of the time.
    
    This patch makes git archive independent from git's internal compression
    level setting.  It affects invocations of git archive without explicitly
    specified compression level option, only.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Jul 15, 2008
  1. archive: remove extra arguments parsing code

    René Scharfe committed with gitster Jul 14, 2008
    Replace the code that calls backend specific argument parsers by a
    simple flag mechanism.  This reduces code size and complexity.
    
    We can add back such a mechanism (based on incremental parse_opt(),
    perhaps) when we need it.  The compression level parameter, though,
    is going to be shared by future compressing backends like tgz.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  2. archive: unify file attribute handling

    René Scharfe committed with gitster Jul 14, 2008
    Now that all file attribute handling for git archive has moved to archive.c,
    we can unexport sha1_file_to_archive() and is_archive_path_ignored() even
    disappears.
    
    Add setup_archive_check(), modelled after similar functions used in the code
    of other commands that support multiple file attributes.
    
    Also remove convert_to_archive(), as it's only remaining function with
    attribute handling gone was to call format_subst() if commit was not NULL,
    which is now checked in sha1_file_to_archive().
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  3. archive: centralize archive entry writing

    René Scharfe committed with gitster Jul 14, 2008
    Add the exported function write_archive_entries() to archive.c, which uses
    the new ability of read_tree_recursive() to pass a context pointer to its
    callback in order to centralize previously duplicated code.
    
    The new callback function write_archive_entry() does the work that every
    archiver backend needs to do: loading file contents, entering subdirectories,
    handling file attributes, constructing the full path of the entry.  All that
    done, it calls the backend specific write_archive_entry_fn_t function.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  4. archive: add baselen member to struct archiver_args

    René Scharfe committed with gitster Jul 15, 2008
    Calculate the length of base and save it in a new member of struct
    archiver_args.  This way we don't have to compute it in each of the
    format backends.
    
    Note: parse_archive_args() guarantees that ->base won't ever be NULL.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
  5. archive: remove args member from struct archiver

    René Scharfe committed with gitster Jul 15, 2008
    Pass struct archiver and struct archiver_args explicitly to parse_archive_args
    and remove the latter from the former.  This allows us to get rid of struct
    archiver_desc and simplifies the code a bit.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Jun 9, 2008
  1. Teach new attribute 'export-ignore' to git-archive

    René Scharfe committed with gitster Jun 8, 2008
    Paths marked with this attribute are not output to git-archive
    output.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Sep 3, 2007
  1. archive: specfile support (--pretty=format: in archive files)

    René Scharfe committed with gitster Sep 3, 2007
    Add support for a new attribute, specfile.  Files marked as being
    specfiles are expanded by git-archive when they are written to an
    archive.  It has no effect on worktree files.  The same placeholders
    as those for the option --pretty=format: of git-log et al. can be
    used.
    
    The attribute is useful for creating auto-updating specfiles.  It is
    limited by the underlying function format_commit_message(), though.
    E.g. currently there is no placeholder for git-describe like output,
    and expanded specfiles can't contain NUL bytes.  That can be fixed
    in format_commit_message() later and will then benefit users of
    git-log, too.
    
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Commits on Nov 5, 2006
  1. Remove unsupported C99 style struct initializers in git-archive.

    spearce committed with Junio C Hamano Nov 5, 2006
    At least one older version of the Solaris C compiler doesn't support
    the newer C99 style struct initializers.  To allow Git to compile
    on those systems use an archive description struct which is easier
    to initialize without the C99 struct initializer syntax.
    
    Also since the archives array is not used by anyone other than
    archive.c we can make it static.
    
    Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
    Signed-off-by: Junio C Hamano <junkio@cox.net>
Commits on Sep 10, 2006
  1. Add --verbose to git-archive

    Junio C Hamano committed Sep 10, 2006
    And teach backends about it.
    
    Signed-off-by: Junio C Hamano <junkio@cox.net>
    (cherry picked from 9e2c44a2893ae90944a0b7c9f40a9d22b759b5c0 commit)
  2. archive: allow remote to have more formats than we understand.

    Junio C Hamano committed Sep 10, 2006
    This fixes git-archive --remote not to parse archiver arguments;
    otherwise if the remote end implements formats other than the
    one known locally we will not be able to access that format.
    
    Signed-off-by: Junio C Hamano <junkio@cox.net>
Commits on Sep 9, 2006
  1. git-archive: make compression level of ZIP archives configurable

    Rene Scharfe committed with Junio C Hamano Sep 9, 2006
    Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <junkio@cox.net>
  2. git-archive: wire up ZIP format.

    Franck Bui-Huu committed with Junio C Hamano Sep 7, 2006
    Again, this is based on Rene Scharfe's earlier patch, but uses
    the archiver support introduced by the previous patch.
    
    Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com>
    Acked-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <junkio@cox.net>
  3. git-archive: wire up TAR format.

    Franck Bui-Huu committed with Junio C Hamano Sep 7, 2006
    This is based on Rene Scharfe's earlier patch, but uses the
    archiver support introduced by the previous patch.
    
    Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com>
    Acked-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <junkio@cox.net>
  4. Add git-archive

    Franck Bui-Huu committed with Junio C Hamano Sep 7, 2006
    git-archive is a command to make TAR and ZIP archives of a git tree.
    It helps prevent a proliferation of git-{format}-tree commands.
    
    Instead of directly calling git-{tar,zip}-tree command, it defines
    a very simple API, that archiver should implement and register in
    "git-archive.c". This API is made up by 2 functions whose prototype
    is defined in "archive.h" file.
    
     - The first one is used to parse 'extra' parameters which have
       signification only for the specific archiver. That would allow
       different archive backends to have different kind of options.
    
     - The second one is used to ask to an archive backend to build
       the archive given some already resolved parameters.
    
    The main reason for making this API is to avoid using
    git-{tar,zip}-tree commands, hence making them useless. Maybe it's
    time for them to die ?
    
    It also implements remote operations by defining a very simple
    protocol: it first sends the name of the specific uploader followed
    the repository name (git-upload-tar git://example.org/repo.git).
    Then it sends options. It's done by sending a sequence of one
    argument per packet, with prefix "argument ", followed by a flush.
    
    The remote protocol is implemented in "git-archive.c" for client
    side and is triggered by "--remote=<repo>" option. For example,
    to fetch a TAR archive in a remote repo, you can issue:
    
    $ git archive --format=tar --remote=git://xxx/yyy/zzz.git HEAD
    
    We choose to not make a new command "git-fetch-archive" for example,
    avoind one more GIT command which should be nice for users (less
    commands to remember, keeps existing --remote option).
    
    Signed-off-by: Franck Bui-Huu <vagabon.xyz@gmail.com>
    Acked-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: Junio C Hamano <junkio@cox.net>