1
+ using System ;
1
2
using GitHub . Logging ;
2
3
using System . Collections . Generic ;
3
4
using System . Linq ;
4
5
using UnityEditor ;
5
6
using UnityEngine ;
7
+ using Object = UnityEngine . Object ;
6
8
7
9
namespace GitHub . Unity
8
10
{
@@ -81,138 +83,96 @@ private static void RepositoryOnLocksChanged(CacheUpdateEvent cacheUpdateEvent)
81
83
}
82
84
}
83
85
84
- [ MenuItem ( AssetsMenuRequestLock , true ) ]
86
+ [ MenuItem ( AssetsMenuRequestLock , true , 10000 ) ]
85
87
private static bool ContextMenu_CanLock ( )
86
88
{
87
89
if ( ! EnsureInitialized ( ) )
88
90
return false ;
89
91
if ( isBusy )
90
92
return false ;
91
-
92
93
return Selection . objects . Any ( IsObjectUnlocked ) ;
93
94
}
94
95
95
- private static bool IsObjectUnlocked ( Object selected )
96
+ [ MenuItem ( AssetsMenuReleaseLock , true , 10001 ) ]
97
+ private static bool ContextMenu_CanUnlock ( )
96
98
{
97
- if ( selected == null )
99
+ if ( ! EnsureInitialized ( ) )
98
100
return false ;
99
-
100
- NPath assetPath = AssetDatabase . GetAssetPath ( selected . GetInstanceID ( ) ) . ToNPath ( ) ;
101
- NPath repositoryPath = manager . Environment . GetRepositoryPath ( assetPath ) ;
102
-
103
- var alreadyLocked = locks . Any ( x => repositoryPath == x . Path ) ;
104
- GitFileStatus status = GitFileStatus . None ;
105
- if ( entries != null )
106
- {
107
- status = entries . FirstOrDefault ( x => repositoryPath == x . Path . ToNPath ( ) ) . Status ;
108
- }
109
-
110
- return ! alreadyLocked && status != GitFileStatus . Untracked && status != GitFileStatus . Ignored ;
111
- }
112
-
113
- [ MenuItem ( AssetsMenuRequestLock ) ]
114
- private static void ContextMenu_Lock ( )
115
- {
116
- isBusy = true ;
117
-
118
- var unlockedObjects = Selection . objects . Where ( IsObjectUnlocked ) . ToArray ( ) ;
119
- var tasks = unlockedObjects . Select ( CreateLockObjectTask ) . ToArray ( ) ;
120
-
121
- var taskQueue = new TaskQueue ( ) ;
122
- foreach ( var task in tasks )
123
- {
124
- taskQueue . Queue ( task ) ;
125
- }
126
-
127
- taskQueue . FinallyInUI ( ( success , exception ) =>
128
- {
129
- if ( ! success )
130
- {
131
- var error = exception . Message ;
132
- if ( error . Contains ( "exit status 255" ) )
133
- error = "Failed to lock: no permissions" ;
134
- EditorUtility . DisplayDialog ( Localization . RequestLockActionTitle ,
135
- error ,
136
- Localization . Ok ) ;
137
- }
138
-
139
- isBusy = false ;
140
- Selection . activeGameObject = null ;
141
- } ) . Start ( ) ;
142
- }
143
-
144
- private static ITask CreateLockObjectTask ( Object selected )
145
- {
146
- NPath assetPath = AssetDatabase . GetAssetPath ( selected . GetInstanceID ( ) ) . ToNPath ( ) ;
147
- NPath repositoryPath = manager . Environment . GetRepositoryPath ( assetPath ) ;
148
-
149
- var task = Repository . RequestLock ( repositoryPath ) ;
150
- task . OnEnd += ( _ , s , ___ ) => { if ( s ) manager . TaskManager . Run ( manager . UsageTracker . IncrementUnityProjectViewContextLfsLock , null ) ; } ;
151
- return task ;
101
+ if ( isBusy )
102
+ return false ;
103
+ return Selection . objects . Any ( IsObjectLocked ) ;
152
104
}
153
105
154
- [ MenuItem ( AssetsMenuReleaseLock , true , 1000 ) ]
155
- private static bool ContextMenu_CanUnlock ( )
106
+ [ MenuItem ( AssetsMenuReleaseLockForced , true , 10002 ) ]
107
+ private static bool ContextMenu_CanUnlockForce ( )
156
108
{
157
109
if ( ! EnsureInitialized ( ) )
158
110
return false ;
159
111
if ( isBusy )
160
112
return false ;
161
-
162
113
return Selection . objects . Any ( IsObjectLocked ) ;
163
114
}
164
115
165
- private static bool IsObjectLocked ( Object selected )
116
+ [ MenuItem ( AssetsMenuRequestLock , false , 10000 ) ]
117
+ private static void ContextMenu_Lock ( )
166
118
{
167
- if ( selected == null )
168
- return false ;
169
-
170
- NPath assetPath = AssetDatabase . GetAssetPath ( selected . GetInstanceID ( ) ) . ToNPath ( ) ;
171
- NPath repositoryPath = manager . Environment . GetRepositoryPath ( assetPath ) ;
172
-
173
- return locks . Any ( x => repositoryPath == x . Path ) ;
119
+ RunLockUnlock ( IsObjectUnlocked , CreateLockObjectTask , Localization . RequestLockActionTitle , "Failed to lock: no permissions" ) ;
174
120
}
175
121
176
- [ MenuItem ( AssetsMenuReleaseLock , false , 1000 ) ]
122
+ [ MenuItem ( AssetsMenuReleaseLockForced , false , 10001 ) ]
177
123
private static void ContextMenu_Unlock ( )
178
124
{
179
- isBusy = true ;
125
+ RunLockUnlock ( IsObjectLocked , x => CreateUnlockObjectTask ( x , false ) , Localization . ReleaseLockActionTitle , "Failed to unlock: no permissions" ) ;
126
+ }
180
127
181
- var lockedObjects = Selection . objects . Where ( IsObjectLocked ) . ToArray ( ) ;
182
- var tasks = lockedObjects . Select ( o => CreateUnlockObjectTask ( o , false ) ) . ToArray ( ) ;
128
+ [ MenuItem ( AssetsMenuReleaseLockForced , false , 10002 ) ]
129
+ private static void ContextMenu_UnlockForce ( )
130
+ {
131
+ RunLockUnlock ( IsObjectLocked , x => CreateUnlockObjectTask ( x , true ) , Localization . ReleaseLockActionTitle , "Failed to unlock: no permissions" ) ;
132
+ }
183
133
134
+ private static void RunLockUnlock ( Func < Object , bool > selector , Func < Object , ITask > creator , string title , string errorMessage )
135
+ {
136
+ isBusy = true ;
184
137
var taskQueue = new TaskQueue ( ) ;
185
- foreach ( var task in tasks )
138
+ foreach ( var lockedObject in Selection . objects . Where ( selector ) )
186
139
{
187
- taskQueue . Queue ( task ) ;
140
+ taskQueue . Queue ( creator ( lockedObject ) ) ;
188
141
}
189
-
190
142
taskQueue . FinallyInUI ( ( success , exception ) =>
191
143
{
192
144
if ( ! success )
193
145
{
194
146
var error = exception . Message ;
195
147
if ( error . Contains ( "exit status 255" ) )
196
- error = "Failed to unlock: no permissions" ;
197
- EditorUtility . DisplayDialog ( Localization . RequestLockActionTitle ,
198
- error ,
199
- Localization . Ok ) ;
148
+ error = errorMessage ;
149
+ EditorUtility . DisplayDialog ( title , error , Localization . Ok ) ;
200
150
}
201
-
202
151
isBusy = false ;
203
- Selection . activeGameObject = null ;
204
- } ) . Start ( ) ;
152
+ } ) ;
153
+ taskQueue . Start ( ) ;
205
154
}
206
155
207
- [ MenuItem ( AssetsMenuReleaseLockForced , true , 1000 ) ]
208
- private static bool ContextMenu_CanUnlockForce ( )
156
+ private static bool IsObjectUnlocked ( Object selected )
209
157
{
210
- if ( ! EnsureInitialized ( ) )
211
- return false ;
212
- if ( isBusy )
158
+ if ( selected == null )
213
159
return false ;
214
160
215
- var selected = Selection . activeObject ;
161
+ NPath assetPath = AssetDatabase . GetAssetPath ( selected . GetInstanceID ( ) ) . ToNPath ( ) ;
162
+ NPath repositoryPath = manager . Environment . GetRepositoryPath ( assetPath ) ;
163
+
164
+ var alreadyLocked = locks . Any ( x => repositoryPath == x . Path ) ;
165
+ GitFileStatus status = GitFileStatus . None ;
166
+ if ( entries != null )
167
+ {
168
+ status = entries . FirstOrDefault ( x => repositoryPath == x . Path . ToNPath ( ) ) . Status ;
169
+ }
170
+
171
+ return ! alreadyLocked && status != GitFileStatus . Untracked && status != GitFileStatus . Ignored ;
172
+ }
173
+
174
+ private static bool IsObjectLocked ( Object selected )
175
+ {
216
176
if ( selected == null )
217
177
return false ;
218
178
@@ -222,40 +182,24 @@ private static bool ContextMenu_CanUnlockForce()
222
182
return locks . Any ( x => repositoryPath == x . Path ) ;
223
183
}
224
184
225
- [ MenuItem ( AssetsMenuReleaseLockForced , false , 1000 ) ]
226
- private static void ContextMenu_UnlockForce ( )
185
+ private static ITask CreateUnlockObjectTask ( Object selected , bool force )
227
186
{
228
- isBusy = true ;
229
-
230
- var lockedObjects = Selection . objects . Where ( IsObjectLocked ) . ToArray ( ) ;
231
- var tasks = lockedObjects . Select ( o => CreateUnlockObjectTask ( o , true ) ) . ToArray ( ) ;
232
-
233
- var taskQueue = new TaskQueue ( ) ;
234
- foreach ( var task in tasks )
235
- {
236
- taskQueue . Queue ( task ) ;
237
- }
187
+ NPath assetPath = AssetDatabase . GetAssetPath ( selected . GetInstanceID ( ) ) . ToNPath ( ) ;
188
+ NPath repositoryPath = manager . Environment . GetRepositoryPath ( assetPath ) ;
238
189
239
- taskQueue . FinallyInUI ( ( success , exception ) =>
240
- {
241
- isBusy = false ;
242
- Selection . activeGameObject = null ;
243
- } ) . Start ( ) ;
190
+ var task = Repository . ReleaseLock ( repositoryPath , force ) ;
191
+ task . OnEnd += ( _ , s , __ ) => { if ( s ) manager . TaskManager . Run ( manager . UsageTracker . IncrementUnityProjectViewContextLfsUnlock , null ) ; } ;
192
+ return task ;
244
193
}
245
194
246
- private static ITask CreateUnlockObjectTask ( Object selected , bool force )
195
+ private static ITask CreateLockObjectTask ( Object selected )
247
196
{
248
197
NPath assetPath = AssetDatabase . GetAssetPath ( selected . GetInstanceID ( ) ) . ToNPath ( ) ;
249
198
NPath repositoryPath = manager . Environment . GetRepositoryPath ( assetPath ) ;
250
199
251
- return Repository . ReleaseLock ( repositoryPath , force )
252
- . FinallyInUI ( ( success , ex ) =>
253
- {
254
- if ( success )
255
- {
256
- manager . TaskManager . Run ( manager . UsageTracker . IncrementUnityProjectViewContextLfsUnlock , null ) ;
257
- }
258
- } ) ;
200
+ var task = Repository . RequestLock ( repositoryPath ) ;
201
+ task . OnEnd += ( _ , s , ___ ) => { if ( s ) manager . TaskManager . Run ( manager . UsageTracker . IncrementUnityProjectViewContextLfsLock , null ) ; } ;
202
+ return task ;
259
203
}
260
204
261
205
private static void OnLocksUpdate ( )
0 commit comments