git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Simplify code outputting relative timestamps in git log

From
Nikolai Weibull <now@bitwi.se>
Date
Aug 27, 2006, 14:23 UTC
Message-ID
<11566886081901-git-send-email-now@bitwi.se>
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(-)
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
Next: Nikolai Weibull
Message 1 of 2 in “Simplify code outputting relative timestamps in git log”
  1. Simplify code outputting relative timestamps in git logNikolai Weibull, Aug 27, 2006
  2. Nikolai WeibullAug 27, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.