git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / Atom feed
2ccd6359d2f07cc0c4497c62913b7f7f39930698 blob 4342 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
 
#ifndef PACK_OBJECTS_H
#define PACK_OBJECTS_H

#define OE_DFS_STATE_BITS	2
#define OE_DEPTH_BITS		12

/*
 * State flags for depth-first search used for analyzing delta cycles.
 *
 * The depth is measured in delta-links to the base (so if A is a delta
 * against B, then A has a depth of 1, and B a depth of 0).
 */
enum dfs_state {
	DFS_NONE = 0,
	DFS_ACTIVE,
	DFS_DONE,
	DFS_NUM_STATES
};

/*
 * basic object info
 * -----------------
 * idx.oid is filled up before delta searching starts. idx.crc32 and
 * is only valid after the object is written down and will be used for
 * generating the index. idx.offset will be both gradually set and
 * used in writing phase (base objects get offset first, then deltas
 * refer to them)
 *
 * "size" is the uncompressed object size. Compressed size is not
 * cached (ie. raw data in a pack) but available via revindex.
 *
 * "hash" contains a path name hash which is used for sorting the
 * delta list and also during delta searching. Once prepare_pack()
 * returns it's no longer needed.
 *
 * source pack info
 * ----------------
 * The (in_pack, in_pack_offset, in_pack_header_size) tuple contains
 * the location of the object in the source pack, with or without
 * header.
 *
 * "type" and "in_pack_type" both describe object type. in_pack_type
 * may contain a delta type, while type is always the canonical type.
 *
 * deltas
 * ------
 * Delta links (delta, delta_child and delta_sibling) are created
 * reflect that delta graph from the source pack then updated or added
 * during delta searching phase when we find better deltas.
 *
 * delta_child and delta_sibling are last needed in
 * compute_write_order(). "delta" and "delta_size" must remain valid
 * at object writing phase in case the delta is not cached.
 *
 * If a delta is cached in memory and is compressed, "delta" points to
 * the data and z_delta_size contains the compressed size. If it's
 * uncompressed [1], z_delta_size must be zero. delta_size is always
 * the uncompressed size and must be valid even if the delta is not
 * cached. Delta recreation technically only depends on "delta"
 * pointer, but delta_size is still used to verify it's the same as
 * before.
 *
 * [1] during try_delta phase we don't bother with compressing because
 * the delta could be quickly replaced with a better one.
 */
struct object_entry {
	struct pack_idx_entry idx;
	unsigned long size;	/* uncompressed size */
	struct packed_git *in_pack;	/* already in pack */
	off_t in_pack_offset;
	struct object_entry *delta;	/* delta base object */
	struct object_entry *delta_child; /* deltified objects who bases me */
	struct object_entry *delta_sibling; /* other deltified objects who
					     * uses the same base as me
					     */
	void *delta_data;	/* cached delta (uncompressed) */
	unsigned long delta_size;	/* delta data size (uncompressed) */
	unsigned long z_delta_size;	/* delta data size (compressed) */
	uint32_t hash;			/* name hint hash */
	unsigned int in_pack_pos;
	unsigned char in_pack_header_size; /* note: spare bits available! */
	unsigned type:TYPE_BITS;
	unsigned in_pack_type:TYPE_BITS; /* could be delta */
	unsigned preferred_base:1; /*
				    * we do not pack this, but is available
				    * to be used as the base object to delta
				    * objects against.
				    */
	unsigned no_try_delta:1;
	unsigned tagged:1; /* near the very tip of refs */
	unsigned filled:1; /* assigned write-order */
	unsigned dfs_state:OE_DFS_STATE_BITS;
	unsigned depth:OE_DEPTH_BITS;

	/* size: 120, bit_padding: 8 bits */
};

struct packing_data {
	struct object_entry *objects;
	uint32_t nr_objects, nr_alloc;

	int32_t *index;
	uint32_t index_size;
};

struct object_entry *packlist_alloc(struct packing_data *pdata,
				    const unsigned char *sha1,
				    uint32_t index_pos);

struct object_entry *packlist_find(struct packing_data *pdata,
				   const unsigned char *sha1,
				   uint32_t *index_pos);

static inline uint32_t pack_name_hash(const char *name)
{
	uint32_t c, hash = 0;

	if (!name)
		return 0;

	/*
	 * This effectively just creates a sortable number from the
	 * last sixteen non-whitespace characters. Last characters
	 * count "most", so things that end in ".c" sort together.
	 */
	while ((c = *name++) != 0) {
		if (isspace(c))
			continue;
		hash = (hash >> 2) + (c << 24);
	}
	return hash;
}

#endif
debug log:

solving 2ccd6359d2 ...
found 2ccd6359d2 in https://public-inbox.org/git/20180308114232.10508-6-pclouds@gmail.com/
found 4b17402953 in https://public-inbox.org/git/20180308114232.10508-5-pclouds@gmail.com/
found 628c45871c in https://public-inbox.org/git/20180308114232.10508-4-pclouds@gmail.com/
found 85b01b66da in https://public-inbox.org/git/20180308114232.10508-3-pclouds@gmail.com/
found f834ead541 in https://public-inbox.org/git/20180308114232.10508-2-pclouds@gmail.com/
found 03f1191659 in https://80x24.org/mirrors/git.git
preparing index
index prepared:
100644 03f1191659dab55b2c4c440c347101a3cdbd4650	pack-objects.h

applying [1/5] https://public-inbox.org/git/20180308114232.10508-2-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 03f1191659..f834ead541 100644


applying [2/5] https://public-inbox.org/git/20180308114232.10508-3-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index f834ead541..85b01b66da 100644


applying [3/5] https://public-inbox.org/git/20180308114232.10508-4-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 85b01b66da..628c45871c 100644


applying [4/5] https://public-inbox.org/git/20180308114232.10508-5-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 628c45871c..4b17402953 100644


applying [5/5] https://public-inbox.org/git/20180308114232.10508-6-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 4b17402953..2ccd6359d2 100644

Checking patch pack-objects.h...
Applied patch pack-objects.h cleanly.
Checking patch pack-objects.h...
Applied patch pack-objects.h cleanly.
Checking patch pack-objects.h...
Applied patch pack-objects.h cleanly.
Checking patch pack-objects.h...
Applied patch pack-objects.h cleanly.
Checking patch pack-objects.h...
Applied patch pack-objects.h cleanly.

index at:
100644 2ccd6359d2f07cc0c4497c62913b7f7f39930698	pack-objects.h

git@vger.kernel.org list mirror (unofficial, one of many)

Archives are clonable:
	git clone --mirror https://public-inbox.org/git
	git clone --mirror http://ou63pmih66umazou.onion/git
	git clone --mirror http://czquwvybam4bgbro.onion/git
	git clone --mirror http://hjrcffqmbrq6wope.onion/git

Example config snippet for mirrors

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.version-control.git
	nntp://ou63pmih66umazou.onion/inbox.comp.version-control.git
	nntp://czquwvybam4bgbro.onion/inbox.comp.version-control.git
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.version-control.git
	nntp://news.gmane.org/gmane.comp.version-control.git

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git