diff options
Diffstat (limited to 'brep/submit/submit.bash.in')
-rw-r--r-- | brep/submit/submit.bash.in | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/brep/submit/submit.bash.in b/brep/submit/submit.bash.in new file mode 100644 index 0000000..d6f0258 --- /dev/null +++ b/brep/submit/submit.bash.in @@ -0,0 +1,114 @@ +# file : brep/submit/submit.bash.in +# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +# @@ Should we make this module besides defining utility functions to also +# parse and remove from args the common arguments (directory)? +# + +if [ "$brep_submit" ]; then + return 0 +else + brep_submit=true +fi + +@import libbutl/manifest-serializer@ + +# Diagnostics. +# +self="$(basename $0)" + +# Result reference (assigned later). +# +reference= + +# Normally the brep module's log record looks like this: +# +# [Mon Jul 23 17:48:46.945079 2018] [brep:error] [pid 123:tid 456] [brep::submit::init]: error description +# +# We will use the (almost) same format for our diagnostics (redirected to the +# Apache's error_log) so it can easily be attributed to the brep module. +# +function info () # <severity> <text> +{ + local severity="$1" + shift + + # Note: %N is Linux-specific. + # + local ts + if ! ts="$(date +"%a %b %d %H:%M:%S.%6N %Y")"; then + ts= + fi + + echo "[$ts] [brep:$severity] [ref $reference] [$self]: $*" 1>&2; +} + +function error () { info "error" "$*"; exit 1; } +function trace () { if [ "$verbose" ]; then info "info" "$*"; fi } + +# Submission data directory. +# +# @@ Doesn't comply with implementation assuming that directory comes before +# submit-handler-arguments. Can we change the doc? +# +dir="${1%/}" # @@ Call it directory? +shift + +if [ -z "$dir" ]; then + error "$usage" +fi + +if [ ! -d "$dir" ]; then + error "'$dir' does not exist or is not a directory" +fi + +reference="$(basename $dir)" + +# Serialize one manifest name/value pair. +# +function serialize () # <name> <value> +{ + printf "%s:%s\0" "$1" "$2" >&"$butl_manifest_serializer_ifd" +} + +# Serialize the submission result manifest to stdout. +# +function result_manifest () # <status> <message> [<reference>] +{ + local sts="$1" + local msg="$2" + local ref="$3" + + trace "serializing result manifest" + butl_manifest_serializer_start + + serialize "" "1" # Start of manifest. + serialize "status" "$sts" + serialize "message" "$msg" + + if [ -n "$ref" ]; then + serialize "reference" "$ref" + fi + + butl_manifest_serializer_finish +} + +# Verify the archive is a valid bpkg package and extract its manifest file. +# +function extract_package_manifest () # <archive> <manifest> +{ + local arc="$1" + local man="$2" + + # Should we remove the submission directory with an invalid package? + # Probably it's better to leave it for potential investigation. Note that we + # can always grep for such directories based on the result.manifest file + # they contain. + # + if ! bpkg pkg-verify --manifest "$arc" >"$man" 2>/dev/null; then + trace "$arc is not a valid package" + result_manifest 400 "archive is not a valid package (run bpkg pkg-verify for details)" + exit 0 + fi +} |