Skip to content
Snippets Groups Projects
Commit e405a736 authored by Andreia Gaita's avatar Andreia Gaita Committed by GitHub
Browse files

Merge branch 'master' into fixes/issue-template

parents 6df8c3b0 d4d890b8
No related branches found
No related tags found
No related merge requests found
......@@ -29,7 +29,6 @@ namespace GitHub.Unity
private readonly ILoginManager loginManager;
private static readonly SemaphoreSlim sem = new SemaphoreSlim(1);
Octokit.Repository repositoryCache = new Octokit.Repository();
IList<Organization> organizationsCache;
Octokit.User userCache;
......@@ -49,13 +48,6 @@ namespace GitHub.Unity
loginManager = new LoginManager(keychain, ApplicationInfo.ClientId, ApplicationInfo.ClientSecret);
}
public async Task GetRepository(Action<Octokit.Repository> callback)
{
Guard.ArgumentNotNull(callback, "callback");
var repo = await GetRepositoryInternal();
callback(repo);
}
public async Task Logout(UriString host)
{
await LogoutInternal(host);
......@@ -182,45 +174,18 @@ namespace GitHub.Unity
return result.Code == LoginResultCodes.Success;
}
private async Task<Octokit.Repository> GetRepositoryInternal()
private async Task CreateRepositoryInternal(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization)
{
try
{
if (owner == null)
logger.Trace("Creating repository");
if (!await EnsureKeychainLoaded())
{
var ownerLogin = OriginalUrl.Owner;
var repositoryName = OriginalUrl.RepositoryName;
if (ownerLogin != null && repositoryName != null)
{
var repo = await githubClient.Repository.Get(ownerLogin, repositoryName);
if (repo != null)
{
repositoryCache = repo;
}
owner = ownerLogin;
}
callback(null, new Exception("Keychain Not Loaded"));
return;
}
}
// it'll throw if it's private or an enterprise instance requiring authentication
catch (ApiException apiex)
{
if (!HostAddress.IsGitHubDotCom(OriginalUrl.ToRepositoryUri()))
isEnterprise = apiex.IsGitHubApiException();
}
catch {}
finally
{
sem.Release();
}
return repositoryCache;
}
private async Task CreateRepositoryInternal(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization)
{
try
{
Octokit.Repository repository;
if (!string.IsNullOrEmpty(organization))
{
......@@ -252,6 +217,11 @@ namespace GitHub.Unity
{
logger.Trace("Getting Organizations");
if (!await EnsureKeychainLoaded())
{
return null;
}
var organizations = await githubClient.Organization.GetAllForCurrent();
logger.Trace("Obtained {0} Organizations", organizations?.Count.ToString() ?? "NULL");
......@@ -276,6 +246,11 @@ namespace GitHub.Unity
{
logger.Trace("Getting Organizations");
if (!await EnsureKeychainLoaded())
{
return null;
}
userCache = await githubClient.User.Current();
}
catch(Exception ex)
......@@ -287,6 +262,31 @@ namespace GitHub.Unity
return userCache;
}
private async Task<bool> EnsureKeychainLoaded()
{
logger.Trace("EnsureKeychainLoaded");
if (keychain.HasKeys)
{
if (!keychain.NeedsLoad)
{
logger.Trace("EnsureKeychainLoaded: Has keys does not need load");
return true;
}
logger.Trace("EnsureKeychainLoaded: Loading");
var uriString = keychain.Connections.First().Host;
var keychainAdapter = await keychain.Load(uriString);
return keychainAdapter.OctokitCredentials != Credentials.Anonymous;
}
logger.Trace("EnsureKeychainLoaded: No keys to load");
return false;
}
public async Task<bool> ValidateCredentials()
{
try
......
......@@ -69,8 +69,6 @@ namespace GitHub.Unity
RestartRepository();
InitializeUI();
new ActionTask(new Task(() => LoadKeychain().Start())).Start();
}
public ITask InitializeRepository()
......@@ -79,7 +77,10 @@ namespace GitHub.Unity
var targetPath = NPath.CurrentDirectory;
var unityYamlMergeExec = Environment.UnityApplication.Parent.Combine("Tools", "UnityYAMLMerge");
var unityYamlMergeExec = Environment.IsWindows
? Environment.UnityApplication.Parent.Combine("Data", "Tools", "UnityYAMLMerge.exe")
: Environment.UnityApplication.Combine("Contents", "Tools", "UnityYAMLMerge");
var yamlMergeCommand = Environment.IsWindows
? $@"'{unityYamlMergeExec}' merge -p ""$BASE"" ""$REMOTE"" ""$LOCAL"" ""$MERGED"""
: $@"'{unityYamlMergeExec}' merge -p '$BASE' '$REMOTE' '$LOCAL' '$MERGED'";
......@@ -125,22 +126,6 @@ namespace GitHub.Unity
}
}
private async Task LoadKeychain()
{
Logger.Trace("Loading Keychain");
var firstConnection = Platform.Keychain.Hosts.FirstOrDefault();
if (firstConnection == null)
{
Logger.Trace("No Host Found");
}
else
{
Logger.Trace("Loading Connection to Host:\"{0}\"", firstConnection);
await Platform.Keychain.Load(firstConnection).SafeAwait();
}
}
private async Task<NPath> DetermineGitExecutablePath(ProgressReport progress = null)
{
var gitExecutablePath = SystemSettings.Get(Constants.GitInstallPathKey)?.ToNPath();
......
......@@ -9,7 +9,6 @@ namespace GitHub.Unity
{
HostAddress HostAddress { get; }
UriString OriginalUrl { get; }
Task GetRepository(Action<Octokit.Repository> callback);
Task CreateRepository(NewRepository newRepository, Action<Octokit.Repository, Exception> callback, string organization = null);
Task GetOrganizations(Action<IList<Organization>> callback);
Task Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result);
......
......@@ -15,6 +15,7 @@ namespace GitHub.Unity
Connection[] Connections { get; }
IList<UriString> Hosts { get; }
bool HasKeys { get; }
bool NeedsLoad { get; }
void SetToken(UriString host, string token);
}
}
\ No newline at end of file
......@@ -230,5 +230,7 @@ namespace GitHub.Unity
public IList<UriString> Hosts => connectionCache.Keys.ToArray();
public bool HasKeys => connectionCache.Any();
public bool NeedsLoad => HasKeys && FindOrCreateAdapter(connectionCache.First().Value.Host).OctokitCredentials == Credentials.Anonymous;
}
}
\ No newline at end of file
......@@ -84,6 +84,7 @@
<Compile Include="Logging\UnityLogAdapter.cs" />
<Compile Include="EntryPoint.cs" />
<Compile Include="Misc\Installer.cs" />
<Compile Include="UI\BaseWindow.cs" />
<Compile Include="UI\PublishWindow.cs" />
<Compile Include="UI\ProjectWindowInterface.cs" />
<Compile Include="Misc\Styles.cs" />
......
using System;
using UnityEditor;
using UnityEngine;
namespace GitHub.Unity
{
abstract class BaseWindow : EditorWindow, IView
{
[NonSerialized] private bool finishCalled = false;
[NonSerialized] private bool initialized = false;
[NonSerialized] private IApplicationManager cachedManager;
[NonSerialized] private IRepository cachedRepository;
[NonSerialized] private bool initializeWasCalled;
[NonSerialized] private bool inLayout;
public event Action<bool> OnClose;
public virtual void Initialize(IApplicationManager applicationManager)
{
Logger.Trace("Initialize ApplicationManager:{0} Initialized:{1}", applicationManager, initialized);
}
public void InitializeWindow(IApplicationManager applicationManager)
{
if (inLayout)
{
initializeWasCalled = true;
cachedManager = applicationManager;
return;
}
Manager = applicationManager;
cachedRepository = Environment.Repository;
initialized = true;
Initialize(applicationManager);
OnRepositoryChanged(null);
Redraw();
}
public virtual void Redraw()
{
Repaint();
}
public virtual void Refresh()
{
Logger.Debug("Refresh");
}
public virtual void Finish(bool result)
{
finishCalled = true;
RaiseOnClose(result);
}
protected void RaiseOnClose(bool result)
{
OnClose.SafeInvoke(result);
}
public virtual void Awake()
{
Logger.Trace("Awake Initialized:{0}", initialized);
if (!initialized)
InitializeWindow(EntryPoint.ApplicationManager);
}
public virtual void OnEnable()
{
Logger.Trace("OnEnable Initialized:{0}", initialized);
if (!initialized)
InitializeWindow(EntryPoint.ApplicationManager);
}
public virtual void OnDisable() {}
public virtual void Update() {}
public virtual void OnDataUpdate()
{}
public virtual void OnRepositoryChanged(IRepository oldRepository)
{}
// OnGUI calls this everytime, so override it to render as you would OnGUI
public virtual void OnUI() {}
// This is Unity's magic method
private void OnGUI()
{
if (Event.current.type == EventType.layout)
{
if (cachedRepository != Environment.Repository)
{
OnRepositoryChanged(cachedRepository);
cachedRepository = Environment.Repository;
}
inLayout = true;
OnDataUpdate();
}
OnUI();
if (Event.current.type == EventType.repaint)
{
inLayout = false;
if (initializeWasCalled)
{
initializeWasCalled = false;
InitializeWindow(cachedManager);
}
}
}
public virtual void OnDestroy()
{
if (!finishCalled)
{
RaiseOnClose(false);
}
}
public virtual void OnSelectionChange()
{}
public virtual Rect Position { get { return position; } }
public IApplicationManager Manager { get; private set; }
public IRepository Repository { get { return inLayout ? cachedRepository : Environment.Repository; } }
public bool HasRepository { get { return Environment.RepositoryPath != null; } }
protected ITaskManager TaskManager { get { return Manager.TaskManager; } }
protected IGitClient GitClient { get { return Manager.GitClient; } }
protected IEnvironment Environment { get { return Manager.Environment; } }
protected IPlatform Platform { get { return Manager.Platform; } }
private ILogging logger;
protected ILogging Logger
{
get
{
if (logger == null)
logger = Logging.GetLogger(GetType());
return logger;
}
}
}
}
\ No newline at end of file
using System;
using UnityEditor;
using UnityEngine;
namespace GitHub.Unity
{
abstract class BaseWindow : EditorWindow, IView
{
[NonSerialized] private bool finishCalled = false;
[NonSerialized] private bool initialized = false;
[NonSerialized] private IApplicationManager cachedManager;
[NonSerialized] private IRepository cachedRepository;
[NonSerialized] private bool initializeWasCalled;
[NonSerialized] private bool inLayout;
public event Action<bool> OnClose;
public virtual void Initialize(IApplicationManager applicationManager)
{
Logger.Trace("Initialize ApplicationManager:{0} Initialized:{1}", applicationManager, initialized);
}
public void InitializeWindow(IApplicationManager applicationManager)
{
if (inLayout)
{
initializeWasCalled = true;
cachedManager = applicationManager;
return;
}
Manager = applicationManager;
cachedRepository = Environment.Repository;
initialized = true;
Initialize(applicationManager);
OnRepositoryChanged(null);
Redraw();
}
public virtual void Redraw()
{
Repaint();
}
public virtual void Refresh()
{
Logger.Debug("Refresh");
}
public virtual void Finish(bool result)
{
finishCalled = true;
RaiseOnClose(result);
}
protected void RaiseOnClose(bool result)
{
OnClose.SafeInvoke(result);
}
public virtual void Awake()
{
Logger.Trace("Awake Initialized:{0}", initialized);
if (!initialized)
InitializeWindow(EntryPoint.ApplicationManager);
}
public virtual void OnEnable()
{
Logger.Trace("OnEnable Initialized:{0}", initialized);
if (!initialized)
InitializeWindow(EntryPoint.ApplicationManager);
}
public virtual void OnDisable() {}
public virtual void Update() {}
public virtual void OnDataUpdate()
{}
public virtual void OnRepositoryChanged(IRepository oldRepository)
{}
// OnGUI calls this everytime, so override it to render as you would OnGUI
public virtual void OnUI() {}
// This is Unity's magic method
private void OnGUI()
{
if (Event.current.type == EventType.layout)
{
if (cachedRepository != Environment.Repository)
{
OnRepositoryChanged(cachedRepository);
cachedRepository = Environment.Repository;
}
inLayout = true;
OnDataUpdate();
}
OnUI();
if (Event.current.type == EventType.repaint)
{
inLayout = false;
if (initializeWasCalled)
{
initializeWasCalled = false;
InitializeWindow(cachedManager);
}
}
}
public virtual void OnDestroy()
{
if (!finishCalled)
{
RaiseOnClose(false);
}
}
public virtual void OnSelectionChange()
{}
public virtual Rect Position { get { return position; } }
public IApplicationManager Manager { get; private set; }
public IRepository Repository { get { return inLayout ? cachedRepository : Environment.Repository; } }
public bool HasRepository { get { return Environment.RepositoryPath != null; } }
protected ITaskManager TaskManager { get { return Manager.TaskManager; } }
protected IGitClient GitClient { get { return Manager.GitClient; } }
protected IEnvironment Environment { get { return Manager.Environment; } }
protected IPlatform Platform { get { return Manager.Platform; } }
private ILogging logger;
protected ILogging Logger
{
get
{
if (logger == null)
logger = Logging.GetLogger(GetType());
return logger;
}
}
}
abstract class Subview : IView
{
public event Action<bool> OnClose;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment