Implement simple revision log UI
[anjuta-git-plugin.git] / plugins / git / git-revision.c
bloba9f6e2f030473a56efc4a8de2d62ef3954550999
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * git-command-test
4 *
5 * git-command-test is free software: you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * git-command-test is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "git-revision.h"
21 struct _GitRevisionPriv
23 gchar *sha;
24 gchar *author;
25 gchar *date;
26 gchar *short_log;
27 GList *children;
28 gboolean has_parents;
31 G_DEFINE_TYPE (GitRevision, git_revision, G_TYPE_OBJECT);
33 static void
34 git_revision_init (GitRevision *self)
36 self->priv = g_new0 (GitRevisionPriv, 1);
39 static void
40 git_revision_finalize (GObject *object)
42 GitRevision *self;
43 GList *current_child;
45 self = GIT_REVISION (object);
47 g_free (self->priv->sha);
48 g_free (self->priv->author);
49 g_free (self->priv->date);
50 g_free (self->priv->short_log);
52 current_child = self->priv->children;
54 while (current_child)
56 g_object_unref (current_child->data);
57 current_child = g_list_next (current_child);
60 g_list_free (self->priv->children);
61 g_free (self->priv);
63 G_OBJECT_CLASS (git_revision_parent_class)->finalize (object);
66 static void
67 git_revision_class_init (GitRevisionClass *klass)
69 GObjectClass* object_class = G_OBJECT_CLASS (klass);
71 object_class->finalize = git_revision_finalize;
74 GitRevision *
75 git_revision_new (void)
77 return g_object_new (GIT_TYPE_REVISION, NULL);
80 void
81 git_revision_set_sha (GitRevision *self, const gchar *sha)
83 g_free (self->priv->sha);
84 self->priv->sha = g_strdup (sha);
87 gchar *
88 git_revision_get_sha (GitRevision *self)
90 return g_strdup (self->priv->sha);
93 void
94 git_revision_set_author (GitRevision *self, const gchar *author)
96 g_free (self->priv->author);
97 self->priv->author = g_strdup (author);
100 gchar *
101 git_revision_get_author (GitRevision *self)
103 return g_strdup (self->priv->author);
106 void
107 git_revision_set_short_log (GitRevision *self, const gchar *short_log)
109 g_free (self->priv->short_log);
110 self->priv->short_log = g_strdup (short_log);
112 g_strchug (self->priv->short_log);
115 gchar *
116 git_revision_get_short_log (GitRevision *self)
118 return g_strdup (self->priv->short_log);
121 static const gchar *
122 git_revision_get_time_format (struct tm *revision_time)
124 struct tm *tm;
125 time_t t1, t2;
127 t1 = mktime ((struct tm *) revision_time);
129 /* check whether it's ahead in time */
130 time (&t2);
131 if (t1 > t2)
133 return "%c";
136 /* check whether it's as fresh as today's bread */
137 t2 = time (NULL);
138 tm = localtime (&t2);
139 tm->tm_sec = tm->tm_min = tm->tm_hour = 0;
140 t2 = mktime (tm);
142 if (t1 > t2)
144 /* TRANSLATORS: it's a strftime format string */
145 return "%I:%M %p";
148 /* check whether it's older than a week */
149 t2 = time (NULL);
150 tm = localtime (&t2);
151 tm->tm_sec = tm->tm_min = tm->tm_hour = 0;
152 t2 = mktime (tm);
154 t2 -= 60 * 60 * 24 * 6; /* substract 1 week */
156 if (t1 > t2)
158 /* TRANSLATORS: it's a strftime format string */
159 return "%a %I:%M %p";
162 /* check whether it's more recent than the new year hangover */
163 t2 = time (NULL);
164 tm = localtime (&t2);
165 tm->tm_sec = tm->tm_min = tm->tm_hour = tm->tm_mon = 0;
166 tm->tm_mday = 1;
167 t2 = mktime (tm);
169 if (t1 > t2)
171 /* TRANSLATORS: it's a strftime format string */
172 return "%b %d %I:%M %p";
175 /* it's older */
176 /* TRANSLATORS: it's a strftime format string */
177 return "%b %d %Y";
180 void
181 git_revision_set_date (GitRevision *self, time_t unix_time)
183 struct tm time;
184 const gchar *format;
185 gchar buffer[256];
187 localtime_r (&unix_time, &time);
188 format = git_revision_get_time_format (&time);
189 strftime (buffer, sizeof (buffer), format, &time);
191 g_free (self->priv->date);
192 self->priv->date = g_strdup (buffer);
195 gchar *
196 git_revision_get_formatted_date (GitRevision *self)
198 return g_strdup (self->priv->date);
201 void
202 git_revision_add_child (GitRevision *self, GitRevision *child)
204 self->priv->children = g_list_prepend (self->priv->children,
205 g_object_ref (child));
206 git_revision_set_has_parents (child, TRUE);
209 GList *
210 git_revision_get_children (GitRevision *self)
212 return self->priv->children;
215 void
216 git_revision_set_has_parents (GitRevision *self, gboolean has_parents)
218 self->priv->has_parents = has_parents;
221 gboolean
222 git_revision_has_parents (GitRevision *self)
224 return self->priv->has_parents;