{"thread":{"id":"7782","subject":"[PATCH 1/5] Add S_IFINVALID mode","startedAt":"2007-04-22T16:43:56Z","lastAt":"2007-04-23T02:33:24Z","messageCount":7,"participants":["Martin Koegler","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"40124","messageId":"1177260240326-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7782","inReplyTo":null,"subject":"[PATCH 1/5] Add S_IFINVALID mode","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-22T16:43:56Z","receivedAt":"2007-04-22T16:43:56Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"S_IFINVALID is used to signal, that no mode information is available.\n\nSigned-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\nIf somebody thinks, that S_IFINVALID should have an different impossible value, \nplease feel free to change it.\n\n cache.h |    3 +++\n 1 files changed, 3 insertions(+), 0 deletions(-)\n\ndiff --git a/cache.h b/cache.h\nindex 53c2341..d425c26 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -24,6 +24,9 @@\n #define DTYPE(de)\tDT_UNKNOWN\n #endif\n \n+/* unknown mode (impossible combination S_IFIFO|S_IFCHR) */\n+#define S_IFINVALID     0030000\n+\n /*\n  * Intensive research over the course of many years has shown that\n  * port 9418 is totally unused by anything else. Or\n-- \n1.5.1.1.206.g4a12-dirty\n"},{"id":"40125","messageId":"11772602402479-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7782","inReplyTo":"1177260240326-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 2/5] add get_sha1_with_mode","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-22T16:43:57Z","receivedAt":"2007-04-22T16:43:57Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"get_sha1_with_mode basically behaves as get_sha1. It has an additional\nparameter for storing the mode of the object. This parameter may be NULL.\nIf the mode can not be determinded, it stores S_IFINVALID.\n\nSigned-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n cache.h     |    1 +\n sha1_name.c |   11 ++++++++++-\n 2 files changed, 11 insertions(+), 1 deletions(-)\n\ndiff --git a/cache.h b/cache.h\nindex d425c26..a9ae3f8 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -320,6 +320,7 @@ static inline unsigned int hexval(unsigned int c)\n #define DEFAULT_ABBREV 7\n \n extern int get_sha1(const char *str, unsigned char *sha1);\n+extern int get_sha1_with_mode(const char *str, unsigned char *sha1, unsigned *mode);\n extern int get_sha1_hex(const char *hex, unsigned char *sha1);\n extern char *sha1_to_hex(const unsigned char *sha1);\t/* static buffer result! */\n extern int read_ref(const char *filename, unsigned char *sha1);\ndiff --git a/sha1_name.c b/sha1_name.c\nindex 267ea3f..1349c0a 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -643,11 +643,18 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1)\n  */\n int get_sha1(const char *name, unsigned char *sha1)\n {\n+\treturn get_sha1_with_mode(name, sha1, NULL);\n+}\n+\n+int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned* mode)\n+{\n \tint ret, bracket_depth;\n \tunsigned unused;\n \tint namelen = strlen(name);\n \tconst char *cp;\n \n+\tif (mode)\n+\t\t*mode = S_IFINVALID;\n \tprepare_alt_odb();\n \tret = get_sha1_1(name, namelen, sha1);\n \tif (!ret)\n@@ -685,6 +692,8 @@ int get_sha1(const char *name, unsigned char *sha1)\n \t\t\t\tbreak;\n \t\t\tif (ce_stage(ce) == stage) {\n \t\t\t\thashcpy(sha1, ce->sha1);\n+\t\t\t\tif (mode)\n+\t\t\t\t\t*mode = ntohl(ce->ce_mode);\n \t\t\t\treturn 0;\n \t\t\t}\n \t\t\tpos++;\n@@ -703,7 +712,7 @@ int get_sha1(const char *name, unsigned char *sha1)\n \t\tunsigned char tree_sha1[20];\n \t\tif (!get_sha1_1(name, cp-name, tree_sha1))\n \t\t\treturn get_tree_entry(tree_sha1, cp+1, sha1,\n-\t\t\t\t\t      &unused);\n+\t\t\t\t\t      mode ? mode : &unused);\n \t}\n \treturn ret;\n }\n-- \n1.5.1.1.206.g4a12-dirty\n"},{"id":"40126","messageId":"1177260240928-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7782","inReplyTo":"11772602402479-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 3/5] add add_object_array_with_mode","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-22T16:43:58Z","receivedAt":"2007-04-22T16:43:58Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"Each object in struct object_array is extended with the mode.\nIf not specified, S_IFINVALID is used. An object with an mode value\ncan be added with add_object_array_with_mode.\n\nSigned-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n object.c |    6 ++++++\n object.h |    2 ++\n 2 files changed, 8 insertions(+), 0 deletions(-)\n\ndiff --git a/object.c b/object.c\nindex 78a44a6..fcf06bd 100644\n--- a/object.c\n+++ b/object.c\n@@ -240,6 +240,11 @@ int object_list_contains(struct object_list *list, struct object *obj)\n \n void add_object_array(struct object *obj, const char *name, struct object_array *array)\n {\n+\tadd_object_array_with_mode(obj, name, array, S_IFINVALID);\n+}\n+\n+void add_object_array_with_mode(struct object *obj, const char *name, struct object_array *array, unsigned mode)\n+{\n \tunsigned nr = array->nr;\n \tunsigned alloc = array->alloc;\n \tstruct object_array_entry *objects = array->objects;\n@@ -252,5 +257,6 @@ void add_object_array(struct object *obj, const char *name, struct object_array\n \t}\n \tobjects[nr].item = obj;\n \tobjects[nr].name = name;\n+\tobjects[nr].mode = mode;\n \tarray->nr = ++nr;\n }\ndiff --git a/object.h b/object.h\nindex bdbbc18..d0b5298 100644\n--- a/object.h\n+++ b/object.h\n@@ -17,6 +17,7 @@ struct object_array {\n \tstruct object_array_entry {\n \t\tstruct object *item;\n \t\tconst char *name;\n+\t\tunsigned mode;\n \t} *objects;\n };\n \n@@ -77,5 +78,6 @@ int object_list_contains(struct object_list *list, struct object *obj);\n \n /* Object array handling .. */\n void add_object_array(struct object *obj, const char *name, struct object_array *array);\n+void add_object_array_with_mode(struct object *obj, const char *name, struct object_array *array, unsigned mode);\n \n #endif /* OBJECT_H */\n-- \n1.5.1.1.206.g4a12-dirty\n"},{"id":"40128","messageId":"11772602401214-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7782","inReplyTo":"1177260240928-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 4/5] store mode in rev_list, if <tree>:<filename> syntax is used","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-22T16:43:59Z","receivedAt":"2007-04-22T16:43:59Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n revision.c |   17 ++++++++++++-----\n revision.h |    1 +\n 2 files changed, 13 insertions(+), 5 deletions(-)\n\ndiff --git a/revision.c b/revision.c\nindex ce70f48..49bd292 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -116,9 +116,14 @@ void mark_parents_uninteresting(struct commit *commit)\n \n void add_pending_object(struct rev_info *revs, struct object *obj, const char *name)\n {\n+\tadd_pending_object_with_mode(revs, obj, name, S_IFINVALID);\n+}\n+\n+void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, const char *name, unsigned mode)\n+{\n \tif (revs->no_walk && (obj->flags & UNINTERESTING))\n \t\tdie(\"object ranges do not make sense when not walking revisions\");\n-\tadd_object_array(obj, name, &revs->pending);\n+\tadd_object_array_with_mode(obj, name, &revs->pending, mode);\n \tif (revs->reflog_info && obj->type == OBJ_COMMIT)\n \t\tadd_reflog_for_walk(revs->reflog_info,\n \t\t\t\t(struct commit *)obj, name);\n@@ -723,6 +728,7 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,\n \t\t\tint flags,\n \t\t\tint cant_be_filename)\n {\n+\tunsigned mode;\n \tchar *dotdot;\n \tstruct object *object;\n \tunsigned char sha1[20];\n@@ -796,12 +802,12 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,\n \t\tlocal_flags = UNINTERESTING;\n \t\targ++;\n \t}\n-\tif (get_sha1(arg, sha1))\n+\tif (get_sha1_with_mode(arg, sha1, &mode))\n \t\treturn -1;\n \tif (!cant_be_filename)\n \t\tverify_non_filename(revs->prefix, arg);\n \tobject = get_reference(revs, arg, sha1, flags ^ local_flags);\n-\tadd_pending_object(revs, object, arg);\n+\tadd_pending_object_with_mode(revs, object, arg, mode);\n \treturn 0;\n }\n \n@@ -1177,10 +1183,11 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch\n \tif (def && !revs->pending.nr) {\n \t\tunsigned char sha1[20];\n \t\tstruct object *object;\n-\t\tif (get_sha1(def, sha1))\n+\t\tunsigned mode;\n+\t\tif (get_sha1_with_mode(def, sha1, &mode))\n \t\t\tdie(\"bad default revision '%s'\", def);\n \t\tobject = get_reference(revs, def, sha1, 0);\n-\t\tadd_pending_object(revs, object, def);\n+\t\tadd_pending_object_with_mode(revs, object, def, mode);\n \t}\n \n \tif (revs->topo_order)\ndiff --git a/revision.h b/revision.h\nindex 8a02618..5b41e2d 100644\n--- a/revision.h\n+++ b/revision.h\n@@ -131,5 +131,6 @@ extern void add_object(struct object *obj,\n \t\t       const char *name);\n \n extern void add_pending_object(struct rev_info *revs, struct object *obj, const char *name);\n+extern void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, const char *name, unsigned mode);\n \n #endif\n-- \n1.5.1.1.206.g4a12-dirty\n"},{"id":"40127","messageId":"11772602403236-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7782","inReplyTo":"11772602401214-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 5/5] use mode of the tree in git-diff, if <tree>:<file> syntax is used","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-22T16:44:00Z","receivedAt":"2007-04-22T16:44:00Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n builtin-diff.c |   20 ++++++++++++++------\n 1 files changed, 14 insertions(+), 6 deletions(-)\n\ndiff --git a/builtin-diff.c b/builtin-diff.c\nindex 21d13f0..f7fb914 100644\n--- a/builtin-diff.c\n+++ b/builtin-diff.c\n@@ -13,13 +13,10 @@\n #include \"log-tree.h\"\n #include \"builtin.h\"\n \n-/* NEEDSWORK: struct object has place for name but we _do_\n- * know mode when we extracted the blob out of a tree, which\n- * we currently lose.\n- */\n struct blobinfo {\n \tunsigned char sha1[20];\n \tconst char *name;\n+\tunsigned mode;\n };\n \n static const char builtin_diff_usage[] =\n@@ -70,8 +67,12 @@ static int builtin_diff_b_f(struct rev_info *revs,\n \t\tdie(\"'%s': %s\", path, strerror(errno));\n \tif (!(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)))\n \t\tdie(\"'%s': not a regular file or symlink\", path);\n+\n+\tif (blob[0].mode == S_IFINVALID)\n+\t\tblob[0].mode = canon_mode(st.st_mode);\n+\n \tstuff_change(&revs->diffopt,\n-\t\t     canon_mode(st.st_mode), canon_mode(st.st_mode),\n+\t\t     blob[0].mode, canon_mode(st.st_mode),\n \t\t     blob[0].sha1, null_sha1,\n \t\t     path, path);\n \tdiffcore_std(&revs->diffopt);\n@@ -88,8 +89,14 @@ static int builtin_diff_blobs(struct rev_info *revs,\n \tif (argc > 1)\n \t\tusage(builtin_diff_usage);\n \n+\tif (blob[0].mode == S_IFINVALID)\n+\t\tblob[0].mode = mode;\n+\n+\tif (blob[1].mode == S_IFINVALID)\n+\t\tblob[1].mode = mode;\n+\n \tstuff_change(&revs->diffopt,\n-\t\t     mode, mode,\n+\t\t     blob[0].mode, blob[1].mode,\n \t\t     blob[0].sha1, blob[1].sha1,\n \t\t     blob[0].name, blob[1].name);\n \tdiffcore_std(&revs->diffopt);\n@@ -271,6 +278,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)\n \t\t\t\tdie(\"more than two blobs given: '%s'\", name);\n \t\t\thashcpy(blob[blobs].sha1, obj->sha1);\n \t\t\tblob[blobs].name = name;\n+\t\t\tblob[blobs].mode = list->mode;\n \t\t\tblobs++;\n \t\t\tcontinue;\n \n-- \n1.5.1.1.206.g4a12-dirty\n"},{"id":"40131","messageId":"7vzm50nvwu.fsf@assigned-by-dhcp.cox.net","threadId":"7782","inReplyTo":"1177260240326-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"Re: [PATCH 1/5] Add S_IFINVALID mode","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-04-22T17:47:29Z","receivedAt":"2007-04-22T17:47:29Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Just gave only a cursory look but this looks much nicer ;-)\n"},{"id":"40174","messageId":"7vmz0zkeff.fsf@assigned-by-dhcp.cox.net","threadId":"7782","inReplyTo":"11772602402479-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"Re: [PATCH 2/5] add get_sha1_with_mode","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-04-23T02:33:24Z","receivedAt":"2007-04-23T02:33:24Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Martin Koegler <mkoegler@auto.tuwien.ac.at> writes:\n\n> get_sha1_with_mode basically behaves as get_sha1. It has an additional\n> parameter for storing the mode of the object. This parameter may be NULL.\n> If the mode can not be determinded, it stores S_IFINVALID.\n>\n> Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n> ---\n>  cache.h     |    1 +\n>  sha1_name.c |   11 ++++++++++-\n>  2 files changed, 11 insertions(+), 1 deletions(-)\n>\n> diff --git a/cache.h b/cache.h\n> index d425c26..a9ae3f8 100644\n> --- a/cache.h\n> +++ b/cache.h\n> @@ -320,6 +320,7 @@ static inline unsigned int hexval(unsigned int c)\n>  #define DEFAULT_ABBREV 7\n>  \n>  extern int get_sha1(const char *str, unsigned char *sha1);\n> +extern int get_sha1_with_mode(const char *str, unsigned char *sha1, unsigned *mode);\n>  extern int get_sha1_hex(const char *hex, unsigned char *sha1);\n>  extern char *sha1_to_hex(const unsigned char *sha1);\t/* static buffer result! */\n>  extern int read_ref(const char *filename, unsigned char *sha1);\n> diff --git a/sha1_name.c b/sha1_name.c\n> index 267ea3f..1349c0a 100644\n> --- a/sha1_name.c\n> +++ b/sha1_name.c\n> @@ -643,11 +643,18 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1)\n>   */\n>  int get_sha1(const char *name, unsigned char *sha1)\n>  {\n> +\treturn get_sha1_with_mode(name, sha1, NULL);\n> +}\n> +\n> +int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned* mode)\n\nStyle.  Asterisk \"*\" is next to variable, not type in our code,\nlike \"unsigned *mode\".\n\n> +{\n>  \tint ret, bracket_depth;\n>  \tunsigned unused;\n>  \tint namelen = strlen(name);\n>  \tconst char *cp;\n>  \n> +\tif (mode)\n> +\t\t*mode = S_IFINVALID;\n>  \tprepare_alt_odb();\n>  \tret = get_sha1_1(name, namelen, sha1);\n>  \tif (!ret)\n> @@ -685,6 +692,8 @@ int get_sha1(const char *name, unsigned char *sha1)\n>  \t\t\t\tbreak;\n>  \t\t\tif (ce_stage(ce) == stage) {\n>  \t\t\t\thashcpy(sha1, ce->sha1);\n> +\t\t\t\tif (mode)\n> +\t\t\t\t\t*mode = ntohl(ce->ce_mode);\n>  \t\t\t\treturn 0;\n>  \t\t\t}\n>  \t\t\tpos++;\n> @@ -703,7 +712,7 @@ int get_sha1(const char *name, unsigned char *sha1)\n>  \t\tunsigned char tree_sha1[20];\n>  \t\tif (!get_sha1_1(name, cp-name, tree_sha1))\n>  \t\t\treturn get_tree_entry(tree_sha1, cp+1, sha1,\n> -\t\t\t\t\t      &unused);\n> +\t\t\t\t\t      mode ? mode : &unused);\n>  \t}\n>  \treturn ret;\n>  }\n\nHmmmm.  I'm not sure if it is worth to have \"store only of mode\npointer is not NULL\" check in many places.  Wouldn't it make\nmore sense to require callers of _with_mode() variant to always\nsend in a valid pointer (after all, it is the caller who chose\nto call the _with_mode() variant), and make get_sha1() like\nthis?\n\n\tint get_sha1(const char *name, unsigned char *sha1)\n\t{\n        \tunsigned discard;\n                return get_sha1_with_mode(name, sha1, &discard);\n\t}\n"}]}