1
1
package scala .cli .commands .publish .checks
2
2
3
+ import java .net .URI
4
+
3
5
import scala .build .EitherCps .{either , value }
4
6
import scala .build .Logger
5
7
import scala .build .errors .BuildException
6
8
import scala .build .options .{PublishOptions => BPublishOptions }
7
9
import scala .cli .commands .publish .ConfigUtil ._
8
- import scala .cli .commands .publish .{OptionCheck , PublishSetupOptions , SetSecret }
10
+ import scala .cli .commands .publish .{OptionCheck , PublishSetupOptions , RepoParams , SetSecret }
9
11
import scala .cli .config .{ConfigDb , Keys }
10
12
import scala .cli .errors .MissingPublishOptionError
11
13
12
14
final case class PasswordCheck (
13
15
options : PublishSetupOptions ,
14
16
configDb : () => ConfigDb ,
17
+ workspace : os.Path ,
15
18
logger : Logger
16
19
) extends OptionCheck {
17
20
def kind = OptionCheck .Kind .Repository
18
21
def fieldName = " password"
19
22
def directivePath = " publish" + (if (options.publishParams.setupCi) " .ci" else " " ) + " .password"
20
23
24
+ private def hostOpt (pubOpt : BPublishOptions ): Option [String ] = {
25
+ val repo = pubOpt.contextual(options.publishParams.setupCi).repository.getOrElse(
26
+ RepositoryCheck .defaultRepository
27
+ )
28
+ RepoParams (
29
+ repo,
30
+ pubOpt.versionControl.map(_.url),
31
+ workspace,
32
+ None ,
33
+ false ,
34
+ null ,
35
+ logger
36
+ ) match {
37
+ case Left (ex) =>
38
+ logger.debug(" Caught exception when trying to compute host to check user credentials" )
39
+ logger.debug(ex)
40
+ None
41
+ case Right (params) =>
42
+ Some (new URI (params.repo.snapshotRepo.root).getHost)
43
+ }
44
+ }
45
+
46
+ private def passwordOpt (pubOpt : BPublishOptions ) = hostOpt(pubOpt) match {
47
+ case None => Right (None )
48
+ case Some (host) =>
49
+ configDb().get(Keys .publishCredentials).wrapConfigException.map { credListOpt =>
50
+ credListOpt.flatMap { credList =>
51
+ credList
52
+ .iterator
53
+ .filter(_.host == host)
54
+ .map(_.password)
55
+ .collectFirst {
56
+ case Some (p) => p
57
+ }
58
+ }
59
+ }
60
+ }
61
+
21
62
def check (pubOpt : BPublishOptions ): Boolean =
22
- ! options.publishParams.setupCi ||
23
- pubOpt.retained(options.publishParams.setupCi).repoPassword.nonEmpty
63
+ pubOpt.retained(options.publishParams.setupCi).repoPassword.nonEmpty || {
64
+ ! options.publishParams.setupCi && (passwordOpt(pubOpt) match {
65
+ case Left (ex) =>
66
+ logger.debug(" Ignoring error while trying to get password from config" )
67
+ logger.debug(ex)
68
+ true
69
+ case Right (valueOpt) =>
70
+ valueOpt.isDefined
71
+ })
72
+ }
24
73
25
74
def defaultValue (pubOpt : BPublishOptions ): Either [BuildException , OptionCheck .DefaultValue ] =
26
75
either {
76
+
27
77
if (options.publishParams.setupCi) {
28
78
val password = options.publishRepo.password match {
29
79
case Some (password0) => password0.toConfig
30
80
case None =>
31
- val passwordOpt = value(configDb().get(Keys .sonatypePassword).wrapConfigException)
32
- passwordOpt match {
81
+ value(passwordOpt(pubOpt)) match {
33
82
case Some (password0) =>
34
- logger.message(" publish.password :" )
83
+ logger.message(" publish.credentials :" )
35
84
logger.message(
36
- s " using ${Keys .sonatypePassword .fullName} from Scala CLI configuration "
85
+ s " using ${Keys .publishCredentials .fullName} from Scala CLI configuration "
37
86
)
38
87
password0
39
88
case None =>
@@ -42,8 +91,8 @@ final case class PasswordCheck(
42
91
new MissingPublishOptionError (
43
92
" publish password" ,
44
93
" --password" ,
45
- " publish.password " ,
46
- configKeys = Seq (Keys .sonatypePassword .fullName)
94
+ " publish.credentials " ,
95
+ configKeys = Seq (Keys .publishCredentials .fullName)
47
96
)
48
97
}
49
98
}
@@ -56,21 +105,30 @@ final case class PasswordCheck(
56
105
Seq (SetSecret (" PUBLISH_PASSWORD" , password.get(), force = true ))
57
106
)
58
107
}
59
- else if (value(configDb().get(Keys .sonatypePassword).wrapConfigException).isDefined) {
60
- logger.message(" publish.password:" )
61
- logger.message(s " found ${Keys .sonatypePassword.fullName} in Scala CLI configuration " )
62
- OptionCheck .DefaultValue .empty
63
- }
64
108
else
65
- value {
66
- Left {
67
- new MissingPublishOptionError (
68
- " publish password" ,
69
- " " ,
70
- " publish.password" ,
71
- configKeys = Seq (Keys .sonatypePassword.fullName)
72
- )
73
- }
109
+ hostOpt(pubOpt) match {
110
+ case None =>
111
+ logger.debug(" No host, not checking for publish repository password" )
112
+ OptionCheck .DefaultValue .empty
113
+ case Some (host) =>
114
+ if (value(passwordOpt(pubOpt)).isDefined) {
115
+ logger.message(" publish.password:" )
116
+ logger.message(
117
+ s " found password for $host in ${Keys .publishCredentials.fullName} in Scala CLI configuration "
118
+ )
119
+ OptionCheck .DefaultValue .empty
120
+ }
121
+ else
122
+ value {
123
+ Left {
124
+ new MissingPublishOptionError (
125
+ " publish password" ,
126
+ " " ,
127
+ " publish.credentials" ,
128
+ configKeys = Seq (Keys .publishCredentials.fullName)
129
+ )
130
+ }
131
+ }
74
132
}
75
133
}
76
134
}
0 commit comments