Copyright header fixes...
[anjuta-git-plugin.git] / plugins / git / git-revision.c
blobc6efb272dd80f0e8760bb8822330ad66061dbe9c
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta
4 * Copyright (C) James Liggett 2008 <jrliggett@cox.net>
5 *
6 * anjuta is free software.
7 *
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
11 * any later version.
13 * anjuta is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 * See the GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with anjuta. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include "git-revision.h"
27 struct _GitRevisionPriv
29 gchar *sha;
30 gchar *author;
31 gchar *date;
32 gchar *short_log;
33 GList *children;
34 gboolean has_parents;
37 G_DEFINE_TYPE (GitRevision, git_revision, G_TYPE_OBJECT);
39 static void
40 git_revision_init (GitRevision *self)
42 self->priv = g_new0 (GitRevisionPriv, 1);
45 static void
46 git_revision_finalize (GObject *object)
48 GitRevision *self;
49 GList *current_child;
51 self = GIT_REVISION (object);
53 g_free (self->priv->sha);
54 g_free (self->priv->author);
55 g_free (self->priv->date);
56 g_free (self->priv->short_log);
58 current_child = self->priv->children;
60 while (current_child)
62 g_object_unref (current_child->data);
63 current_child = g_list_next (current_child);
66 g_list_free (self->priv->children);
67 g_free (self->priv);
69 G_OBJECT_CLASS (git_revision_parent_class)->finalize (object);
72 static void
73 git_revision_class_init (GitRevisionClass *klass)
75 GObjectClass* object_class = G_OBJECT_CLASS (klass);
77 object_class->finalize = git_revision_finalize;
80 GitRevision *
81 git_revision_new (void)
83 return g_object_new (GIT_TYPE_REVISION, NULL);
86 void
87 git_revision_set_sha (GitRevision *self, const gchar *sha)
89 g_free (self->priv->sha);
90 self->priv->sha = g_strdup (sha);
93 gchar *
94 git_revision_get_sha (GitRevision *self)
96 return g_strdup (self->priv->sha);
99 gchar *
100 git_revision_get_short_sha (GitRevision *self)
102 return g_strndup (self->priv->sha, 7);
105 void
106 git_revision_set_author (GitRevision *self, const gchar *author)
108 g_free (self->priv->author);
109 self->priv->author = g_strdup (author);
112 gchar *
113 git_revision_get_author (GitRevision *self)
115 return g_strdup (self->priv->author);
118 void
119 git_revision_set_short_log (GitRevision *self, const gchar *short_log)
121 g_free (self->priv->short_log);
122 self->priv->short_log = g_strdup (short_log);
124 g_strchug (self->priv->short_log);
127 gchar *
128 git_revision_get_short_log (GitRevision *self)
130 return g_strdup (self->priv->short_log);
133 static const gchar *
134 git_revision_get_time_format (struct tm *revision_time)
136 struct tm *tm;
137 time_t t1, t2;
139 t1 = mktime ((struct tm *) revision_time);
141 /* check whether it's ahead in time */
142 time (&t2);
143 if (t1 > t2)
145 return "%c";
148 /* check whether it's as fresh as today's bread */
149 t2 = time (NULL);
150 tm = localtime (&t2);
151 tm->tm_sec = tm->tm_min = tm->tm_hour = 0;
152 t2 = mktime (tm);
154 if (t1 > t2)
156 /* TRANSLATORS: it's a strftime format string */
157 return "%I:%M %p";
160 /* check whether it's older than a week */
161 t2 = time (NULL);
162 tm = localtime (&t2);
163 tm->tm_sec = tm->tm_min = tm->tm_hour = 0;
164 t2 = mktime (tm);
166 t2 -= 60 * 60 * 24 * 6; /* substract 1 week */
168 if (t1 > t2)
170 /* TRANSLATORS: it's a strftime format string */
171 return "%a %I:%M %p";
174 /* check whether it's more recent than the new year hangover */
175 t2 = time (NULL);
176 tm = localtime (&t2);
177 tm->tm_sec = tm->tm_min = tm->tm_hour = tm->tm_mon = 0;
178 tm->tm_mday = 1;
179 t2 = mktime (tm);
181 if (t1 > t2)
183 /* TRANSLATORS: it's a strftime format string */
184 return "%b %d %I:%M %p";
187 /* it's older */
188 /* TRANSLATORS: it's a strftime format string */
189 return "%b %d %Y";
192 void
193 git_revision_set_date (GitRevision *self, time_t unix_time)
195 struct tm time;
196 const gchar *format;
197 gchar buffer[256];
199 localtime_r (&unix_time, &time);
200 format = git_revision_get_time_format (&time);
201 strftime (buffer, sizeof (buffer), format, &time);
203 g_free (self->priv->date);
204 self->priv->date = g_strdup (buffer);
207 gchar *
208 git_revision_get_formatted_date (GitRevision *self)
210 return g_strdup (self->priv->date);
213 void
214 git_revision_add_child (GitRevision *self, GitRevision *child)
216 self->priv->children = g_list_prepend (self->priv->children,
217 g_object_ref (child));
218 git_revision_set_has_parents (child, TRUE);
221 GList *
222 git_revision_get_children (GitRevision *self)
224 return self->priv->children;
227 void
228 git_revision_set_has_parents (GitRevision *self, gboolean has_parents)
230 self->priv->has_parents = has_parents;
233 gboolean
234 git_revision_has_parents (GitRevision *self)
236 return self->priv->has_parents;