Skip to content

Commit 852d989

Browse files
committed
Support legacy package format in conan upload parser
Add support for the legacy package format so that `name/version@user/channel` parses into a valid path
1 parent 67cc7f5 commit 852d989

File tree

2 files changed

+95
-8
lines changed

2 files changed

+95
-8
lines changed

artifactory/commands/conan/upload.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ func (up *UploadProcessor) parseUploadedArtifactPaths(output string) []string {
130130
lines := strings.Split(output, "\n")
131131

132132
// State tracking for hierarchical parsing
133-
var currentPkg string // Current package name/version (e.g., "multideps/1.0.0")
134-
var currentRecipeRev string // Current recipe revision hash (MD5, 32 chars)
135-
var currentPkgId string // Current package ID (SHA1, 40 chars)
133+
var currentPkg *ConanPackageInfo = nil // Current package name/version (e.g., "multideps/1.0.0")
134+
var currentRecipeRev string // Current recipe revision hash (MD5, 32 chars)
135+
var currentPkgId string // Current package ID (SHA1, 40 chars)
136136
inUploadSection := false
137137

138138
for _, line := range lines {
@@ -156,7 +156,13 @@ func (up *UploadProcessor) parseUploadedArtifactPaths(output string) []string {
156156
// Match package name/version line: "multideps/1.0.0"
157157
// Must contain "/" but not be a path or special marker
158158
if up.isPackageNameLine(trimmed) {
159-
currentPkg = trimmed
159+
pkgInfo, err := ParsePackageReference(trimmed)
160+
if err != nil {
161+
// Fall back to Conan 2 defaults if parsing fails on unexpected output shape.
162+
currentPkg = &ConanPackageInfo{Name: trimmed, User: "_", Channel: "_"}
163+
} else {
164+
currentPkg = pkgInfo
165+
}
160166
currentRecipeRev = ""
161167
currentPkgId = ""
162168
continue
@@ -176,14 +182,14 @@ func (up *UploadProcessor) parseUploadedArtifactPaths(output string) []string {
176182
if currentPkgId == "" {
177183
// This is a recipe revision
178184
currentRecipeRev = rev
179-
if currentPkg != "" {
180-
path := fmt.Sprintf("_/%s/_/%s/export", currentPkg, rev)
185+
if currentPkg != nil {
186+
path := fmt.Sprintf("%s/%s/%s/%s/%s/export", currentPkg.User, currentPkg.Name, currentPkg.Version, currentPkg.Channel, rev)
181187
paths = append(paths, path)
182188
}
183189
} else if currentRecipeRev != "" {
184190
// This is a package revision
185-
if currentPkg != "" {
186-
path := fmt.Sprintf("_/%s/_/%s/package/%s/%s", currentPkg, currentRecipeRev, currentPkgId, rev)
191+
if currentPkg != nil {
192+
path := fmt.Sprintf("%s/%s/%s/%s/%s/package/%s/%s", currentPkg.User, currentPkg.Name, currentPkg.Version, currentPkg.Channel, currentRecipeRev, currentPkgId, rev)
187193
paths = append(paths, path)
188194
}
189195
currentPkgId = "" // Reset for next package

artifactory/commands/conan/upload_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,87 @@ Upload completed in 3s
114114
}
115115
}
116116

117+
func TestUploadProcessor_ParseUploadedArtifactPaths(t *testing.T) {
118+
tests := []struct {
119+
name string
120+
output string
121+
expected []string
122+
}{
123+
{
124+
name: "Conan 2.x upload summary with recipe and package revision",
125+
output: `
126+
======== Uploading to remote conan-local ========
127+
128+
-------- Upload summary --------
129+
conan-local
130+
multideps/1.0.0
131+
revisions
132+
797d134a8590a1bfa06d846768443f48 (Uploaded)
133+
packages
134+
594ed0eb2e9dfcc60607438924c35871514e6c2a
135+
revisions
136+
ca858ea14c32f931e49241df0b52bec9 (Uploaded)
137+
`,
138+
expected: []string{
139+
"_/multideps/1.0.0/_/797d134a8590a1bfa06d846768443f48/export",
140+
"_/multideps/1.0.0/_/797d134a8590a1bfa06d846768443f48/package/594ed0eb2e9dfcc60607438924c35871514e6c2a/ca858ea14c32f931e49241df0b52bec9",
141+
},
142+
},
143+
{
144+
name: "includes skipped artifacts that already exist in server",
145+
output: `
146+
-------- Upload summary --------
147+
conan-local
148+
zlib/1.2.13
149+
revisions
150+
11111111111111111111111111111111 (Skipped, already in server)
151+
packages
152+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
153+
revisions
154+
22222222222222222222222222222222 (Skipped, package is up to date)
155+
`,
156+
expected: []string{
157+
"_/zlib/1.2.13/_/11111111111111111111111111111111/export",
158+
"_/zlib/1.2.13/_/11111111111111111111111111111111/package/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/22222222222222222222222222222222",
159+
},
160+
},
161+
{
162+
name: "Conan 1.x upload summary with user and channel",
163+
output: `
164+
-------- Upload summary --------
165+
conan-local
166+
boost/1.82.0@myuser/stable
167+
revisions
168+
33333333333333333333333333333333 (Uploaded)
169+
packages
170+
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
171+
revisions
172+
44444444444444444444444444444444 (Uploaded)
173+
`,
174+
expected: []string{
175+
"myuser/boost/1.82.0/stable/33333333333333333333333333333333/export",
176+
"myuser/boost/1.82.0/stable/33333333333333333333333333333333/package/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/44444444444444444444444444444444",
177+
},
178+
},
179+
{
180+
name: "no upload section returns no paths",
181+
output: `
182+
Checking server for existing packages
183+
No changes detected
184+
`,
185+
expected: nil,
186+
},
187+
}
188+
189+
for _, tt := range tests {
190+
t.Run(tt.name, func(t *testing.T) {
191+
processor := &UploadProcessor{}
192+
result := processor.parseUploadedArtifactPaths(tt.output)
193+
assert.Equal(t, tt.expected, result)
194+
})
195+
}
196+
}
197+
117198
func TestNewUploadProcessor(t *testing.T) {
118199
workingDir := "/test/path"
119200

0 commit comments

Comments
 (0)