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