Usage
plash b PLASHCMD *BUILDARGS [-- *CMDARGS]
Description
Build then run utility. Builds the given build commands and calls the given
plash command with the builded container.
Example
$ plash b run -A
$ plash b run --eval-file ./plashfile -- ls
Tested Behaviour
#!/bin/bash
set -eux
• b builds flag arguments and passes it to command
test "$(plash b nodepath -f 1)" = "$(plash nodepath 1)"
• no build build flags fail
[[ "$(plash b nodepath 1)" = *"no build arguments"*]]
! plash b nodepath 1
[[ "$(plash b nodepath 1 2 3 4)" = *"no build arguments"*]]
! plash b nodepath 1 2 3 4
• no arguments fail
[[ "$(plash b nodepath)" = "usage: plash b"*]]
! plash b nodepath
• build arguments can be in the beginning or end
plash b with-mount true -A
plash b with-mount -A -- true
Source Code
#define USAGE "usage: plash b PLASHCMD *BUILDARGS [-- *CMDARGS]\n"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <plash.h>
int b_main(int argc, char *argv[]) {
if (argc < 2) {
fputs(USAGE, stderr);
return EXIT_FAILURE;
}
char **buildargs = argv;
char **cmdargs = (char *[]){NULL};
char *cmd = strdup(argv[1]);
if (cmd == NULL)
pl_fatal("strdup");
// reuse argv to build command to build the image
*argv = "/proc/self/exe";
argv++;
*argv = "build";
argv++;
while (*(++argv)) {
if ((*argv)[0] == '-' && (*argv)[1] == '-' && (*argv)[2] == '\0') {
// "--" found, cut the array here
*argv = NULL;
cmdargs = argv + 1;
}
}
// Run the requested command with the builded image
pl_exec_add("/proc/self/exe");
pl_exec_add(cmd);
pl_exec_add(pl_firstline(pl_check_output(buildargs)));
while (*(cmdargs))
pl_exec_add(*cmdargs++);
pl_exec_add(NULL);
return EXIT_FAILURE;
}