Merge refs/heads/master from .
[gitweb.git] / commit.c
index 3ac421ac349e64f89cdd2f319b732cbb6d10cc44..e51eda15243614d83948f31ee3814120ad61b1fe 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -33,26 +33,37 @@ enum cmit_fmt get_commit_format(const char *arg)
                return CMIT_FMT_SHORT;
        if (!strcmp(arg, "=full"))
                return CMIT_FMT_FULL;
+       if (!strcmp(arg, "=oneline"))
+               return CMIT_FMT_ONELINE;
        die("invalid --pretty format");
 }
 
-static struct commit *check_commit(struct object *obj, const unsigned char *sha1)
+static struct commit *check_commit(struct object *obj,
+                                  const unsigned char *sha1,
+                                  int quiet)
 {
        if (obj->type != commit_type) {
-               error("Object %s is a %s, not a commit", 
-                     sha1_to_hex(sha1), obj->type);
+               if (!quiet)
+                       error("Object %s is a %s, not a commit",
+                             sha1_to_hex(sha1), obj->type);
                return NULL;
        }
        return (struct commit *) obj;
 }
 
-struct commit *lookup_commit_reference(const unsigned char *sha1)
+struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
+                                             int quiet)
 {
        struct object *obj = deref_tag(parse_object(sha1));
 
        if (!obj)
                return NULL;
-       return check_commit(obj, sha1);
+       return check_commit(obj, sha1, quiet);
+}
+
+struct commit *lookup_commit_reference(const unsigned char *sha1)
+{
+       return lookup_commit_reference_gently(sha1, 0);
 }
 
 struct commit *lookup_commit(const unsigned char *sha1)
@@ -67,7 +78,7 @@ struct commit *lookup_commit(const unsigned char *sha1)
        }
        if (!obj->type)
                obj->type = commit_type;
-       return check_commit(obj, sha1);
+       return check_commit(obj, sha1, 0);
 }
 
 static unsigned long parse_commit_date(const char *buf)
@@ -350,6 +361,8 @@ static int add_user_info(const char *what, enum cmit_fmt fmt, char *buf, const c
        unsigned long time;
        int tz, ret;
 
+       if (fmt == CMIT_FMT_ONELINE)
+               return 0;
        date = strchr(line, '>');
        if (!date)
                return 0;
@@ -373,6 +386,9 @@ static int is_empty_line(const char *line, int len)
 static int add_parent_info(enum cmit_fmt fmt, char *buf, const char *line, int parents)
 {
        int offset = 0;
+
+       if (fmt == CMIT_FMT_ONELINE)
+               return offset;
        switch (parents) {
        case 1:
                break;
@@ -393,6 +409,7 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt, const char *msg, unsigned l
        int hdr = 1, body = 0;
        unsigned long offset = 0;
        int parents = 0;
+       int indent = (fmt == CMIT_FMT_ONELINE) ? 0 : 4;
 
        for (;;) {
                const char *line = msg;
@@ -416,7 +433,8 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt, const char *msg, unsigned l
                if (hdr) {
                        if (linelen == 1) {
                                hdr = 0;
-                               buf[offset++] = '\n';
+                               if (fmt != CMIT_FMT_ONELINE)
+                                       buf[offset++] = '\n';
                                continue;
                        }
                        if (fmt == CMIT_FMT_RAW) {
@@ -446,13 +464,23 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt, const char *msg, unsigned l
                } else {
                        body = 1;
                }
-               memset(buf + offset, ' ', 4);
-               memcpy(buf + offset + 4, line, linelen);
-               offset += linelen + 4;
+
+               memset(buf + offset, ' ', indent);
+               memcpy(buf + offset + indent, line, linelen);
+               offset += linelen + indent;
+               if (fmt == CMIT_FMT_ONELINE)
+                       break;
+       }
+       if (fmt == CMIT_FMT_ONELINE) {
+               /* We do not want the terminating newline */
+               if (buf[offset - 1] == '\n')
+                       offset--;
+       }
+       else {
+               /* Make sure there is an EOLN */
+               if (buf[offset - 1] != '\n')
+                       buf[offset++] = '\n';
        }
-       /* Make sure there is an EOLN */
-       if (buf[offset - 1] != '\n')
-               buf[offset++] = '\n';
        buf[offset] = '\0';
        return offset;
 }