adding repos
[webgit] / src / query.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
23 #include "query.h"
24
25 #include "cwa.h"
26
27
28 void
29 ctgit_query_init (struct ctgit_query* q)
30 {
31   q->repo = NULL;
32   q->action = cwa_strdup ("main");
33   q->object = NULL;
34   q->head = NULL;
35   llist_init (&q->repos);
36 }
37
38 struct ctgit_query*
39 ctgit_query_destroy (struct ctgit_query* q)
40 {
41   cgi_free (q->request);
42
43   free (q->repo);
44   free (q->action);
45   free (q->object);
46   free (q->head);
47
48   LLIST_WHILE_HEAD (&q->repos, head)
49     {
50       struct ctgit_repo_info* h = (struct ctgit_repo_info*)head;
51
52       free (h->path);
53       free (h->name);
54
55       free (h->owner);
56       free (h->description);
57       free (h->pull_url);
58
59       llist_unlink (head);
60       free (h);
61     }
62
63   return q;
64 }
65
66
67 void
68 ctgit_query_add_repo (struct ctgit_query* q, const char* path)
69 {
70   if (!path)
71     return;
72
73   // TODO check path == git repo
74
75   struct ctgit_repo_info* self = cwa_malloc (sizeof(struct ctgit_repo_info));
76
77   llist_init (&self->node);
78   self->path = cwa_strdup (path);
79
80   char* n;
81   while (n = strrchr(path, '/'))
82     if (n[1])
83       {
84         ++n;
85         break;
86       }
87
88   if (!n)
89     n = path;
90
91   self->name = cwa_strdup (n);       // TODO
92
93   self->owner = NULL;
94   self->description = NULL;
95   self->pull_url = NULL;
96
97   LList p = &q->repos;
98   LLIST_FOREACH (&q->repos, node)
99     {
100       struct ctgit_repo_info* n = (struct ctgit_repo_info*)node;
101       if (strcmp (n->name, self->name) > 0)
102         break;
103       p = node;
104     }
105   llist_insert_next (p, &self->node);
106
107 }
108
109
110 static void
111 ctgit_repo_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
112 {
113   struct ctgit_query* q = (struct ctgit_query*) u_dat;
114
115   free (q->repo);
116   q->repo = strdup(v);
117
118   fprintf (stderr,"repo='%s'\n", v);
119 }
120
121 static void
122 ctgit_action_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
123 {
124   struct ctgit_query* q = (struct ctgit_query*) u_dat;
125
126   free (q->action);
127   q->action = strdup(v);
128
129   fprintf (stderr,"action='%s'\n", v);
130 }
131
132 static void
133 ctgit_object_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
134 {
135   struct ctgit_query* q = (struct ctgit_query*) u_dat;
136
137   free (q->object);
138   q->object = strdup (v);
139
140   fprintf (stderr,"object='%s'\n", v);
141 }
142
143 static void
144 ctgit_ref_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
145 {
146   struct ctgit_query* q = (struct ctgit_query*) u_dat;
147
148   free (q->head);
149   q->head = strdup(v);
150
151   fprintf (stderr,"head='%s'\n", v);
152 }
153
154
155
156 void
157 ctgit_param_dispatch (const Cgi self,
158                       const char* name,
159                       const char* value,
160                       size_t value_len,
161                       void* user_data)
162 {
163 #define CTGIT_PARAM(name, _) {#name, ctgit_##name##_param},
164   struct param_table{
165     char* name;
166     void (*cb)(const Cgi, const char* v, size_t v_sz, void* u_dat);
167   } cmds[] = {CTGIT_PARAMS {"", NULL}};
168 #undef CTGIT_PARAMS
169
170   for (struct param_table* j = cmds; j->cb; ++j)
171     {
172       if (!strcmp (j->name, name))
173         {
174           j->cb (self, value, value_len, user_data);
175           break;
176         }
177     }
178 }