Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit e405a73

Browse files
authored
Merge branch 'master' into fixes/issue-template
2 parents 6df8c3b + d4d890b commit e405a73

File tree

8 files changed

+196
-203
lines changed

8 files changed

+196
-203
lines changed

src/GitHub.Api/Application/ApiClient.cs

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public static IApiClient Create(UriString repositoryUrl, IKeychain keychain)
2929
private readonly ILoginManager loginManager;
3030
private static readonly SemaphoreSlim sem = new SemaphoreSlim(1);
3131

32-
Octokit.Repository repositoryCache = new Octokit.Repository();
3332
IList<Organization> organizationsCache;
3433
Octokit.User userCache;
3534

@@ -49,13 +48,6 @@ public ApiClient(UriString hostUrl, IKeychain keychain, IGitHubClient githubClie
4948
loginManager = new LoginManager(keychain, ApplicationInfo.ClientId, ApplicationInfo.ClientSecret);
5049
}
5150

52-
public async Task GetRepository(Action<Octokit.Repository> callback)
53-
{
54-
Guard.ArgumentNotNull(callback, "callback");
55-
var repo = await GetRepositoryInternal();
56-
callback(repo);
57-
}
58-
5951
public async Task Logout(UriString host)
6052
{
6153
await LogoutInternal(host);
@@ -182,45 +174,18 @@ public async Task<bool> ContinueLoginAsync(LoginResult loginResult, Func<LoginRe
182174
return result.Code == LoginResultCodes.Success;
183175
}
184176

185-
private async Task<Octokit.Repository> GetRepositoryInternal()
177+
private async Task CreateRepositoryInternal(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization)
186178
{
187179
try
188180
{
189-
if (owner == null)
181+
logger.Trace("Creating repository");
182+
183+
if (!await EnsureKeychainLoaded())
190184
{
191-
var ownerLogin = OriginalUrl.Owner;
192-
var repositoryName = OriginalUrl.RepositoryName;
193-
194-
if (ownerLogin != null && repositoryName != null)
195-
{
196-
var repo = await githubClient.Repository.Get(ownerLogin, repositoryName);
197-
if (repo != null)
198-
{
199-
repositoryCache = repo;
200-
}
201-
owner = ownerLogin;
202-
}
185+
callback(null, new Exception("Keychain Not Loaded"));
186+
return;
203187
}
204-
}
205-
// it'll throw if it's private or an enterprise instance requiring authentication
206-
catch (ApiException apiex)
207-
{
208-
if (!HostAddress.IsGitHubDotCom(OriginalUrl.ToRepositoryUri()))
209-
isEnterprise = apiex.IsGitHubApiException();
210-
}
211-
catch {}
212-
finally
213-
{
214-
sem.Release();
215-
}
216188

217-
return repositoryCache;
218-
}
219-
220-
private async Task CreateRepositoryInternal(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization)
221-
{
222-
try
223-
{
224189
Octokit.Repository repository;
225190
if (!string.IsNullOrEmpty(organization))
226191
{
@@ -252,6 +217,11 @@ private async Task<IList<Organization>> GetOrganizationInternal()
252217
{
253218
logger.Trace("Getting Organizations");
254219

220+
if (!await EnsureKeychainLoaded())
221+
{
222+
return null;
223+
}
224+
255225
var organizations = await githubClient.Organization.GetAllForCurrent();
256226

257227
logger.Trace("Obtained {0} Organizations", organizations?.Count.ToString() ?? "NULL");
@@ -276,6 +246,11 @@ private async Task<IList<Organization>> GetOrganizationInternal()
276246
{
277247
logger.Trace("Getting Organizations");
278248

249+
if (!await EnsureKeychainLoaded())
250+
{
251+
return null;
252+
}
253+
279254
userCache = await githubClient.User.Current();
280255
}
281256
catch(Exception ex)
@@ -287,6 +262,31 @@ private async Task<IList<Organization>> GetOrganizationInternal()
287262
return userCache;
288263
}
289264

265+
private async Task<bool> EnsureKeychainLoaded()
266+
{
267+
logger.Trace("EnsureKeychainLoaded");
268+
269+
if (keychain.HasKeys)
270+
{
271+
if (!keychain.NeedsLoad)
272+
{
273+
logger.Trace("EnsureKeychainLoaded: Has keys does not need load");
274+
return true;
275+
}
276+
277+
logger.Trace("EnsureKeychainLoaded: Loading");
278+
279+
var uriString = keychain.Connections.First().Host;
280+
var keychainAdapter = await keychain.Load(uriString);
281+
282+
return keychainAdapter.OctokitCredentials != Credentials.Anonymous;
283+
}
284+
285+
logger.Trace("EnsureKeychainLoaded: No keys to load");
286+
287+
return false;
288+
}
289+
290290
public async Task<bool> ValidateCredentials()
291291
{
292292
try

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ public virtual async Task Run(bool firstRun)
6969

7070
RestartRepository();
7171
InitializeUI();
72-
73-
new ActionTask(new Task(() => LoadKeychain().Start())).Start();
7472
}
7573

7674
public ITask InitializeRepository()
@@ -79,7 +77,10 @@ public ITask InitializeRepository()
7977

8078
var targetPath = NPath.CurrentDirectory;
8179

82-
var unityYamlMergeExec = Environment.UnityApplication.Parent.Combine("Tools", "UnityYAMLMerge");
80+
var unityYamlMergeExec = Environment.IsWindows
81+
? Environment.UnityApplication.Parent.Combine("Data", "Tools", "UnityYAMLMerge.exe")
82+
: Environment.UnityApplication.Combine("Contents", "Tools", "UnityYAMLMerge");
83+
8384
var yamlMergeCommand = Environment.IsWindows
8485
? $@"'{unityYamlMergeExec}' merge -p ""$BASE"" ""$REMOTE"" ""$LOCAL"" ""$MERGED"""
8586
: $@"'{unityYamlMergeExec}' merge -p '$BASE' '$REMOTE' '$LOCAL' '$MERGED'";
@@ -125,22 +126,6 @@ public void RestartRepository()
125126
}
126127
}
127128

128-
private async Task LoadKeychain()
129-
{
130-
Logger.Trace("Loading Keychain");
131-
132-
var firstConnection = Platform.Keychain.Hosts.FirstOrDefault();
133-
if (firstConnection == null)
134-
{
135-
Logger.Trace("No Host Found");
136-
}
137-
else
138-
{
139-
Logger.Trace("Loading Connection to Host:\"{0}\"", firstConnection);
140-
await Platform.Keychain.Load(firstConnection).SafeAwait();
141-
}
142-
}
143-
144129
private async Task<NPath> DetermineGitExecutablePath(ProgressReport progress = null)
145130
{
146131
var gitExecutablePath = SystemSettings.Get(Constants.GitInstallPathKey)?.ToNPath();

src/GitHub.Api/Application/IApiClient.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ interface IApiClient
99
{
1010
HostAddress HostAddress { get; }
1111
UriString OriginalUrl { get; }
12-
Task GetRepository(Action<Octokit.Repository> callback);
1312
Task CreateRepository(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization = null);
1413
Task GetOrganizations(Action<IList<Organization>> callback);
1514
Task Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result);

src/GitHub.Api/Authentication/IKeychain.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ interface IKeychain
1515
Connection[] Connections { get; }
1616
IList<UriString> Hosts { get; }
1717
bool HasKeys { get; }
18+
bool NeedsLoad { get; }
1819
void SetToken(UriString host, string token);
1920
}
2021
}

src/GitHub.Api/Authentication/Keychain.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,5 +230,7 @@ public void UpdateToken(UriString host, string token)
230230
public IList<UriString> Hosts => connectionCache.Keys.ToArray();
231231

232232
public bool HasKeys => connectionCache.Any();
233+
234+
public bool NeedsLoad => HasKeys && FindOrCreateAdapter(connectionCache.First().Value.Host).OctokitCredentials == Credentials.Anonymous;
233235
}
234236
}

src/UnityExtension/Assets/Editor/GitHub.Unity/GitHub.Unity.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
<Compile Include="Logging\UnityLogAdapter.cs" />
8585
<Compile Include="EntryPoint.cs" />
8686
<Compile Include="Misc\Installer.cs" />
87+
<Compile Include="UI\BaseWindow.cs" />
8788
<Compile Include="UI\PublishWindow.cs" />
8889
<Compile Include="UI\ProjectWindowInterface.cs" />
8990
<Compile Include="Misc\Styles.cs" />
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
using System;
2+
using UnityEditor;
3+
using UnityEngine;
4+
5+
namespace GitHub.Unity
6+
{
7+
abstract class BaseWindow : EditorWindow, IView
8+
{
9+
[NonSerialized] private bool finishCalled = false;
10+
[NonSerialized] private bool initialized = false;
11+
12+
[NonSerialized] private IApplicationManager cachedManager;
13+
[NonSerialized] private IRepository cachedRepository;
14+
[NonSerialized] private bool initializeWasCalled;
15+
[NonSerialized] private bool inLayout;
16+
17+
public event Action<bool> OnClose;
18+
19+
public virtual void Initialize(IApplicationManager applicationManager)
20+
{
21+
Logger.Trace("Initialize ApplicationManager:{0} Initialized:{1}", applicationManager, initialized);
22+
}
23+
24+
public void InitializeWindow(IApplicationManager applicationManager)
25+
{
26+
if (inLayout)
27+
{
28+
initializeWasCalled = true;
29+
cachedManager = applicationManager;
30+
return;
31+
}
32+
33+
Manager = applicationManager;
34+
cachedRepository = Environment.Repository;
35+
initialized = true;
36+
Initialize(applicationManager);
37+
OnRepositoryChanged(null);
38+
Redraw();
39+
}
40+
41+
public virtual void Redraw()
42+
{
43+
Repaint();
44+
}
45+
46+
public virtual void Refresh()
47+
{
48+
Logger.Debug("Refresh");
49+
}
50+
51+
public virtual void Finish(bool result)
52+
{
53+
finishCalled = true;
54+
RaiseOnClose(result);
55+
}
56+
57+
protected void RaiseOnClose(bool result)
58+
{
59+
OnClose.SafeInvoke(result);
60+
}
61+
62+
public virtual void Awake()
63+
{
64+
Logger.Trace("Awake Initialized:{0}", initialized);
65+
if (!initialized)
66+
InitializeWindow(EntryPoint.ApplicationManager);
67+
}
68+
69+
public virtual void OnEnable()
70+
{
71+
Logger.Trace("OnEnable Initialized:{0}", initialized);
72+
if (!initialized)
73+
InitializeWindow(EntryPoint.ApplicationManager);
74+
}
75+
76+
public virtual void OnDisable() {}
77+
78+
public virtual void Update() {}
79+
80+
public virtual void OnDataUpdate()
81+
{}
82+
83+
public virtual void OnRepositoryChanged(IRepository oldRepository)
84+
{}
85+
86+
// OnGUI calls this everytime, so override it to render as you would OnGUI
87+
public virtual void OnUI() {}
88+
89+
// This is Unity's magic method
90+
private void OnGUI()
91+
{
92+
if (Event.current.type == EventType.layout)
93+
{
94+
if (cachedRepository != Environment.Repository)
95+
{
96+
OnRepositoryChanged(cachedRepository);
97+
cachedRepository = Environment.Repository;
98+
}
99+
inLayout = true;
100+
OnDataUpdate();
101+
}
102+
103+
OnUI();
104+
105+
if (Event.current.type == EventType.repaint)
106+
{
107+
inLayout = false;
108+
if (initializeWasCalled)
109+
{
110+
initializeWasCalled = false;
111+
InitializeWindow(cachedManager);
112+
}
113+
}
114+
}
115+
116+
public virtual void OnDestroy()
117+
{
118+
if (!finishCalled)
119+
{
120+
RaiseOnClose(false);
121+
}
122+
}
123+
124+
public virtual void OnSelectionChange()
125+
{}
126+
127+
public virtual Rect Position { get { return position; } }
128+
public IApplicationManager Manager { get; private set; }
129+
public IRepository Repository { get { return inLayout ? cachedRepository : Environment.Repository; } }
130+
public bool HasRepository { get { return Environment.RepositoryPath != null; } }
131+
132+
protected ITaskManager TaskManager { get { return Manager.TaskManager; } }
133+
protected IGitClient GitClient { get { return Manager.GitClient; } }
134+
protected IEnvironment Environment { get { return Manager.Environment; } }
135+
protected IPlatform Platform { get { return Manager.Platform; } }
136+
private ILogging logger;
137+
protected ILogging Logger
138+
{
139+
get
140+
{
141+
if (logger == null)
142+
logger = Logging.GetLogger(GetType());
143+
return logger;
144+
}
145+
}
146+
}
147+
}

0 commit comments

Comments
 (0)