{"thread":{"id":"8569","subject":"[PATCH 3/3] Support branch^[merge] and branch^[push]","startedAt":"2007-06-12T03:10:54Z","lastAt":"2007-06-12T03:10:54Z","messageCount":1,"participants":["Daniel Barkalow"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"44787","messageId":"Pine.LNX.4.64.0706112307000.5848@iabervon.org","threadId":"8569","inReplyTo":null,"subject":"[PATCH 3/3] Support branch^[merge] and branch^[push]","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2007-06-12T03:10:54Z","receivedAt":"2007-06-12T03:10:54Z","isPatch":true,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"For a branch name, support getting related refs based on configuration.\n\nSigned-off-by: Daniel Barkalow <barkalow@iabervon.org>\n---\n sha1_name.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++\n 1 files changed, 50 insertions(+), 0 deletions(-)\n\ndiff --git a/sha1_name.c b/sha1_name.c\nindex 7df01af..dc5da7a 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -5,6 +5,7 @@\n #include \"blob.h\"\n #include \"tree-walk.h\"\n #include \"refs.h\"\n+#include \"remote.h\"\n \n static int find_short_object_filename(int len, const char *name, unsigned char *sha1)\n {\n@@ -511,6 +512,51 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)\n \treturn 0;\n }\n \n+static int lookup_specials(const char *name, int len, unsigned char *sha1)\n+{\n+\tconst char *sp;\n+\n+\tif (len < 5 || name[len - 1] != ']')\n+\t\treturn -1;\n+\n+\tfor (sp = name + len - 1; name <= sp; sp--) {\n+\t\tint ch = *sp;\n+\t\tif (ch == '[' && name < sp && sp[-1] == '^')\n+\t\t\tbreak;\n+\t}\n+\n+\tif (sp <= name)\n+\t\treturn -1;\n+\n+\tsp++; /* beginning of special name */\n+\tif (!strncmp(\"merge]\", sp, 6)) {\n+\t\tchar *word = xstrndup(name, sp - name - 2);\n+\t\tstruct branch *branch = branch_get(word);\n+\t\tfree(word);\n+\t\tif (branch && branch->merge) {\n+\t\t\treturn get_sha1(branch->merge->dst, sha1);\n+\t\t}\n+\t} else if (!strncmp(\"push]\", sp, 5)) {\n+\t\tchar *word = xstrndup(name, sp - name - 2);\n+\t\tstruct branch *branch = branch_get(word);\n+\t\tstruct refspec remote;\n+\t\tstruct refspec local;\n+\n+\t\tif (!branch || !branch->remote)\n+\t\t\treturn -1;\n+\n+\t\tremote.src = branch->refname;\n+\t\tif (remote_find_push(branch->remote, &remote))\n+\t\t\treturn -1;\n+\n+\t\tlocal.src = remote.dst;\n+\t\tif (remote_find_tracking(branch->remote, &local))\n+\t\t\treturn -1;\n+\t\treturn get_sha1(local.dst, sha1);\n+\t}\n+\treturn -1;\n+}\n+\n static int get_describe_name(const char *name, int len, unsigned char *sha1)\n {\n \tconst char *cp;\n@@ -565,6 +611,10 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1)\n \t\treturn get_nth_ancestor(name, len1, sha1, num);\n \t}\n \n+\tret = lookup_specials(name, len, sha1);\n+\tif (!ret)\n+\t\treturn 0;\n+\n \tret = peel_onion(name, len, sha1);\n \tif (!ret)\n \t\treturn 0;\n-- \n1.5.2.901.g27ad4-dirty\n"}]}