{"thread":{"id":"3226","subject":"Re: The merge from hell...","startedAt":"2006-02-03T06:41:54Z","lastAt":"2006-02-03T06:41:54Z","messageCount":1,"participants":["linux@horizon.com"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"15514","messageId":"20060203064154.21015.qmail@science.horizon.com","threadId":"3226","inReplyTo":null,"subject":"Re: The merge from hell...","fromName":"","fromEmail":"linux@horizon.com","sentAt":"2006-02-03T06:41:54Z","receivedAt":"2006-02-03T06:41:54Z","isPatch":false,"sender":{"key":"linux@horizon.com","avatar":null},"body":"While we're stress-testing the ystem, does anyone feel like fixing\ngit-rev-parse 9fdb62af92c741addbea15545f214a6e89460865^10 ?\n\nThe following is my attempt, but it doesn't seem sufficient...\n\n$ ~/git/git-rev-parse 9fdb62af92c741addbea15545f214a6e89460865^{1,2,3,4,5,6,7,8,9,10,11,12}\n3ee68c4af3fd7228c1be63254b9f884614f9ebb2\n876c184b31dc73cc3f38c5b86dee55d091a56769\n729b4d4ce1982c52040bbf22d6711cdf8db07ad8\ncf82478840188f8c8494c1d7a668a8ae170d0e07\ndacd9b80355525be0e3c519687868410e304ad1c\n63c94b68ec30847a6e2b36651703f41066f91480\n35f652b5ef4ef145ac5514f6302b3f4cebfbbad4\n1a38416cea8ac801ae8f261074721f35317613dc\n4a90c7e86202f46fa9af011bdbcdf36e355d1721\nfatal: '9fdb62af92c741addbea15545f214a6e89460865^10': No such file or directory\n\n(Placed in the public domain; go nuts.)\n\ndiff --git a/sha1_name.c b/sha1_name.c\nindex ba0747c..adf49d2 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -388,52 +388,33 @@ static int peel_onion(const char *name, \n \n static int get_sha1_1(const char *name, int len, unsigned char *sha1)\n {\n-\tint parent, ret;\n-\tconst char *cp;\n-\n-\t/* foo^[0-9] or foo^ (== foo^1); we do not do more than 9 parents. */\n-\tif (len > 2 && name[len-2] == '^' &&\n-\t    name[len-1] >= '0' && name[len-1] <= '9') {\n-\t\tparent = name[len-1] - '0';\n-\t\tlen -= 2;\n-\t}\n-\telse if (len > 1 && name[len-1] == '^') {\n-\t\tparent = 1;\n-\t\tlen--;\n-\t} else\n-\t\tparent = -1;\n-\n-\tif (parent >= 0)\n-\t\treturn get_parent(name, len, sha1, parent);\n-\n-\t/* \"name~3\" is \"name^^^\",\n-\t * \"name~12\" is \"name^^^^^^^^^^^^\", and\n-\t * \"name~\" and \"name~0\" are name -- not \"name^0\"!\n-\t */\n-\tparent = 0;\n-\tfor (cp = name + len - 1; name <= cp; cp--) {\n-\t\tint ch = *cp;\n-\t\tif ('0' <= ch && ch <= '9')\n-\t\t\tcontinue;\n-\t\tif (ch != '~')\n-\t\t\tparent = -1;\n-\t\tbreak;\n+\tint parent = 0, pow10 = 1;\n+\tconst char *cp = name + len;\n+\tchar ch = 0;\t/* In case len == 0 */\n+\n+\t/* Parse trailing number and check for ^5 or ~5 */\n+\twhile (cp > name && (ch = *--cp) >= '0' && ch <= '9') {\n+\t\tparent += ch - '0' * pow10;\n+\t\tpow10 *= 10;\n \t}\n-\tif (!parent && *cp == '~') {\n-\t\tint len1 = cp - name;\n-\t\tcp++;\n-\t\twhile (cp < name + len)\n-\t\t\tparent = parent * 10 + *cp++ - '0';\n-\t\treturn get_nth_ancestor(name, len1, sha1, parent);\n+\n+\t/* Handle foo^[0-9]* case */\n+\tif (ch == '^') {\n+\t\t/* foo^ means foo^1, first parent */\n+\t\tif (cp + 1 == name)\n+\t\t\tparent = 1;\n+\t\treturn get_parent(name, cp - name, sha1, parent);\n \t}\n+\t/* Handle foo~[0-9]* case.  name~ = name~0 = name (not name^0!) */\n+\tif (ch == '~')\n+\t\treturn get_nth_ancestor(name, cp - name, sha1, parent);\n \n-\tret = peel_onion(name, len, sha1);\n-\tif (!ret)\n+\tif (!peel_onion(name, len, sha1))\n \t\treturn 0;\n \n-\tret = get_sha1_basic(name, len, sha1);\n-\tif (!ret)\n+\tif (!get_sha1_basic(name, len, sha1))\n \t\treturn 0;\n+\n \treturn get_short_sha1(name, len, sha1, 0);\n }\n \n"}]}