{"thread":{"id":"25781","subject":"[PATCH] branch: support sorting branches by mtime","startedAt":"2010-11-18T14:22:06Z","lastAt":"2010-11-20T04:22:19Z","messageCount":3,"participants":["Nguyễn Thái Ngọc Duy","Jeff King","Joshua Juran"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"156098","messageId":"1290090126-14471-1-git-send-email-pclouds@gmail.com","threadId":"25781","inReplyTo":null,"subject":"[PATCH] branch: support sorting branches by mtime","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2010-11-18T14:22:06Z","receivedAt":"2010-11-18T14:22:06Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"I lost in my branches again while looking for a topic that I feel like\nworking on tonight. Too old branches are out of question.\n\nThis throwaway patch demonstrates the idea. I should have looked into\nreflog for this kind of information, but my laziness won over me.\n\nOK Git's fun time is over..\n---\n builtin/branch.c |   32 ++++++++++++++++++++++++++++----\n 1 files changed, 28 insertions(+), 4 deletions(-)\n\ndiff --git a/builtin/branch.c b/builtin/branch.c\nindex 87976f0..fdc2714 100644\n--- a/builtin/branch.c\n+++ b/builtin/branch.c\n@@ -232,6 +232,7 @@ struct ref_item {\n \tchar *name;\n \tchar *dest;\n \tunsigned int kind, len;\n+\tunsigned long mtime;\n \tstruct commit *commit;\n };\n \n@@ -259,6 +260,7 @@ static char *resolve_symref(const char *src, const char *prefix)\n \n struct append_ref_cb {\n \tstruct ref_list *ref_list;\n+\tint collect_mtime;\n \tint ret;\n };\n \n@@ -270,6 +272,7 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,\n \tstruct commit *commit;\n \tint kind, i;\n \tconst char *prefix, *orig_refname = refname;\n+\tstruct stat st;\n \n \tstatic struct {\n \t\tint kind;\n@@ -334,6 +337,13 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,\n \tif (newitem->len > ref_list->maxwidth)\n \t\tref_list->maxwidth = newitem->len;\n \n+\tkind = kind == REF_LOCAL_BRANCH ? 0 : 1;\n+\tif (stat(git_path(\"logs/%s%s\", ref_kind[kind].prefix, refname), &st)) {\n+\t\tnewitem->mtime = 0;\n+\t}\n+\telse\n+\t\tnewitem->mtime = st.st_mtime;\n+\n \treturn 0;\n }\n \n@@ -358,6 +368,16 @@ static int ref_cmp(const void *r1, const void *r2)\n \treturn strcmp(c1->name, c2->name);\n }\n \n+static int ref_mtime_cmp(const void *r1, const void *r2)\n+{\n+\tstruct ref_item *c1 = (struct ref_item *)(r1);\n+\tstruct ref_item *c2 = (struct ref_item *)(r2);\n+\n+\tif (c1->kind != c2->kind)\n+\t\treturn c1->kind - c2->kind;\n+\treturn c1->mtime - c2->mtime;\n+}\n+\n static void fill_tracking_info(struct strbuf *stat, const char *branch_name,\n \t\tint show_upstream_ref)\n {\n@@ -492,7 +512,8 @@ static void show_detached(struct ref_list *ref_list)\n \t}\n }\n \n-static int print_ref_list(int kinds, int detached, int verbose, int abbrev, struct commit_list *with_commit)\n+static int print_ref_list(int kinds, int detached, int verbose, int abbrev,\n+\t\t\t  int sort_by_mtime, struct commit_list *with_commit)\n {\n \tint i;\n \tstruct append_ref_cb cb;\n@@ -507,6 +528,7 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru\n \t\tinit_revisions(&ref_list.revs, NULL);\n \tcb.ref_list = &ref_list;\n \tcb.ret = 0;\n+\tcb.collect_mtime = sort_by_mtime;\n \tfor_each_rawref(append_ref, &cb);\n \tif (merge_filter != NO_FILTER) {\n \t\tstruct commit *filter;\n@@ -520,7 +542,8 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru\n \t\t\tref_list.maxwidth = calc_maxwidth(&ref_list);\n \t}\n \n-\tqsort(ref_list.list, ref_list.index, sizeof(struct ref_item), ref_cmp);\n+\tqsort(ref_list.list, ref_list.index, sizeof(struct ref_item),\n+\t      sort_by_mtime ? ref_mtime_cmp : ref_cmp);\n \n \tdetached = (detached && (kinds & REF_LOCAL_BRANCH));\n \tif (detached)\n@@ -614,7 +637,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)\n {\n \tint delete = 0, rename = 0, force_create = 0;\n \tint verbose = 0, abbrev = DEFAULT_ABBREV, detached = 0;\n-\tint reflog = 0;\n+\tint reflog = 0, sort_by_mtime = 0;\n \tenum branch_track track;\n \tint kinds = REF_LOCAL_BRANCH;\n \tstruct commit_list *with_commit = NULL;\n@@ -664,6 +687,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)\n \t\t\tPARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG,\n \t\t\topt_parse_merge_filter, (intptr_t) \"HEAD\",\n \t\t},\n+\t\tOPT_BOOLEAN(0, \"mtime\", &sort_by_mtime, \"sort branch list by modification time\"),\n \t\tOPT_END(),\n \t};\n \n@@ -695,7 +719,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)\n \tif (delete)\n \t\treturn delete_branches(argc, argv, delete > 1, kinds);\n \telse if (argc == 0)\n-\t\treturn print_ref_list(kinds, detached, verbose, abbrev, with_commit);\n+\t\treturn print_ref_list(kinds, detached, verbose, abbrev, sort_by_mtime, with_commit);\n \telse if (rename && (argc == 1))\n \t\trename_branch(head, argv[0], rename > 1);\n \telse if (rename && (argc == 2))\n-- \n1.7.3.2.210.g045198\n"},{"id":"156107","messageId":"20101118161351.GA19011@sigill.intra.peff.net","threadId":"25781","inReplyTo":"1290090126-14471-1-git-send-email-pclouds@gmail.com","subject":"Re: [PATCH] branch: support sorting branches by mtime","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2010-11-18T16:13:51Z","receivedAt":"2010-11-18T16:13:51Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, Nov 18, 2010 at 09:22:06PM +0700, Nguyễn Thái Ngọc Duy wrote:\n\n> I lost in my branches again while looking for a topic that I feel like\n> working on tonight. Too old branches are out of question.\n> \n> This throwaway patch demonstrates the idea. I should have looked into\n> reflog for this kind of information, but my laziness won over me.\n\nI do something similar, but rather than using mtime, I sort by\nauthordate, which for-each-ref supports already. In fact, the script I\nuse is:\n\n-- >8 --\n#!/bin/sh\n\nformat='%(refname:short)'\nsortby=refname\nset -- $(getopt vt \"$@\")\nwhile test $# -gt 0; do\n\tcase \"$1\" in\n\t-v) format='%(refname:short) %(subject)' ;;\n\t-t) sortby=-authordate ;;\n\t--) break ;;\n\t *) echo >&2 \"unknown option: $1\"; exit 100 ;;\n\tesac\n\tshift\ndone\n\ngit for-each-ref --sort=$sortby --format=\"$format\" refs/heads |\negrep '^[a-z]{2,3}/' |\nperl -pe '\n  s/(\\S+) /$1 . \" \" x (22 - length($1))/e; # line up subjects\n  s/^(.{79}).*/$1/; # truncate long lines\n'\n-- 8< --\n\nIt might be nice if git-branch supported the same sortby that\nfor-each-ref does.\n\n-Peff\n"},{"id":"156245","messageId":"21836339-5F7E-4485-97CB-FC609CE4E364@gmail.com","threadId":"25781","inReplyTo":"1290090126-14471-1-git-send-email-pclouds@gmail.com","subject":"Re: [PATCH] branch: support sorting branches by mtime","fromName":"Joshua Juran","fromEmail":"jjuran@gmail.com","sentAt":"2010-11-20T04:22:19Z","receivedAt":"2010-11-20T04:22:19Z","isPatch":true,"sender":{"key":"jjuran@gmail.com","avatar":null},"body":"On Nov 18, 2010, at 6:22 AM, Nguyễn Thái Ngọc Duy wrote:\n\n> I lost in my branches again while looking for a topic that I feel like\n> working on tonight. Too old branches are out of question.\n>\n> This throwaway patch demonstrates the idea. I should have looked into\n> reflog for this kind of information, but my laziness won over me.\n>\n> OK Git's fun time is over..\n> ---\n> builtin/branch.c |   32 ++++++++++++++++++++++++++++----\n> 1 files changed, 28 insertions(+), 4 deletions(-)\n>\n> diff --git a/builtin/branch.c b/builtin/branch.c\n> index 87976f0..fdc2714 100644\n> --- a/builtin/branch.c\n> +++ b/builtin/branch.c\n> @@ -232,6 +232,7 @@ struct ref_item {\n> \tchar *name;\n> \tchar *dest;\n> \tunsigned int kind, len;\n> +\tunsigned long mtime;\n> \tstruct commit *commit;\n> };\n\nIt's possible to have 32-bit long and 64-bit time_t.\n\nJosh\n"}]}