diff --git a/.dockerignore b/.dockerignore index 643e6db..3909ae0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,3 +2,4 @@ !src/ !Makefile +!patches/ diff --git a/.gitignore b/.gitignore index 71064b1..df4fcc9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ vieter.log # External lib; gets added by Makefile libarchive-* test/ + +# V compiler directory +v-*/ diff --git a/.woodpecker/.builder.yml b/.woodpecker/.builder.yml index f827566..75f5267 100644 --- a/.woodpecker/.builder.yml +++ b/.woodpecker/.builder.yml @@ -12,4 +12,7 @@ pipeline: platforms: [ linux/arm/v7, linux/arm64/v8, linux/amd64 ] when: event: push - path: Dockerfile.builder + path: + - Dockerfile.builder + - patches/* + - Makefile diff --git a/Dockerfile.builder b/Dockerfile.builder index 75b1e3c..1f44b4c 100644 --- a/Dockerfile.builder +++ b/Dockerfile.builder @@ -1,4 +1,4 @@ -FROM alpine:3.12 +FROM alpine:3.15 ARG TARGETPLATFORM @@ -8,8 +8,7 @@ ENV VVV /opt/vlang ENV PATH /opt/vlang:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ENV VFLAGS -cc gcc -RUN mkdir -p /opt/vlang && \ - ln -s /opt/vlang/v /usr/bin/v && \ +RUN ln -s /opt/vlang/v /usr/bin/v && \ apk --no-cache add \ git make gcc curl openssl \ musl-dev \ @@ -20,20 +19,16 @@ RUN mkdir -p /opt/vlang && \ libarchive-static libarchive-dev \ diffutils +COPY patches ./patches +COPY Makefile ./ + +RUN make v && \ + mv v-*/* /opt/vlang && \ + v -version + RUN if [ "$TARGETPLATFORM" = 'linux/amd64' ]; then \ wget -O /usr/local/bin/mc https://dl.min.io/client/mc/release/linux-amd64/mc && \ chmod +x /usr/local/bin/mc ; \ fi - -COPY . /vlang-local - -RUN git clone \ - 'https://github.com/ChewingBever/v/' \ - -b vweb-streaming \ - --single-branch \ - '/opt/vlang' && \ - rm -rf '/vlang-local' && \ - make && v -version - CMD ["v"] diff --git a/Makefile b/Makefile index 9a5d6fa..aea3f6f 100644 --- a/Makefile +++ b/Makefile @@ -6,9 +6,11 @@ LARCHIVE_VER := 3.5.2 LARCHIVE_DIR := libarchive-$(LARCHIVE_VER) LARCHIVE_LIB := $(LARCHIVE_DIR)/libarchive/libarchive.so +V_RELEASE := weekly.2022.04 + # Custom V command for linking libarchive # V := LDFLAGS=$(PWD)/$(LARCHIVE_LIB) v -cflags '-I$(PWD)/$(LARCHIVE_DIR) -I $(PWD)/$(LARCHIVE_DIR)' -V := v -showcc +V := v-$(V_RELEASE)/v -showcc all: vieter @@ -64,24 +66,13 @@ fmt: vet: $(V) vet -W $(SRC_DIR) -# Pulls & builds my personal build of the v compiler, required for this project to function -.PHONY: customv -customv: - rm -rf v-jjr - git clone \ - -b vweb-streaming \ - --single-branch \ - https://github.com/ChewingBever/v jjr-v - '$(MAKE)' -C jjr-v - - -# =====LIBARCHIVE===== -.PHONY: libarchive -libarchive: $(LARCHIVE_LIB) -$(LARCHIVE_LIB): - curl -o - "https://libarchive.org/downloads/libarchive-${LARCHIVE_VER}.tar.gz" | tar xzf - - cd "libarchive-${LARCHIVE_VER}" && cmake . - '$(MAKE)' -C "libarchive-${LARCHIVE_VER}" +# Build & patch the V compiler +.PHONY: v +v: v-$(V_RELEASE)/v +v-$(V_RELEASE)/v: + curl -Lo - 'https://github.com/vlang/v/archive/refs/tags/$(V_RELEASE).tar.gz' | tar xzf - + cd patches && ./patch.sh '../v-$(V_RELEASE)' + '$(MAKE)' -C 'v-$(V_RELEASE)' clean: - rm -rf '$(LARCHIVE_DIR)' 'data' 'vieter' 'dvieter' 'pvieter' 'vieter.c' + rm -rf '$(LARCHIVE_DIR)' 'data' 'vieter' 'dvieter' 'pvieter' 'vieter.c' 'v-$(V_RELEASE)' diff --git a/patches/parse_request_no_body.v b/patches/parse_request_no_body.v new file mode 100644 index 0000000..c00a51c --- /dev/null +++ b/patches/parse_request_no_body.v @@ -0,0 +1,23 @@ +// Parse the header of a raw HTTP request into a Request object +pub fn parse_request_head(mut reader io.BufferedReader) ?Request { + // request line + mut line := reader.read_line() ? + method, target, version := parse_request_line(line) ? + + // headers + mut header := new_header() + line = reader.read_line() ? + for line != '' { + key, value := parse_header(line) ? + header.add_custom(key, value) ? + line = reader.read_line() ? + } + header.coerce(canonicalize: true) + + return Request{ + method: method + url: target.str() + header: header + version: version + } +} diff --git a/patches/patch.sh b/patches/patch.sh new file mode 100755 index 0000000..a7378e7 --- /dev/null +++ b/patches/patch.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env sh +# This file patches the downloaded V version +# Should be run from within the directory it's in, as it uses relative paths to the files used for patching. +# $1 is the path to the downloaded V version + +# Add parse_request_no_body +cat parse_request_no_body.v >> "$1"/vlib/net/http/request.v diff --git a/src/package.v b/src/package.v index c229e3f..7db5849 100644 --- a/src/package.v +++ b/src/package.v @@ -143,16 +143,17 @@ pub fn read_pkg(pkg_path string) ?Pkg { // TODO can this unsafe block be avoided? buf = unsafe { malloc(size) } + defer { + unsafe { + free(buf) + } + } C.archive_read_data(a, buf, size) unsafe { println(cstring_to_vstring(buf)) } pkg_info = parse_pkg_info_string(unsafe { cstring_to_vstring(buf) }) ? - - unsafe { - free(buf) - } } else { C.archive_read_data_skip(a) }