Skip to content

Commit 697b946

Browse files
committed
credentials: check for quit=1
1 parent 62458a4 commit 697b946

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

src/scmrepo/git/credentials.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class CredentialNotFoundError(SCMError):
6868
"""Error occurred while retrieving credentials/no credentials available."""
6969

7070

71+
class CredentialQuitError(SCMError):
72+
"""Credential helper returned quit=1."""
73+
74+
7175
class CredentialHelper(ABC):
7276
"""Base git-credential helper."""
7377

@@ -174,6 +178,9 @@ def get(self, credential: "Credential", **kwargs) -> "Credential":
174178
continue
175179
if not credentials:
176180
raise CredentialNotFoundError("No credentials found")
181+
quit_ = credentials.get("quit")
182+
if quit_ is not None and quit_.lower() in ("true", "1"):
183+
raise CredentialQuitError("Helper returned quit=1")
177184
return Credential(**credentials)
178185

179186
def store(self, credential: "Credential", **kwargs):
@@ -539,6 +546,9 @@ def helpers(self) -> List["CredentialHelper"]:
539546

540547
def fill(self, interactive: bool = True) -> "Credential":
541548
"""Return a new credential with filled username and password."""
549+
if self.username and self.password:
550+
return Credential(**self)
551+
542552
try:
543553
return memory_helper.get(self, interactive=False)
544554
except CredentialNotFoundError:
@@ -549,13 +559,17 @@ def fill(self, interactive: bool = True) -> "Credential":
549559
return helper.get(self)
550560
except CredentialNotFoundError:
551561
continue
562+
except CredentialQuitError as exc:
563+
raise CredentialNotFoundError(
564+
f"No available credentials for '{self}'"
565+
) from exc
552566

553567
try:
554568
return memory_helper.get(self, interactive=interactive)
555569
except CredentialNotFoundError:
556570
pass
557571

558-
raise CredentialNotFoundError(f"No available credentials for '{self.url}'")
572+
raise CredentialNotFoundError(f"No available credentials for '{self}'")
559573

560574
def approve(self):
561575
"""Store this credential in available helpers."""

tests/test_credentials.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
CredentialNotFoundError,
88
GitCredentialHelper,
99
MemoryCredentialHelper,
10-
_CredentialKey,
1110
)
1211

1312

@@ -100,7 +99,7 @@ def test_memory_helper_get_cached(mocker):
10099
expected = Credential(
101100
protocol="https", host="foo.com", username="foo", password="bar"
102101
)
103-
helper._credentials[_CredentialKey.from_credential(expected)] = expected
102+
helper[expected] = expected
104103

105104
get_interactive = mocker.patch.object(
106105
helper,

0 commit comments

Comments
 (0)