pretty: add infrastructure for commit format aliases
[gitweb.git] / pretty.c
index f795a9a18d735b9385ded29bb55ae6ae5e9ac046..c2c8901f8f826ea2d81e7c0185abd81964288112 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -15,6 +15,8 @@ static struct cmt_fmt_map {
        const char *name;
        enum cmit_fmt format;
        int is_tformat;
+       int is_alias;
+       const char *user_format;
 } *commit_formats;
 static size_t commit_formats_len;
 static struct cmt_fmt_map *find_commit_format(const char *sought);
@@ -46,14 +48,18 @@ static void setup_commit_formats(void)
               sizeof(*builtin_formats)*ARRAY_SIZE(builtin_formats));
 }
 
-static struct cmt_fmt_map *find_commit_format(const char *sought)
+static struct cmt_fmt_map *find_commit_format_recursive(const char *sought,
+                                                       const char *original,
+                                                       int num_redirections)
 {
        struct cmt_fmt_map *found = NULL;
        size_t found_match_len = 0;
        int i;
 
-       if (!commit_formats)
-               setup_commit_formats();
+       if (num_redirections >= commit_formats_len)
+               die("invalid --pretty format: "
+                   "'%s' references an alias which points to itself",
+                   original);
 
        for (i = 0; i < commit_formats_len; i++) {
                size_t match_len;
@@ -67,9 +73,24 @@ static struct cmt_fmt_map *find_commit_format(const char *sought)
                        found_match_len = match_len;
                }
        }
+
+       if (found && found->is_alias) {
+               found = find_commit_format_recursive(found->user_format,
+                                                    original,
+                                                    num_redirections+1);
+       }
+
        return found;
 }
 
+static struct cmt_fmt_map *find_commit_format(const char *sought)
+{
+       if (!commit_formats)
+               setup_commit_formats();
+
+       return find_commit_format_recursive(sought, sought, 0);
+}
+
 void get_commit_format(const char *arg, struct rev_info *rev)
 {
        struct cmt_fmt_map *commit_format;