-
-
Notifications
You must be signed in to change notification settings - Fork 135
/
remotes.py
82 lines (65 loc) · 2.49 KB
/
remotes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from GitSavvy.core.git_mixins.branches import Upstream
from typing import Dict, Optional, TYPE_CHECKING
name = str
url = str
if TYPE_CHECKING:
from GitSavvy.core.git_command import GitCommand
base = GitCommand
else:
base = object
NOTSET = "<NOTSET>"
UPSTREAM_NOT_SET = Upstream("", "", "", "")
class GithubRemotesMixin(base):
def read_gitsavvy_config(self):
# type: () -> Dict[str, str]
return dict(
line[9:].split()
for line in self.git(
"config",
"--get-regex",
r"^gitsavvy\..*",
throw_on_error=False
).splitlines()
)
def get_integrated_branch_name(self):
# type: () -> Optional[str]
return self.read_gitsavvy_config().get("ghbranch")
def get_integrated_remote_name(
self,
remotes,
current_upstream=UPSTREAM_NOT_SET,
configured_remote_name=NOTSET
):
# type: (Dict[name, url], Optional[Upstream], Optional[str]) -> name
if len(remotes) == 0:
raise ValueError("GitHub integration will not function when no remotes defined.")
if len(remotes) == 1:
return list(remotes.keys())[0]
if configured_remote_name is NOTSET:
configured_remote_name = self.read_gitsavvy_config().get("ghremote")
if configured_remote_name in remotes:
return configured_remote_name
for name in ("upstream", "origin"):
if name in remotes:
return name
if current_upstream is UPSTREAM_NOT_SET:
current_upstream = self.get_upstream_for_active_branch()
if current_upstream:
return current_upstream.remote
raise ValueError("Cannot determine GitHub integrated remote.")
def get_integrated_remote_url(self):
# type: () -> url
remotes = self.get_remotes()
configured_remote_name = self.get_integrated_remote_name(remotes)
return remotes[configured_remote_name]
def guess_github_remote(self, remotes):
# type: (Dict[name, url]) -> Optional[name]
if len(remotes) == 1:
return list(remotes.keys())[0]
upstream = self.get_upstream_for_active_branch()
integrated_remote = self.get_integrated_remote_name(remotes, current_upstream=upstream)
if upstream:
tracked_remote = upstream.remote
if tracked_remote != integrated_remote:
return None
return integrated_remote