]> git.ozlabs.org Git - ccan/blob - tools/create_dep_tar.c
Fix linking for tools, and add tools: target.
[ccan] / tools / create_dep_tar.c
1 #include "tools.h"
2 #include <err.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <sqlite3.h>
7 #include "ccan/grab_file/grab_file.h"
8 #include "ccan/str_talloc/str_talloc.h"
9 #include "ccan/talloc/talloc.h"
10 #include "tools/_infotojson/database.h"
11
12 #define TAR_CMD "tar cvvf "
13
14 /* get dependents of the module from db */
15 static char**
16 get_dependents(const char *dir, const char *db)
17 {
18         char            *query, *module, **dependents;
19         sqlite3         *handle;
20         int             i;
21         struct db_query *q;
22
23         module = strrchr(dir, '/');
24         module++;
25
26         /* getting dependents from db */
27         handle = db_open(db);
28         query = talloc_asprintf(NULL, "select module from search where depends LIKE \"%%%s%%\";", module);
29         q = db_query(handle, query);
30         db_close(handle);
31
32         if (q->num_rows == 0)
33                 return 0;
34         else {  
35                 /* getting query results and returning */
36                 dependents = talloc_array(NULL, char *, q->num_rows + 1);
37                 for (i = 0; i < q->num_rows; i++)
38                         dependents[i] = talloc_asprintf(dependents, "ccan/%s", q->rows[i][0]);
39                 dependents[q->num_rows] = NULL;
40                 return dependents;
41         }
42 }
43
44 /* create tar ball of dependencies */
45 static void
46 create_tar(char **deps, const char *dir, const char *targetdir)
47 {
48         FILE    *p;
49         char    *cmd_args, *cmd, *module, *buffer;
50
51         /* getting module name*/
52         module = strrchr(dir, '/');
53         module++;
54         
55         if (deps != NULL) {
56                 cmd_args = strjoin(NULL, deps, " ");    
57                 cmd = talloc_asprintf(NULL, TAR_CMD "%s/%s_with_deps.tar %s %s", targetdir, module, cmd_args, dir);
58         } else 
59                 cmd = talloc_asprintf(NULL, TAR_CMD "%s/%s.tar %s", targetdir, module, dir);
60                         
61         p = popen(cmd, "r");
62         if (!p)
63                 err(1, "Executing '%s'", cmd);
64
65         buffer = grab_fd(NULL, fileno(p), NULL);
66         if (!buffer)
67                 err(1, "Reading from '%s'", cmd);
68         pclose(p);
69 }
70
71 int main(int argc, char *argv[])
72 {
73         char    **deps, **dependents;
74         int     i;
75
76         if (argc != 4)
77                 errx(1, "Usage: create_dep_tar <dir> <targetdir> <db>\n"
78                         "Create tar of all the ccan dependencies");
79
80         /* creating tar of the module */
81         create_tar(NULL, argv[1], argv[2]);
82         printf("creating tar ball of \"%s\"\n", argv[1]);       
83
84         /* creating tar of the module dependencies */
85         deps = get_deps(talloc_autofree_context(), argv[1], true);
86         if (deps != NULL)
87                 create_tar(deps, argv[1], argv[2]);
88         talloc_free(deps);
89
90         /* creating/updating tar of the module dependents */
91         dependents = get_dependents(argv[1], argv[3]);
92         if (dependents != NULL)
93                 for (i = 0; dependents[i]; i++) {       
94                         printf("creating tar ball of \"%s\"\n", dependents[i]); 
95                         deps = get_deps(NULL, dependents[i], true);
96                         if (deps != NULL)
97                                 create_tar(deps, dependents[i], argv[2]);                       
98                         talloc_free(deps);
99                 }
100
101         talloc_free(dependents);
102         return 0;
103 }