summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 848b292)
raw | patch | inline | side by side (parent: 848b292)
author | Linus Torvalds <torvalds@ppc970.osdl.org> | |
Sun, 5 Jun 2005 16:02:03 +0000 (09:02 -0700) | ||
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | |
Sun, 5 Jun 2005 16:02:03 +0000 (09:02 -0700) |
You can ask to print out "raw" format (full headers, full body),
"medium" format (author and date, full body) or "short" format
(author only, condensed body).
Use "git-rev-list --pretty=short HEAD | less -S" for an example.
"medium" format (author and date, full body) or "short" format
(author only, condensed body).
Use "git-rev-list --pretty=short HEAD | less -S" for an example.
commit.c | patch | blob | history | |
commit.h | patch | blob | history | |
diff-tree.c | patch | blob | history | |
rev-list.c | patch | blob | history |
diff --git a/commit.c b/commit.c
index de5e94d1dd5eabc5dfdf6935cb90096c3d37c13e..3d3bb1cde8cf1f57576d4bed99a4673da2be1bc5 100644 (file)
--- a/commit.c
+++ b/commit.c
+#include <ctype.h>
#include "tag.h"
#include "commit.h"
#include "cache.h"
return ret;
}
-static int add_author_info(char *buf, const char *line, int len)
+static int add_author_info(enum cmit_fmt fmt, char *buf, const char *line, int len)
{
char *date;
unsigned int namelen;
unsigned long time;
- int tz;
+ int tz, ret;
line += strlen("author ");
date = strchr(line, '>');
time = strtoul(date, &date, 10);
tz = strtol(date, NULL, 10);
- return sprintf(buf, "Author: %.*s\nDate: %s\n",
- namelen, line,
- show_date(time, tz));
+ ret = sprintf(buf, "Author: %.*s\n", namelen, line);
+ if (fmt == CMIT_FMT_MEDIUM)
+ ret += sprintf(buf + ret, "Date: %s\n", show_date(time, tz));
+ return ret;
+}
+
+static int is_empty_line(const char *line, int len)
+{
+ while (len && isspace(line[len-1]))
+ len--;
+ return !len;
}
-unsigned long pretty_print_commit(const char *msg, unsigned long len, char *buf, unsigned long space)
+unsigned long pretty_print_commit(enum cmit_fmt fmt, const char *msg, unsigned long len, char *buf, unsigned long space)
{
- int hdr = 1;
+ int hdr = 1, body = 0;
unsigned long offset = 0;
for (;;) {
@@ -237,13 +246,30 @@ unsigned long pretty_print_commit(const char *msg, unsigned long len, char *buf,
msg += linelen;
len -= linelen;
- if (linelen == 1)
- hdr = 0;
if (hdr) {
+ if (linelen == 1) {
+ hdr = 0;
+ buf[offset++] = '\n';
+ continue;
+ }
+ if (fmt == CMIT_FMT_RAW) {
+ memcpy(buf + offset, line, linelen);
+ offset += linelen;
+ continue;
+ }
if (!memcmp(line, "author ", 7))
- offset += add_author_info(buf + offset, line, linelen);
+ offset += add_author_info(fmt, buf + offset, line, linelen);
continue;
}
+
+ if (is_empty_line(line, linelen)) {
+ if (!body)
+ continue;
+ if (fmt == CMIT_FMT_SHORT)
+ break;
+ } else {
+ body = 1;
+ }
memset(buf + offset, ' ', 4);
memcpy(buf + offset + 4, line, linelen);
offset += linelen + 4;
diff --git a/commit.h b/commit.h
index 8147551c9edc112d2a046e4fc80c65bcb259ba73..85736a89f9a26451973673d26a21f7179b0276b9 100644 (file)
--- a/commit.h
+++ b/commit.h
void sort_by_date(struct commit_list **list);
-extern unsigned long pretty_print_commit(const char *msg, unsigned long len, char *buf, unsigned long space);
+/* Commit formats */
+enum cmit_fmt {
+ CMIT_FMT_RAW,
+ CMIT_FMT_MEDIUM,
+ CMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM,
+ CMIT_FMT_SHORT
+};
+
+extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const char *msg, unsigned long len, char *buf, unsigned long space);
/** Removes the first commit from a list sorted by date, and adds all
diff --git a/diff-tree.c b/diff-tree.c
index 3881c23ca37a86c41ec12b2d5c4713ab01cc9d82..6f8dc2024c289a92fe81014511a8377364340783 100644 (file)
--- a/diff-tree.c
+++ b/diff-tree.c
static const char *orderfile = NULL;
static const char *header = NULL;
static const char *header_prefix = "";
+static enum cmit_fmt commit_format = CMIT_FMT_RAW;
// What paths are we interested in?
static int nr_paths = 0;
offset = sprintf(this_header, "%s%s (from %s)\n", header_prefix, commit, parent);
if (verbose_header) {
- offset += pretty_print_commit(msg, len, this_header + offset, sizeof(this_header) - offset);
+ offset += pretty_print_commit(commit_format, msg, len, this_header + offset, sizeof(this_header) - offset);
this_header[offset++] = '\n';
this_header[offset++] = 0;
}
diff --git a/rev-list.c b/rev-list.c
index cbfc5c439d7b40c6804356a8288735b241d51a2f..2b098c1e88ee60e8d81f6fc16bb246819711afe6 100644 (file)
--- a/rev-list.c
+++ b/rev-list.c
static int verbose_header = 0;
static int show_parents = 0;
-static int pretty_print = 0;
static int hdr_termination = 0;
static const char *prefix = "";
static unsigned long max_age = -1;
static unsigned long min_age = -1;
static int max_count = -1;
+static enum cmit_fmt commit_format = CMIT_FMT_RAW;
static void show_commit(struct commit *commit)
{
}
putchar('\n');
if (verbose_header) {
- const char *buf = commit->buffer;
- if (pretty_print) {
- static char pretty_header[16384];
- pretty_print_commit(commit->buffer, ~0, pretty_header, sizeof(pretty_header));
- buf = pretty_header;
- }
- printf("%s%c", buf, hdr_termination);
+ static char pretty_header[16384];
+ pretty_print_commit(commit_format, commit->buffer, ~0, pretty_header, sizeof(pretty_header));
+ printf("%s%c", pretty_header, hdr_termination);
}
}
return newlist;
}
+static enum cmit_fmt get_commit_format(const char *arg)
+{
+ if (!*arg)
+ return CMIT_FMT_DEFAULT;
+ if (!strcmp(arg, "=raw"))
+ return CMIT_FMT_RAW;
+ if (!strcmp(arg, "=medium"))
+ return CMIT_FMT_MEDIUM;
+ if (!strcmp(arg, "=short"))
+ return CMIT_FMT_SHORT;
+ usage(rev_list_usage);
+}
+
+
int main(int argc, char **argv)
{
struct commit_list *list = NULL;
verbose_header = 1;
continue;
}
- if (!strcmp(arg, "--pretty")) {
+ if (!strncmp(arg, "--pretty", 8)) {
+ commit_format = get_commit_format(arg+8);
verbose_header = 1;
- pretty_print = 1;
hdr_termination = '\n';
prefix = "commit ";
continue;