Skip to content
Snippets Groups Projects
Select Git revision
  • pu
  • passt default
  • master
  • todo
  • next
  • maint
  • v2.8.0-rc1
  • v2.8.0-rc0
  • v2.7.2
  • v2.7.1
  • v2.7.0
  • v2.6.5
  • v2.7.0-rc3
  • v2.7.0-rc2
  • v2.7.0-rc1
  • v2.7.0-rc0
  • v2.6.4
  • v2.6.3
  • v2.6.2
  • v2.6.1
  • v2.3.10
  • v2.5.4
  • v2.4.10
  • v2.6.0
  • v2.6.0-rc3
  • v2.5.3
26 results

bulk-checkin.c

Blame
    • Jeff King's avatar
      ef1286d3
      use xsnprintf for generating git object headers · ef1286d3
      Jeff King authored
      
      We generally use 32-byte buffers to format git's "type size"
      header fields. These should not generally overflow unless
      you can produce some truly gigantic objects (and our types
      come from our internal array of constant strings). But it is
      a good idea to use xsnprintf to make sure this is the case.
      
      Note that we slightly modify the interface to
      write_sha1_file_prepare, which nows uses "hdrlen" as an "in"
      parameter as well as an "out" (on the way in it stores the
      allocated size of the header, and on the way out it returns
      the ultimate size of the header).
      
      Signed-off-by: default avatarJeff King <peff@peff.net>
      Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
      ef1286d3
      History
      use xsnprintf for generating git object headers
      Jeff King authored
      
      We generally use 32-byte buffers to format git's "type size"
      header fields. These should not generally overflow unless
      you can produce some truly gigantic objects (and our types
      come from our internal array of constant strings). But it is
      a good idea to use xsnprintf to make sure this is the case.
      
      Note that we slightly modify the interface to
      write_sha1_file_prepare, which nows uses "hdrlen" as an "in"
      parameter as well as an "out" (on the way in it stores the
      allocated size of the header, and on the way out it returns
      the ultimate size of the header).
      
      Signed-off-by: default avatarJeff King <peff@peff.net>
      Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    bulk-checkin.c 7.07 KiB
    /*
     * Copyright (c) 2011, Google Inc.
     */
    #include "cache.h"
    #include "bulk-checkin.h"
    #include "csum-file.h"
    #include "pack.h"
    #include "strbuf.h"
    
    static int pack_compression_level = Z_DEFAULT_COMPRESSION;
    
    static struct bulk_checkin_state {
    	unsigned plugged:1;
    
    	char *pack_tmp_name;
    	struct sha1file *f;
    	off_t offset;
    	struct pack_idx_option pack_idx_opts;
    
    	struct pack_idx_entry **written;
    	uint32_t alloc_written;
    	uint32_t nr_written;
    } state;
    
    static void finish_bulk_checkin(struct bulk_checkin_state *state)
    {
    	struct object_id oid;
    	struct strbuf packname = STRBUF_INIT;
    	int i;
    
    	if (!state->f)
    		return;
    
    	if (state->nr_written == 0) {
    		close(state->f->fd);
    		unlink(state->pack_tmp_name);
    		goto clear_exit;
    	} else if (state->nr_written == 1) {
    		sha1close(state->f, oid.hash, CSUM_FSYNC);
    	} else {
    		int fd = sha1close(state->f, oid.hash, 0);
    		fixup_pack_header_footer(fd, oid.hash, state->pack_tmp_name,
    					 state->nr_written, oid.hash,
    					 state->offset);
    		close(fd);
    	}
    
    	strbuf_addf(&packname, "%s/pack/pack-", get_object_directory());
    	finish_tmp_packfile(&packname, state->pack_tmp_name,
    			    state->written, state->nr_written,
    			    &state->pack_idx_opts, oid.hash);
    	for (i = 0; i < state->nr_written; i++)
    		free(state->written[i]);
    
    clear_exit:
    	free(state->written);
    	memset(state, 0, sizeof(*state));
    
    	strbuf_release(&packname);
    	/* Make objects we just wrote available to ourselves */
    	reprepare_packed_git();
    }
    
    static int already_written(struct bulk_checkin_state *state, unsigned char sha1[])
    {
    	int i;
    
    	/* The object may already exist in the repository */
    	if (has_sha1_file(sha1))
    		return 1;