* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Linus Torvalds @ 2006-07-12 3:45 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Junio C Hamano, sf, Git Mailing List
In-Reply-To: <Pine.LNX.4.63.0607120226210.29667@wbgn013.biozentrum.uni-wuerzburg.de>
On Wed, 12 Jul 2006, Johannes Schindelin wrote:
>>
> I completely forgot to mention that type_names[] is already declared in
> object.h. Obviously, it is not really important, but maybe it would be
> better to obey the DRY principle (think addition of "bind" object type).
Actually, the type_names[] array in object.h is _totally_ different. That
one is indexed by TYPE_xxx, not OBJ_xxxx.
And yeah, it's stupid to have two different numberings for the same thing,
and we really really shouldn't. But the OBJ_xxx numbering was originally a
a totally internal implementation detail to just the pack-files.
I shouldn't have introduced the new TYPE_xxx macros. I should just have
used the same OBJ_xxx macros that we use in the pack-file.
Junio: this patch is totally independent from the other patches, and is on
top of you current "master". It gets rid of TYPE_xxx in favor of the
OBJ_xxx enums, which are moved from pack.h into object.h.
That way, we can't have people mixing up the two different kinds of type
enumeration.
(Eventually, I want to get rid of passing around the "type strings"
entirely, and this will help - no confusion about two different integer
enumeration).
Linus
----
diff --git a/blob.c b/blob.c
index 496f270..d1af2e6 100644
--- a/blob.c
+++ b/blob.c
@@ -10,12 +10,12 @@ struct blob *lookup_blob(const unsigned
if (!obj) {
struct blob *ret = alloc_blob_node();
created_object(sha1, &ret->object);
- ret->object.type = TYPE_BLOB;
+ ret->object.type = OBJ_BLOB;
return ret;
}
if (!obj->type)
- obj->type = TYPE_BLOB;
- if (obj->type != TYPE_BLOB) {
+ obj->type = OBJ_BLOB;
+ if (obj->type != OBJ_BLOB) {
error("Object %s is a %s, not a blob",
sha1_to_hex(sha1), typename(obj->type));
return NULL;
diff --git a/builtin-diff.c b/builtin-diff.c
index ae901dd..cb38f44 100644
--- a/builtin-diff.c
+++ b/builtin-diff.c
@@ -285,9 +285,9 @@ int cmd_diff(int argc, const char **argv
obj = deref_tag(obj, NULL, 0);
if (!obj)
die("invalid object '%s' given.", name);
- if (obj->type == TYPE_COMMIT)
+ if (obj->type == OBJ_COMMIT)
obj = &((struct commit *)obj)->tree->object;
- if (obj->type == TYPE_TREE) {
+ if (obj->type == OBJ_TREE) {
if (ARRAY_SIZE(ent) <= ents)
die("more than %d trees given: '%s'",
(int) ARRAY_SIZE(ent), name);
@@ -297,7 +297,7 @@ int cmd_diff(int argc, const char **argv
ents++;
continue;
}
- if (obj->type == TYPE_BLOB) {
+ if (obj->type == OBJ_BLOB) {
if (2 <= blobs)
die("more than two blobs given: '%s'", name);
memcpy(blob[blobs].sha1, obj->sha1, 20);
diff --git a/builtin-fmt-merge-msg.c b/builtin-fmt-merge-msg.c
index 6527482..b3c4f98 100644
--- a/builtin-fmt-merge-msg.c
+++ b/builtin-fmt-merge-msg.c
@@ -177,7 +177,7 @@ static void shortlog(const char *name, u
int flags = UNINTERESTING | TREECHANGE | SEEN | SHOWN | ADDED;
branch = deref_tag(parse_object(sha1), sha1_to_hex(sha1), 40);
- if (!branch || branch->type != TYPE_COMMIT)
+ if (!branch || branch->type != OBJ_COMMIT)
return;
setup_revisions(0, NULL, rev, NULL);
diff --git a/builtin-grep.c b/builtin-grep.c
index 4c2f7df..a79bac3 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -891,9 +891,9 @@ static int grep_tree(struct grep_opt *op
static int grep_object(struct grep_opt *opt, const char **paths,
struct object *obj, const char *name)
{
- if (obj->type == TYPE_BLOB)
+ if (obj->type == OBJ_BLOB)
return grep_sha1(opt, obj->sha1, name);
- if (obj->type == TYPE_COMMIT || obj->type == TYPE_TREE) {
+ if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) {
struct tree_desc tree;
void *data;
int hit;
diff --git a/builtin-rev-list.c b/builtin-rev-list.c
index 63bad0e..8f32871 100644
--- a/builtin-rev-list.c
+++ b/builtin-rev-list.c
@@ -167,16 +167,16 @@ static void show_commit_list(struct rev_
const char *name = pending->name;
if (obj->flags & (UNINTERESTING | SEEN))
continue;
- if (obj->type == TYPE_TAG) {
+ if (obj->type == OBJ_TAG) {
obj->flags |= SEEN;
add_object_array(obj, name, &objects);
continue;
}
- if (obj->type == TYPE_TREE) {
+ if (obj->type == OBJ_TREE) {
process_tree((struct tree *)obj, &objects, NULL, name);
continue;
}
- if (obj->type == TYPE_BLOB) {
+ if (obj->type == OBJ_BLOB) {
process_blob((struct blob *)obj, &objects, NULL, name);
continue;
}
diff --git a/commit.c b/commit.c
index c6bf10d..46d5867 100644
--- a/commit.c
+++ b/commit.c
@@ -56,7 +56,7 @@ static struct commit *check_commit(struc
const unsigned char *sha1,
int quiet)
{
- if (obj->type != TYPE_COMMIT) {
+ if (obj->type != OBJ_COMMIT) {
if (!quiet)
error("Object %s is a %s, not a commit",
sha1_to_hex(sha1), typename(obj->type));
@@ -86,11 +86,11 @@ struct commit *lookup_commit(const unsig
if (!obj) {
struct commit *ret = alloc_commit_node();
created_object(sha1, &ret->object);
- ret->object.type = TYPE_COMMIT;
+ ret->object.type = OBJ_COMMIT;
return ret;
}
if (!obj->type)
- obj->type = TYPE_COMMIT;
+ obj->type = OBJ_COMMIT;
return check_commit(obj, sha1, 0);
}
diff --git a/describe.c b/describe.c
index 8e68d5d..324ca89 100644
--- a/describe.c
+++ b/describe.c
@@ -67,7 +67,7 @@ static int get_name(const char *path, co
* Otherwise only annotated tags are used.
*/
if (!strncmp(path, "refs/tags/", 10)) {
- if (object->type == TYPE_TAG)
+ if (object->type == OBJ_TAG)
prio = 2;
else
prio = 1;
diff --git a/fetch-pack.c b/fetch-pack.c
index f2c51eb..b7824db 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -46,7 +46,7 @@ static int rev_list_insert_ref(const cha
{
struct object *o = deref_tag(parse_object(sha1), path, 0);
- if (o && o->type == TYPE_COMMIT)
+ if (o && o->type == OBJ_COMMIT)
rev_list_push((struct commit *)o, SEEN);
return 0;
@@ -256,14 +256,14 @@ static int mark_complete(const char *pat
{
struct object *o = parse_object(sha1);
- while (o && o->type == TYPE_TAG) {
+ while (o && o->type == OBJ_TAG) {
struct tag *t = (struct tag *) o;
if (!t->tagged)
break; /* broken repository */
o->flags |= COMPLETE;
o = parse_object(t->tagged->sha1);
}
- if (o && o->type == TYPE_COMMIT) {
+ if (o && o->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *)o;
commit->object.flags |= COMPLETE;
insert_by_date(commit, &complete);
@@ -357,7 +357,7 @@ static int everything_local(struct ref *
* in sync with the other side at some time after
* that (it is OK if we guess wrong here).
*/
- if (o->type == TYPE_COMMIT) {
+ if (o->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *)o;
if (!cutoff || cutoff < commit->date)
cutoff = commit->date;
@@ -376,7 +376,7 @@ static int everything_local(struct ref *
struct object *o = deref_tag(lookup_object(ref->old_sha1),
NULL, 0);
- if (!o || o->type != TYPE_COMMIT || !(o->flags & COMPLETE))
+ if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
continue;
if (!(o->flags & SEEN)) {
diff --git a/fsck-objects.c b/fsck-objects.c
index ef54a8a..e167f41 100644
--- a/fsck-objects.c
+++ b/fsck-objects.c
@@ -297,13 +297,13 @@ static int fsck_sha1(unsigned char *sha1
if (obj->flags & SEEN)
return 0;
obj->flags |= SEEN;
- if (obj->type == TYPE_BLOB)
+ if (obj->type == OBJ_BLOB)
return 0;
- if (obj->type == TYPE_TREE)
+ if (obj->type == OBJ_TREE)
return fsck_tree((struct tree *) obj);
- if (obj->type == TYPE_COMMIT)
+ if (obj->type == OBJ_COMMIT)
return fsck_commit((struct commit *) obj);
- if (obj->type == TYPE_TAG)
+ if (obj->type == OBJ_TAG)
return fsck_tag((struct tag *) obj);
/* By now, parse_object() would've returned NULL instead. */
return objerror(obj, "unknown type '%d' (internal fsck error)", obj->type);
@@ -472,7 +472,7 @@ static int fsck_cache_tree(struct cache_
}
mark_reachable(obj, REACHABLE);
obj->used = 1;
- if (obj->type != TYPE_TREE)
+ if (obj->type != OBJ_TREE)
err |= objerror(obj, "non-tree in cache-tree");
}
for (i = 0; i < it->subtree_nr; i++)
diff --git a/http-push.c b/http-push.c
index f761584..4768619 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1784,16 +1784,16 @@ static int get_delta(struct rev_info *re
if (obj->flags & (UNINTERESTING | SEEN))
continue;
- if (obj->type == TYPE_TAG) {
+ if (obj->type == OBJ_TAG) {
obj->flags |= SEEN;
p = add_one_object(obj, p);
continue;
}
- if (obj->type == TYPE_TREE) {
+ if (obj->type == OBJ_TREE) {
p = process_tree((struct tree *)obj, p, NULL, name);
continue;
}
- if (obj->type == TYPE_BLOB) {
+ if (obj->type == OBJ_BLOB) {
p = process_blob((struct blob *)obj, p, NULL, name);
continue;
}
@@ -1960,12 +1960,12 @@ static int ref_newer(const unsigned char
* old. Otherwise we require --force.
*/
o = deref_tag(parse_object(old_sha1), NULL, 0);
- if (!o || o->type != TYPE_COMMIT)
+ if (!o || o->type != OBJ_COMMIT)
return 0;
old = (struct commit *) o;
o = deref_tag(parse_object(new_sha1), NULL, 0);
- if (!o || o->type != TYPE_COMMIT)
+ if (!o || o->type != OBJ_COMMIT)
return 0;
new = (struct commit *) o;
@@ -2044,7 +2044,7 @@ static void add_remote_info_ref(struct r
fwrite_buffer(ref_info, 1, len, buf);
free(ref_info);
- if (o->type == TYPE_TAG) {
+ if (o->type == OBJ_TAG) {
o = deref_tag(o, ls->dentry_name, 0);
if (o) {
len = strlen(ls->dentry_name) + 45;
diff --git a/name-rev.c b/name-rev.c
index 083d067..f92f14e 100644
--- a/name-rev.c
+++ b/name-rev.c
@@ -84,14 +84,14 @@ static int name_ref(const char *path, co
if (tags_only && strncmp(path, "refs/tags/", 10))
return 0;
- while (o && o->type == TYPE_TAG) {
+ while (o && o->type == OBJ_TAG) {
struct tag *t = (struct tag *) o;
if (!t->tagged)
break; /* broken repository */
o = parse_object(t->tagged->sha1);
deref = 1;
}
- if (o && o->type == TYPE_COMMIT) {
+ if (o && o->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *)o;
if (!strncmp(path, "refs/heads/", 11))
@@ -111,7 +111,7 @@ static const char* get_rev_name(struct o
struct rev_name *n;
struct commit *c;
- if (o->type != TYPE_COMMIT)
+ if (o->type != OBJ_COMMIT)
return "undefined";
c = (struct commit *) o;
n = c->util;
@@ -172,7 +172,7 @@ int main(int argc, char **argv)
}
o = deref_tag(parse_object(sha1), *argv, 0);
- if (!o || o->type != TYPE_COMMIT) {
+ if (!o || o->type != OBJ_COMMIT) {
fprintf(stderr, "Could not get commit for %s. Skipping.\n",
*argv);
continue;
diff --git a/object.c b/object.c
index 37277f9..e7ca56e 100644
--- a/object.c
+++ b/object.c
@@ -19,7 +19,8 @@ struct object *get_indexed_object(unsign
}
const char *type_names[] = {
- "none", "blob", "tree", "commit", "bad"
+ "none", "commit", "tree", "blob", "tag",
+ "bad type 5", "bad type 6", "delta", "bad",
};
static unsigned int hash_obj(struct object *obj, unsigned int n)
@@ -88,7 +89,7 @@ void created_object(const unsigned char
{
obj->parsed = 0;
obj->used = 0;
- obj->type = TYPE_NONE;
+ obj->type = OBJ_NONE;
obj->flags = 0;
memcpy(obj->sha1, sha1, 20);
@@ -131,7 +132,7 @@ struct object *lookup_unknown_object(con
if (!obj) {
union any_object *ret = xcalloc(1, sizeof(*ret));
created_object(sha1, &ret->object);
- ret->object.type = TYPE_NONE;
+ ret->object.type = OBJ_NONE;
return &ret->object;
}
return obj;
diff --git a/object.h b/object.h
index e0125e1..7893e94 100644
--- a/object.h
+++ b/object.h
@@ -24,12 +24,19 @@ struct object_array {
#define TYPE_BITS 3
#define FLAG_BITS 27
-#define TYPE_NONE 0
-#define TYPE_BLOB 1
-#define TYPE_TREE 2
-#define TYPE_COMMIT 3
-#define TYPE_TAG 4
-#define TYPE_BAD 5
+/*
+ * The object type is stored in 3 bits.
+ */
+enum object_type {
+ OBJ_NONE = 0,
+ OBJ_COMMIT = 1,
+ OBJ_TREE = 2,
+ OBJ_BLOB = 3,
+ OBJ_TAG = 4,
+ /* 5/6 for future expansion */
+ OBJ_DELTA = 7,
+ OBJ_BAD,
+};
struct object {
unsigned parsed : 1;
@@ -40,14 +47,14 @@ struct object {
};
extern int track_object_refs;
-extern const char *type_names[];
+extern const char *type_names[9];
extern unsigned int get_max_object_index(void);
extern struct object *get_indexed_object(unsigned int);
static inline const char *typename(unsigned int type)
{
- return type_names[type > TYPE_TAG ? TYPE_BAD : type];
+ return type_names[type > OBJ_TAG ? OBJ_BAD : type];
}
extern struct object_refs *lookup_object_refs(struct object *);
diff --git a/pack-check.c b/pack-check.c
diff --git a/pack.h b/pack.h
index 694e0c5..eb07b03 100644
--- a/pack.h
+++ b/pack.h
@@ -1,20 +1,7 @@
#ifndef PACK_H
#define PACK_H
-/*
- * The packed object type is stored in 3 bits.
- * The type value 0 is a reserved prefix if ever there is more than 7
- * object types, or any future format extensions.
- */
-enum object_type {
- OBJ_EXT = 0,
- OBJ_COMMIT = 1,
- OBJ_TREE = 2,
- OBJ_BLOB = 3,
- OBJ_TAG = 4,
- /* 5/6 for future expansion */
- OBJ_DELTA = 7,
-};
+#include "object.h"
/*
* Packed object header
diff --git a/revision.c b/revision.c
index 7df9089..874e349 100644
--- a/revision.c
+++ b/revision.c
@@ -135,7 +135,7 @@ static struct commit *handle_commit(stru
/*
* Tag object? Look what it points to..
*/
- while (object->type == TYPE_TAG) {
+ while (object->type == OBJ_TAG) {
struct tag *tag = (struct tag *) object;
if (revs->tag_objects && !(flags & UNINTERESTING))
add_pending_object(revs, object, tag->tag);
@@ -148,7 +148,7 @@ static struct commit *handle_commit(stru
* Commit object? Just return it, we'll do all the complex
* reachability crud.
*/
- if (object->type == TYPE_COMMIT) {
+ if (object->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *)object;
if (parse_commit(commit) < 0)
die("unable to parse commit %s", name);
@@ -164,7 +164,7 @@ static struct commit *handle_commit(stru
* Tree object? Either mark it uniniteresting, or add it
* to the list of objects to look at later..
*/
- if (object->type == TYPE_TREE) {
+ if (object->type == OBJ_TREE) {
struct tree *tree = (struct tree *)object;
if (!revs->tree_objects)
return NULL;
@@ -179,7 +179,7 @@ static struct commit *handle_commit(stru
/*
* Blob object? You know the drill by now..
*/
- if (object->type == TYPE_BLOB) {
+ if (object->type == OBJ_BLOB) {
struct blob *blob = (struct blob *)object;
if (!revs->blob_objects)
return NULL;
@@ -494,11 +494,11 @@ static int add_parents_only(struct rev_i
return 0;
while (1) {
it = get_reference(revs, arg, sha1, 0);
- if (it->type != TYPE_TAG)
+ if (it->type != OBJ_TAG)
break;
memcpy(sha1, ((struct tag*)it)->tagged->sha1, 20);
}
- if (it->type != TYPE_COMMIT)
+ if (it->type != OBJ_COMMIT)
return 0;
commit = (struct commit *)it;
for (parents = commit->parents; parents; parents = parents->next) {
diff --git a/send-pack.c b/send-pack.c
index 4019a4b..10bc8bc 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -151,12 +151,12 @@ static int ref_newer(const unsigned char
* old. Otherwise we require --force.
*/
o = deref_tag(parse_object(old_sha1), NULL, 0);
- if (!o || o->type != TYPE_COMMIT)
+ if (!o || o->type != OBJ_COMMIT)
return 0;
old = (struct commit *) o;
o = deref_tag(parse_object(new_sha1), NULL, 0);
- if (!o || o->type != TYPE_COMMIT)
+ if (!o || o->type != OBJ_COMMIT)
return 0;
new = (struct commit *) o;
diff --git a/server-info.c b/server-info.c
index fdfe05a..7df628f 100644
--- a/server-info.c
+++ b/server-info.c
@@ -12,7 +12,7 @@ static int add_info_ref(const char *path
struct object *o = parse_object(sha1);
fprintf(info_ref_fp, "%s %s\n", sha1_to_hex(sha1), path);
- if (o->type == TYPE_TAG) {
+ if (o->type == OBJ_TAG) {
o = deref_tag(o, path, 0);
if (o)
fprintf(info_ref_fp, "%s %s^{}\n",
diff --git a/sha1_name.c b/sha1_name.c
index f2cbafa..5fe8e5d 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -381,13 +381,13 @@ static int peel_onion(const char *name,
sp++; /* beginning of type name, or closing brace for empty */
if (!strncmp(commit_type, sp, 6) && sp[6] == '}')
- expected_type = TYPE_COMMIT;
+ expected_type = OBJ_COMMIT;
else if (!strncmp(tree_type, sp, 4) && sp[4] == '}')
- expected_type = TYPE_TREE;
+ expected_type = OBJ_TREE;
else if (!strncmp(blob_type, sp, 4) && sp[4] == '}')
- expected_type = TYPE_BLOB;
+ expected_type = OBJ_BLOB;
else if (sp[0] == '}')
- expected_type = TYPE_NONE;
+ expected_type = OBJ_NONE;
else
return -1;
@@ -416,9 +416,9 @@ static int peel_onion(const char *name,
memcpy(sha1, o->sha1, 20);
return 0;
}
- if (o->type == TYPE_TAG)
+ if (o->type == OBJ_TAG)
o = ((struct tag*) o)->tagged;
- else if (o->type == TYPE_COMMIT)
+ else if (o->type == OBJ_COMMIT)
o = &(((struct commit *) o)->tree->object);
else
return error("%.*s: expected %s type, but the object dereferences to %s type",
diff --git a/tag.c b/tag.c
index 74d0dab..864ac1b 100644
--- a/tag.c
+++ b/tag.c
@@ -5,7 +5,7 @@ const char *tag_type = "tag";
struct object *deref_tag(struct object *o, const char *warn, int warnlen)
{
- while (o && o->type == TYPE_TAG)
+ while (o && o->type == OBJ_TAG)
o = parse_object(((struct tag *)o)->tagged->sha1);
if (!o && warn) {
if (!warnlen)
@@ -21,12 +21,12 @@ struct tag *lookup_tag(const unsigned ch
if (!obj) {
struct tag *ret = alloc_tag_node();
created_object(sha1, &ret->object);
- ret->object.type = TYPE_TAG;
+ ret->object.type = OBJ_TAG;
return ret;
}
if (!obj->type)
- obj->type = TYPE_TAG;
- if (obj->type != TYPE_TAG) {
+ obj->type = OBJ_TAG;
+ if (obj->type != OBJ_TAG) {
error("Object %s is a %s, not a tree",
sha1_to_hex(sha1), typename(obj->type));
return NULL;
diff --git a/tree.c b/tree.c
index 1023655..a6032e3 100644
--- a/tree.c
+++ b/tree.c
@@ -131,12 +131,12 @@ struct tree *lookup_tree(const unsigned
if (!obj) {
struct tree *ret = alloc_tree_node();
created_object(sha1, &ret->object);
- ret->object.type = TYPE_TREE;
+ ret->object.type = OBJ_TREE;
return ret;
}
if (!obj->type)
- obj->type = TYPE_TREE;
- if (obj->type != TYPE_TREE) {
+ obj->type = OBJ_TREE;
+ if (obj->type != OBJ_TREE) {
error("Object %s is a %s, not a tree",
sha1_to_hex(sha1), typename(obj->type));
return NULL;
@@ -216,11 +216,11 @@ struct tree *parse_tree_indirect(const u
do {
if (!obj)
return NULL;
- if (obj->type == TYPE_TREE)
+ if (obj->type == OBJ_TREE)
return (struct tree *) obj;
- else if (obj->type == TYPE_COMMIT)
+ else if (obj->type == OBJ_COMMIT)
obj = &(((struct commit *) obj)->tree->object);
- else if (obj->type == TYPE_TAG)
+ else if (obj->type == OBJ_TAG)
obj = ((struct tag *) obj)->tagged;
else
return NULL;
diff --git a/upload-pack.c b/upload-pack.c
index b18eb9b..2e820c9 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -326,7 +326,7 @@ static int got_sha1(char *hex, unsigned
o = parse_object(sha1);
if (!o)
die("oops (%s)", sha1_to_hex(sha1));
- if (o->type == TYPE_COMMIT) {
+ if (o->type == OBJ_COMMIT) {
struct commit_list *parents;
if (o->flags & THEY_HAVE)
return 0;
@@ -457,7 +457,7 @@ static int send_ref(const char *refname,
o->flags |= OUR_REF;
nr_our_refs++;
}
- if (o->type == TYPE_TAG) {
+ if (o->type == OBJ_TAG) {
o = deref_tag(o, refname, 0);
packet_write(1, "%s %s^{}\n", sha1_to_hex(o->sha1), refname);
}
^ permalink raw reply related
* [PATCH] gitweb.cgi: Teach tree->raw to not require the hash of the blob
From: Luben Tuikov @ 2006-07-12 3:43 UTC (permalink / raw)
To: git
[-- Attachment #1: Type: text/plain, Size: 503 bytes --]
Teach tree->raw to not require the hash of the blob, but to
figure it out from the file name. This allows to externally
link to files into the repository, such that the hash is not
required. I.e. the file obtained would be as of the HEAD
commit.
In contrast tree->blob for binary files passes the hash, as
does tree->blob->plain for "text/*" files.
Signed-off-by: Luben Tuikov <ltuikov@yahoo.com>
---
gitweb/gitweb.cgi | 20 ++++++++++++++++----
1 files changed, 16 insertions(+), 4 deletions(-)
[-- Attachment #2: pat1827152979 --]
[-- Type: application/octet-stream, Size: 2055 bytes --]
diff --git a/gitweb/gitweb.cgi b/gitweb/gitweb.cgi
index 2e87de4..e904eb7 100755
--- a/gitweb/gitweb.cgi
+++ b/gitweb/gitweb.cgi
@@ -1521,6 +1521,14 @@ sub git_blob_plain_mimetype {
}
sub git_blob_plain {
+ if (!defined $hash) {
+ if (defined $file_name) {
+ my $base = $hash_base || git_read_head($project);
+ $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
+ } else {
+ die_error(undef, "No file name defined.");
+ }
+ }
my $type = shift;
open my $fd, "-|", "$gitbin/git-cat-file blob $hash" or die_error("Couldn't cat $file_name, $hash");
@@ -1544,9 +1552,13 @@ sub git_blob_plain {
}
sub git_blob {
- if (!defined $hash && defined $file_name) {
- my $base = $hash_base || git_read_head($project);
- $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
+ if (!defined $hash) {
+ if (defined $file_name) {
+ my $base = $hash_base || git_read_head($project);
+ $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
+ } else {
+ die_error(undef, "No file name defined.");
+ }
}
my $have_blame = git_get_project_config_bool ('blame');
open my $fd, "-|", "$gitbin/git-cat-file blob $hash" or die_error(undef, "Open failed.");
@@ -1678,8 +1690,7 @@ sub git_tree {
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$t_hash$base_key;f=$base$t_name")}, "blob") .
# " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;h=$t_hash$base_key;f=$base$t_name")}, "blame") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;h=$hash_base;f=$base$t_name")}, "history") .
- " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;h=$t_hash;f=$base$t_name")}, "raw") .
+ " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;f=$base$t_name")}, "raw") .
"</td>\n";
} elsif ($t_type eq "tree") {
print "<td class=\"list\">" .
--
1.4.1.g9ca3
^ permalink raw reply related
* [PATCH] gitweb.css: Courer fonts for commits and tree-diff
From: Luben Tuikov @ 2006-07-12 3:43 UTC (permalink / raw)
To: git
[-- Attachment #1: Type: text/plain, Size: 205 bytes --]
Courer fonts for the commit header, commit message,
and tree-diff.
Signed-off-by: Luben Tuikov <ltuikov@yahoo.com>
---
gitweb/gitweb.css | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
[-- Attachment #2: pat619875137 --]
[-- Type: application/octet-stream, Size: 685 bytes --]
diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css
index 98410f5..b51282b 100644
--- a/gitweb/gitweb.css
+++ b/gitweb/gitweb.css
@@ -60,6 +60,7 @@ div.page_footer_text {
div.page_body {
padding: 8px;
+ font-family: courier;
}
div.title, a.title {
@@ -79,6 +80,7 @@ div.title_text {
padding: 6px 0px;
border: solid #d9d8d1;
border-width: 0px 0px 1px;
+ font-family: courier;
}
div.log_body {
@@ -142,11 +144,15 @@ table {
padding: 8px 4px;
}
-table.project_list, table.diff_tree {
+table.project_list {
border-spacing: 0;
}
+table.diff_tree {
+ border-spacing: 0;
+ font-family: courier;
+}
+
table.blame {
border-collapse: collapse;
}
--
1.4.1.g9ca3
^ permalink raw reply related
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Linus Torvalds @ 2006-07-12 3:42 UTC (permalink / raw)
To: Junio C Hamano; +Cc: sf, Johannes Schindelin, Git Mailing List
In-Reply-To: <7vveq31wgo.fsf@assigned-by-dhcp.cox.net>
On Tue, 11 Jul 2006, Junio C Hamano wrote:
> > unsigned char *buf = xmalloc(1+size);
> > + unsigned long n;
> >
> > - memcpy(buf, (char *) buffer + bytes, stream->total_out - bytes);
> > - bytes = stream->total_out - bytes;
> > + n = stream->total_out - bytes;
> > + if (n > size)
> > + n = size;
> > + memcpy(buf, (char *) buffer + bytes, n);
> > + bytes = n;
> > if (bytes < size) {
> > stream->next_out = buf + bytes;
> > stream->avail_out = size - bytes;
>
> This one looks like an independent fix for a well spotted bug.
Yeah, well, the "bug" only happens if you screw something up (which I
triggered both times I tried to rewrite this ;)
Or possibly it the object is corrupt.
But yes, it's independent.
> > - size = deflateBound(&stream, len+hdrlen);
> > + size = 8 + deflateBound(&stream, len+hdrlen);
> > compressed = xmalloc(size);
> >
> > /* Compress it */
>
> I am wondring what this eight is. You would pack 7 7-bit length
> plus 4-bit totalling 49+4 = 53-bit length (plus 4-bit type). Is
> it an unwritten decision that the format would not deal with
> objects larger than 2^53 (which is probably fine but looks
> magic)?
8 was just "obviously enough".
The "hdrlen" part should already give us _way_ more padding than we need
(the old-fashioned header will deflate to something bigger than the new
header, so deflateBound() even _without_ the extra space should be
plenty).
But I decided to add a few bytes just because it won't hurt.
Linus
^ permalink raw reply
* Wow, you used to ccum within 5 minutes!
From: Foreman @ 2006-07-12 3:30 UTC (permalink / raw)
To: godard
How are you? You have a unique chance to forget this distress forever. Stop being a two pump chump. Gain confidence with Extra-Time, a ground-breaking thing making your life better. Imagine how your life will improve if you stopped being reproached for premature creaming once and for all. Check up here: http://justcallterry.com/dll/get/ Give her the beautiful romantic evening full of love that she has been waiting for.
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Junio C Hamano @ 2006-07-12 0:46 UTC (permalink / raw)
To: Linus Torvalds; +Cc: sf, Johannes Schindelin, Git Mailing List
In-Reply-To: <Pine.LNX.4.64.0607111656250.5623@g5.osdl.org>
Linus Torvalds <torvalds@osdl.org> writes:
> It's actually really part of the specs, and not just happenstance.
> Well, I normally would agree with you if it was a "oh, all our zlib
> objects seem to start with 0x78" thing, but after having dug into both the
> zlib standard (which is actually an RFC, not just some random thing), and
> looked at the sources, it's definitely the case that the "0x78" byte isn't
> just an implementation detail.
Ok, I do not think we would worry about casting use of deflate +
32k windowsize in stone that much, and being able to check the
size and type without inflating certainly is attractive.
Validating FCHECK bits is surely a nice touch. Thanks.
> Anyway, I think this following patch replaces the old 2/3 and 3/3 (it
> still depends on the original [1/3] cleanup.
>
> (It also renames and reverses the meaning of the config file option: it's
> now "[core] LegacyHeaders = true" for using legacy headers.)
>
> Not heavily tested, but seems ok.
I'd queue it in "pu" with reversed default and then move it to
"next" later.
> static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size)
> {
> int bytes = strlen(buffer) + 1;
> unsigned char *buf = xmalloc(1+size);
> + unsigned long n;
>
> - memcpy(buf, (char *) buffer + bytes, stream->total_out - bytes);
> - bytes = stream->total_out - bytes;
> + n = stream->total_out - bytes;
> + if (n > size)
> + n = size;
> + memcpy(buf, (char *) buffer + bytes, n);
> + bytes = n;
> if (bytes < size) {
> stream->next_out = buf + bytes;
> stream->avail_out = size - bytes;
This one looks like an independent fix for a well spotted bug.
> int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *returnsha1)
> {
> int size;
> @@ -1459,7 +1550,7 @@ int write_sha1_file(void *buf, unsigned
> /* Set it up */
> memset(&stream, 0, sizeof(stream));
> deflateInit(&stream, zlib_compression_level);
> - size = deflateBound(&stream, len+hdrlen);
> + size = 8 + deflateBound(&stream, len+hdrlen);
> compressed = xmalloc(size);
>
> /* Compress it */
I am wondring what this eight is. You would pack 7 7-bit length
plus 4-bit totalling 49+4 = 53-bit length (plus 4-bit type). Is
it an unwritten decision that the format would not deal with
objects larger than 2^53 (which is probably fine but looks
magic)?
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Johannes Schindelin @ 2006-07-12 0:39 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Junio C Hamano, sf, Git Mailing List
In-Reply-To: <Pine.LNX.4.64.0607111656250.5623@g5.osdl.org>
Hi,
On Tue, 11 Jul 2006, Linus Torvalds wrote:
> On Tue, 11 Jul 2006, Junio C Hamano wrote:
> >
> > I do not like to rely too heavily on what zlib compression's
> > beginning of stream looks like.
>
> Well, I normally would agree with you if it was a "oh, all our zlib
> objects seem to start with 0x78" thing, but after having dug into both the
> zlib standard (which is actually an RFC, not just some random thing), and
> looked at the sources, it's definitely the case that the "0x78" byte isn't
> just an implementation detail.
>
> It's actually really part of the specs, and not just happenstance.
Good.
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -684,26 +684,74 @@ static void *map_sha1_file_internal(cons
> return map;
> }
>
> -static int unpack_sha1_header(z_stream *stream, void *map, unsigned long mapsize, void *buffer, unsigned long size)
> +static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz)
> {
> + unsigned char c;
> + unsigned int word, bits;
> + unsigned long size;
> + static const char *typename[8] = {
> + NULL, /* OBJ_EXT */
> + "commit", "tree", "blob", "tag",
> + NULL, NULL, NULL
> + };
I completely forgot to mention that type_names[] is already declared in
object.h. Obviously, it is not really important, but maybe it would be
better to obey the DRY principle (think addition of "bind" object type).
> + while (!(c & 0x80)) {
> + if (bits >= 8*sizeof(long))
Another nit: while it is safe to assume that sizeof(long) ==
sizeof(unsigned long), it was nevertheless a little confusing to yours
truly (especially since you changed it since your last patch).
> static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size)
> {
> int bytes = strlen(buffer) + 1;
> unsigned char *buf = xmalloc(1+size);
> + unsigned long n;
>
> - memcpy(buf, (char *) buffer + bytes, stream->total_out - bytes);
> - bytes = stream->total_out - bytes;
> + n = stream->total_out - bytes;
> + if (n > size)
> + n = size;
Just out of curiosity: when can this happen? I mean, there is no error or
something which could tell the caller that not the whole object was
copied.
> memset(&stream, 0, sizeof(stream));
> deflateInit(&stream, zlib_compression_level);
> - size = deflateBound(&stream, len+hdrlen);
> + size = 8 + deflateBound(&stream, len+hdrlen);
Again, I had to think why this is correct. I think it should be something
like 2 + sizeof(unsigned long) * 8 / 7, but I did not think all that hard.
It looks good to me, but I did not really test...
Ciao,
Dscho
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Linus Torvalds @ 2006-07-12 0:03 UTC (permalink / raw)
To: Junio C Hamano, sf, Johannes Schindelin; +Cc: Git Mailing List
In-Reply-To: <7vejwr3ftl.fsf@assigned-by-dhcp.cox.net>
On Tue, 11 Jul 2006, Junio C Hamano wrote:
>
> I do not like to rely too heavily on what zlib compression's
> beginning of stream looks like.
Well, I normally would agree with you if it was a "oh, all our zlib
objects seem to start with 0x78" thing, but after having dug into both the
zlib standard (which is actually an RFC, not just some random thing), and
looked at the sources, it's definitely the case that the "0x78" byte isn't
just an implementation detail.
It's actually really part of the specs, and not just happenstance.
> I think the new format can be deflated new header (fully
> synched) followed by deflated payload.
That would work, but on the other hand, one of the advantages of doing the
new format would be that the "check size and type" code wouldn't even need
to call into the zlib code.
Anyway, I think this following patch replaces the old 2/3 and 3/3 (it
still depends on the original [1/3] cleanup.
(It also renames and reverses the meaning of the config file option: it's
now "[core] LegacyHeaders = true" for using legacy headers.)
Not heavily tested, but seems ok.
sf? Dscho? Can you check this thing out?
Linus
----
Documentation/config.txt | 6 +++
cache.h | 1
config.c | 5 ++
environment.c | 1
sha1_file.c | 106 +++++++++++++++++++++++++++++++++++++++++++---
5 files changed, 111 insertions(+), 8 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 0b434c1..9780c89 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -97,6 +97,12 @@ core.compression::
compression, and 1..9 are various speed/size tradeoffs, 9 being
slowest.
+core.legacyheaders::
+ A boolean which enables the legacy object header format in case
+ you want to interoperate with old clients accessing the object
+ database directly (where the "http://" and "rsync://" protocols
+ count as direct access).
+
alias.*::
Command aliases for the gitlink:git[1] command wrapper - e.g.
after defining "alias.last = cat-file commit HEAD", the invocation
diff --git a/cache.h b/cache.h
index d433d46..eee5fc9 100644
--- a/cache.h
+++ b/cache.h
@@ -176,6 +176,7 @@ extern int commit_lock_file(struct lock_
extern void rollback_lock_file(struct lock_file *);
/* Environment bits from configuration mechanism */
+extern int use_legacy_headers;
extern int trust_executable_bit;
extern int assume_unchanged;
extern int prefer_symlink_refs;
diff --git a/config.c b/config.c
index 8445f7d..0ac6aeb 100644
--- a/config.c
+++ b/config.c
@@ -279,6 +279,11 @@ int git_default_config(const char *var,
return 0;
}
+ if (!strcmp(var, "core.legacyheaders")) {
+ use_legacy_headers = git_config_bool(var, value);
+ return 0;
+ }
+
if (!strcmp(var, "core.compression")) {
int level = git_config_int(var, value);
if (level == -1)
diff --git a/environment.c b/environment.c
index 97d42b1..d80a39a 100644
--- a/environment.c
+++ b/environment.c
@@ -11,6 +11,7 @@ #include "cache.h"
char git_default_email[MAX_GITNAME];
char git_default_name[MAX_GITNAME];
+int use_legacy_headers = 0;
int trust_executable_bit = 1;
int assume_unchanged = 0;
int prefer_symlink_refs = 0;
diff --git a/sha1_file.c b/sha1_file.c
index 8734d50..475b23d 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -684,26 +684,74 @@ static void *map_sha1_file_internal(cons
return map;
}
-static int unpack_sha1_header(z_stream *stream, void *map, unsigned long mapsize, void *buffer, unsigned long size)
+static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz)
{
+ unsigned char c;
+ unsigned int word, bits;
+ unsigned long size;
+ static const char *typename[8] = {
+ NULL, /* OBJ_EXT */
+ "commit", "tree", "blob", "tag",
+ NULL, NULL, NULL
+ };
+ const char *type;
+
/* Get the data stream */
memset(stream, 0, sizeof(*stream));
stream->next_in = map;
stream->avail_in = mapsize;
stream->next_out = buffer;
- stream->avail_out = size;
+ stream->avail_out = bufsiz;
+
+ /*
+ * Is it a zlib-compressed buffer? If so, the first byte
+ * must be 0x78 (15-bit window size, deflated), and the
+ * first 16-bit word is evenly divisible by 31
+ */
+ word = (map[0] << 8) + map[1];
+ if (map[0] == 0x78 && !(word % 31)) {
+ inflateInit(stream);
+ return inflate(stream, 0);
+ }
+
+ c = *map++;
+ mapsize--;
+ type = typename[(c >> 4) & 7];
+ if (!type)
+ return -1;
+
+ bits = 4;
+ size = c & 0xf;
+ while (!(c & 0x80)) {
+ if (bits >= 8*sizeof(long))
+ return -1;
+ c = *map++;
+ size += (c & 0x7f) << bits;
+ bits += 7;
+ mapsize--;
+ }
+ /* Set up the stream for the rest.. */
+ stream->next_in = map;
+ stream->avail_in = mapsize;
inflateInit(stream);
- return inflate(stream, 0);
+
+ /* And generate the fake traditional header */
+ stream->total_out = 1 + snprintf(buffer, bufsiz, "%s %lu", type, size);
+ return 0;
}
static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size)
{
int bytes = strlen(buffer) + 1;
unsigned char *buf = xmalloc(1+size);
+ unsigned long n;
- memcpy(buf, (char *) buffer + bytes, stream->total_out - bytes);
- bytes = stream->total_out - bytes;
+ n = stream->total_out - bytes;
+ if (n > size)
+ n = size;
+ memcpy(buf, (char *) buffer + bytes, n);
+ bytes = n;
if (bytes < size) {
stream->next_out = buf + bytes;
stream->avail_out = size - bytes;
@@ -1414,6 +1462,49 @@ static int write_buffer(int fd, const vo
return 0;
}
+static int write_binary_header(unsigned char *hdr, enum object_type type, unsigned long len)
+{
+ int hdr_len;
+ unsigned char c;
+
+ c = (type << 4) | (len & 15);
+ len >>= 4;
+ hdr_len = 1;
+ while (len) {
+ *hdr++ = c;
+ hdr_len++;
+ c = (len & 0x7f);
+ len >>= 7;
+ }
+ *hdr = c | 0x80;
+ return hdr_len;
+}
+
+static void setup_object_header(z_stream *stream, const char *type, unsigned long len)
+{
+ int obj_type, hdr;
+
+ if (use_legacy_headers) {
+ while (deflate(stream, 0) == Z_OK)
+ /* nothing */;
+ return;
+ }
+ if (!strcmp(type, blob_type))
+ obj_type = OBJ_BLOB;
+ else if (!strcmp(type, tree_type))
+ obj_type = OBJ_TREE;
+ else if (!strcmp(type, commit_type))
+ obj_type = OBJ_COMMIT;
+ else if (!strcmp(type, tag_type))
+ obj_type = OBJ_TAG;
+ else
+ die("trying to generate bogus object of type '%s'", type);
+ hdr = write_binary_header(stream->next_out, obj_type, len);
+ stream->total_out = hdr;
+ stream->next_out += hdr;
+ stream->avail_out -= hdr;
+}
+
int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *returnsha1)
{
int size;
@@ -1459,7 +1550,7 @@ int write_sha1_file(void *buf, unsigned
/* Set it up */
memset(&stream, 0, sizeof(stream));
deflateInit(&stream, zlib_compression_level);
- size = deflateBound(&stream, len+hdrlen);
+ size = 8 + deflateBound(&stream, len+hdrlen);
compressed = xmalloc(size);
/* Compress it */
@@ -1469,8 +1560,7 @@ int write_sha1_file(void *buf, unsigned
/* First header.. */
stream.next_in = hdr;
stream.avail_in = hdrlen;
- while (deflate(&stream, 0) == Z_OK)
- /* nothing */;
+ setup_object_header(&stream, type, len);
/* Then the data itself.. */
stream.next_in = buf;
^ permalink raw reply related
* Re: [PATCH] Install built-ins as symlinks
From: Alex Riesen @ 2006-07-12 0:01 UTC (permalink / raw)
To: Petr Baudis; +Cc: Johannes Schindelin, Alp Toker, git
In-Reply-To: <20060711184838.GC13776@pasky.or.cz>
Petr Baudis, Tue, Jul 11, 2006 20:48:38 +0200:
> > And -- just maybe -- I _did_ mention a single reason to keep hard links:
> > It works now. So why change it?
>
> The original patch mentioned why hardlinks are bad, so if you argue
> that the raised points are moot, you should give some substance to your
> argument.
Windows will add that substance, even if it is a dirty one: symlinks
don't work there properly (cygwin makes that very stupid .lnk file).
^ permalink raw reply
* Re: git-daemon problem
From: Junio C Hamano @ 2006-07-11 23:32 UTC (permalink / raw)
To: Matthias Lederhofer; +Cc: git
In-Reply-To: <E1G0QeX-0003hG-0I@moooo.ath.cx>
Matthias Lederhofer <matled@gmx.net> writes:
> A few weeks ago upgrading from 1.3.x to 1.4.1 I had a problem with
> git-daemon. I started git-daemon on a terminal but did not redirect
> stdin/stdout/stderr to /dev/null (actually using daemon(8) on freebsd
> without -f but just disowning the process and closing the terminal
> works fine too, nothing freebsd/daemon(8) specific).
This is because the server side closes fd #2 in such a setup,
and we still wrote using safe_write() into it. Thanks for
spotting.
Would this replacement patch help?
diff --git a/upload-pack.c b/upload-pack.c
index b18eb9b..44038d3 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -51,6 +51,13 @@ static ssize_t send_client_data(int fd,
if (fd == 3)
/* emergency quit */
fd = 2;
+ if (fd == 2) {
+ /* people sometomes close fd 2 on the server
+ * side -- making safe_write() to barf.
+ */
+ write(2, data, sz);
+ return sz;
+ }
return safe_write(fd, data, sz);
}
p = data;
^ permalink raw reply related
* Re: git-daemon problem
From: Junio C Hamano @ 2006-07-11 23:04 UTC (permalink / raw)
To: git
In-Reply-To: <E1G0QeX-0003hG-0I@moooo.ath.cx>
Matthias Lederhofer <matled@gmx.net> writes:
> A few weeks ago upgrading from 1.3.x to 1.4.1 I had a problem with
> git-daemon. I started git-daemon on a terminal but did not redirect
> stdin/stdout/stderr to /dev/null (actually using daemon(8) on freebsd
> without -f but just disowning the process and closing the terminal
> works fine too, nothing freebsd/daemon(8) specific). After closing
> the terminal I was not able to use the git-daemon anymore with some
> versions of the git. So now I took some time and tried to find what
> was the reason for that.
>
> It seems to be related to the client version too (git without version
> appendix is the current next (028cfcba78c3e4).
>
> 583b7ea31b7c16~1 (last good):
> $ git clone git://host:9419/foo
> $ git1.3.2 clone git://host:9419/foo.git
> (cloned successfully, both no output)
>
> 583b7ea31b7c16 (first bad):
> $ git clone git://host:9420/foo
> Generating pack...
> Done counting 6 objects.
> Deltifying 6 objects.
> 100% (6/6) done
> Total 6, written 6 (delta 0), reused 0 (delta 0)
> $ git1.3.2 clone git://host:9420/foo.git
> fatal: cannot mmap packfile '/somewhere/foo/.git/objects/pack/tmp-VX82qz': Invalid argument
> error: git-fetch-pack: unable to read from git-index-pack
> error: git-index-pack died with error code 128
> fetch-pack from 'git://host:9420/foo.git' failed.
> [1] 13267 exit 1 git1.3.2 clone git://host:9420/foo.git
> (/somewhere is the cwd on the client)
>
> I tried to find which part of the patch caused the problem and came
> out with the patch below. With this I can clone with git1.3.2 again
> but then git 1.4.x does not show any statistics about packing, its
> just a starting point to look at. Perhaps someone has an idea why
> this happens. I've got to sleep now :)
>
> ---
> upload-pack.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/upload-pack.c b/upload-pack.c
> index 7b86f69..94f0d85 100644
> --- a/upload-pack.c
> +++ b/upload-pack.c
> @@ -249,7 +249,7 @@ static void create_pack_file(void)
> sz = read(pe_pipe[0], progress,
> sizeof(progress));
> if (0 < sz)
> - send_client_data(2, progress, sz);
> + write(2, progress, sz);
> else if (sz == 0) {
> close(pe_pipe[0]);
> pe_pipe[0] = -1;
This breaks the newer clients that knows how to do side-band
doesn't it?
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Junio C Hamano @ 2006-07-11 23:03 UTC (permalink / raw)
To: git
In-Reply-To: <Pine.LNX.4.64.0607111449190.5623@g5.osdl.org>
Linus Torvalds <torvalds@osdl.org> writes:
> So if we have a uncompressed header, we'd need to add a separate 2-byte
> fingerprint to it _before_ the real header that isn't divisible by 31, and
> use that as the thing to test.
>
> Ho humm. I'll see what I can come up with.
I do not like to rely too heavily on what zlib compression's
beginning of stream looks like.
I think the new format can be deflated new header (fully
synched) followed by deflated payload.
So the sequence unpack-sha1-header followed by parse-sha1-header
would notice we are dealing with new format and reinitialize the
deflator at the point where the header deflator left off.
Wouldn't that work?
^ permalink raw reply
* Re: [PATCH] Typo fix
From: Pavel Roskin @ 2006-07-11 22:37 UTC (permalink / raw)
To: Alp Toker; +Cc: git
In-Reply-To: <11526131782190-git-send-email-alp@atoker.com>
Hello Alp,
On Tue, 2006-07-11 at 11:19 +0100, Alp Toker wrote:
> Signed-off-by: Alp Toker <alp@atoker.com>
> ---
> -wrote you about that phantastic commit 33db5f4d9027a10e477ccf054b2c1ab94f74c85a.
> +wrote you about that fantastic commit 33db5f4d9027a10e477ccf054b2c1ab94f74c85a.
You are overreacting. I checked all sources for typos and of course I
saw "phantastic" but I assumed it was intentional. We don't want the
documentation to be devoid of humor. Just in case, British spelling
like "behaviour" was also preserved out of respect to the authors.
--
Regards,
Pavel Roskin
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: sf @ 2006-07-11 22:25 UTC (permalink / raw)
To: git
In-Reply-To: <Pine.LNX.4.64.0607111449190.5623@g5.osdl.org>
Linus Torvalds wrote:
...
> The common byte sequence for a compressed stream is
>
> 78 9c ...
>
> where the first byte is the CMF byte (compression info and method).
>
> But it's not the only possible such sequence according to the zlib format.
No, but 0x78 is the only first byte ever produced by git; the files are
always deflated (second nibble is 8) with window size 32K (first nibble
is 7).
^ permalink raw reply
* Re: [RFC]: Pack-file object format for individual objects (Was: Revisiting large binary files issue.)
From: Linus Torvalds @ 2006-07-11 22:26 UTC (permalink / raw)
To: sf; +Cc: git
In-Reply-To: <Pine.LNX.4.64.0607111512420.5623@g5.osdl.org>
On Tue, 11 Jul 2006, Linus Torvalds wrote:
>
> - for low bits: CM (compression method):
>
> "This identifies the compression method used in the file. CM = 8
> denotes the "deflate" compression method with a window size up
> to 32K. This is the method used by gzip and PNG (see
> references [1] and [2] in Chapter 3, below, for the reference
> documents). CM = 15 is reserved. It might be used in a future
> version of this specification to indicate the presence of an
> extra field before the compressed data."
>
> - four high bits are CINFO:
>
> "For CM = 8, CINFO is the base-2 logarithm of the LZ77 window
> size, minus eight (CINFO=7 indicates a 32K window size). Values
> of CINFO above 7 are not allowed in this version of the
> specification. CINFO is not defined in this specification for
> CM not equal to 8."
>
> so 0x78 means "deflate with 32kB window size", but I don't see anything
> guaranteeing that we might not see something else for an object that
> cannot be compressed, for example.
Ahh. Looking at the zlib sources, I see
/* Write the zlib header */
if (s->status == INIT_STATE) {
uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
uInt level_flags = (s->level-1) >> 1;
if (level_flags > 3) level_flags = 3;
header |= (level_flags << 6);
if (s->strstart != 0) header |= PRESET_DICT;
header += 31 - (header % 31);
s->status = BUSY_STATE;
putShortMSB(s, header);
(which is that first 16-bit word, MSB first). So we'll always have the
Z-DEFLATED (8) there in the low four bits, but the high nybble will be
"s->w_bits-8" where w_bits comes from windowBits, and I think we can
depend on it beign 15:
"The windowBits parameter is the base two logarithm of the window size
(the size of the history buffer). It should be in the range 8..15 for this
version of the library. Larger values of this parameter result in better
compression at the expense of memory usage. The default value is 15 if
deflateInit is used instead."
so since we use deflateInit(), we know the window will be 15.
So I guess we _can_ depend on the first byte being 0x78 for our use.
Goodie.
Linus
^ permalink raw reply
* git-daemon problem
From: Matthias Lederhofer @ 2006-07-11 22:24 UTC (permalink / raw)
To: git
A few weeks ago upgrading from 1.3.x to 1.4.1 I had a problem with
git-daemon. I started git-daemon on a terminal but did not redirect
stdin/stdout/stderr to /dev/null (actually using daemon(8) on freebsd
without -f but just disowning the process and closing the terminal
works fine too, nothing freebsd/daemon(8) specific). After closing
the terminal I was not able to use the git-daemon anymore with some
versions of the git. So now I took some time and tried to find what
was the reason for that.
It seems to be related to the client version too (git without version
appendix is the current next (028cfcba78c3e4).
583b7ea31b7c16~1 (last good):
$ git clone git://host:9419/foo
$ git1.3.2 clone git://host:9419/foo.git
(cloned successfully, both no output)
583b7ea31b7c16 (first bad):
$ git clone git://host:9420/foo
Generating pack...
Done counting 6 objects.
Deltifying 6 objects.
100% (6/6) done
Total 6, written 6 (delta 0), reused 0 (delta 0)
$ git1.3.2 clone git://host:9420/foo.git
fatal: cannot mmap packfile '/somewhere/foo/.git/objects/pack/tmp-VX82qz': Invalid argument
error: git-fetch-pack: unable to read from git-index-pack
error: git-index-pack died with error code 128
fetch-pack from 'git://host:9420/foo.git' failed.
[1] 13267 exit 1 git1.3.2 clone git://host:9420/foo.git
(/somewhere is the cwd on the client)
I tried to find which part of the patch caused the problem and came
out with the patch below. With this I can clone with git1.3.2 again
but then git 1.4.x does not show any statistics about packing, its
just a starting point to look at. Perhaps someone has an idea why
this happens. I've got to sleep now :)
---
upload-pack.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/upload-pack.c b/upload-pack.c
index 7b86f69..94f0d85 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -249,7 +249,7 @@ static void create_pack_file(void)
sz = read(pe_pipe[0], progress,
sizeof(progress));
if (0 < sz)
- send_client_data(2, progress, sz);
+ write(2, progress, sz);
else if (sz == 0) {
close(pe_pipe[0]);
pe_pipe[0] = -1;
^ permalink raw reply related
* Re: [RFC]: Pack-file object format for individual objects (Was: Revisiting large binary files issue.)
From: Linus Torvalds @ 2006-07-11 22:17 UTC (permalink / raw)
To: sf; +Cc: git
In-Reply-To: <44B41BFD.8010808@stephan-feder.de>
On Tue, 11 Jul 2006, sf wrote:
>
> Just look at the first byte of the object file _without doing any
> decompression_. It is 0x78 _if and only if_ the object file is in the
> traditional format.
0x78 isn't the only valid flag for a zlib stream, as far as I can tell.
It may be the only one _in_practice_, of course, but the zlib standard
defines the first byte as
- for low bits: CM (compression method):
"This identifies the compression method used in the file. CM = 8
denotes the "deflate" compression method with a window size up
to 32K. This is the method used by gzip and PNG (see
references [1] and [2] in Chapter 3, below, for the reference
documents). CM = 15 is reserved. It might be used in a future
version of this specification to indicate the presence of an
extra field before the compressed data."
- four high bits are CINFO:
"For CM = 8, CINFO is the base-2 logarithm of the LZ77 window
size, minus eight (CINFO=7 indicates a 32K window size). Values
of CINFO above 7 are not allowed in this version of the
specification. CINFO is not defined in this specification for
CM not equal to 8."
so 0x78 means "deflate with 32kB window size", but I don't see anything
guaranteeing that we might not see something else for an object that
cannot be compressed, for example.
Anyway, the good news is that _if_ 0x78 is indeed the only possible value,
then it is also an illegal value for an unpacked object in pack-file
format (type=7 being OBJ_DELTA) and we wouldn't need any other flag for
this.
I just don't know if it's the only possible one..
Linus
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Linus Torvalds @ 2006-07-11 22:09 UTC (permalink / raw)
To: sf; +Cc: git
In-Reply-To: <44B4172B.3070503@stephan-feder.de>
On Tue, 11 Jul 2006, sf wrote:
>
> And in the traditional format type and length are compressed whereas in
> the pack-file format they are not.
Ahh. Yes.
> > This should probably be applied to the main tree asap if we think
> > this is at all a worthwhile exercise. But somebody should verify that I
> > got the format right first!
>
> Sorry but see above.
Good catch, thanks indeed.
Doing that for unpacked objects would in fact make a lot of things much
simpler, so it would be good to do. The _bad_ part is that this also makes
it a lot harder to see the difference between a "binary header" and a
"compressed ASCII header". The two are not "obviously different" any more.
The common byte sequence for a compressed stream is
78 9c ...
where the first byte is the CMF byte (compression info and method).
But it's not the only possible such sequence according to the zlib format.
(The 16-bit hex number in MSB format, ie 0x789c above, is defined to have
a built-in checksum, so that it must be a multiple of 31 according to the
standard: 0x789c = 996 * 31).
So if we have a uncompressed header, we'd need to add a separate 2-byte
fingerprint to it _before_ the real header that isn't divisible by 31, and
use that as the thing to test.
Ho humm. I'll see what I can come up with.
Linus
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Junio C Hamano @ 2006-07-11 21:47 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Johannes Schindelin, Carl Baldwin, Git Mailing List
In-Reply-To: <Pine.LNX.4.64.0607111241460.5623@g5.osdl.org>
Linus Torvalds <torvalds@osdl.org> writes:
> Here's a newer verson of [2/3], with these issues fixed. It actually fixes
> things twice: (a) by parsing the binary version first (which makes sense
> for a totally independent reason - if that is going to be the "default"
> version in the long run, we should just test it first anyway) and (b) by
> making the ASCII version parser stricter too.
Wait a minute.
read-sha1-file maps sha1-file-internal (for unpacked one), and then
calls unpack-sha1-file.
unpack-sha1-file calls unpack-sha1-header to start inflation,
lets parse-sha1-header to read the header in the inflated
buffer, and calls unpack-sha1-rest to inflate the rest.
But in packs, we have binary header not deflated, followed by
deflated payload. If we want to copy things from loose objects
into pack without changing the packfile format, this change
would not help, I suspect.
At least, your updated unpack_sha1_file() needs to check for
binary header first (starting from "map"), and if that starts
with binary header, start inflating after the header to extract
the payload. Otherwise you would do the traditional.
^ permalink raw reply
* Re: [RFC]: Pack-file object format for individual objects (Was: Revisiting large binary files issue.)
From: sf @ 2006-07-11 21:45 UTC (permalink / raw)
To: git
In-Reply-To: <Pine.LNX.4.64.0607111053270.5623@g5.osdl.org>
Linus Torvalds wrote:
...
> On Tue, 11 Jul 2006, sf wrote:
...
>> Step 1. When reading individual objects from disk check the first nibble
>> and decode accordingly (see above).
>
> Check more than that, but yes, this should be tightened up in my
> series.
Just look at the first byte of the object file _without doing any
decompression_. It is 0x78 _if and only if_ the object file is in the
traditional format.
>> Step 3. Remove code for (old) individual object disk format.
>
> Well, I'm not sure how necessary that even is. We actually do have to
> generate the old header regardless, if for no other reason than the fact
> that we generate the SHA1 names based on it (even if we then write a
> new-style dense binary header to disk and discard the ASCII header).
>
> Having it there means that you can always just get a new version of git,
> and never worry about how old the archive you're working with is.
>
> (And then doing a "git repack -a -d" will make any archive also work with
> an old-style git, since the pack-file format didn't change, and a "git
> repack" thus ends up always creating something that is readable by
> anybody, including old clients).
Agreed.
Regards
Stephan
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: sf @ 2006-07-11 21:24 UTC (permalink / raw)
To: git
In-Reply-To: <Pine.LNX.4.64.0607111010320.5623@g5.osdl.org>
Linus Torvalds wrote:
> The pack-file format is slightly different from the traditional git
> object format, in that it has a much denser binary header encoding.
>
> The traditional format uses an ASCII string with type and length
> information, which is somewhat wasteful.
And in the traditional format type and length are compressed whereas in
the pack-file format they are not.
> This should probably be applied to the main tree asap if we think
> this is at all a worthwhile exercise. But somebody should verify that I
> got the format right first!
Sorry but see above.
Regards
Stephan
^ permalink raw reply
* Re: [PATCH 2/3] sha1_file: add the ability to parse objects in "pack file format"
From: Johannes Schindelin @ 2006-07-11 21:25 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Git Mailing List
In-Reply-To: <Pine.LNX.4.64.0607111241460.5623@g5.osdl.org>
Hi,
On Tue, 11 Jul 2006, Linus Torvalds wrote:
> On Tue, 11 Jul 2006, Johannes Schindelin wrote:
> >
> > > Or, more likely, the parse_sha1_header() function should just be changed
> > > to check the binary format first (and then add your comment about why that
> > > is safe).
> >
> > Yes, exactly.
>
> Here's a newer verson of [2/3], with these issues fixed. It actually fixes
> things twice: (a) by parsing the binary version first (which makes sense
> for a totally independent reason - if that is going to be the "default"
> version in the long run, we should just test it first anyway) and (b) by
> making the ASCII version parser stricter too.
Melikey.
Ciao,
Dscho
^ permalink raw reply
* Re: [PATCH] git-fetch: fix a bashism (==)
From: Eric Wong @ 2006-07-11 21:10 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
In-Reply-To: <11526519991197-git-send-email-normalperson@yhbt.net>
Eric Wong <normalperson@yhbt.net> wrote:
> From: Eric Wong <normalperson@untitled.(none)>
Weird, I didn't have my email address set correctly (yet another
different repo from my usual one) and send-email added this line to it.
I'll look into fixing it later today/tonight.
--
Eric Wong
^ permalink raw reply
* [PATCH] git-fetch: fix a bashism (==)
From: Eric Wong @ 2006-07-11 21:06 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Eric Wong
From: Eric Wong <normalperson@untitled.(none)>
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
git-fetch.sh | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/git-fetch.sh b/git-fetch.sh
index c0d256c..ff17699 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -80,7 +80,7 @@ rref=
rsync_slurped_objects=
rloga="$rloga $remote_nick"
-test "$remote_nick" == "$remote" || rloga="$rloga $remote"
+test "$remote_nick" = "$remote" || rloga="$rloga $remote"
if test "" = "$append"
then
--
1.4.1.g2f48
^ permalink raw reply related
* [PATCH] gitweb: Include a site name in page titles
From: Alp Toker @ 2006-07-11 20:10 UTC (permalink / raw)
To: git; +Cc: junkio, martin.langhoff
Tip Of The Day:
<title>: the most important element of a quality Web page.
This helps users tell one 'git' bookmark apart from the other in their
browser and improves the indexing of gitweb sites in Web search engines.
Defaults to the HTTP SERVER_NAME.
Signed-off-by: Alp Toker <alp@atoker.com>
---
gitweb/gitweb.cgi | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/gitweb/gitweb.cgi b/gitweb/gitweb.cgi
index 2e87de4..be0a01d 100755
--- a/gitweb/gitweb.cgi
+++ b/gitweb/gitweb.cgi
@@ -46,6 +46,10 @@ if (! -d $git_temp) {
# target of the home link on top of all pages
our $home_link = $my_uri;
+# name of your site or organization to appear in page titles
+# replace this with something more descriptive for clearer bookmarks
+our $site_name = $ENV{'SERVER_NAME'} || "Untitled";
+
# html text to include at home page
our $home_text = "indextext.html";
@@ -280,7 +284,7 @@ sub git_header_html {
my $status = shift || "200 OK";
my $expires = shift;
- my $title = "git";
+ my $title = "$site_name git";
if (defined $project) {
$title .= " - $project";
if (defined $action) {
@@ -1760,7 +1764,7 @@ sub git_opml {
print "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n".
"<opml version=\"1.0\">\n".
"<head>".
- " <title>Git OPML Export</title>\n".
+ " <title>$site_name Git OPML Export</title>\n".
"</head>\n".
"<body>\n".
"<outline text=\"git RSS feeds\">\n";
--
1.4.1.g97c7-dirty
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox