Merge pull request #1440 from aptly-dev/bugfix/issue-1435-fix-s3-upload-unchanged-package

Fix upload of unchanged packages in S3 on source update of published repository
This commit is contained in:
André Roth
2025-04-25 13:21:10 +02:00
committed by GitHub
23 changed files with 317 additions and 62 deletions
+27 -1
View File
@@ -93,7 +93,7 @@ jobs:
- name: "Merge Code Coverage"
run: |
go install github.com/wadey/gocovmerge@latest
go install github.com/wadey/gocovmerge@v0.0.0-20160331181800-b5bfa59ec0ad
~/go/bin/gocovmerge unit.out ${{ runner.temp }}/*.out > coverage.txt
- name: "Upload Code Coverage"
@@ -207,6 +207,23 @@ jobs:
run: |
.github/workflows/scripts/upload-artifacts.sh release ${{ matrix.suite }}
- name: "Get aptly version"
env:
FORCE_CI: ${{ steps.force_ci.outputs.FORCE_CI }}
run: |
aptlyver=$(make -s version)
echo "Aptly Version: $aptlyver"
echo "VERSION=$aptlyver" >> $GITHUB_OUTPUT
id: releaseversion
- name: "Upload CI Artifacts"
if: github.ref != 'refs/heads/master' && !startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v4
with:
name: aptly_${{ steps.releaseversion.outputs.VERSION }}_${{ matrix.suite }}_${{ matrix.arch }}
path: build/
retention-days: 7
ci-binary-build:
name: "Build"
needs: test
@@ -267,6 +284,15 @@ jobs:
path: build/aptly_${{ steps.releaseversion.outputs.VERSION }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip
compression-level: 0 # no compression
- name: "Upload CI Artifacts"
uses: actions/upload-artifact@v4
if: "!startsWith(github.event.ref, 'refs/tags')"
with:
name: aptly_${{ steps.releaseversion.outputs.VERSION }}_${{ matrix.goos }}_${{ matrix.goarch }}
path: build/aptly_${{ steps.releaseversion.outputs.VERSION }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip
compression-level: 0 # no compression
retention-days: 7
gh-release:
name: "Github Release"
runs-on: ubuntu-latest
+1 -1
View File
@@ -44,7 +44,7 @@ jobs:
# Require: The version of golangci-lint to use.
# When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version.
# When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit.
version: v1.54.1
version: v1.64.5
# Optional: working directory, useful for monorepos
# working-directory: somedir
+10 -6
View File
@@ -2,13 +2,15 @@ GOPATH=$(shell go env GOPATH)
VERSION=$(shell make -s version)
PYTHON?=python3
BINPATH?=$(GOPATH)/bin
GOLANGCI_LINT_VERSION=v1.54.1 # version supporting go 1.19
GOLANGCI_LINT_VERSION=v1.64.5 # version supporting go 1.23
COVERAGE_DIR?=$(shell mktemp -d)
GOOS=$(shell go env GOHOSTOS)
GOARCH=$(shell go env GOHOSTARCH)
# Uncomment to update system test gold files
# CAPTURE := "--capture"
# export CAPUTRE=1 for regenrating test gold files
ifeq ($(CAPTURE),1)
CAPTURE_ARG := --capture
endif
help: ## Print this help
@grep -E '^[a-zA-Z][a-zA-Z0-9_-]*:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
@@ -50,7 +52,7 @@ swagger-install:
echo "// @version $(VERSION)" >> docs/swagger.conf
azurite-start:
azurite -l /tmp/aptly-azurite & \
azurite -l /tmp/aptly-azurite > ~/.azurite.log 2>&1 & \
echo $$! > ~/.azurite.pid
azurite-stop:
@@ -71,7 +73,7 @@ lint: prepare
# Install golangci-lint
@test -f $(BINPATH)/golangci-lint || go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION)
# Running lint
@PATH=$(BINPATH)/:$(PATH) golangci-lint run
@PATH=$(BINPATH)/:$(PATH) golangci-lint run --max-issues-per-linter 0 --max-same-issues 0
build: prepare swagger ## Build aptly
@@ -102,7 +104,7 @@ system-test: prepare swagger etcd-install ## Run system tests
if [ ! -e ~/aptly-fixture-pool ]; then git clone https://github.com/aptly-dev/aptly-fixture-pool.git ~/aptly-fixture-pool/; fi
test -f ~/etcd.db || (curl -o ~/etcd.db.xz http://repo.aptly.info/system-tests/etcd.db.xz && xz -d ~/etcd.db.xz)
# Run system tests
PATH=$(BINPATH)/:$(PATH) && FORCE_COLOR=1 $(PYTHON) system/run.py --long --coverage-dir $(COVERAGE_DIR) $(CAPTURE) $(TEST)
PATH=$(BINPATH)/:$(PATH) && FORCE_COLOR=1 $(PYTHON) system/run.py --long --coverage-dir $(COVERAGE_DIR) $(CAPTURE_ARG) $(TEST)
bench:
@echo "\e[33m\e[1mRunning benchmark ...\e[0m"
@@ -186,6 +188,8 @@ docker-system-test: ## Run system tests in docker container (add TEST=t04_mirro
AZURE_STORAGE_ENDPOINT=http://127.0.0.1:10000/devstoreaccount1 \
AZURE_STORAGE_ACCOUNT=devstoreaccount1 \
AZURE_STORAGE_ACCESS_KEY="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" \
AWS_ACCESS_KEY_ID=$(AWS_ACCESS_KEY_ID) \
AWS_SECRET_ACCESS_KEY=$(AWS_SECRET_ACCESS_KEY) \
system-test TEST=$(TEST) \
azurite-stop
+5 -5
View File
@@ -625,7 +625,7 @@ func apiPublishAddSource(c *gin.Context) {
resources := []string{string(published.Key())}
taskName := fmt.Sprintf("Update published %s repository %s/%s", published.SourceKind, published.StoragePrefix(), published.Distribution)
maybeRunTaskInBackground(c, taskName, resources, func(out aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
maybeRunTaskInBackground(c, taskName, resources, func(_ aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
err = collection.Update(published)
if err != nil {
return &task.ProcessReturnValue{Code: http.StatusInternalServerError, Value: nil}, fmt.Errorf("unable to save to DB: %s", err)
@@ -739,7 +739,7 @@ func apiPublishSetSources(c *gin.Context) {
resources := []string{string(published.Key())}
taskName := fmt.Sprintf("Update published %s repository %s/%s", published.SourceKind, published.StoragePrefix(), published.Distribution)
maybeRunTaskInBackground(c, taskName, resources, func(out aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
maybeRunTaskInBackground(c, taskName, resources, func(_ aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
err = collection.Update(published)
if err != nil {
return &task.ProcessReturnValue{Code: http.StatusInternalServerError, Value: nil}, fmt.Errorf("unable to save to DB: %s", err)
@@ -789,7 +789,7 @@ func apiPublishDropChanges(c *gin.Context) {
resources := []string{string(published.Key())}
taskName := fmt.Sprintf("Update published %s repository %s/%s", published.SourceKind, published.StoragePrefix(), published.Distribution)
maybeRunTaskInBackground(c, taskName, resources, func(out aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
maybeRunTaskInBackground(c, taskName, resources, func(_ aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
err = collection.Update(published)
if err != nil {
return &task.ProcessReturnValue{Code: http.StatusInternalServerError, Value: nil}, fmt.Errorf("unable to save to DB: %s", err)
@@ -869,7 +869,7 @@ func apiPublishUpdateSource(c *gin.Context) {
resources := []string{string(published.Key())}
taskName := fmt.Sprintf("Update published %s repository %s/%s", published.SourceKind, published.StoragePrefix(), published.Distribution)
maybeRunTaskInBackground(c, taskName, resources, func(out aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
maybeRunTaskInBackground(c, taskName, resources, func(_ aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
err = collection.Update(published)
if err != nil {
return &task.ProcessReturnValue{Code: http.StatusInternalServerError, Value: nil}, fmt.Errorf("unable to save to DB: %s", err)
@@ -932,7 +932,7 @@ func apiPublishRemoveSource(c *gin.Context) {
resources := []string{string(published.Key())}
taskName := fmt.Sprintf("Update published %s repository %s/%s", published.SourceKind, published.StoragePrefix(), published.Distribution)
maybeRunTaskInBackground(c, taskName, resources, func(out aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
maybeRunTaskInBackground(c, taskName, resources, func(_ aptly.Progress, _ *task.Detail) (*task.ProcessReturnValue, error) {
err = collection.Update(published)
if err != nil {
return &task.ProcessReturnValue{Code: http.StatusInternalServerError, Value: nil}, fmt.Errorf("unable to save to DB: %s", err)
-5
View File
@@ -2,7 +2,6 @@ package api
import (
"net/http"
"os"
"sync/atomic"
"github.com/aptly-dev/aptly/aptly"
@@ -56,13 +55,9 @@ func Router(c *ctx.AptlyContext) http.Handler {
router.UseRawPath = true
if c.Config().LogFormat == "json" {
c.StructuredLogging(true)
utils.SetupJSONLogger(c.Config().LogLevel, os.Stdout)
gin.DefaultWriter = utils.LogWriter{Logger: log.Logger}
router.Use(JSONLogger())
} else {
c.StructuredLogging(false)
utils.SetupDefaultLogger(c.Config().LogLevel)
router.Use(gin.Logger())
}
+3 -2
View File
@@ -6,6 +6,7 @@ import (
"strings"
"github.com/aptly-dev/aptly/aptly"
"github.com/aptly-dev/aptly/utils"
"github.com/cheggaaa/pb"
"github.com/rs/zerolog/log"
"github.com/wsxiaoys/terminal/color"
@@ -78,7 +79,7 @@ func (p *Progress) InitBar(count int64, isBytes bool, _ aptly.BarType) {
if p.bar != nil {
panic("bar already initialized")
}
if RunningOnTerminal() {
if utils.RunningOnTerminal() {
p.bar = pb.New(0)
p.bar.Total = count
p.bar.NotPrint = true
@@ -141,7 +142,7 @@ func (p *Progress) PrintfStdErr(msg string, a ...interface{}) {
// ColoredPrintf does printf in colored way + newline
func (p *Progress) ColoredPrintf(msg string, a ...interface{}) {
if RunningOnTerminal() {
if utils.RunningOnTerminal() {
p.queue <- printTask{code: codePrint, message: color.Sprintf(msg, a...) + "\n"}
} else {
// stip color marks
-12
View File
@@ -1,12 +0,0 @@
package console
import (
"syscall"
"golang.org/x/term"
)
// RunningOnTerminal checks whether stdout is terminal
func RunningOnTerminal() bool {
return term.IsTerminal(syscall.Stdout)
}
+8
View File
@@ -123,6 +123,14 @@ func (context *AptlyContext) config() *utils.ConfigStructure {
}
}
if utils.Config.LogFormat == "json" {
context.StructuredLogging(true)
utils.SetupJSONLogger(utils.Config.LogLevel, os.Stdout)
} else {
context.StructuredLogging(false)
utils.SetupDefaultLogger(utils.Config.LogLevel)
}
context.configLoaded = true
}
+8 -8
View File
@@ -1,6 +1,6 @@
module github.com/aptly-dev/aptly
go 1.22.7
go 1.23
require (
github.com/AlekSi/pointer v1.1.0
@@ -32,9 +32,9 @@ require (
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
github.com/ugorji/go/codec v1.2.11
github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/sys v0.28.0
golang.org/x/term v0.27.0
golang.org/x/crypto v0.33.0 // indirect
golang.org/x/sys v0.30.0
golang.org/x/term v0.29.0
golang.org/x/time v0.5.0
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
@@ -103,10 +103,10 @@ require (
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
golang.org/x/net v0.35.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/tools v0.30.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect
google.golang.org/grpc v1.64.1 // indirect
+15
View File
@@ -324,12 +324,15 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -348,6 +351,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -357,6 +362,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -385,6 +392,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
@@ -392,6 +401,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -401,6 +412,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -412,6 +425,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+9 -3
View File
@@ -172,6 +172,7 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err
}
defer source.Close()
log.Debug().Msgf("S3: PutFile '%s'", path)
err = storage.putFile(path, source, "")
if err != nil {
err = errors.Wrap(err, fmt.Sprintf("error uploading %s to %s", sourceFilename, storage))
@@ -196,7 +197,6 @@ func (storage *PublishedStorage) getMD5(path string) (string, error) {
// putFile uploads file-like object to
func (storage *PublishedStorage) putFile(path string, source io.ReadSeeker, sourceMD5 string) error {
params := &s3.PutObjectInput{
Bucket: aws.String(storage.bucket),
Key: aws.String(filepath.Join(storage.prefix, path)),
@@ -238,6 +238,7 @@ func (storage *PublishedStorage) Remove(path string) error {
Key: aws.String(filepath.Join(storage.prefix, path)),
}
log.Debug().Msgf("S3: Remove '%s'", path)
if _, err := storage.s3.DeleteObject(context.TODO(), params); err != nil {
var notFoundErr *smithy.GenericAPIError
if errors.As(err, &notFoundErr) && notFoundErr.Code == "NoSuchBucket" {
@@ -270,6 +271,7 @@ func (storage *PublishedStorage) RemoveDirs(path string, _ aptly.Progress) error
return err
}
log.Debug().Msgf("S3: RemoveDirs '%s'", path)
if storage.disableMultiDel {
for i := range filelist {
params := &s3.DeleteObjectInput{
@@ -338,7 +340,7 @@ func (storage *PublishedStorage) LinkFromPool(publishedPrefix, publishedRelPath,
poolPath := filepath.Join(storage.prefix, relPath)
if storage.pathCache == nil {
paths, md5s, err := storage.internalFilelist(filepath.Join(storage.prefix, publishedPrefix, "pool"), true)
paths, md5s, err := storage.internalFilelist(filepath.Join(publishedPrefix, "pool"), true)
if err != nil {
return errors.Wrap(err, "error caching paths under prefix")
}
@@ -346,7 +348,7 @@ func (storage *PublishedStorage) LinkFromPool(publishedPrefix, publishedRelPath,
storage.pathCache = make(map[string]string, len(paths))
for i := range paths {
storage.pathCache[paths[i]] = md5s[i]
storage.pathCache[filepath.Join("pool", paths[i])] = md5s[i]
}
}
@@ -385,6 +387,7 @@ func (storage *PublishedStorage) LinkFromPool(publishedPrefix, publishedRelPath,
}
defer source.Close()
log.Debug().Msgf("S3: LinkFromPool '%s'", relPath)
err = storage.putFile(relPath, source, sourceMD5)
if err == nil {
storage.pathCache[relPath] = sourceMD5
@@ -465,6 +468,7 @@ func (storage *PublishedStorage) RenameFile(oldName, newName string) error {
params.ServerSideEncryption = storage.encryptionMethod
}
log.Debug().Msgf("S3: RenameFile %s -> %s", oldName, newName)
_, err := storage.s3.CopyObject(context.TODO(), params)
if err != nil {
return fmt.Errorf("error copying %s -> %s in %s: %s", oldName, newName, storage, err)
@@ -494,6 +498,7 @@ func (storage *PublishedStorage) SymLink(src string, dst string) error {
params.ServerSideEncryption = types.ServerSideEncryption(storage.encryptionMethod)
}
log.Debug().Msgf("S3: SymLink %s -> %s", src, dst)
_, err := storage.s3.CopyObject(context.TODO(), params)
if err != nil {
return fmt.Errorf("error symlinking %s -> %s in %s: %s", src, dst, storage, err)
@@ -504,6 +509,7 @@ func (storage *PublishedStorage) SymLink(src string, dst string) error {
// HardLink using symlink functionality as hard links do not exist
func (storage *PublishedStorage) HardLink(src string, dst string) error {
log.Debug().Msgf("S3: HardLink %s -> %s", src, dst)
return storage.SymLink(src, dst)
}
+1 -1
View File
@@ -370,7 +370,7 @@ func (s *PublishedStorageSuite) TestLinkFromPoolCache(c *C) {
// Check only one listing request was done to the server
s.checkGetRequestsEqual(c, "/test?", []string{
"/test?list-type=2&max-keys=1000&prefix=lala%2Flala%2Fpool%2F",
"/test?list-type=2&max-keys=1000&prefix=lala%2Fpool%2F",
})
// Publish two packages at a prefixed storage plus a publish prefix.
+16 -13
View File
@@ -289,8 +289,6 @@ class BaseTest(object):
def run(self):
output = self.run_cmd(self.runCmd, self.expectedCode)
if self.sortOutput:
output = self.sort_lines(output)
self.output = self.output_processor(output)
def _start_process(self, command, stderr=subprocess.STDOUT, stdout=None):
@@ -493,24 +491,29 @@ class BaseTest(object):
return a.decode('utf-8')
return a
def verify_match(self, a, b, match_prepare=None, ensure_utf8=True):
def verify_match(self, gold, orig, match_prepare=None, ensure_utf8=True):
output = orig
if ensure_utf8:
a = self.ensure_utf8(a)
b = self.ensure_utf8(b)
gold = self.ensure_utf8(gold)
output = self.ensure_utf8(output)
if match_prepare is not None:
a = match_prepare(a)
b = match_prepare(b)
gold = match_prepare(gold)
output = match_prepare(output)
# sort if requested
if self.sortOutput:
gold = self.sort_lines(gold)
output = self.sort_lines(output)
# strip trailing whitespace and newlines
a = a.strip()
b = b.strip()
gold = gold.strip()
output = output.strip()
if a != b:
if gold != output:
diff = "".join(difflib.unified_diff(
[l + "\n" for l in a.split("\n")], [l + "\n" for l in b.split("\n")]))
raise Exception("content doesn't match:\n" + diff + "\n")
[l + "\n" for l in gold.split("\n")], [l + "\n" for l in output.split("\n")]))
raise Exception("content doesn't match:\n" + diff + "\n\nOutput:\n" + orig + "\n")
check = check_output
@@ -12,3 +12,4 @@ Now you can add following line to apt sources:
Don't forget to add your GPG key to apt with apt-key.
You can also use `aptly serve` to publish your repositories over HTTP quickly.
+18
View File
@@ -1,8 +1,26 @@
Loading packages...
Generating metadata files and linking package files...
DBG S3: LinkFromPool 'pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb'
DBG S3: LinkFromPool 'pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc'
DBG S3: LinkFromPool 'pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz'
DBG S3: LinkFromPool 'pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz'
DBG S3: LinkFromPool 'pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc'
Finalizing metadata files...
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.bz2'
DBG S3: PutFile 'dists/maverick/main/source/Sources'
DBG S3: PutFile 'dists/maverick/main/source/Sources.gz'
DBG S3: PutFile 'dists/maverick/main/source/Sources.bz2'
DBG S3: PutFile 'dists/maverick/main/Contents-i386.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Release'
DBG S3: PutFile 'dists/maverick/main/source/Release'
DBG S3: PutFile 'dists/maverick/Contents-i386.gz'
DBG S3: PutFile 'dists/maverick/Release'
Signing file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/Release.gpg'
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/InRelease'
Local repo local-repo has been successfully published.
Now you can add following line to apt sources:
+43
View File
@@ -1,9 +1,52 @@
Loading packages...
Generating metadata files and linking package files...
Finalizing metadata files...
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp.bz2'
DBG S3: PutFile 'dists/maverick/main/source/Sources.tmp'
DBG S3: PutFile 'dists/maverick/main/source/Sources.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/source/Sources.tmp.bz2'
DBG S3: PutFile 'dists/maverick/main/Contents-i386.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Release.tmp'
DBG S3: PutFile 'dists/maverick/main/source/Release.tmp'
DBG S3: PutFile 'dists/maverick/Contents-i386.tmp.gz'
DBG S3: PutFile 'dists/maverick/Release.tmp'
Signing file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/Release.tmp.gpg'
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/InRelease.tmp'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp -> dists/maverick/main/binary-i386/Packages
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp.gz -> dists/maverick/main/binary-i386/Packages.gz
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp.gz'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp.bz2 -> dists/maverick/main/binary-i386/Packages.bz2
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp.bz2'
DBG S3: RenameFile dists/maverick/main/Contents-i386.tmp.gz -> dists/maverick/main/Contents-i386.gz
DBG S3: Remove 'dists/maverick/main/Contents-i386.tmp.gz'
DBG S3: RenameFile dists/maverick/main/binary-i386/Release.tmp -> dists/maverick/main/binary-i386/Release
DBG S3: Remove 'dists/maverick/main/binary-i386/Release.tmp'
DBG S3: RenameFile dists/maverick/InRelease.tmp -> dists/maverick/InRelease
DBG S3: Remove 'dists/maverick/InRelease.tmp'
DBG S3: RenameFile dists/maverick/main/source/Sources.tmp -> dists/maverick/main/source/Sources
DBG S3: Remove 'dists/maverick/main/source/Sources.tmp'
DBG S3: RenameFile dists/maverick/main/source/Sources.tmp.gz -> dists/maverick/main/source/Sources.gz
DBG S3: Remove 'dists/maverick/main/source/Sources.tmp.gz'
DBG S3: RenameFile dists/maverick/main/source/Sources.tmp.bz2 -> dists/maverick/main/source/Sources.bz2
DBG S3: Remove 'dists/maverick/main/source/Sources.tmp.bz2'
DBG S3: RenameFile dists/maverick/main/source/Release.tmp -> dists/maverick/main/source/Release
DBG S3: Remove 'dists/maverick/main/source/Release.tmp'
DBG S3: RenameFile dists/maverick/Contents-i386.tmp.gz -> dists/maverick/Contents-i386.gz
DBG S3: Remove 'dists/maverick/Contents-i386.tmp.gz'
DBG S3: RenameFile dists/maverick/Release.tmp -> dists/maverick/Release
DBG S3: Remove 'dists/maverick/Release.tmp'
DBG S3: RenameFile dists/maverick/Release.tmp.gpg -> dists/maverick/Release.gpg
DBG S3: Remove 'dists/maverick/Release.tmp.gpg'
Cleaning up published repository s3:test1:./maverick...
Cleaning up component 'main'...
DBG S3: Remove 'pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz'
Published local repository s3:test1:./maverick [i386, source] publishes {main: [local-repo]} has been updated successfully.
+49
View File
@@ -1,9 +1,58 @@
Loading packages...
Generating metadata files and linking package files...
Finalizing metadata files...
DBG S3: PutFile 'dists/maverick/main/binary-i386/Release.tmp'
DBG S3: PutFile 'dists/maverick/Contents-amd64.tmp.gz'
DBG S3: PutFile 'dists/maverick/Contents-i386.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-amd64/Packages.tmp'
DBG S3: PutFile 'dists/maverick/main/binary-amd64/Packages.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-amd64/Packages.tmp.bz2'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp.bz2'
DBG S3: PutFile 'dists/maverick/main/Contents-amd64.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/Contents-i386.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-amd64/Release.tmp'
DBG S3: PutFile 'dists/maverick/Release.tmp'
Signing file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/Release.tmp.gpg'
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/InRelease.tmp'
DBG S3: RenameFile dists/maverick/main/Contents-amd64.tmp.gz -> dists/maverick/main/Contents-amd64.gz
DBG S3: Remove 'dists/maverick/main/Contents-amd64.tmp.gz'
DBG S3: RenameFile dists/maverick/main/binary-i386/Release.tmp -> dists/maverick/main/binary-i386/Release
DBG S3: Remove 'dists/maverick/main/binary-i386/Release.tmp'
DBG S3: RenameFile dists/maverick/main/Contents-i386.tmp.gz -> dists/maverick/main/Contents-i386.gz
DBG S3: Remove 'dists/maverick/main/Contents-i386.tmp.gz'
DBG S3: RenameFile dists/maverick/main/binary-amd64/Release.tmp -> dists/maverick/main/binary-amd64/Release
DBG S3: Remove 'dists/maverick/main/binary-amd64/Release.tmp'
DBG S3: RenameFile dists/maverick/Release.tmp -> dists/maverick/Release
DBG S3: Remove 'dists/maverick/Release.tmp'
DBG S3: RenameFile dists/maverick/InRelease.tmp -> dists/maverick/InRelease
DBG S3: Remove 'dists/maverick/InRelease.tmp'
DBG S3: RenameFile dists/maverick/main/binary-amd64/Packages.tmp -> dists/maverick/main/binary-amd64/Packages
DBG S3: Remove 'dists/maverick/main/binary-amd64/Packages.tmp'
DBG S3: RenameFile dists/maverick/main/binary-amd64/Packages.tmp.bz2 -> dists/maverick/main/binary-amd64/Packages.bz2
DBG S3: Remove 'dists/maverick/main/binary-amd64/Packages.tmp.bz2'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp.bz2 -> dists/maverick/main/binary-i386/Packages.bz2
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp.bz2'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp -> dists/maverick/main/binary-i386/Packages
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp.gz -> dists/maverick/main/binary-i386/Packages.gz
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp.gz'
DBG S3: RenameFile dists/maverick/Release.tmp.gpg -> dists/maverick/Release.gpg
DBG S3: Remove 'dists/maverick/Release.tmp.gpg'
DBG S3: RenameFile dists/maverick/Contents-amd64.tmp.gz -> dists/maverick/Contents-amd64.gz
DBG S3: Remove 'dists/maverick/Contents-amd64.tmp.gz'
DBG S3: RenameFile dists/maverick/Contents-i386.tmp.gz -> dists/maverick/Contents-i386.gz
DBG S3: Remove 'dists/maverick/Contents-i386.tmp.gz'
DBG S3: RenameFile dists/maverick/main/binary-amd64/Packages.tmp.gz -> dists/maverick/main/binary-amd64/Packages.gz
DBG S3: Remove 'dists/maverick/main/binary-amd64/Packages.tmp.gz'
Cleaning up published repository s3:test1:./maverick...
Cleaning up component 'main'...
DBG S3: Remove 'pool/main/g/gnuplot/gnuplot-doc_4.6.1-1~maverick2_all.deb'
DBG S3: Remove 'pool/main/g/gnuplot/gnuplot-nox_4.6.1-1~maverick2_amd64.deb'
DBG S3: Remove 'pool/main/g/gnuplot/gnuplot-nox_4.6.1-1~maverick2_i386.deb'
DBG S3: Remove 'pool/main/g/gnuplot/gnuplot_4.6.1-1~maverick2_all.deb'
Published snapshot repository s3:test1:./maverick (origin: LP-PPA-gladky-anton-gnuplot) [amd64, i386] publishes {main: [snap3]: Pulled into 'snap2' with 'snap1' as source, pull request was: 'gnuplot-x11'} has been successfully switched to new source.
+6
View File
@@ -1,4 +1,10 @@
DBG S3: RemoveDirs 'dists/sq2'
Cleaning up published repository s3:test1:./sq2...
Cleaning up component 'main'...
DBG S3: Remove 'pool/main/b/boost-defaults/libboost-program-options-dev_1.62.0.1_i386.deb'
DBG S3: Remove 'pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz'
Published repository has been removed successfully.
+43
View File
@@ -1,9 +1,52 @@
Loading packages...
Generating metadata files and linking package files...
Finalizing metadata files...
DBG S3: PutFile 'dists/maverick/main/Contents-i386.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Release.tmp'
DBG S3: PutFile 'dists/maverick/main/source/Release.tmp'
DBG S3: PutFile 'dists/maverick/Contents-i386.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/binary-i386/Packages.tmp.bz2'
DBG S3: PutFile 'dists/maverick/main/source/Sources.tmp'
DBG S3: PutFile 'dists/maverick/main/source/Sources.tmp.gz'
DBG S3: PutFile 'dists/maverick/main/source/Sources.tmp.bz2'
DBG S3: PutFile 'dists/maverick/Release.tmp'
Signing file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/Release.tmp.gpg'
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
DBG S3: PutFile 'dists/maverick/InRelease.tmp'
DBG S3: RenameFile dists/maverick/InRelease.tmp -> dists/maverick/InRelease
DBG S3: Remove 'dists/maverick/InRelease.tmp'
DBG S3: RenameFile dists/maverick/main/source/Release.tmp -> dists/maverick/main/source/Release
DBG S3: Remove 'dists/maverick/main/source/Release.tmp'
DBG S3: RenameFile dists/maverick/Contents-i386.tmp.gz -> dists/maverick/Contents-i386.gz
DBG S3: Remove 'dists/maverick/Contents-i386.tmp.gz'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp -> dists/maverick/main/binary-i386/Packages
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp.bz2 -> dists/maverick/main/binary-i386/Packages.bz2
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp.bz2'
DBG S3: RenameFile dists/maverick/Release.tmp -> dists/maverick/Release
DBG S3: Remove 'dists/maverick/Release.tmp'
DBG S3: RenameFile dists/maverick/main/source/Sources.tmp.bz2 -> dists/maverick/main/source/Sources.bz2
DBG S3: Remove 'dists/maverick/main/source/Sources.tmp.bz2'
DBG S3: RenameFile dists/maverick/Release.tmp.gpg -> dists/maverick/Release.gpg
DBG S3: Remove 'dists/maverick/Release.tmp.gpg'
DBG S3: RenameFile dists/maverick/main/Contents-i386.tmp.gz -> dists/maverick/main/Contents-i386.gz
DBG S3: Remove 'dists/maverick/main/Contents-i386.tmp.gz'
DBG S3: RenameFile dists/maverick/main/binary-i386/Release.tmp -> dists/maverick/main/binary-i386/Release
DBG S3: Remove 'dists/maverick/main/binary-i386/Release.tmp'
DBG S3: RenameFile dists/maverick/main/binary-i386/Packages.tmp.gz -> dists/maverick/main/binary-i386/Packages.gz
DBG S3: Remove 'dists/maverick/main/binary-i386/Packages.tmp.gz'
DBG S3: RenameFile dists/maverick/main/source/Sources.tmp -> dists/maverick/main/source/Sources
DBG S3: Remove 'dists/maverick/main/source/Sources.tmp'
DBG S3: RenameFile dists/maverick/main/source/Sources.tmp.gz -> dists/maverick/main/source/Sources.gz
DBG S3: Remove 'dists/maverick/main/source/Sources.tmp.gz'
Cleaning up published repository s3:test1:./maverick...
Cleaning up component 'main'...
DBG S3: Remove 'pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc'
DBG S3: Remove 'pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz'
Published local repository s3:test1:./maverick [i386, source] publishes {main: [local-repo]} has been updated successfully.
+6
View File
@@ -14,6 +14,7 @@ class S3Publish1Test(S3Test):
"aptly repo add local-repo ${files}",
"aptly repo remove local-repo libboost-program-options-dev_1.62.0.1_i386",
]
sortOutput = True
runCmd = "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:"
def check(self):
@@ -53,6 +54,7 @@ class S3Publish2Test(S3Test):
"aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:",
"aptly repo remove local-repo pyspi"
]
sortOutput = True
runCmd = "aptly publish update -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec maverick s3:test1:"
def check(self):
@@ -93,6 +95,7 @@ class S3Publish3Test(S3Test):
"aptly snapshot pull -no-deps -architectures=i386,amd64 snap2 snap1 snap3 gnuplot-x11",
"aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=maverick snap1 s3:test1:",
]
sortOutput = True
runCmd = "aptly publish switch -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec maverick s3:test1: snap3"
def check(self):
@@ -129,6 +132,7 @@ class S3Publish4Test(S3Test):
"aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=xyz local-repo s3:test1:",
"aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:prefix",
]
sortOutput = True
runCmd = "aptly publish list"
@@ -144,6 +148,7 @@ class S3Publish5Test(S3Test):
"aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=sq1 local1 s3:test1:",
"aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=sq2 local2 s3:test1:",
]
sortOutput = True
runCmd = "aptly publish drop sq2 s3:test1:"
def check(self):
@@ -172,6 +177,7 @@ class S3Publish6Test(S3Test):
"aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:",
"aptly repo remove local-repo pyspi"
]
sortOutput = True
runCmd = "aptly publish update -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec maverick s3:test1:"
def check(self):
+35
View File
@@ -22,6 +22,7 @@ class PublishSnapshot1Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap1 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec snap1"
gold_processor = BaseTest.expand_environ
@@ -131,6 +132,7 @@ class PublishSnapshot2Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap2 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=squeeze snap2"
gold_processor = BaseTest.expand_environ
@@ -168,6 +170,7 @@ class PublishSnapshot3Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap3 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=squeeze -component=contrib snap3"
gold_processor = BaseTest.expand_environ
@@ -208,6 +211,7 @@ class PublishSnapshot4Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap4 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly -architectures=i386 publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=squeeze snap4"
gold_processor = BaseTest.expand_environ
@@ -247,6 +251,7 @@ class PublishSnapshot5Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap5 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -acquire-by-hash -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=squeeze snap5 ppa/smira"
gold_processor = BaseTest.expand_environ
@@ -294,6 +299,7 @@ class PublishSnapshot6Test(BaseTest):
"aptly snapshot create snap2 from mirror wheezy-main",
"aptly snapshot merge snap6 snap2 snap"
]
sortOutput = True
runCmd = "aptly publish snapshot snap6"
expectedCode = 1
@@ -308,6 +314,7 @@ class PublishSnapshot7Test(BaseTest):
"aptly snapshot create snap7 from mirror gnuplot-maverick",
"aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec snap7",
]
sortOutput = True
runCmd = "aptly publish snapshot snap7"
expectedCode = 1
@@ -322,6 +329,7 @@ class PublishSnapshot8Test(BaseTest):
"aptly snapshot create snap8 from mirror gnuplot-maverick",
"aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec snap8 ./ppa",
]
sortOutput = True
runCmd = "aptly publish snapshot snap8 ppa"
expectedCode = 1
@@ -334,6 +342,7 @@ class PublishSnapshot9Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap9 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot snap9 ppa/dists/la"
expectedCode = 1
@@ -346,6 +355,7 @@ class PublishSnapshot10Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap10 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot snap10 ppa/pool/la"
expectedCode = 1
@@ -358,6 +368,7 @@ class PublishSnapshot11Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap11 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot snap11 ../la"
expectedCode = 1
@@ -367,6 +378,7 @@ class PublishSnapshot12Test(BaseTest):
publish snapshot: no snapshot
"""
fixtureDB = True
sortOutput = True
runCmd = "aptly publish snapshot snap12"
expectedCode = 1
@@ -465,6 +477,7 @@ class PublishSnapshot16Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap16 from mirror gnuplot-maverick-src",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec snap16"
gold_processor = BaseTest.expand_environ
@@ -524,6 +537,7 @@ class PublishSnapshot17Test(BaseTest):
"aptly repo add local-repo ${files}",
"aptly snapshot create snap17 from repo local-repo",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=maverick snap17"
gold_processor = BaseTest.expand_environ
@@ -578,6 +592,7 @@ class PublishSnapshot18Test(BaseTest):
"aptly repo add repo1 ${files}",
"aptly snapshot create snap1 from repo repo1",
]
sortOutput = True
runCmd = "aptly publish snapshot snap1"
expectedCode = 1
@@ -682,6 +697,7 @@ class PublishSnapshot24Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap24 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=squeeze -origin=aptly24 -notautomatic=yes -butautomaticupgrades=yes snap24"
gold_processor = BaseTest.expand_environ
@@ -701,6 +717,7 @@ class PublishSnapshot25Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap25 empty",
]
sortOutput = True
runCmd = "aptly publish snapshot -architectures=amd64 --distribution=maverick -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec snap25"
gold_processor = BaseTest.expand_environ
@@ -736,6 +753,7 @@ class PublishSnapshot26Test(BaseTest):
"aptly repo add local-repo ${files}",
"aptly snapshot create snap26.2 from repo local-repo",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -component=main,contrib snap26.1 snap26.2"
gold_processor = BaseTest.expand_environ
@@ -864,6 +882,7 @@ class PublishSnapshot27Test(BaseTest):
"aptly repo add local-repo ${files}",
"aptly snapshot create snap27.2 from repo local-repo",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -component=, snap27.1 snap27.2"
gold_processor = BaseTest.expand_environ
@@ -879,6 +898,7 @@ class PublishSnapshot28Test(BaseTest):
"aptly repo add local-repo ${files}",
"aptly snapshot create snap28.2 from repo local-repo",
]
sortOutput = True
runCmd = "aptly publish snapshot -component=, snap28.1 snap28.2"
expectedCode = 1
@@ -891,6 +911,7 @@ class PublishSnapshot29Test(BaseTest):
"aptly snapshot create snap29.1 empty",
"aptly snapshot create snap29.2 empty",
]
sortOutput = True
runCmd = "aptly publish snapshot -component=b,b snap29.1 snap29.2"
expectedCode = 1
@@ -906,6 +927,7 @@ class PublishSnapshot30Test(BaseTest):
"aptly repo add local-repo ${files}",
"aptly snapshot create snap30.2 from repo local-repo",
]
sortOutput = True
runCmd = "aptly publish snapshot -component=main,contrib snap30.1 snap30.2"
expectedCode = 1
@@ -917,6 +939,7 @@ class PublishSnapshot31Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap31.1 empty",
]
sortOutput = True
runCmd = "aptly publish snapshot -component=main,contrib snap31.1 snap31.2"
expectedCode = 1
@@ -928,6 +951,7 @@ class PublishSnapshot32Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap32.1 empty",
]
sortOutput = True
runCmd = "aptly publish snapshot -component=main,contrib snap32.1"
expectedCode = 2
@@ -948,6 +972,7 @@ class PublishSnapshot33Test(BaseTest):
"aptly snapshot create snap2 from repo local-repo2",
"aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=maverick snap1",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=squeeze snap2"
expectedCode = 1
gold_processor = BaseTest.expand_environ
@@ -966,6 +991,7 @@ class PublishSnapshot34Test(BaseTest):
"aptly snapshot create snap2 from repo local-repo2",
"aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=maverick snap1",
]
sortOutput = True
runCmd = "aptly publish snapshot -force-overwrite -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=squeeze snap2"
gold_processor = BaseTest.expand_environ
@@ -987,6 +1013,7 @@ class PublishSnapshot35Test(BaseTest):
"aptly mirror update -keyring=aptlytest.gpg stretch",
"aptly snapshot create stretch from mirror stretch",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec stretch"
gold_processor = BaseTest.expand_environ
@@ -1118,6 +1145,7 @@ class PublishSnapshot36Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap36 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -skip-contents snap36"
gold_processor = BaseTest.expand_environ
@@ -1145,6 +1173,7 @@ class PublishSnapshot37Test(BaseTest):
"aptly mirror update -keyring=aptlytest.gpg stretch",
"aptly snapshot create stretch from mirror stretch",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec stretch"
gold_processor = BaseTest.expand_environ
@@ -1160,8 +1189,10 @@ class PublishSnapshot38Test(BaseTest):
"aptly mirror update -keyring=aptlytest.gpg stretch",
"aptly snapshot create stretch from mirror stretch",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec stretch"
gold_processor = BaseTest.expand_environ
sortOutput = True
def check(self):
super(PublishSnapshot38Test, self).check()
@@ -1187,6 +1218,7 @@ class PublishSnapshot39Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap1 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -suite=stable snap1"
gold_processor = BaseTest.expand_environ
@@ -1222,6 +1254,7 @@ class PublishSnapshot40Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap40 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -skip-bz2 snap40"
gold_processor = BaseTest.expand_environ
@@ -1254,6 +1287,7 @@ class PublishSnapshot41Test(BaseTest):
"aptly mirror update -keyring=aptlytest.gpg ps41",
"aptly snapshot create snap41 from mirror ps41",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec snap41"
gold_processor = BaseTest.expand_environ
@@ -1375,6 +1409,7 @@ class PublishSnapshot42Test(BaseTest):
fixtureCmds = [
"aptly snapshot create snap1 from mirror gnuplot-maverick",
]
sortOutput = True
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -multi-dist snap1"
gold_processor = BaseTest.expand_environ
+2
View File
@@ -1,6 +1,8 @@
<!doctype html>
<pre>
<a href="debian/">debian/</a>
<a href="dists/">dists/</a>
<a href="multi/">multi/</a>
<a href="pool/">pool/</a>
<meta name="viewport" content="width=device-width">
</pre>
+11 -5
View File
@@ -4,12 +4,19 @@ import (
"io"
"os"
"strings"
"syscall"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"golang.org/x/term"
)
// RunningOnTerminal checks whether stdout is terminal
func RunningOnTerminal() bool {
return term.IsTerminal(syscall.Stdout)
}
type LogWriter struct {
Logger zerolog.Logger
}
@@ -32,11 +39,10 @@ func SetupDefaultLogger(levelStr string) {
zerolog.MessageFieldName = "message"
zerolog.LevelFieldName = "level"
log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}).
Level(GetLogLevelOrDebug(levelStr)).
With().
Timestamp().
Logger()
log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr,
FormatTimestamp: func(_ interface{}) string { return "" },
NoColor: !RunningOnTerminal(),
}).Level(GetLogLevelOrDebug(levelStr))
}
func GetLogLevelOrDebug(levelStr string) zerolog.Level {