create_dep_tar.c 2.6 KB

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