threads / patch / 5408

patchSimplify code outputting relative timestamps in git log

Subject: [PATCH] Simplify code outputting relative timestamps in git log

## tl;dr

2 messages between Aug 27, 2006 and Aug 27, 2006. Diffs are folded; open one to read it.

replies: 1people: 1as markdown or json

Nikolai Weibull· Aug 27, 2006, 14:23 UTC · lore
From: Nikolai Weibull <now@puritan.pcp.ath.cx>

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@bitwi.se>
---
 date.c |   63 +++++++++++++++++++++++++++++++--------------------------------
 1 files changed, 31 insertions(+), 32 deletions(-)
Show changes to date.c +31 −32
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
Nikolai Weibull· Aug 27, 2006, 14:27 UTC · re: Nikolai Weibull · lore

Re: [PATCH] Simplify code outputting relative timestamps in git log

On 8/27/06, Nikolai Weibull <now@bitwi.se> wrote:
> From: Nikolai Weibull <now@puritan.pcp.ath.cx>
Hm...why is format-patch not using user.email?
> 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.

I just realized that I forgot to update the cutoffs to those in the repository. I was playing around with other cutoffs. I'll send a new patch if it is of any interest.

  nikolai

← back to recent threads