{"thread":{"id":"7767","subject":"[PATCH 2/4] add support for storing the mode in object_array","startedAt":"2007-04-21T12:26:17Z","lastAt":"2007-04-21T20:02:39Z","messageCount":6,"participants":["Martin Koegler","Junio C Hamano","Alex Riesen"],"isPatch":true,"patchVersion":1,"patchTotal":4},"messages":[{"id":"40048","messageId":"1177158380197-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7767","inReplyTo":null,"subject":"[PATCH 1/4] add mode parameter to get_sha1","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-21T12:26:17Z","receivedAt":"2007-04-21T12:26:17Z","isPatch":true,"sender":{"key":"mkoegler@auto.tuwien.ac.at","avatar":null},"body":"If the mode parameter is not NULL, get_sha1 will store\nthe mode of the object in it.\n\nSigned-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>\n---\n builtin-apply.c         |    2 +-\n builtin-archive.c       |    2 +-\n builtin-blame.c         |    2 +-\n builtin-branch.c        |    2 +-\n builtin-cat-file.c      |    2 +-\n builtin-commit-tree.c   |    4 ++--\n builtin-describe.c      |    2 +-\n builtin-diff.c          |    2 +-\n builtin-fetch--tool.c   |    4 ++--\n builtin-fmt-merge-msg.c |    2 +-\n builtin-fsck.c          |    2 +-\n builtin-grep.c          |    2 +-\n builtin-log.c           |    2 +-\n builtin-ls-tree.c       |    2 +-\n builtin-merge-base.c    |    4 ++--\n builtin-name-rev.c      |    4 ++--\n builtin-read-tree.c     |    2 +-\n builtin-rev-parse.c     |    8 ++++----\n builtin-revert.c        |    4 ++--\n builtin-rm.c            |    2 +-\n builtin-show-branch.c   |    8 ++++----\n builtin-update-ref.c    |    4 ++--\n cache.h                 |    5 ++++-\n connect.c               |    2 +-\n convert-objects.c       |    2 +-\n fast-import.c           |    8 ++++----\n merge-recursive.c       |    2 +-\n merge-tree.c            |    2 +-\n revision.c              |   14 +++++++-------\n sha1_name.c             |    8 ++++++--\n ssh-upload.c            |    2 +-\n unpack-file.c           |    2 +-\n upload-pack.c           |    2 +-\n wt-status.c             |    2 +-\n 34 files changed, 63 insertions(+), 56 deletions(-)\n\ndiff --git a/builtin-apply.c b/builtin-apply.c\nindex 94311e7..a053403 100644\n--- a/builtin-apply.c\n+++ b/builtin-apply.c\n@@ -2159,7 +2159,7 @@ static void show_index_list(struct patch *list)\n \t\tname = patch->old_name ? patch->old_name : patch->new_name;\n \t\tif (0 < patch->is_new)\n \t\t\tsha1_ptr = null_sha1;\n-\t\telse if (get_sha1(patch->old_sha1_prefix, sha1))\n+\t\telse if (get_sha1(patch->old_sha1_prefix, sha1, NULL))\n \t\t\tdie(\"sha1 information is lacking or useless (%s).\",\n \t\t\t    name);\n \t\telse\ndiff --git a/builtin-archive.c b/builtin-archive.c\nindex 7f4e409..97b4dcb 100644\n--- a/builtin-archive.c\n+++ b/builtin-archive.c\n@@ -112,7 +112,7 @@ void parse_treeish_arg(const char **argv, struct archiver_args *ar_args,\n \tstruct commit *commit;\n \tunsigned char sha1[20];\n \n-\tif (get_sha1(name, sha1))\n+\tif (get_sha1(name, sha1, NULL))\n \t\tdie(\"Not a valid object name\");\n \n \tcommit = lookup_commit_reference_gently(sha1, 1);\ndiff --git a/builtin-blame.c b/builtin-blame.c\nindex 8919b02..7777748 100644\n--- a/builtin-blame.c\n+++ b/builtin-blame.c\n@@ -1935,7 +1935,7 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con\n \tstruct cache_entry *ce;\n \tunsigned mode;\n \n-\tif (get_sha1(\"HEAD\", head_sha1))\n+\tif (get_sha1(\"HEAD\", head_sha1, NULL))\n \t\tdie(\"No such ref: HEAD\");\n \n \ttime(&now);\ndiff --git a/builtin-branch.c b/builtin-branch.c\nindex 7408285..66ef90c 100644\n--- a/builtin-branch.c\n+++ b/builtin-branch.c\n@@ -442,7 +442,7 @@ static void create_branch(const char *name, const char *start_name,\n \t}\n \n \treal_ref = NULL;\n-\tif (get_sha1(start_name, sha1))\n+\tif (get_sha1(start_name, sha1, NULL))\n \t\tdie(\"Not a valid object name: '%s'.\", start_name);\n \n \tswitch (dwim_ref(start_name, strlen(start_name), sha1, &real_ref)) {\ndiff --git a/builtin-cat-file.c b/builtin-cat-file.c\nindex d61d3d5..11512da 100644\n--- a/builtin-cat-file.c\n+++ b/builtin-cat-file.c\n@@ -87,7 +87,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)\n \tgit_config(git_default_config);\n \tif (argc != 3)\n \t\tusage(\"git-cat-file [-t|-s|-e|-p|<type>] <sha1>\");\n-\tif (get_sha1(argv[2], sha1))\n+\tif (get_sha1(argv[2], sha1, NULL))\n \t\tdie(\"Not a valid object name %s\", argv[2]);\n \n \topt = 0;\ndiff --git a/builtin-commit-tree.c b/builtin-commit-tree.c\nindex 4a8d8d8..1b5a572 100644\n--- a/builtin-commit-tree.c\n+++ b/builtin-commit-tree.c\n@@ -97,7 +97,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)\n \n \tif (argc < 2)\n \t\tusage(commit_tree_usage);\n-\tif (get_sha1(argv[1], tree_sha1))\n+\tif (get_sha1(argv[1], tree_sha1, NULL))\n \t\tdie(\"Not a valid object name %s\", argv[1]);\n \n \tcheck_valid(tree_sha1, OBJ_TREE);\n@@ -109,7 +109,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)\n \n \t\tif (parents >= MAXPARENT)\n \t\t\tdie(\"Too many parents (%d max)\", MAXPARENT);\n-\t\tif (get_sha1(b, parent_sha1[parents]))\n+\t\tif (get_sha1(b, parent_sha1[parents], NULL))\n \t\t\tdie(\"Not a valid object name %s\", b);\n \t\tcheck_valid(parent_sha1[parents], OBJ_COMMIT);\n \t\tif (new_parent(parents))\ndiff --git a/builtin-describe.c b/builtin-describe.c\nindex 165917e..1d5467f 100644\n--- a/builtin-describe.c\n+++ b/builtin-describe.c\n@@ -135,7 +135,7 @@ static void describe(const char *arg, int last_one)\n \tunsigned int match_cnt = 0, annotated_cnt = 0, cur_match;\n \tunsigned long seen_commits = 0;\n \n-\tif (get_sha1(arg, sha1))\n+\tif (get_sha1(arg, sha1, NULL))\n \t\tdie(\"Not a valid object name %s\", arg);\n \tcmit = lookup_commit_reference(sha1);\n \tif (!cmit)\ndiff --git a/builtin-diff.c b/builtin-diff.c\nindex 21d13f0..5f1b50e 100644\n--- a/builtin-diff.c\n+++ b/builtin-diff.c\n@@ -173,7 +173,7 @@ void add_head(struct rev_info *revs)\n {\n \tunsigned char sha1[20];\n \tstruct object *obj;\n-\tif (get_sha1(\"HEAD\", sha1))\n+\tif (get_sha1(\"HEAD\", sha1, NULL))\n \t\treturn;\n \tobj = parse_object(sha1);\n \tif (!obj)\ndiff --git a/builtin-fetch--tool.c b/builtin-fetch--tool.c\nindex e9d6764..fe38d34 100644\n--- a/builtin-fetch--tool.c\n+++ b/builtin-fetch--tool.c\n@@ -79,7 +79,7 @@ static int update_local_ref(const char *name,\n \t\treturn 0;\n \t}\n \n-\tif (get_sha1(name, sha1_old)) {\n+\tif (get_sha1(name, sha1_old, NULL)) {\n \t\tchar *msg;\n \tjust_store:\n \t\t/* new ref */\n@@ -148,7 +148,7 @@ static int append_fetch_head(FILE *fp,\n \tchar note[1024];\n \tconst char *what, *kind;\n \n-\tif (get_sha1(head, sha1))\n+\tif (get_sha1(head, sha1, NULL))\n \t\treturn error(\"Not a valid object name: %s\", head);\n \tcommit = lookup_commit_reference(sha1);\n \tif (!commit)\ndiff --git a/builtin-fmt-merge-msg.c b/builtin-fmt-merge-msg.c\nindex 5c145d2..89224c2 100644\n--- a/builtin-fmt-merge-msg.c\n+++ b/builtin-fmt-merge-msg.c\n@@ -89,7 +89,7 @@ static int handle_line(char *line)\n \n \tline[40] = 0;\n \tsha1 = xmalloc(20);\n-\ti = get_sha1(line, sha1);\n+\ti = get_sha1(line, sha1, NULL);\n \tline[40] = '\\t';\n \tif (i)\n \t\treturn 3;\ndiff --git a/builtin-fsck.c b/builtin-fsck.c\nindex 05d98d2..3ed2c50 100644\n--- a/builtin-fsck.c\n+++ b/builtin-fsck.c\n@@ -674,7 +674,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)\n \t\tif (*arg == '-')\n \t\t\tcontinue;\n \n-\t\tif (!get_sha1(arg, head_sha1)) {\n+\t\tif (!get_sha1(arg, head_sha1, NULL)) {\n \t\t\tstruct object *obj = lookup_object(head_sha1);\n \n \t\t\t/* Error is printed by lookup_object(). */\ndiff --git a/builtin-grep.c b/builtin-grep.c\nindex e13cb31..f2ee20f 100644\n--- a/builtin-grep.c\n+++ b/builtin-grep.c\n@@ -673,7 +673,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)\n \t\tconst char *arg = argv[i];\n \t\tunsigned char sha1[20];\n \t\t/* Is it a rev? */\n-\t\tif (!get_sha1(arg, sha1)) {\n+\t\tif (!get_sha1(arg, sha1, NULL)) {\n \t\t\tstruct object *object = parse_object(sha1);\n \t\t\tif (!object)\n \t\t\t\tdie(\"bad object %s\", arg);\ndiff --git a/builtin-log.c b/builtin-log.c\nindex 38bf52f..1ca3aa9 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -648,7 +648,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n static int add_pending_commit(const char *arg, struct rev_info *revs, int flags)\n {\n \tunsigned char sha1[20];\n-\tif (get_sha1(arg, sha1) == 0) {\n+\tif (get_sha1(arg, sha1, NULL) == 0) {\n \t\tstruct commit *commit = lookup_commit_reference(sha1);\n \t\tif (commit) {\n \t\t\tcommit->object.flags |= flags;\ndiff --git a/builtin-ls-tree.c b/builtin-ls-tree.c\nindex 6472610..40213ee 100644\n--- a/builtin-ls-tree.c\n+++ b/builtin-ls-tree.c\n@@ -143,7 +143,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)\n \n \tif (argc < 2)\n \t\tusage(ls_tree_usage);\n-\tif (get_sha1(argv[1], sha1))\n+\tif (get_sha1(argv[1], sha1, NULL))\n \t\tdie(\"Not a valid object name %s\", argv[1]);\n \n \tpathspec = get_pathspec(prefix, argv + 2);\ndiff --git a/builtin-merge-base.c b/builtin-merge-base.c\nindex e35d362..7b415a1 100644\n--- a/builtin-merge-base.c\n+++ b/builtin-merge-base.c\n@@ -39,9 +39,9 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix)\n \t}\n \tif (argc != 3)\n \t\tusage(merge_base_usage);\n-\tif (get_sha1(argv[1], rev1key))\n+\tif (get_sha1(argv[1], rev1key, NULL))\n \t\tdie(\"Not a valid object name %s\", argv[1]);\n-\tif (get_sha1(argv[2], rev2key))\n+\tif (get_sha1(argv[2], rev2key, NULL))\n \t\tdie(\"Not a valid object name %s\", argv[2]);\n \trev1 = lookup_commit_reference(rev1key);\n \trev2 = lookup_commit_reference(rev2key);\ndiff --git a/builtin-name-rev.c b/builtin-name-rev.c\nindex c022224..0351185 100644\n--- a/builtin-name-rev.c\n+++ b/builtin-name-rev.c\n@@ -184,7 +184,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)\n \t\t\tusage(name_rev_usage);\n \t\t}\n \n-\t\tif (get_sha1(*argv, sha1)) {\n+\t\tif (get_sha1(*argv, sha1, NULL)) {\n \t\t\tfprintf(stderr, \"Could not get sha1 for %s. Skipping.\\n\",\n \t\t\t\t\t*argv);\n \t\t\tcontinue;\n@@ -230,7 +230,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)\n \t\t\t\t\tforty = 0;\n \n \t\t\t\t\t*(p+1) = 0;\n-\t\t\t\t\tif (!get_sha1(p - 39, sha1)) {\n+\t\t\t\t\tif (!get_sha1(p - 39, sha1, NULL)) {\n \t\t\t\t\t\tstruct object *o =\n \t\t\t\t\t\t\tlookup_object(sha1);\n \t\t\t\t\t\tif (o)\ndiff --git a/builtin-read-tree.c b/builtin-read-tree.c\nindex 316fb0f..06224aa 100644\n--- a/builtin-read-tree.c\n+++ b/builtin-read-tree.c\n@@ -204,7 +204,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)\n \t\tif (1 < opts.index_only + opts.update)\n \t\t\tusage(read_tree_usage);\n \n-\t\tif (get_sha1(arg, sha1))\n+\t\tif (get_sha1(arg, sha1, NULL))\n \t\t\tdie(\"Not a valid object name %s\", arg);\n \t\tif (list_tree(sha1) < 0)\n \t\t\tdie(\"failed to unpack tree object %s\", arg);\ndiff --git a/builtin-rev-parse.c b/builtin-rev-parse.c\nindex 37addb2..370856b 100644\n--- a/builtin-rev-parse.c\n+++ b/builtin-rev-parse.c\n@@ -130,7 +130,7 @@ static void show_default(void)\n \t\tunsigned char sha1[20];\n \n \t\tdef = NULL;\n-\t\tif (!get_sha1(s, sha1)) {\n+\t\tif (!get_sha1(s, sha1, NULL)) {\n \t\t\tshow_rev(NORMAL, sha1, s);\n \t\t\treturn;\n \t\t}\n@@ -186,7 +186,7 @@ static int try_difference(const char *arg)\n \t\tnext = \"HEAD\";\n \tif (dotdot == arg)\n \t\tthis = \"HEAD\";\n-\tif (!get_sha1(this, sha1) && !get_sha1(next, end)) {\n+\tif (!get_sha1(this, sha1, NULL) && !get_sha1(next, end, NULL)) {\n \t\tshow_rev(NORMAL, end, next);\n \t\tshow_rev(symmetric ? NORMAL : REVERSED, sha1, this);\n \t\tif (symmetric) {\n@@ -376,11 +376,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)\n \t\t/* Not a flag argument */\n \t\tif (try_difference(arg))\n \t\t\tcontinue;\n-\t\tif (!get_sha1(arg, sha1)) {\n+\t\tif (!get_sha1(arg, sha1, NULL)) {\n \t\t\tshow_rev(NORMAL, sha1, arg);\n \t\t\tcontinue;\n \t\t}\n-\t\tif (*arg == '^' && !get_sha1(arg+1, sha1)) {\n+\t\tif (*arg == '^' && !get_sha1(arg+1, sha1, NULL)) {\n \t\t\tshow_rev(REVERSED, sha1, arg+1);\n \t\t\tcontinue;\n \t\t}\ndiff --git a/builtin-revert.c b/builtin-revert.c\nindex 4ba0ee6..2db624a 100644\n--- a/builtin-revert.c\n+++ b/builtin-revert.c\n@@ -61,7 +61,7 @@ static void parse_options(int argc, const char **argv)\n \t}\n \n \targ = argv[argc - 1];\n-\tif (get_sha1(arg, sha1))\n+\tif (get_sha1(arg, sha1, NULL))\n \t\tdie (\"Cannot find '%s'\", arg);\n \tcommit = (struct commit *)parse_object(sha1);\n \tif (!commit)\n@@ -257,7 +257,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)\n \t} else {\n \t\tstruct wt_status s;\n \n-\t\tif (get_sha1(\"HEAD\", head))\n+\t\tif (get_sha1(\"HEAD\", head, NULL))\n \t\t\tdie (\"You do not have a valid HEAD\");\n \t\twt_status_prepare(&s);\n \t\tif (s.commitable || s.workdir_dirty)\ndiff --git a/builtin-rm.c b/builtin-rm.c\nindex 4a0bd93..6fc44af 100644\n--- a/builtin-rm.c\n+++ b/builtin-rm.c\n@@ -190,7 +190,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)\n \t */\n \tif (!force) {\n \t\tunsigned char sha1[20];\n-\t\tif (get_sha1(\"HEAD\", sha1))\n+\t\tif (get_sha1(\"HEAD\", sha1, NULL))\n \t\t\thashclr(sha1);\n \t\tif (check_local_mod(sha1))\n \t\t\texit(1);\ndiff --git a/builtin-show-branch.c b/builtin-show-branch.c\nindex c892f1f..9c515db 100644\n--- a/builtin-show-branch.c\n+++ b/builtin-show-branch.c\n@@ -383,7 +383,7 @@ static int append_head_ref(const char *refname, const unsigned char *sha1, int f\n \t/* If both heads/foo and tags/foo exists, get_sha1 would\n \t * get confused.\n \t */\n-\tif (get_sha1(refname + ofs, tmp) || hashcmp(tmp, sha1))\n+\tif (get_sha1(refname + ofs, tmp, NULL) || hashcmp(tmp, sha1))\n \t\tofs = 5;\n \treturn append_ref(refname + ofs, sha1, 0);\n }\n@@ -397,7 +397,7 @@ static int append_remote_ref(const char *refname, const unsigned char *sha1, int\n \t/* If both heads/foo and tags/foo exists, get_sha1 would\n \t * get confused.\n \t */\n-\tif (get_sha1(refname + ofs, tmp) || hashcmp(tmp, sha1))\n+\tif (get_sha1(refname + ofs, tmp, NULL) || hashcmp(tmp, sha1))\n \t\tofs = 5;\n \treturn append_ref(refname + ofs, sha1, 0);\n }\n@@ -511,7 +511,7 @@ static int show_independent(struct commit **rev,\n static void append_one_rev(const char *av)\n {\n \tunsigned char revkey[20];\n-\tif (!get_sha1(av, revkey)) {\n+\tif (!get_sha1(av, revkey, NULL)) {\n \t\tappend_ref(av, revkey, 0);\n \t\treturn;\n \t}\n@@ -794,7 +794,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \n \t\tif (MAX_REVS <= num_rev)\n \t\t\tdie(\"cannot handle more than %d revs.\", MAX_REVS);\n-\t\tif (get_sha1(ref_name[num_rev], revkey))\n+\t\tif (get_sha1(ref_name[num_rev], revkey, NULL))\n \t\t\tdie(\"'%s' is not a valid ref.\", ref_name[num_rev]);\n \t\tcommit = lookup_commit_reference(revkey);\n \t\tif (!commit)\ndiff --git a/builtin-update-ref.c b/builtin-update-ref.c\nindex 5ee960b..3c56e1b 100644\n--- a/builtin-update-ref.c\n+++ b/builtin-update-ref.c\n@@ -46,7 +46,7 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)\n \tif (!refname || !value)\n \t\tusage(git_update_ref_usage);\n \n-\tif (get_sha1(value, sha1))\n+\tif (get_sha1(value, sha1, NULL))\n \t\tdie(\"%s: not a valid SHA1\", value);\n \n \tif (delete) {\n@@ -56,7 +56,7 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)\n \t}\n \n \thashclr(oldsha1);\n-\tif (oldval && *oldval && get_sha1(oldval, oldsha1))\n+\tif (oldval && *oldval && get_sha1(oldval, oldsha1, NULL))\n \t\tdie(\"%s: not a valid old SHA1\", oldval);\n \n \tlock = lock_any_ref_for_update(refname, oldval ? oldsha1 : NULL);\ndiff --git a/cache.h b/cache.h\nindex 53c2341..dc8d7b1 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 */\n+#define S_IFINVALID    0320000\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@@ -316,7 +319,7 @@ static inline unsigned int hexval(unsigned int c)\n #define MINIMUM_ABBREV 4\n #define DEFAULT_ABBREV 7\n \n-extern int get_sha1(const char *str, unsigned char *sha1);\n+extern int get_sha1(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/connect.c b/connect.c\nindex da89c9c..71ebe3c 100644\n--- a/connect.c\n+++ b/connect.c\n@@ -243,7 +243,7 @@ static struct ref *try_explicit_object_name(const char *name)\n \t\thashclr(ref->new_sha1);\n \t\treturn ref;\n \t}\n-\tif (get_sha1(name, sha1))\n+\tif (get_sha1(name, sha1, NULL))\n \t\treturn NULL;\n \tlen = strlen(name) + 1;\n \tref = xcalloc(1, sizeof(*ref) + len);\ndiff --git a/convert-objects.c b/convert-objects.c\nindex cefbceb..d3fa9bf 100644\n--- a/convert-objects.c\n+++ b/convert-objects.c\n@@ -320,7 +320,7 @@ int main(int argc, char **argv)\n \n \tif (argc != 2)\n \t\tusage(\"git-convert-objects <sha1>\");\n-\tif (get_sha1(argv[1], sha1))\n+\tif (get_sha1(argv[1], sha1, NULL))\n \t\tdie(\"Not a valid object name %s\", argv[1]);\n \n \tentry = convert_entry(sha1);\ndiff --git a/fast-import.c b/fast-import.c\nindex cdd629d..a671f77 100644\n--- a/fast-import.c\n+++ b/fast-import.c\n@@ -1721,7 +1721,7 @@ static void cmd_from(struct branch *b)\n \t\tfree(buf);\n \t\thashcpy(b->branch_tree.versions[0].sha1,\n \t\t\tb->branch_tree.versions[1].sha1);\n-\t} else if (!get_sha1(from, b->sha1)) {\n+\t} else if (!get_sha1(from, b->sha1, NULL)) {\n \t\tif (is_null_sha1(b->sha1)) {\n \t\t\thashclr(b->branch_tree.versions[0].sha1);\n \t\t\thashclr(b->branch_tree.versions[1].sha1);\n@@ -1765,7 +1765,7 @@ static struct hash_list *cmd_merge(unsigned int *count)\n \t\t\tif (oe->type != OBJ_COMMIT)\n \t\t\t\tdie(\"Mark :%\" PRIuMAX \" not a commit\", idnum);\n \t\t\thashcpy(n->sha1, oe->sha1);\n-\t\t} else if (!get_sha1(from, n->sha1)) {\n+\t\t} else if (!get_sha1(from, n->sha1, NULL)) {\n \t\t\tunsigned long size;\n \t\t\tchar *buf = read_object_with_reference(n->sha1,\n \t\t\t\tcommit_type, &size, n->sha1);\n@@ -1916,7 +1916,7 @@ static void cmd_new_tag(void)\n \t\tif (oe->type != OBJ_COMMIT)\n \t\t\tdie(\"Mark :%\" PRIuMAX \" not a commit\", from_mark);\n \t\thashcpy(sha1, oe->sha1);\n-\t} else if (!get_sha1(from, sha1)) {\n+\t} else if (!get_sha1(from, sha1, NULL)) {\n \t\tunsigned long size;\n \t\tchar *buf;\n \n@@ -2011,7 +2011,7 @@ static void import_marks(const char *input_file)\n \t\t*end = 0;\n \t\tmark = strtoumax(line + 1, &end, 10);\n \t\tif (!mark || end == line + 1\n-\t\t\t|| *end != ' ' || get_sha1(end + 1, sha1))\n+\t\t\t|| *end != ' ' || get_sha1(end + 1, sha1, NULL))\n \t\t\tdie(\"corrupt mark line: %s\", line);\n \t\te = find_object(sha1);\n \t\tif (!e) {\ndiff --git a/merge-recursive.c b/merge-recursive.c\nindex cea6c87..8e6daca 100644\n--- a/merge-recursive.c\n+++ b/merge-recursive.c\n@@ -1364,7 +1364,7 @@ static struct commit *get_ref(const char *ref)\n \tunsigned char sha1[20];\n \tstruct object *object;\n \n-\tif (get_sha1(ref, sha1))\n+\tif (get_sha1(ref, sha1, NULL))\n \t\tdie(\"Could not resolve ref '%s'\", ref);\n \tobject = deref_tag(parse_object(sha1), ref, strlen(ref));\n \tif (object->type == OBJ_TREE)\ndiff --git a/merge-tree.c b/merge-tree.c\nindex 3b8d9e6..1831082 100644\n--- a/merge-tree.c\n+++ b/merge-tree.c\n@@ -325,7 +325,7 @@ static void *get_tree_descriptor(struct tree_desc *desc, const char *rev)\n \tunsigned char sha1[20];\n \tvoid *buf;\n \n-\tif (get_sha1(rev, sha1))\n+\tif (get_sha1(rev, sha1, NULL))\n \t\tdie(\"unknown rev %s\", rev);\n \tbuf = fill_tree_descriptor(desc, sha1);\n \tif (!buf)\ndiff --git a/revision.c b/revision.c\nindex ce70f48..8f0ed77 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -614,7 +614,7 @@ static int add_parents_only(struct rev_info *revs, const char *arg, int flags)\n \t\tflags ^= UNINTERESTING;\n \t\targ++;\n \t}\n-\tif (get_sha1(arg, sha1))\n+\tif (get_sha1(arg, sha1, NULL))\n \t\treturn 0;\n \twhile (1) {\n \t\tit = get_reference(revs, arg, sha1, 0);\n@@ -684,9 +684,9 @@ static void prepare_show_merge(struct rev_info *revs)\n \tconst char **prune = NULL;\n \tint i, prune_num = 1; /* counting terminating NULL */\n \n-\tif (get_sha1(\"HEAD\", sha1) || !(head = lookup_commit(sha1)))\n+\tif (get_sha1(\"HEAD\", sha1, NULL) || !(head = lookup_commit(sha1)))\n \t\tdie(\"--merge without HEAD?\");\n-\tif (get_sha1(\"MERGE_HEAD\", sha1) || !(other = lookup_commit(sha1)))\n+\tif (get_sha1(\"MERGE_HEAD\", sha1, NULL) || !(other = lookup_commit(sha1)))\n \t\tdie(\"--merge without MERGE_HEAD?\");\n \tadd_pending_object(revs, &head->object, \"HEAD\");\n \tadd_pending_object(revs, &other->object, \"MERGE_HEAD\");\n@@ -743,8 +743,8 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,\n \t\t\tnext = \"HEAD\";\n \t\tif (dotdot == arg)\n \t\t\tthis = \"HEAD\";\n-\t\tif (!get_sha1(this, from_sha1) &&\n-\t\t    !get_sha1(next, sha1)) {\n+\t\tif (!get_sha1(this, from_sha1, NULL) &&\n+\t\t    !get_sha1(next, sha1, NULL)) {\n \t\t\tstruct commit *a, *b;\n \t\t\tstruct commit_list *exclude;\n \n@@ -796,7 +796,7 @@ 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(arg, sha1, NULL))\n \t\treturn -1;\n \tif (!cant_be_filename)\n \t\tverify_non_filename(revs->prefix, arg);\n@@ -1177,7 +1177,7 @@ 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\tif (get_sha1(def, sha1, NULL))\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);\ndiff --git a/sha1_name.c b/sha1_name.c\nindex 267ea3f..57de683 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -641,13 +641,15 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1)\n  * This is like \"get_sha1_basic()\", except it allows \"sha1 expressions\",\n  * notably \"xyz^\" for \"parent of xyz\"\n  */\n-int get_sha1(const char *name, unsigned char *sha1)\n+int get_sha1(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 +687,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 = ce->ce_mode;\n \t\t\t\treturn 0;\n \t\t\t}\n \t\t\tpos++;\n@@ -703,7 +707,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 }\ndiff --git a/ssh-upload.c b/ssh-upload.c\nindex 2f04572..065cf5d 100644\n--- a/ssh-upload.c\n+++ b/ssh-upload.c\n@@ -130,7 +130,7 @@ int main(int argc, char **argv)\n \t\tusage(ssh_push_usage);\n \tcommit_id = argv[arg];\n \turl = argv[arg + 1];\n-\tif (get_sha1(commit_id, sha1))\n+\tif (get_sha1(commit_id, sha1, NULL))\n \t\tdie(\"Not a valid object name %s\", commit_id);\n \tmemcpy(hex, sha1_to_hex(sha1), sizeof(hex));\n \targv[arg] = hex;\ndiff --git a/unpack-file.c b/unpack-file.c\nindex 25c56b3..f6aaca0 100644\n--- a/unpack-file.c\n+++ b/unpack-file.c\n@@ -29,7 +29,7 @@ int main(int argc, char **argv)\n \n \tif (argc != 2)\n \t\tusage(\"git-unpack-file <sha1>\");\n-\tif (get_sha1(argv[1], sha1))\n+\tif (get_sha1(argv[1], sha1, NULL))\n \t\tdie(\"Not a valid object name %s\", argv[1]);\n \n \tsetup_git_directory();\ndiff --git a/upload-pack.c b/upload-pack.c\nindex d3a09e7..9c39231 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -517,7 +517,7 @@ static void receive_needs(void)\n \t\t\tunsigned char sha1[20];\n \t\t\tstruct object *object;\n \t\t\tuse_thin_pack = 0;\n-\t\t\tif (get_sha1(line + 8, sha1))\n+\t\t\tif (get_sha1(line + 8, sha1, NULL))\n \t\t\t\tdie(\"invalid shallow line: %s\", line);\n \t\t\tobject = parse_object(sha1);\n \t\t\tif (!object)\ndiff --git a/wt-status.c b/wt-status.c\nindex a055990..a40c5d1 100644\n--- a/wt-status.c\n+++ b/wt-status.c\n@@ -302,7 +302,7 @@ static void wt_status_print_verbose(struct wt_status *s)\n void wt_status_print(struct wt_status *s)\n {\n \tunsigned char sha1[20];\n-\ts->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;\n+\ts->is_initial = get_sha1(s->reference, sha1, NULL) ? 1 : 0;\n \n \tif (s->branch) {\n \t\tconst char *on_what = \"On branch \";\n-- \n1.4.4.4\n"},{"id":"40046","messageId":"11771583802243-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7767","inReplyTo":"1177158380197-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 2/4] add support for storing the mode in object_array","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-21T12:26:18Z","receivedAt":"2007-04-21T12:26:18Z","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-bundle.c   |    2 +-\n builtin-grep.c     |    2 +-\n builtin-log.c      |    2 +-\n builtin-name-rev.c |    2 +-\n builtin-reflog.c   |    8 ++++----\n list-objects.c     |    2 +-\n object.c           |    3 ++-\n object.h           |    3 ++-\n revision.c         |    6 +++---\n shallow.c          |    2 +-\n upload-pack.c      |    8 ++++----\n 11 files changed, 21 insertions(+), 19 deletions(-)\n\ndiff --git a/builtin-bundle.c b/builtin-bundle.c\nindex d1635a0..97cce9e 100644\n--- a/builtin-bundle.c\n+++ b/builtin-bundle.c\n@@ -155,7 +155,7 @@ static int verify_bundle(struct bundle_header *header, int verbose)\n \tmemset(&refs, 0, sizeof(struct object_array));\n \tfor (i = 0; i < revs.pending.nr; i++) {\n \t\tstruct object_array_entry *e = revs.pending.objects + i;\n-\t\tadd_object_array(e->item, e->name, &refs);\n+\t\tadd_object_array(e->item, e->name, S_IFINVALID, &refs);\n \t}\n \n \tprepare_revision_walk(&revs);\ndiff --git a/builtin-grep.c b/builtin-grep.c\nindex f2ee20f..3690f7e 100644\n--- a/builtin-grep.c\n+++ b/builtin-grep.c\n@@ -677,7 +677,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)\n \t\t\tstruct object *object = parse_object(sha1);\n \t\t\tif (!object)\n \t\t\t\tdie(\"bad object %s\", arg);\n-\t\t\tadd_object_array(object, arg, &list);\n+\t\t\tadd_object_array(object, arg, S_IFINVALID, &list);\n \t\t\tcontinue;\n \t\t}\n \t\tif (!strcmp(arg, \"--\")) {\ndiff --git a/builtin-log.c b/builtin-log.c\nindex 1ca3aa9..ca12791 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -202,7 +202,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)\n \t\tcase OBJ_COMMIT:\n \t\t\trev.pending.nr = rev.pending.alloc = 0;\n \t\t\trev.pending.objects = NULL;\n-\t\t\tadd_object_array(o, name, &rev.pending);\n+\t\t\tadd_object_array(o, name, S_IFINVALID, &rev.pending);\n \t\t\tret = cmd_log_walk(&rev);\n \t\t\tbreak;\n \t\tdefault:\ndiff --git a/builtin-name-rev.c b/builtin-name-rev.c\nindex 0351185..748cc0c 100644\n--- a/builtin-name-rev.c\n+++ b/builtin-name-rev.c\n@@ -202,7 +202,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)\n \t\tif (cutoff > commit->date)\n \t\t\tcutoff = commit->date;\n \n-\t\tadd_object_array((struct object *)commit, *argv, &revs);\n+\t\tadd_object_array((struct object *)commit, *argv, S_IFINVALID, &revs);\n \t}\n \n \tfor_each_ref(name_ref, &data);\ndiff --git a/builtin-reflog.c b/builtin-reflog.c\nindex 4c39f1d..a346e8e 100644\n--- a/builtin-reflog.c\n+++ b/builtin-reflog.c\n@@ -101,8 +101,8 @@ static int commit_is_complete(struct commit *commit)\n \t */\n \tmemset(&study, 0, sizeof(study));\n \tmemset(&found, 0, sizeof(found));\n-\tadd_object_array(&commit->object, NULL, &study);\n-\tadd_object_array(&commit->object, NULL, &found);\n+\tadd_object_array(&commit->object, NULL, S_IFINVALID, &study);\n+\tadd_object_array(&commit->object, NULL, S_IFINVALID, &found);\n \tcommit->object.flags |= STUDYING;\n \twhile (study.nr) {\n \t\tstruct commit *c;\n@@ -123,8 +123,8 @@ static int commit_is_complete(struct commit *commit)\n \t\t\tif (p->object.flags & STUDYING)\n \t\t\t\tcontinue;\n \t\t\tp->object.flags |= STUDYING;\n-\t\t\tadd_object_array(&p->object, NULL, &study);\n-\t\t\tadd_object_array(&p->object, NULL, &found);\n+\t\t\tadd_object_array(&p->object, NULL, S_IFINVALID, &study);\n+\t\t\tadd_object_array(&p->object, NULL, S_IFINVALID, &found);\n \t\t}\n \t}\n \tif (!is_incomplete) {\ndiff --git a/list-objects.c b/list-objects.c\nindex 2ba2c95..1f862bc 100644\n--- a/list-objects.c\n+++ b/list-objects.c\n@@ -118,7 +118,7 @@ void traverse_commit_list(struct rev_info *revs,\n \t\t\tcontinue;\n \t\tif (obj->type == OBJ_TAG) {\n \t\t\tobj->flags |= SEEN;\n-\t\t\tadd_object_array(obj, name, &objects);\n+\t\t\tadd_object_array(obj, name, S_IFINVALID, &objects);\n \t\t\tcontinue;\n \t\t}\n \t\tif (obj->type == OBJ_TREE) {\ndiff --git a/object.c b/object.c\nindex 78a44a6..11c614e 100644\n--- a/object.c\n+++ b/object.c\n@@ -238,7 +238,7 @@ int object_list_contains(struct object_list *list, struct object *obj)\n \treturn 0;\n }\n \n-void add_object_array(struct object *obj, const char *name, struct object_array *array)\n+void add_object_array(struct object *obj, const char *name, unsigned mode, struct object_array *array)\n {\n \tunsigned nr = array->nr;\n \tunsigned alloc = array->alloc;\n@@ -252,5 +252,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..b29268a 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@@ -76,6 +77,6 @@ unsigned object_list_length(struct object_list *list);\n 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(struct object *obj, const char *name, unsigned mode, struct object_array *array);\n \n #endif /* OBJECT_H */\ndiff --git a/revision.c b/revision.c\nindex 8f0ed77..b2df974 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -39,7 +39,7 @@ void add_object(struct object *obj,\n \t\tstruct name_path *path,\n \t\tconst char *name)\n {\n-\tadd_object_array(obj, path_name(path, name), p);\n+\tadd_object_array(obj, path_name(path, name), S_IFINVALID, p);\n }\n \n static void mark_blob_uninteresting(struct blob *blob)\n@@ -118,7 +118,7 @@ void add_pending_object(struct rev_info *revs, struct object *obj, const char *n\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(obj, name, S_IFINVALID, &revs->pending);\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@@ -1461,7 +1461,7 @@ struct commit *get_revision(struct rev_info *revs)\n \t\t\tcontinue;\n \t\tp->flags |= CHILD_SHOWN;\n \t\tgc_boundary(&revs->boundary_commits);\n-\t\tadd_object_array(p, NULL, &revs->boundary_commits);\n+\t\tadd_object_array(p, NULL, S_IFINVALID, &revs->boundary_commits);\n \t}\n \n \treturn c;\ndiff --git a/shallow.c b/shallow.c\nindex d178689..d320a13 100644\n--- a/shallow.c\n+++ b/shallow.c\n@@ -87,7 +87,7 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,\n \t\t\tif (cur_depth < depth) {\n \t\t\t\tif (p->next)\n \t\t\t\t\tadd_object_array(&p->item->object,\n-\t\t\t\t\t\t\tNULL, &stack);\n+\t\t\t\t\t\t\tNULL, S_IFINVALID, &stack);\n \t\t\t\telse {\n \t\t\t\t\tcommit = p->item;\n \t\t\t\t\tcur_depth = *(int *)commit->util;\ndiff --git a/upload-pack.c b/upload-pack.c\nindex 9c39231..1f12d29 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -378,7 +378,7 @@ static int got_sha1(char *hex, unsigned char *sha1)\n \t\t\tparents->item->object.flags |= THEY_HAVE;\n \t}\n \tif (!we_knew_they_have) {\n-\t\tadd_object_array(o, NULL, &have_obj);\n+\t\tadd_object_array(o, NULL, S_IFINVALID, &have_obj);\n \t\treturn 1;\n \t}\n \treturn 0;\n@@ -523,7 +523,7 @@ static void receive_needs(void)\n \t\t\tif (!object)\n \t\t\t\tdie(\"did not find object for %s\", line);\n \t\t\tobject->flags |= CLIENT_SHALLOW;\n-\t\t\tadd_object_array(object, NULL, &shallows);\n+\t\t\tadd_object_array(object, NULL, S_IFINVALID, &shallows);\n \t\t\tcontinue;\n \t\t}\n \t\tif (!prefixcmp(line, \"deepen \")) {\n@@ -564,7 +564,7 @@ static void receive_needs(void)\n \t\t\tdie(\"git-upload-pack: not our ref %s\", line+5);\n \t\tif (!(o->flags & WANTED)) {\n \t\t\to->flags |= WANTED;\n-\t\t\tadd_object_array(o, NULL, &want_obj);\n+\t\t\tadd_object_array(o, NULL, S_IFINVALID, &want_obj);\n \t\t}\n \t}\n \tif (depth == 0 && shallows.nr == 0)\n@@ -598,7 +598,7 @@ static void receive_needs(void)\n \t\t\t\tparents = ((struct commit *)object)->parents;\n \t\t\t\twhile (parents) {\n \t\t\t\t\tadd_object_array(&parents->item->object,\n-\t\t\t\t\t\t\tNULL, &want_obj);\n+\t\t\t\t\t\t\tNULL, S_IFINVALID, &want_obj);\n \t\t\t\t\tparents = parents->next;\n \t\t\t\t}\n \t\t\t}\n-- \n1.4.4.4\n"},{"id":"40049","messageId":"11771583803353-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7767","inReplyTo":"11771583802243-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 3/4] add mode to add_pending_object","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-21T12:26:19Z","receivedAt":"2007-04-21T12:26:19Z","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-blame.c         |    2 +-\n builtin-bundle.c        |    4 ++--\n builtin-diff.c          |    2 +-\n builtin-fmt-merge-msg.c |    4 ++--\n builtin-log.c           |    6 +++---\n reachable.c             |    8 ++++----\n revision.c              |   38 ++++++++++++++++++++------------------\n revision.h              |    2 +-\n upload-pack.c           |    4 ++--\n 9 files changed, 36 insertions(+), 34 deletions(-)\n\ndiff --git a/builtin-blame.c b/builtin-blame.c\nindex 7777748..5491dd2 100644\n--- a/builtin-blame.c\n+++ b/builtin-blame.c\n@@ -2274,7 +2274,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)\n \t\t * or \"--contents\".\n \t\t */\n \t\tsb.final = fake_working_tree_commit(path, contents_from);\n-\t\tadd_pending_object(&revs, &(sb.final->object), \":\");\n+\t\tadd_pending_object(&revs, &(sb.final->object), \":\", S_IFINVALID);\n \t}\n \telse if (contents_from)\n \t\tdie(\"Cannot use --contents with final commit object name\");\ndiff --git a/builtin-bundle.c b/builtin-bundle.c\nindex 97cce9e..80a1a3f 100644\n--- a/builtin-bundle.c\n+++ b/builtin-bundle.c\n@@ -140,7 +140,7 @@ static int verify_bundle(struct bundle_header *header, int verbose)\n \t\tstruct object *o = parse_object(e->sha1);\n \t\tif (o) {\n \t\t\to->flags |= PREREQ_MARK;\n-\t\t\tadd_pending_object(&revs, o, e->name);\n+\t\t\tadd_pending_object(&revs, o, e->name, S_IFINVALID);\n \t\t\tcontinue;\n \t\t}\n \t\tif (++ret == 1)\n@@ -238,7 +238,7 @@ static int create_bundle(struct bundle_header *header, const char *path,\n \t\t\tif (!get_sha1_hex(buffer + 1, sha1)) {\n \t\t\t\tstruct object *object = parse_object(sha1);\n \t\t\t\tobject->flags |= UNINTERESTING;\n-\t\t\t\tadd_pending_object(&revs, object, buffer);\n+\t\t\t\tadd_pending_object(&revs, object, buffer, S_IFINVALID);\n \t\t\t}\n \t\t} else if (!get_sha1_hex(buffer, sha1)) {\n \t\t\tstruct object *object = parse_object(sha1);\ndiff --git a/builtin-diff.c b/builtin-diff.c\nindex 5f1b50e..a427358 100644\n--- a/builtin-diff.c\n+++ b/builtin-diff.c\n@@ -178,7 +178,7 @@ void add_head(struct rev_info *revs)\n \tobj = parse_object(sha1);\n \tif (!obj)\n \t\treturn;\n-\tadd_pending_object(revs, obj, \"HEAD\");\n+\tadd_pending_object(revs, obj, \"HEAD\", S_IFINVALID);\n }\n \n int cmd_diff(int argc, const char **argv, const char *prefix)\ndiff --git a/builtin-fmt-merge-msg.c b/builtin-fmt-merge-msg.c\nindex 89224c2..127263a 100644\n--- a/builtin-fmt-merge-msg.c\n+++ b/builtin-fmt-merge-msg.c\n@@ -186,8 +186,8 @@ static void shortlog(const char *name, unsigned char *sha1,\n \n \tsetup_revisions(0, NULL, rev, NULL);\n \trev->ignore_merges = 1;\n-\tadd_pending_object(rev, branch, name);\n-\tadd_pending_object(rev, &head->object, \"^HEAD\");\n+\tadd_pending_object(rev, branch, name, S_IFINVALID);\n+\tadd_pending_object(rev, &head->object, \"^HEAD\", S_IFINVALID);\n \thead->object.flags |= UNINTERESTING;\n \tprepare_revision_walk(rev);\n \twhile ((commit = get_revision(rev)) != NULL) {\ndiff --git a/builtin-log.c b/builtin-log.c\nindex ca12791..678ef6b 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -388,8 +388,8 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const cha\n \tinit_revisions(&check_rev, prefix);\n \to1->flags ^= UNINTERESTING;\n \to2->flags ^= UNINTERESTING;\n-\tadd_pending_object(&check_rev, o1, \"o1\");\n-\tadd_pending_object(&check_rev, o2, \"o2\");\n+\tadd_pending_object(&check_rev, o1, \"o1\", S_IFINVALID);\n+\tadd_pending_object(&check_rev, o2, \"o2\", S_IFINVALID);\n \tprepare_revision_walk(&check_rev);\n \n \twhile ((commit = get_revision(&check_rev)) != NULL) {\n@@ -652,7 +652,7 @@ static int add_pending_commit(const char *arg, struct rev_info *revs, int flags)\n \t\tstruct commit *commit = lookup_commit_reference(sha1);\n \t\tif (commit) {\n \t\t\tcommit->object.flags |= flags;\n-\t\t\tadd_pending_object(revs, &commit->object, arg);\n+\t\t\tadd_pending_object(revs, &commit->object, arg, S_IFINVALID);\n \t\t\treturn 0;\n \t\t}\n \t}\ndiff --git a/reachable.c b/reachable.c\nindex ff3dd34..4edca75 100644\n--- a/reachable.c\n+++ b/reachable.c\n@@ -112,10 +112,10 @@ static int add_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1,\n \n \tobject = parse_object(osha1);\n \tif (object)\n-\t\tadd_pending_object(revs, object, \"\");\n+\t\tadd_pending_object(revs, object, \"\", S_IFINVALID);\n \tobject = parse_object(nsha1);\n \tif (object)\n-\t\tadd_pending_object(revs, object, \"\");\n+\t\tadd_pending_object(revs, object, \"\", S_IFINVALID);\n \treturn 0;\n }\n \n@@ -126,7 +126,7 @@ static int add_one_ref(const char *path, const unsigned char *sha1, int flag, vo\n \n \tif (!object)\n \t\tdie(\"bad object ref: %s:%s\", path, sha1_to_hex(sha1));\n-\tadd_pending_object(revs, object, \"\");\n+\tadd_pending_object(revs, object, \"\", S_IFINVALID);\n \n \treturn 0;\n }\n@@ -140,7 +140,7 @@ static int add_one_reflog(const char *path, const unsigned char *sha1, int flag,\n static void add_one_tree(const unsigned char *sha1, struct rev_info *revs)\n {\n \tstruct tree *tree = lookup_tree(sha1);\n-\tadd_pending_object(revs, &tree->object, \"\");\n+\tadd_pending_object(revs, &tree->object, \"\", S_IFINVALID);\n }\n \n static void add_cache_tree(struct cache_tree *it, struct rev_info *revs)\ndiff --git a/revision.c b/revision.c\nindex b2df974..4ff2e4e 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -114,11 +114,11 @@ void mark_parents_uninteresting(struct commit *commit)\n \t}\n }\n \n-void add_pending_object(struct rev_info *revs, struct object *obj, const char *name)\n+void add_pending_object(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, S_IFINVALID, &revs->pending);\n+\tadd_object_array(obj, name, mode, &revs->pending);\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@@ -145,7 +145,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object\n \twhile (object->type == OBJ_TAG) {\n \t\tstruct tag *tag = (struct tag *) object;\n \t\tif (revs->tag_objects && !(flags & UNINTERESTING))\n-\t\t\tadd_pending_object(revs, object, tag->tag);\n+\t\t\tadd_pending_object(revs, object, tag->tag, S_IFINVALID);\n \t\tobject = parse_object(tag->tagged->sha1);\n \t\tif (!object)\n \t\t\tdie(\"bad object %s\", sha1_to_hex(tag->tagged->sha1));\n@@ -179,7 +179,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object\n \t\t\tmark_tree_uninteresting(tree);\n \t\t\treturn NULL;\n \t\t}\n-\t\tadd_pending_object(revs, object, \"\");\n+\t\tadd_pending_object(revs, object, \"\", S_IFINVALID);\n \t\treturn NULL;\n \t}\n \n@@ -194,7 +194,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object\n \t\t\tmark_blob_uninteresting(blob);\n \t\t\treturn NULL;\n \t\t}\n-\t\tadd_pending_object(revs, object, \"\");\n+\t\tadd_pending_object(revs, object, \"\", S_IFINVALID);\n \t\treturn NULL;\n \t}\n \tdie(\"%s is unknown object\", name);\n@@ -548,7 +548,7 @@ static int handle_one_ref(const char *path, const unsigned char *sha1, int flag,\n \tstruct all_refs_cb *cb = cb_data;\n \tstruct object *object = get_reference(cb->all_revs, path, sha1,\n \t\t\t\t\t      cb->all_flags);\n-\tadd_pending_object(cb->all_revs, object, path);\n+\tadd_pending_object(cb->all_revs, object, path, S_IFINVALID);\n \treturn 0;\n }\n \n@@ -567,7 +567,7 @@ static void handle_one_reflog_commit(unsigned char *sha1, void *cb_data)\n \t\tstruct object *o = parse_object(sha1);\n \t\tif (o) {\n \t\t\to->flags |= cb->all_flags;\n-\t\t\tadd_pending_object(cb->all_revs, o, \"\");\n+\t\t\tadd_pending_object(cb->all_revs, o, \"\", S_IFINVALID);\n \t\t}\n \t\telse if (!cb->warned_bad_reflog) {\n \t\t\twarning(\"reflog of '%s' references pruned commits\",\n@@ -628,7 +628,7 @@ static int add_parents_only(struct rev_info *revs, const char *arg, int flags)\n \tfor (parents = commit->parents; parents; parents = parents->next) {\n \t\tit = &parents->item->object;\n \t\tit->flags |= flags;\n-\t\tadd_pending_object(revs, it, arg);\n+\t\tadd_pending_object(revs, it, arg, S_IFINVALID);\n \t}\n \treturn 1;\n }\n@@ -671,7 +671,7 @@ static void add_pending_commit_list(struct rev_info *revs,\n \twhile (commit_list) {\n \t\tstruct object *object = &commit_list->item->object;\n \t\tobject->flags |= flags;\n-\t\tadd_pending_object(revs, object, sha1_to_hex(object->sha1));\n+\t\tadd_pending_object(revs, object, sha1_to_hex(object->sha1), S_IFINVALID);\n \t\tcommit_list = commit_list->next;\n \t}\n }\n@@ -688,8 +688,8 @@ static void prepare_show_merge(struct rev_info *revs)\n \t\tdie(\"--merge without HEAD?\");\n \tif (get_sha1(\"MERGE_HEAD\", sha1, NULL) || !(other = lookup_commit(sha1)))\n \t\tdie(\"--merge without MERGE_HEAD?\");\n-\tadd_pending_object(revs, &head->object, \"HEAD\");\n-\tadd_pending_object(revs, &other->object, \"MERGE_HEAD\");\n+\tadd_pending_object(revs, &head->object, \"HEAD\", S_IFINVALID);\n+\tadd_pending_object(revs, &other->object, \"MERGE_HEAD\", S_IFINVALID);\n \tbases = get_merge_bases(head, other, 1);\n \twhile (bases) {\n \t\tstruct commit *it = bases->item;\n@@ -697,7 +697,7 @@ static void prepare_show_merge(struct rev_info *revs)\n \t\tfree(bases);\n \t\tbases = n;\n \t\tit->object.flags |= UNINTERESTING;\n-\t\tadd_pending_object(revs, &it->object, \"(merge-base)\");\n+\t\tadd_pending_object(revs, &it->object, \"(merge-base)\", S_IFINVALID);\n \t}\n \n \tif (!active_nr)\n@@ -727,6 +727,7 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,\n \tstruct object *object;\n \tunsigned char sha1[20];\n \tint local_flags;\n+\tunsigned mode;\n \n \tdotdot = strstr(arg, \"..\");\n \tif (dotdot) {\n@@ -771,8 +772,8 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,\n \t\t\t} else\n \t\t\t\ta->object.flags |= flags_exclude;\n \t\t\tb->object.flags |= flags;\n-\t\t\tadd_pending_object(revs, &a->object, this);\n-\t\t\tadd_pending_object(revs, &b->object, next);\n+\t\t\tadd_pending_object(revs, &a->object, this, S_IFINVALID);\n+\t\t\tadd_pending_object(revs, &b->object, next, S_IFINVALID);\n \t\t\treturn 0;\n \t\t}\n \t\t*dotdot = '.';\n@@ -796,12 +797,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, NULL))\n+\tif (get_sha1(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(revs, object, arg, mode);\n \treturn 0;\n }\n \n@@ -1177,10 +1178,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, NULL))\n+\t\tunsigned mode;\n+\t\tif (get_sha1(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(revs, object, def, mode);\n \t}\n \n \tif (revs->topo_order)\ndiff --git a/revision.h b/revision.h\nindex 8a02618..c58ec75 100644\n--- a/revision.h\n+++ b/revision.h\n@@ -130,6 +130,6 @@ extern void add_object(struct object *obj,\n \t\t       struct name_path *path,\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(struct rev_info *revs, struct object *obj, const char *name, unsigned mode);\n \n #endif\ndiff --git a/upload-pack.c b/upload-pack.c\nindex 1f12d29..aefca5f 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -139,12 +139,12 @@ static void create_pack_file(void)\n \t\t\t\tstruct object *o = want_obj.objects[i].item;\n \t\t\t\t/* why??? */\n \t\t\t\to->flags &= ~UNINTERESTING;\n-\t\t\t\tadd_pending_object(&revs, o, NULL);\n+\t\t\t\tadd_pending_object(&revs, o, NULL, S_IFINVALID);\n \t\t\t}\n \t\t\tfor (i = 0; i < have_obj.nr; i++) {\n \t\t\t\tstruct object *o = have_obj.objects[i].item;\n \t\t\t\to->flags |= UNINTERESTING;\n-\t\t\t\tadd_pending_object(&revs, o, NULL);\n+\t\t\t\tadd_pending_object(&revs, o, NULL, S_IFINVALID);\n \t\t\t}\n \t\t\tsetup_revisions(0, NULL, &revs, NULL);\n \t\t}\n-- \n1.4.4.4\n"},{"id":"40047","messageId":"11771583802608-git-send-email-mkoegler@auto.tuwien.ac.at","threadId":"7767","inReplyTo":"11771583803353-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"[PATCH 4/4] use the mode information of the tree, if <SHA1>:file name syntax is used","fromName":"Martin Koegler","fromEmail":"mkoegler@auto.tuwien.ac.at","sentAt":"2007-04-21T12:26:20Z","receivedAt":"2007-04-21T12:26:20Z","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 |   10 +++++++++-\n 1 files changed, 9 insertions(+), 1 deletions(-)\n\ndiff --git a/builtin-diff.c b/builtin-diff.c\nindex a427358..f1886ec 100644\n--- a/builtin-diff.c\n+++ b/builtin-diff.c\n@@ -20,6 +20,7 @@\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@@ -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.4.4.4\n"},{"id":"40066","messageId":"7vps5xtvqw.fsf@assigned-by-dhcp.cox.net","threadId":"7767","inReplyTo":"1177158380197-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"Re: [PATCH 1/4] add mode parameter to get_sha1","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-04-21T18:42:15Z","receivedAt":"2007-04-21T18:42:15Z","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> If the mode parameter is not NULL, get_sha1 will store\n> the mode of the object in it.\n\nMost existing callers pass NULL to this.  Wouldn't it be cleaner\nto have a new get_sha1_with_mode() function, and convert the\ncallers that care about mode to use it, like this?\n\nint get_sha1(const char *str, unsigned char sha1[20]) {\n\tunsigned discard;\n        return get_sha1_with_mode(str, sha1, &discard);\n}\n\nThat way, your patch would be much easier to review and would\nhave less chance of getting it wrong.  I wonder if [2/4] can be\nmade less impact using a similar trick.  Most of the existing\ncallers that place objects in object_array do not know the mode.\nOnly some do.\n\n+/* unknown mode */\n+#define S_IFINVALID    0320000\n+\n\nThis hunk does not belong to [1/4]; it is part of [2/4].\n\nTypically S_IF$TYPE macros are masked with S_IFMT (0170000)\nbefore being used, so the above value is *obviously* invalid,\nbut it also risks our code would treat it as a symlink, we do\nthe masking before comparison.  I wonder if defining it to\nS_IFMT mask itself might be a safer option.\n"},{"id":"40069","messageId":"20070421200239.GA2437@steel.home","threadId":"7767","inReplyTo":"1177158380197-git-send-email-mkoegler@auto.tuwien.ac.at","subject":"Re: [PATCH 1/4] add mode parameter to get_sha1","fromName":"Alex Riesen","fromEmail":"raa.lkml@gmail.com","sentAt":"2007-04-21T20:02:39Z","receivedAt":"2007-04-21T20:02:39Z","isPatch":true,"sender":{"key":"raa.lkml@gmail.com","avatar":"https://avatars.githubusercontent.com/u/324101?v=4"},"body":"Martin Koegler, Sat, Apr 21, 2007 14:26:17 +0200:\n> If the mode parameter is not NULL, get_sha1 will store\n> the mode of the object in it.\n\nIt looks like the number of call sites which actually use the\nargument is vanishingly small compared to the number of sites\nwhere it is set to NULL. Why don't you introduce a new function\ninstead, say get_sha1_and_mode, and use it for this two or three\nplaces?\n"}]}