Simple mainpage generation, skeletons for further work
[webgit] / src / repo.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2007,               Christian Thaeter <ct@pipapo.org>
6
7   This program is free software; you can redistribute it and/or
8   modify it under the terms of the GNU General Public License as
9   published by the Free Software Foundation; either version 2 of the
10   License, or (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "repo.h"
23 #include "age.h"
24
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <unistd.h>
28 #include <pwd.h>
29 #include <stdint.h>
30
31 Html
32 ctgit_repo_age (struct ctgit_query* query, struct ctgit_repo_info* n)
33 {
34   char buf[512];
35
36   snprintf (buf, 512, "%s/.git/refs/heads", n->path);
37
38   struct stat st;
39
40   if (!stat (buf, &st))
41     return ctgit_pretty_age (query->now, st.st_mtime);
42   else
43     return html("file not found");
44 }
45
46
47 struct ctgit_repo_info*
48 ctgit_repoinfo_new (const char* path)
49 {
50   if (!path)
51     return NULL;
52
53   // TODO check path == git repo
54
55   struct ctgit_repo_info* self = cwa_malloc (sizeof(struct ctgit_repo_info));
56
57   llist_init (&self->node);
58   self->path = cwa_strndup (path, SIZE_MAX);
59
60   const char* n;
61   while ((n = strrchr (path, '/')))
62     if (n[1])
63       {
64         ++n;
65         break;
66       }
67
68   if (!n)
69     n = path;
70
71   char buf[512];
72   struct stat st;
73   if (stat (path, &st))
74     return NULL; // error ILLEGAL dir
75
76   self->name = cwa_strndup (n, SIZE_MAX);       // TODO
77
78   struct passwd* pw;
79   if ((pw = getpwuid (st.st_uid)) != NULL)
80     self->owner = cwa_strndup (pw->pw_gecos, strchr (pw->pw_gecos, ',') - pw->pw_gecos);
81   else
82     self->owner = cwa_strndup ("unknown", 100);
83
84
85
86   self->description = NULL;
87
88   snprintf (buf, 512, "%s/.git/description", path);
89
90   FILE* desc = fopen (buf, "r");
91   if (desc)
92     {
93       fgets (buf, 512, desc);
94       fclose (desc);
95       char* e = strchr (buf, '\n');
96       if (e)
97         *e = '\0';
98
99       self->description = cwa_strndup (buf, 40);
100       size_t l = strlen (self->description);
101       if (l >= 39)
102         {
103           self->description[l-1] = '.';
104           self->description[l-2] = '.';
105           self->description[l-3] = '.';
106         }
107     }
108
109
110
111
112
113
114   self->pull_url = NULL;
115
116   return self;
117 }