@@ -83,11 +83,12 @@ class SettingsView : Subview
8383 [ SerializeField ] private int lockedFileSelection = - 1 ;
8484 [ SerializeField ] private bool hasRemote ;
8585 [ SerializeField ] private bool remoteHasChanged ;
86- [ SerializeField ] private bool userDataHasChanged ;
86+ [ NonSerialized ] private bool userDataHasChanged ;
8787
8888 [ SerializeField ] private string newGitName ;
8989 [ SerializeField ] private string newGitEmail ;
9090 [ SerializeField ] private string newRepositoryRemoteUrl ;
91+ [ SerializeField ] private User cachedUser ;
9192
9293 public override void OnEnable ( )
9394 {
@@ -113,13 +114,16 @@ public override void OnRepositoryChanged(IRepository oldRepository)
113114
114115 DetachHandlers ( oldRepository ) ;
115116 AttachHandlers ( Repository ) ;
117+ activeRemote = Repository . CurrentRemote ;
118+ remoteHasChanged = true ;
116119 Refresh ( ) ;
117120 }
118121
119122 public override void Refresh ( )
120123 {
121124 base . Refresh ( ) ;
122- Repository . ListLocks ( ) . Start ( ) ;
125+ if ( Repository != null )
126+ Repository . ListLocks ( ) . Start ( ) ;
123127 }
124128
125129 private void AttachHandlers ( IRepository repository )
@@ -144,12 +148,12 @@ public override void OnGUI()
144148 {
145149 scroll = GUILayout . BeginScrollView ( scroll ) ;
146150 {
147- if ( Repository != null )
148- {
149- OnUserSettingsGUI ( ) ;
151+ OnUserSettingsGUI ( ) ;
150152
151- GUILayout . Space ( EditorGUIUtility . standardVerticalSpacing ) ;
153+ GUILayout . Space ( EditorGUIUtility . standardVerticalSpacing ) ;
152154
155+ if ( Repository != null )
156+ {
153157 OnRepositorySettingsGUI ( ) ;
154158
155159 GUILayout . Space ( EditorGUIUtility . standardVerticalSpacing ) ;
@@ -173,34 +177,62 @@ private void MaybeUpdateData()
173177 lockedFiles = new List < GitLock > ( ) ;
174178
175179 if ( Repository == null )
180+ {
181+ if ( cachedUser == null || String . IsNullOrEmpty ( cachedUser . Name ) )
182+ {
183+ var user = new User ( ) ;
184+ GitClient . GetConfig ( "user.name" , GitConfigSource . User )
185+ . Then ( ( success , value ) => user . Name = value ) . Then (
186+ GitClient . GetConfig ( "user.email" , GitConfigSource . User )
187+ . Then ( ( success , value ) => user . Email = value ) )
188+ . FinallyInUI ( ( success , ex ) =>
189+ {
190+ if ( success && ! String . IsNullOrEmpty ( user . Name ) )
191+ {
192+ cachedUser = user ;
193+ userDataHasChanged = true ;
194+ Redraw ( ) ;
195+ }
196+ } )
197+ . Start ( ) ;
198+ }
199+
200+ if ( userDataHasChanged )
201+ {
202+ newGitName = gitName = cachedUser . Name ;
203+ newGitEmail = gitEmail = cachedUser . Email ;
204+ userDataHasChanged = false ;
205+ }
176206 return ;
207+ }
177208
178- userDataHasChanged = ! ( Repository . User . Name == gitName && Repository . User . Email == gitEmail ) ;
209+ userDataHasChanged = Repository . User . Name != gitName || Repository . User . Email != gitEmail ;
179210
180211 if ( ! remoteHasChanged && ! userDataHasChanged )
181212 return ;
182213
214+ if ( userDataHasChanged )
215+ {
216+ userDataHasChanged = false ;
217+ newGitName = gitName = Repository . User . Name ;
218+ newGitEmail = gitEmail = Repository . User . Email ;
219+ }
220+
183221 if ( remoteHasChanged )
184222 {
185223 remoteHasChanged = false ;
186224 hasRemote = activeRemote . HasValue && ! String . IsNullOrEmpty ( activeRemote . Value . Url ) ;
187225 if ( ! hasRemote )
188226 {
189227 repositoryRemoteName = DefaultRepositoryRemoteName ;
190- repositoryRemoteUrl = string . Empty ;
228+ newRepositoryRemoteUrl = repositoryRemoteUrl = string . Empty ;
191229 }
192230 else
193231 {
194232 repositoryRemoteName = activeRemote . Value . Name ;
195- repositoryRemoteUrl = activeRemote . Value . Url ;
233+ newRepositoryRemoteUrl = repositoryRemoteUrl = activeRemote . Value . Url ;
196234 }
197235 }
198-
199- if ( userDataHasChanged )
200- {
201- gitName = Repository . User . Name ;
202- gitEmail = Repository . User . Email ;
203- }
204236 }
205237
206238 private void ResetToDefaults ( )
@@ -243,42 +275,80 @@ private void OnUserSettingsGUI()
243275
244276 EditorGUI . BeginDisabledGroup ( isBusy ) ;
245277 {
246- newGitName = EditorGUILayout . TextField ( GitConfigNameLabel , gitName ) ;
247- newGitEmail = EditorGUILayout . TextField ( GitConfigEmailLabel , gitEmail ) ;
278+ newGitName = EditorGUILayout . TextField ( GitConfigNameLabel , newGitName ) ;
279+ newGitEmail = EditorGUILayout . TextField ( GitConfigEmailLabel , newGitEmail ) ;
248280
249281 var needsSaving = newGitName != gitName || newGitEmail != gitEmail ;
250- EditorGUI . BeginDisabledGroup ( needsSaving ) ;
282+ EditorGUI . BeginDisabledGroup ( ! needsSaving ) ;
251283 {
252284 if ( GUILayout . Button ( GitConfigUserSave , GUILayout . ExpandWidth ( false ) ) )
253285 {
254286 GitClient . SetConfig ( "user.name" , newGitName , GitConfigSource . User )
255- . Then ( ( success , value ) => { if ( success ) Repository . User . Name = value ; } )
287+ . Then ( ( success , value ) =>
288+ {
289+ if ( success )
290+ {
291+ if ( Repository != null )
292+ {
293+ Repository . User . Name = value ;
294+ }
295+ else
296+ {
297+ if ( cachedUser == null )
298+ {
299+ cachedUser = new User ( ) ;
300+ }
301+ cachedUser . Name = value ;
302+ }
303+ }
304+ } )
256305 . Then (
257306 GitClient . SetConfig ( "user.email" , newGitEmail , GitConfigSource . User )
258- . Then ( ( success , value ) => { if ( success ) Repository . User . Email = value ; } ) )
259- . FinallyInUI ( ( _ , __ ) => isBusy = false )
307+ . Then ( ( success , value ) =>
308+ {
309+ if ( success )
310+ {
311+ if ( Repository != null )
312+ {
313+ Repository . User . Email = value ;
314+ }
315+ else
316+ {
317+ cachedUser . Email = value ;
318+ userDataHasChanged = true ;
319+ }
320+ }
321+ } ) )
322+ . FinallyInUI ( ( _ , __ ) =>
323+ {
324+ isBusy = false ;
325+ Redraw ( ) ;
326+ } )
260327 . Start ( ) ;
261328 isBusy = true ;
262329 }
263330 }
331+ EditorGUI . EndDisabledGroup ( ) ;
264332 }
333+ EditorGUI . EndDisabledGroup ( ) ;
265334 }
266335
267336 private void OnRepositorySettingsGUI ( )
268337 {
269338 GUILayout . Label ( GitRepositoryTitle , EditorStyles . boldLabel ) ;
339+
270340 EditorGUI . BeginDisabledGroup ( isBusy ) ;
271341 {
272342 newRepositoryRemoteUrl = EditorGUILayout . TextField ( GitRepositoryRemoteLabel + ": " + repositoryRemoteName , newRepositoryRemoteUrl ) ;
273- var needsSaving = newRepositoryRemoteUrl != repositoryRemoteUrl ;
274- EditorGUI . BeginDisabledGroup ( needsSaving ) ;
343+ var needsSaving = newRepositoryRemoteUrl != repositoryRemoteUrl && ! String . IsNullOrEmpty ( newRepositoryRemoteUrl ) ;
344+ EditorGUI . BeginDisabledGroup ( ! needsSaving ) ;
275345 {
276346 if ( GUILayout . Button ( GitRepositorySave , GUILayout . ExpandWidth ( false ) ) )
277347 {
278348 try
279349 {
280350 isBusy = true ;
281- Repository . SetupRemote ( repositoryRemoteName , repositoryRemoteUrl )
351+ Repository . SetupRemote ( repositoryRemoteName , newRepositoryRemoteUrl )
282352 . FinallyInUI ( ( _ , __ ) =>
283353 {
284354 isBusy = false ;
@@ -292,7 +362,9 @@ private void OnRepositorySettingsGUI()
292362 }
293363 }
294364 }
365+ EditorGUI . EndDisabledGroup ( ) ;
295366 }
367+ EditorGUI . EndDisabledGroup ( ) ;
296368 }
297369
298370 private bool ValidateGitInstall ( string path )
0 commit comments