[PATCH] Simplify code outputting relative timestamps in git log

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Nikolai Weibull <now@xxxxxxxxxxxxxxxxxx>

The code that outputs relative timestamps is repetitive and can be
simplified by using an array to deal with the various cutoffs.  This makes
it easier to modify and remove the cutoffs if we in the future desire to do
so.

Signed-off-by: Nikolai Weibull <now@xxxxxxxx>
---
 date.c |   63 +++++++++++++++++++++++++++++++--------------------------------
 1 files changed, 31 insertions(+), 32 deletions(-)

diff --git a/date.c b/date.c
index e387dcd..5891fa8 100644
--- a/date.c
+++ b/date.c
@@ -64,6 +64,29 @@ const char *show_date(unsigned long time
 	static char timebuf[200];
 
 	if (relative) {
+		static struct {
+			char name[8];
+			unsigned long cutoff;
+			unsigned long factor;
+			unsigned long term;
+		} cutoffs[] = {
+#define CUTOFF(name, cutoff, factor, ceiling) \
+			{ (name), (cutoff) * (factor), (factor), (ceiling) }
+#define MINUTES(minutes)        ((minutes) * 60)
+#define HOURS(hours)            ((hours) * MINUTES(60))
+#define DAYS(days)              ((days) * HOURS(24))
+			CUTOFF("seconds", 90, 1, 0),
+			CUTOFF("minutes", 90, MINUTES(1), 30),
+			CUTOFF("hours", 36, HOURS(1), MINUTES(30)),
+			CUTOFF("days", 14, DAYS(1), HOURS(12)),
+			CUTOFF("weeks", 12, DAYS(7), HOURS(12)),
+			CUTOFF("months", 12, DAYS(30), HOURS(12))
+#undef MINUTES
+#undef DAYS
+#undef HOURS
+#undef CUTOFF
+		};
+		int i;
 		unsigned long diff;
 		time_t t = gm_time_t(time, tz);
 		struct timeval now;
@@ -71,39 +94,15 @@ const char *show_date(unsigned long time
 		if (now.tv_sec < t)
 			return "in the future";
 		diff = now.tv_sec - t;
-		if (diff < 90) {
-			snprintf(timebuf, sizeof(timebuf), "%lu seconds ago", diff);
-			return timebuf;
-		}
-		/* Turn it into minutes */
-		diff = (diff + 30) / 60;
-		if (diff < 90) {
-			snprintf(timebuf, sizeof(timebuf), "%lu minutes ago", diff);
-			return timebuf;
-		}
-		/* Turn it into hours */
-		diff = (diff + 30) / 60;
-		if (diff < 36) {
-			snprintf(timebuf, sizeof(timebuf), "%lu hours ago", diff);
-			return timebuf;
-		}
-		/* We deal with number of days from here on */
-		diff = (diff + 12) / 24;
-		if (diff < 14) {
-			snprintf(timebuf, sizeof(timebuf), "%lu days ago", diff);
-			return timebuf;
-		}
-		/* Say weeks for the past 10 weeks or so */
-		if (diff < 70) {
-			snprintf(timebuf, sizeof(timebuf), "%lu weeks ago", (diff + 3) / 7);
-			return timebuf;
-		}
-		/* Say months for the past 12 months or so */
-		if (diff < 360) {
-			snprintf(timebuf, sizeof(timebuf), "%lu months ago", (diff + 15) / 30);
-			return timebuf;
+		for (i = 0; i < ARRAY_SIZE(cutoffs); i++) {
+			if (diff < cutoffs[i].cutoff) {
+				snprintf(timebuf, sizeof(timebuf), "%lu %s ago",
+					(diff + cutoffs[i].term) / cutoffs[i].factor,
+					cutoffs[i].name);
+				return timebuf;
+			}
 		}
-		/* Else fall back on absolute format.. */
+		/* If we went beyond the month cutoff, use absolute format. */
 	}
 
 	tm = time_to_tm(time, tz);
-- 
1.4.2.GIT-dirty

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]