git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / Atom feed
cb752fb4d8cb23dd00242e7a49eff5448dc597e4 blob 4009 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
135
136
137
138
139
140
141
142
143
144
145
146
 
#ifndef PACK_OBJECTS_H
#define PACK_OBJECTS_H

#include "packfile.h"

#define OE_DFS_STATE_BITS 2
#define OE_DEPTH_BITS 12
#define OE_IN_PACK_BITS 14

#define IN_PACK_POS(to_pack, obj) \
	(to_pack)->in_pack_pos[(struct object_entry *)(obj) - (to_pack)->objects]

#define IN_PACK(to_pack, obj) \
	(to_pack)->in_pack[(obj)->in_pack_idx]

/*
 * 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
};

/*
 * The size of struct nearly determines pack-objects's memory
 * consumption. This struct is packed tight for that reason. When you
 * add or reorder something in this struct, think a bit about this.
 */
struct object_entry {
	struct pack_idx_entry idx;
	unsigned long size;	/* uncompressed size */
	uint32_t delta_idx;	/* delta base object */
	uint32_t delta_child_idx; /* deltified objects who bases me */
	uint32_t delta_sibling_idx; /* other deltified objects who
				     * uses the same base as me
				     */
	uint32_t hash;			/* name hint hash */
	void *delta_data;	/* cached delta (uncompressed) */
	unsigned long delta_size;	/* delta data size (uncompressed) */
	unsigned long z_delta_size;	/* delta data size (compressed) */
	/*
	 * If in_pack_location_is_offset is true, this contains offset
	 * to the object in "in_pack". If false, it contains the
	 * object _index_ and pack offset must be retrieved via
	 * nth_packed_object_offset().
	 */
	uint32_t in_pack_location;
	unsigned char in_pack_header_size; /* note: spare bits available! */
	unsigned in_pack_idx:OE_IN_PACK_BITS;	/* already in pack */
	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 in_pack_location_is_offset:1;
	unsigned dfs_state:OE_DFS_STATE_BITS;

	/* XXX 8 bits hole, try to pack */

	unsigned depth:OE_DEPTH_BITS;

	/* size: 96, padding: 4, bit_padding: 17 bits */
};

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

	int32_t *index;
	uint32_t index_size;

	unsigned int *in_pack_pos;
	int in_pack_count;
	struct packed_git *in_pack[1 << OE_IN_PACK_BITS];
};

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;
}

static inline off_t oe_in_pack_offset(const struct packing_data *pack,
				      const struct object_entry *e)
{
	if (e->in_pack_location_is_offset)
		return e->in_pack_location;

	/*
	 * Slow path where in_pack_location contains the object index
	 * instead of offset. We perform one more lookup.
	 */
	return nth_packed_object_offset(IN_PACK(pack, e),
					e->in_pack_location);
}

static inline void oe_set_in_pack_offset(struct packing_data *pack,
					 struct object_entry *e,
					 off_t offset)
{
	struct revindex_entry *revidx;

	e->in_pack_location = offset;
	if (e->in_pack_location == offset) {
		e->in_pack_location_is_offset = 1;
		return;
	}

	revidx = find_pack_revindex(IN_PACK(pack, e), offset);
	e->in_pack_location = revidx->nr;
	e->in_pack_location_is_offset = 0;
}

#endif
debug log:

solving cb752fb4d8 ...
found cb752fb4d8 in https://public-inbox.org/git/20180305092842.GA28090@ash/
found a57aca5f03 in https://public-inbox.org/git/20180303024706.31465-10-pclouds@gmail.com/ ||
	https://public-inbox.org/git/20180303024706.31465-1-pclouds@gmail.com/
found db50e56223 in https://public-inbox.org/git/20180303024706.31465-9-pclouds@gmail.com/
found 83d91a0765 in https://public-inbox.org/git/20180303024706.31465-8-pclouds@gmail.com/
found 737e89b665 in https://public-inbox.org/git/20180303024706.31465-7-pclouds@gmail.com/
found fb2a3c8f48 in https://public-inbox.org/git/20180303024706.31465-6-pclouds@gmail.com/
found 2050a05a0b in https://public-inbox.org/git/20180303024706.31465-5-pclouds@gmail.com/
found 6a85cc60c9 in https://public-inbox.org/git/20180303024706.31465-4-pclouds@gmail.com/
found f8b06e2521 in https://public-inbox.org/git/20180301091052.32267-3-pclouds@gmail.com/ ||
	https://public-inbox.org/git/20180303024706.31465-3-pclouds@gmail.com/
found 720a8e8756 in https://public-inbox.org/git/20180303024706.31465-2-pclouds@gmail.com/ ||
	https://public-inbox.org/git/20180301091052.32267-2-pclouds@gmail.com/
found 03f1191659 in https://80x24.org/mirrors/git.git
preparing index
index prepared:
100644 03f1191659dab55b2c4c440c347101a3cdbd4650	pack-objects.h

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

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

skipping https://public-inbox.org/git/20180301091052.32267-2-pclouds@gmail.com/ for 720a8e8756
index at:
100644 720a8e8756430dbea8e1702323d5c99feb25e83a	pack-objects.h

applying [2/13] https://public-inbox.org/git/20180301091052.32267-3-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 720a8e8756..f8b06e2521 100644

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

skipping https://public-inbox.org/git/20180303024706.31465-3-pclouds@gmail.com/ for f8b06e2521
index at:
100644 f8b06e2521161f72ebcc1768209a112960cc3f2e	pack-objects.h

applying [3/13] https://public-inbox.org/git/20180303024706.31465-4-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index f8b06e2521..6a85cc60c9 100644


applying [4/13] https://public-inbox.org/git/20180303024706.31465-5-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 6a85cc60c9..2050a05a0b 100644


applying [5/13] https://public-inbox.org/git/20180303024706.31465-6-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 2050a05a0b..fb2a3c8f48 100644


applying [6/13] https://public-inbox.org/git/20180303024706.31465-7-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index fb2a3c8f48..737e89b665 100644


applying [7/13] https://public-inbox.org/git/20180303024706.31465-8-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 737e89b665..83d91a0765 100644


applying [8/13] https://public-inbox.org/git/20180303024706.31465-9-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index 83d91a0765..db50e56223 100644


applying [9/13] https://public-inbox.org/git/20180303024706.31465-10-pclouds@gmail.com/
diff --git a/pack-objects.h b/pack-objects.h
index db50e56223..a57aca5f03 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.
Checking patch pack-objects.h...
Applied patch pack-objects.h cleanly.
Checking patch pack-objects.h...
Applied patch pack-objects.h cleanly.

skipping https://public-inbox.org/git/20180303024706.31465-1-pclouds@gmail.com/ for a57aca5f03
index at:
100644 a57aca5f03251ecdd9e0ebac5daf4fedab5437b1	pack-objects.h

applying [10/13] https://public-inbox.org/git/20180305092842.GA28090@ash/
diff --git a/pack-objects.h b/pack-objects.h
index a57aca5f03..cb752fb4d8 100644

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

index at:
100644 cb752fb4d8cb23dd00242e7a49eff5448dc597e4	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.io/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