diff --git a/.gitignore b/.gitignore index fbbe78a..e0bb624 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,6 @@ /s3-genindex +build/ # Generated index files **/index.html coverage.* - -# Debian packaging artifacts -debian/.debhelper/ -debian/.gocache/ -debian/go/ -debian/s3-genindex/ -debian/files -debian/*.substvars -debian/debhelper-build-stamp -debian/*.debhelper diff --git a/Makefile b/Makefile index 0bf285d..35801b2 100644 --- a/Makefile +++ b/Makefile @@ -1,108 +1,59 @@ -.PHONY: build clean wipe test help sync-version pkg-deb +PROG := s3-genindex +MODULE := git.ipng.ch/ipng/s3-genindex +NATIVE_ARCH := $(shell go env GOARCH) +VERSION := ${shell head -1 debian/changelog | sed -n 's/.*(\([^)]*\)).*/\1/p'} +COMMIT_HASH := $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) +DATE := $(shell date -u +%Y-%m-%dT%H:%M:%SZ) +LDFLAGS := -s -w \ + -X 'main.Version=$(VERSION)' \ + -X 'main.Commit=$(COMMIT_HASH)' \ + -X 'main.Date=$(DATE)' -# Default target -all: build +# CGO_ENABLED=0 yields a fully static binary so the same .deb runs on +# any glibc/musl Linux of the matching arch. The AWS SDK and the rest +# of this codebase are pure Go, so this has no behavioural impact +# beyond switching net/dns to the pure-Go resolver. +export CGO_ENABLED := 0 -# Build the binary -build: - @echo "Building s3-genindex..." - go build -o s3-genindex ./cmd/s3-genindex - @echo "Build complete: s3-genindex" +.PHONY: help all build build-amd64 build-arm64 test pkg-deb fmt vet lint check clean -# Run tests -test: - @echo "Running tests..." - go test -v ./... - @echo "Tests complete" +help: ## Show this help + @printf "Usage: make \n\nTargets:\n" + @awk -F ':.*## ' '/^[A-Za-z][A-Za-z0-9_-]*:.*## / {printf " %-16s %s\n", $$1, $$2}' $(MAKEFILE_LIST) -# Run tests with coverage -test-coverage: - @echo "Running tests with coverage..." - go test -v -coverprofile=coverage.out ./... - go tool cover -html=coverage.out -o coverage.html - @echo "Coverage report generated: coverage.html" +all: build ## Alias for build (native arch) -# Clean build artifacts -clean: - @echo "Cleaning build artifacts..." - rm -f s3-genindex - rm -f coverage.out coverage.html - rm -rf debian/s3-genindex debian/files debian/*.substvars debian/debhelper-build-stamp - [ -d debian/go ] && chmod -R +w debian/go || true - rm -rf debian/.gocache debian/go - find . -name index.html -delete - @echo "Clean complete" +build: ## Build the binary for the host architecture + mkdir -p build/$(NATIVE_ARCH) + go build -ldflags "$(LDFLAGS)" -o build/$(NATIVE_ARCH)/$(PROG) ./cmd/$(PROG) -# Wipe everything including test caches -wipe: clean - @echo "Wiping test cache and module cache..." - go clean -testcache - go clean -modcache - @echo "Wipe complete" +build-amd64: ## Cross-build the binary for linux/amd64 + mkdir -p build/amd64 + GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o build/amd64/$(PROG) ./cmd/$(PROG) -# Install binary to $GOPATH/bin or $GOBIN -install: - @echo "Installing s3-genindex..." - go install ./cmd/s3-genindex - @echo "Install complete" +build-arm64: ## Cross-build the binary for linux/arm64 + mkdir -p build/arm64 + GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o build/arm64/$(PROG) ./cmd/$(PROG) -# Format code -fmt: - @echo "Formatting code..." +test: ## Run all Go unit tests + go test ./... + +pkg-deb: build-amd64 build-arm64 ## Build .deb packages for amd64 and arm64 + debian/build-deb.sh $(PROG) amd64 $(VERSION) + debian/build-deb.sh $(PROG) arm64 $(VERSION) + +fmt: ## go fmt everything go fmt ./... - @echo "Format complete" -# Vet code for issues -vet: - @echo "Vetting code..." +vet: ## go vet everything go vet ./... - @echo "Vet complete" -# Lint code (requires golangci-lint) -lint: - @echo "Linting code..." - @if command -v golangci-lint >/dev/null 2>&1; then \ - golangci-lint run; \ - else \ - echo "golangci-lint not found, skipping lint"; \ - fi +lint: ## golangci-lint, if installed + @if command -v golangci-lint >/dev/null 2>&1; then golangci-lint run; else echo "golangci-lint not installed, skipping"; fi -# Run all checks -check: fmt vet lint test - @echo "All checks passed" +check: fmt vet lint test ## Format, vet, lint, and test -# Run benchmarks -bench: - @echo "Running benchmarks..." - go test -bench=. ./... - -# Sync version from debian/changelog to source code -sync-version: - @echo "Syncing version..." - @version=$$(head -1 debian/changelog | sed -n 's/.*(\([^)]*\)).*/\1/p'); \ - sed -i "s/const Version = .*/const Version = \"$$version\"/" cmd/s3-genindex/main.go; \ - echo "Updated version to $$version" - -# Build Debian package -pkg-deb: sync-version - @echo "Building Debian package..." - DEB_BUILD_OPTIONS=noautodbgsym fakeroot dpkg-buildpackage -us -uc -b - @echo "Debian package build complete" - -# Show help -help: - @echo "Available targets:" - @echo " build - Build the s3-genindex binary" - @echo " test - Run all tests" - @echo " test-coverage - Run tests with coverage report" - @echo " clean - Remove build artifacts" - @echo " wipe - Clean everything including caches" - @echo " install - Install binary to GOPATH/bin" - @echo " fmt - Format code" - @echo " vet - Vet code for issues" - @echo " lint - Lint code (requires golangci-lint)" - @echo " check - Run fmt, vet, lint, and test" - @echo " bench - Run benchmarks" - @echo " sync-version - Sync version from debian/changelog to source" - @echo " pkg-deb - Build Debian package" - @echo " help - Show this help message" +clean: ## Remove build artifacts + rm -rf build/ + rm -f $(PROG) coverage.out coverage.html + find . -name index.html -delete diff --git a/cmd/s3-genindex/main.go b/cmd/s3-genindex/main.go index ee8d6d9..5b16919 100644 --- a/cmd/s3-genindex/main.go +++ b/cmd/s3-genindex/main.go @@ -20,8 +20,8 @@ import ( "git.ipng.ch/ipng/s3-genindex/internal/indexgen" ) -// Version is the application version (sync'd from debian/changelog) -const Version = "1.0.0-1" +// Version is set at link time via -ldflags "-X main.Version=...". +var Version = "dev" // S3Config holds S3 connection configuration type S3Config struct { diff --git a/debian/build-deb.sh b/debian/build-deb.sh new file mode 100755 index 0000000..d5dbb95 --- /dev/null +++ b/debian/build-deb.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# SPDX-License-Identifier: Apache-2.0 +# Build one s3-genindex .deb for one architecture. +# Usage: build-deb.sh +# +# The version is also baked into the binary at link time (see Makefile +# LDFLAGS), so `s3-genindex -version` is the source of truth for "which +# build". The .deb itself only carries the release version. +set -euo pipefail + +PACKAGE="${1:?usage: build-deb.sh }" +ARCH="${2:?usage: build-deb.sh }" +VERSION="${3:?usage: build-deb.sh }" + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PKG="${PACKAGE}_${VERSION}_${ARCH}" +STAGING="$(mktemp -d)" +trap 'rm -rf "$STAGING"' EXIT + +echo "Building ${PKG}.deb" + +install -d "$STAGING/DEBIAN" +install -d "$STAGING/usr/bin" +install -d "$STAGING/usr/share/man/man1" + +# s3-genindex is a CLI tool, so /usr/bin (on every login PATH) is the +# right place; no /usr/sbin, no systemd unit, no /etc conffile. +install -m 755 "$REPO_ROOT/build/${ARCH}/${PACKAGE}" "$STAGING/usr/bin/${PACKAGE}" +gzip -9 -c "$REPO_ROOT/docs/${PACKAGE}.1" > "$STAGING/usr/share/man/man1/${PACKAGE}.1.gz" + +sed "s/@VERSION@/${VERSION}/;s/@ARCH@/${ARCH}/" \ + "$REPO_ROOT/debian/${PACKAGE}.control.in" > "$STAGING/DEBIAN/control" + +mkdir -p "$REPO_ROOT/build" +OUT="$REPO_ROOT/build/${PKG}.deb" +dpkg-deb --build --root-owner-group "$STAGING" "$OUT" +echo "Built: $OUT" diff --git a/debian/compat b/debian/compat deleted file mode 100644 index 9a03714..0000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -10 \ No newline at end of file diff --git a/debian/control b/debian/control deleted file mode 100644 index 1d22659..0000000 --- a/debian/control +++ /dev/null @@ -1,21 +0,0 @@ -Source: s3-genindex -Section: utils -Priority: optional -Maintainer: Pim van Pelt -Build-Depends: debhelper (>= 10), golang-go -Standards-Version: 4.1.2 -Homepage: https://git.ipng.ch/ipng/s3-genindex - -Package: s3-genindex -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: HTML directory index generator for local and S3 storage - Generate HTML directory indexes with file type icons and responsive design - for local directories and S3-compatible storage. This is particularly useful - for S3 buckets that are publicly readable. - . - Features include local directory indexing with recursive traversal, - S3-compatible storage support (MinIO, AWS S3, etc.), hierarchical directory - structure for S3 buckets, responsive HTML design with file type icons, - dry run mode for testing, flexible filtering with glob patterns and regex - exclusion, and hidden file control. diff --git a/debian/install b/debian/install deleted file mode 100644 index c03eb5a..0000000 --- a/debian/install +++ /dev/null @@ -1,2 +0,0 @@ -s3-genindex usr/bin -docs/s3-genindex.1 usr/share/man/man1 \ No newline at end of file diff --git a/debian/rules b/debian/rules deleted file mode 100755 index 4c54f8d..0000000 --- a/debian/rules +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/make -f - -export GO111MODULE=on -export GOPROXY=direct -export GOSUMDB=off -export GOCACHE=$(CURDIR)/debian/.gocache -export GOPATH=$(CURDIR)/debian/go - -%: - dh $@ - -override_dh_auto_build: - go build -o s3-genindex ./cmd/s3-genindex - -override_dh_auto_test: - go test ./... - -override_dh_auto_install: - mkdir -p debian/s3-genindex/usr/bin - cp s3-genindex debian/s3-genindex/usr/bin/ \ No newline at end of file diff --git a/debian/s3-genindex.control.in b/debian/s3-genindex.control.in new file mode 100644 index 0000000..2847a1b --- /dev/null +++ b/debian/s3-genindex.control.in @@ -0,0 +1,17 @@ +Package: s3-genindex +Version: @VERSION@ +Architecture: @ARCH@ +Maintainer: Pim van Pelt +Section: utils +Priority: optional +Homepage: https://git.ipng.ch/ipng/s3-genindex +Description: HTML directory index generator for local and S3 storage + Generate HTML directory indexes with file type icons and responsive + design for local directories and S3-compatible storage. Particularly + useful for S3 buckets that are publicly readable. + . + Features include local directory indexing with recursive traversal, + S3-compatible storage support (MinIO, AWS S3, etc.), hierarchical + directory structure for S3 buckets, responsive HTML design with file + type icons, dry run mode for testing, flexible filtering with glob + patterns and regex exclusion, and hidden file control.