Skip to content

Commit d0cc7ed

Browse files
committed
Implement setting project attribute via project:info
1 parent d89c7cc commit d0cc7ed

File tree

4 files changed

+50
-32
lines changed

4 files changed

+50
-32
lines changed

go-tests/go.mod

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
module github.com/platformsh/legacy-cli/tests
22

3-
go 1.22.9
3+
go 1.23.0
4+
5+
toolchain go1.24.4
46

57
require (
6-
github.com/go-chi/chi/v5 v5.1.0
7-
github.com/platformsh/cli v0.0.0-20250115153051-60dcb793eb89
8-
github.com/stretchr/testify v1.9.0
9-
golang.org/x/crypto v0.31.0
8+
github.com/go-chi/chi/v5 v5.2.1
9+
github.com/platformsh/cli v0.0.0-20250703103124-87b7ab372c7b
10+
github.com/stretchr/testify v1.10.0
11+
golang.org/x/crypto v0.37.0
1012
)
1113

1214
require (
1315
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
14-
github.com/kr/pretty v0.3.1 // indirect
1516
github.com/oklog/ulid/v2 v2.1.0 // indirect
1617
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
17-
golang.org/x/sys v0.28.0 // indirect
18+
golang.org/x/sys v0.32.0 // indirect
1819
gopkg.in/yaml.v3 v3.0.1 // indirect
1920
)

go-tests/go.sum

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,23 @@
1-
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
21
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
32
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4-
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
5-
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
6-
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
7-
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
8-
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
9-
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
3+
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
4+
github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
105
github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
116
github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
127
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
13-
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
14-
github.com/platformsh/cli v0.0.0-20250115153051-60dcb793eb89 h1:+EN931RRA5tsviOEqw6HW62u6UusZJq7LJKY3EIYrE0=
15-
github.com/platformsh/cli v0.0.0-20250115153051-60dcb793eb89/go.mod h1:b1v98rkg8bScSoo5gK8Fc1qRta1FUU8wElRf+bGvV5Y=
8+
github.com/platformsh/cli v0.0.0-20250703103124-87b7ab372c7b h1:o0ykauvwRrRUKszPVLjaI2MaB9y276vlwYEaxzUfwXE=
9+
github.com/platformsh/cli v0.0.0-20250703103124-87b7ab372c7b/go.mod h1:1OFXJCFPlXT4zSc1U/U3xSNh1UmuqOm9rz+FldYe8z8=
1610
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
1711
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
18-
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
19-
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
20-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
21-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
22-
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
23-
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
24-
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
25-
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
26-
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
27-
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
12+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
13+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
14+
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
15+
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
16+
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
17+
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
18+
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
19+
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
20+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2821
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
29-
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
30-
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
3122
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
3223
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

go-tests/project_info_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,9 @@ git [email protected]:mock-project.git`
8181

8282
// TODO --refresh should not be needed here
8383
assert.Equal(t, "New Title\n", f.Run("pro:info", "-p", projectID, "title", "--refresh"))
84+
85+
// Test setting an attribute using dot notation
86+
f.Run("pro:info", "-v", "-p", projectID, "attributes.foo", "bar")
87+
// TODO --refresh should not be needed here
88+
assert.Equal(t, "bar\n", f.Run("pro:info", "-p", projectID, "attributes.foo", "--refresh"))
8489
}

src/Command/Project/ProjectInfoCommand.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,16 @@ protected function listProperties(array $properties): int
113113

114114
protected function setProperty(string $property, string $value, Project $project, bool $noWait): int
115115
{
116-
$type = $this->getType($property);
116+
$isMap = str_contains($property, '.');
117+
if ($isMap) {
118+
[$mapName, $mapKey] = explode('.', $property, 2);
119+
}
120+
if ($isMap) {
121+
$type = $this->getType($mapName . '.*');
122+
} else {
123+
$type = $this->getType($property);
124+
}
125+
117126
if (!$type) {
118127
$this->stdErr->writeln("Property not writable: <error>$property</error>");
119128
return 1;
@@ -122,17 +131,28 @@ protected function setProperty(string $property, string $value, Project $project
122131
$value = false;
123132
}
124133
settype($value, $type);
125-
$currentValue = $project->getProperty($property);
134+
135+
if ($isMap) {
136+
$currentMap = $project->getProperty($mapName) ?? [];
137+
$currentValue = $currentMap[$mapKey] ?? null;
138+
} else {
139+
$currentValue = $project->getProperty($property);
140+
}
126141
if ($currentValue === $value) {
127142
$this->stdErr->writeln(
128143
"Property <info>$property</info> already set as: " . $this->propertyFormatter->format($value, $property),
129144
);
130145

131146
return 0;
147+
132148
}
133149

150+
$update = [$property => $value];
151+
if ($isMap) {
152+
$update = [$mapName => [$mapKey => $value]];
153+
}
134154
$project->ensureFull();
135-
$result = $project->update([$property => $value]);
155+
$result = $project->update($update);
136156
$this->stdErr->writeln(sprintf(
137157
'Property <info>%s</info> set to: %s',
138158
$property,
@@ -160,6 +180,7 @@ protected function getType(string $property): string|false
160180
'description' => 'string',
161181
'default_domain' => 'string',
162182
'default_branch' => 'string',
183+
'attributes.*' => 'string',
163184
];
164185

165186
return $writableProperties[$property] ?? false;

0 commit comments

Comments
 (0)