Git development
 help / color / mirror / Atom feed
From: Nikolai Weibull <now@bitwi.se>
To: git@vger.kernel.org
Cc: Nikolai Weibull <now@puritan.pcp.ath.cx>, Nikolai Weibull <now@bitwi.se>
Subject: [PATCH] Simplify code outputting relative timestamps in git log
Date: Sun, 27 Aug 2006 16:23:28 +0200	[thread overview]
Message-ID: <11566886081901-git-send-email-now@bitwi.se> (raw)

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

             reply	other threads:[~2006-08-27 14:23 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-27 14:23 Nikolai Weibull [this message]
2006-08-27 14:27 ` [PATCH] Simplify code outputting relative timestamps in git log Nikolai Weibull

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11566886081901-git-send-email-now@bitwi.se \
    --to=now@bitwi.se \
    --cc=git@vger.kernel.org \
    --cc=now@puritan.pcp.ath.cx \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox