int exec_create(int argc, char **argv) { match_t match = MATCH_EXACT; const char *outdir = NULL; const char *format = NULL; const char *rootdir = NULL; const char *metadatadir = NULL; const char *manifest = NULL; char *plist = NULL; pkg_formats fmt; int ch; bool overwrite = true; bool hash = false; /* POLA: pkg create is quiet by default, unless * PKG_CREATE_VERBOSE is set in pkg.conf. This is for * historical reasons. */ quiet = !pkg_object_bool(pkg_config_get("PKG_CREATE_VERBOSE")); struct option longopts[] = { { "all", no_argument, NULL, 'a' }, { "format", required_argument, NULL, 'f' }, { "glob", no_argument, NULL, 'g' }, { "hash", no_argument, NULL, 'h' }, { "regex", no_argument, NULL, 'x' }, { "root-dir", required_argument, NULL, 'r' }, { "metadata", required_argument, NULL, 'm' }, { "manifest", required_argument, NULL, 'M' }, { "no-clobber", no_argument, NULL, 'n' }, { "out-dir", required_argument, NULL, 'o' }, { "plist", required_argument, NULL, 'p' }, { "quiet", no_argument, NULL, 'q' }, { "verbose", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 }, }; while ((ch = getopt_long(argc, argv, "+aghxf:r:m:M:o:np:qv", longopts, NULL)) != -1) { switch (ch) { case 'a': match = MATCH_ALL; break; case 'f': format = optarg; break; case 'g': match = MATCH_GLOB; break; case 'h': hash = true; break; case 'm': metadatadir = optarg; break; case 'M': manifest = optarg; break; case 'n': overwrite = false; break; case 'o': outdir = optarg; break; case 'p': plist = optarg; break; case 'q': quiet = true; break; case 'r': rootdir = optarg; break; case 'v': quiet = false; break; case 'x': match = MATCH_REGEX; break; default: usage_create(); return (EX_USAGE); } } argc -= optind; argv += optind; if (match != MATCH_ALL && metadatadir == NULL && manifest == NULL && argc == 0) { usage_create(); return (EX_USAGE); } if (metadatadir == NULL && manifest == NULL && rootdir != NULL) { warnx("Do not specify a rootdir without also specifying " "either a metadatadir or manifest"); usage_create(); return (EX_USAGE); } if (outdir == NULL) outdir = "./"; if (format == NULL) { fmt = TXZ; } else { if (format[0] == '.') ++format; if (strcmp(format, "txz") == 0) fmt = TXZ; else if (strcmp(format, "tbz") == 0) fmt = TBZ; else if (strcmp(format, "tgz") == 0) fmt = TGZ; else if (strcmp(format, "tar") == 0) fmt = TAR; else { warnx("unknown format %s, using txz", format); fmt = TXZ; } } if (metadatadir == NULL && manifest == NULL) { return (pkg_create_matches(argc, argv, match, fmt, outdir, overwrite) == EPKG_OK ? EX_OK : EX_SOFTWARE); } else if (metadatadir != NULL) { return (pkg_create_staged(outdir, fmt, rootdir, metadatadir, plist, hash) == EPKG_OK ? EX_OK : EX_SOFTWARE); } else { /* (manifest != NULL) */ return (pkg_create_from_manifest(outdir, fmt, rootdir, manifest, plist) == EPKG_OK ? EX_OK : EX_SOFTWARE); } }
int exec_create(int argc, char **argv) { match_t match = MATCH_EXACT; const char *outdir = NULL; const char *format = NULL; const char *rootdir = NULL; const char *metadatadir = NULL; const char *manifest = NULL; char *plist = NULL; pkg_formats fmt; int ch; bool overwrite = true; struct option longopts[] = { { "all", no_argument, NULL, 'a' }, { "glob", no_argument, NULL, 'g' }, { "regex", no_argument, NULL, 'x' }, { "format", required_argument, NULL, 'f' }, { "root-dir", required_argument, NULL, 'r' }, { "metadata", required_argument, NULL, 'm' }, { "manifest", required_argument, NULL, 'M' }, { "out-dir", required_argument, NULL, 'o' }, { "no-clobber", no_argument, NULL, 'n' }, { "plist", required_argument, NULL, 'p' }, { NULL, 0, NULL, 0 }, }; while ((ch = getopt_long(argc, argv, "+agxf:r:m:M:o:np:", longopts, NULL)) != -1) { switch (ch) { case 'a': match = MATCH_ALL; break; case 'g': match = MATCH_GLOB; break; case 'x': match = MATCH_REGEX; break; case 'f': format = optarg; break; case 'o': outdir = optarg; break; case 'r': rootdir = optarg; break; case 'm': metadatadir = optarg; break; case 'M': manifest = optarg; break; case 'n': overwrite = false; break; case 'p': plist = optarg; break; default: usage_create(); return (EX_USAGE); } } argc -= optind; argv += optind; if (match != MATCH_ALL && metadatadir == NULL && manifest == NULL && argc == 0) { usage_create(); return (EX_USAGE); } if (metadatadir == NULL && manifest == NULL && rootdir != NULL) { warnx("Do not specify a rootdir when creating a package from an installed package"); usage_create(); return (EX_USAGE); } if (outdir == NULL) outdir = "./"; if (format == NULL) { fmt = TXZ; } else { if (format[0] == '.') ++format; if (strcmp(format, "txz") == 0) fmt = TXZ; else if (strcmp(format, "tbz") == 0) fmt = TBZ; else if (strcmp(format, "tgz") == 0) fmt = TGZ; else if (strcmp(format, "tar") == 0) fmt = TAR; else { warnx("unknown format %s, using txz", format); fmt = TXZ; } } if (metadatadir == NULL && manifest == NULL) { return (pkg_create_matches(argc, argv, match, fmt, outdir, overwrite) == EPKG_OK ? EX_OK : EX_SOFTWARE); } else if (metadatadir != NULL) { return (pkg_create_staged(outdir, fmt, rootdir, metadatadir, plist) == EPKG_OK ? EX_OK : EX_SOFTWARE); } else { /* (manifest != NULL) */ return (pkg_create_from_manifest(outdir, fmt, rootdir, manifest) == EPKG_OK ? EX_OK : EX_SOFTWARE); } }