Skip to content

Commit 8543a4c

Browse files
committed
Added lock, unlock and unlock force menu items.
1 parent efab8c1 commit 8543a4c

File tree

2 files changed

+116
-6
lines changed

2 files changed

+116
-6
lines changed

Assets/Plugins/CandyCoded.GitStatus/Scripts/CustomEditor/Git.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics;
7+
using System.IO;
78
using System.Threading.Tasks;
89
using UnityEngine;
10+
using Debug = UnityEngine.Debug;
911

1012
namespace CandyCoded.GitStatus
1113
{
@@ -23,6 +25,8 @@ public static class Git
2325
public static string GitLFSPath => "/usr/local/bin/git-lfs";
2426
#endif
2527

28+
public static string RepoPath => $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}";
29+
2630
private static Task<Process> GenerateProcess(string path, string arguments)
2731
{
2832

@@ -111,6 +115,17 @@ public static async Task DiscardChanges(string path)
111115

112116
}
113117

118+
public static async Task ForceUnlockFile(string path)
119+
{
120+
121+
var process =
122+
await GenerateProcess(GitLFSPath,
123+
$@"unlock ""{path.Replace(RepoPath, "")}"" --force");
124+
125+
process?.WaitForExit();
126+
127+
}
128+
114129
public static async Task Init()
115130
{
116131

@@ -145,6 +160,16 @@ public static async Task<string[]> LockedFiles()
145160

146161
}
147162

163+
public static async Task LockFile(string path)
164+
{
165+
166+
var process = await GenerateProcess(GitLFSPath,
167+
$@"lock ""{path.Replace(RepoPath, "")}""");
168+
169+
process?.WaitForExit();
170+
171+
}
172+
148173
public static async Task<string> Status()
149174
{
150175

@@ -161,6 +186,16 @@ public static async Task<string> Status()
161186

162187
}
163188

189+
public static async Task UnlockFile(string path)
190+
{
191+
192+
var process = await GenerateProcess(GitLFSPath,
193+
$@"unlock ""{path.Replace(RepoPath, "")}""");
194+
195+
process?.WaitForExit();
196+
197+
}
198+
164199
public static async Task<string[]> UntrackedFiles()
165200
{
166201

Assets/Plugins/CandyCoded.GitStatus/Scripts/CustomEditor/GitMenuItems.cs

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#if UNITY_EDITOR
44
using System;
55
using System.IO;
6+
using System.Linq;
67
using UnityEditor;
78

89
namespace CandyCoded.GitStatus
@@ -13,10 +14,17 @@ public static class GitMenuItems
1314

1415
private const int PRIORITY = 5000;
1516

16-
private static string GetSelectedPath()
17+
private static string GetSelectedAbsolutePath()
1718
{
1819

19-
return Path.Combine(Environment.CurrentDirectory, AssetDatabase.GetAssetPath(Selection.activeObject));
20+
return Path.Combine(Environment.CurrentDirectory, GetSelectedRelativePath());
21+
22+
}
23+
24+
private static string GetSelectedRelativePath()
25+
{
26+
27+
return AssetDatabase.GetAssetPath(Selection.activeObject);
2028

2129
}
2230

@@ -28,7 +36,7 @@ private static async void DiscardChanges()
2836
try
2937
{
3038

31-
await Git.DiscardChanges(GetSelectedPath());
39+
await Git.DiscardChanges(GetSelectedAbsolutePath());
3240

3341
}
3442
catch (Exception error)
@@ -45,7 +53,8 @@ private static async void DiscardChanges()
4553
private static bool ValidateDiscardChanges()
4654
{
4755

48-
return Selection.activeObject && File.Exists(GetSelectedPath());
56+
return Selection.activeObject && File.Exists(GetSelectedAbsolutePath()) &&
57+
GitStatus.changedFiles.Contains(GetSelectedRelativePath());
4958

5059
}
5160

@@ -63,7 +72,7 @@ private static async void DiscardAllChanges()
6372
try
6473
{
6574

66-
await Git.DiscardChanges(GetSelectedPath());
75+
await Git.DiscardChanges(GetSelectedAbsolutePath());
6776

6877
}
6978
catch (Exception error)
@@ -82,7 +91,73 @@ private static async void DiscardAllChanges()
8291
private static bool ValidateDiscardAllChanges()
8392
{
8493

85-
return Selection.activeObject && Directory.Exists(GetSelectedPath());
94+
return Selection.activeObject && Directory.Exists(GetSelectedAbsolutePath());
95+
96+
}
97+
98+
[MenuItem("Git/Lock File", true, PRIORITY)]
99+
[MenuItem("Assets/Lock File", true, PRIORITY)]
100+
private static bool ValidateLockFile()
101+
{
102+
103+
return Selection.activeObject && File.Exists(GetSelectedAbsolutePath()) &&
104+
!GitStatus.lockedFiles.Contains(GetSelectedRelativePath());
105+
106+
}
107+
108+
[MenuItem("Git/Lock File", false, PRIORITY)]
109+
[MenuItem("Assets/Lock File", false, PRIORITY)]
110+
private static async void LockFile()
111+
{
112+
113+
await Git.LockFile(GetSelectedAbsolutePath());
114+
115+
}
116+
117+
[MenuItem("Git/Unlock File", true, PRIORITY)]
118+
[MenuItem("Assets/Unlock File", true, PRIORITY)]
119+
private static bool ValidateUnlockFile()
120+
{
121+
122+
return Selection.activeObject && File.Exists(GetSelectedAbsolutePath()) &&
123+
GitStatus.lockedFiles.Contains(GetSelectedRelativePath());
124+
125+
}
126+
127+
[MenuItem("Git/Unlock File", false, PRIORITY)]
128+
[MenuItem("Assets/Unlock File", false, PRIORITY)]
129+
private static async void UnlockFile()
130+
{
131+
132+
await Git.UnlockFile(GetSelectedAbsolutePath());
133+
134+
}
135+
136+
[MenuItem("Git/Force Unlock File", true, PRIORITY)]
137+
[MenuItem("Assets/Force Unlock File", true, PRIORITY)]
138+
private static bool ValidateForceUnlockFile()
139+
{
140+
141+
return Selection.activeObject && File.Exists(GetSelectedAbsolutePath()) &&
142+
GitStatus.lockedFiles.Contains(GetSelectedRelativePath());
143+
144+
}
145+
146+
[MenuItem("Git/Force Unlock File", false, PRIORITY)]
147+
[MenuItem("Assets/Force Unlock File", false, PRIORITY)]
148+
private static async void ForceUnlockFile()
149+
{
150+
151+
if (EditorUtility.DisplayDialog(
152+
"Force unlock file",
153+
$"Are you sure you want to force unlock {Selection.activeObject.name}?",
154+
"Yes",
155+
"Cancel"))
156+
{
157+
158+
await Git.ForceUnlockFile(GetSelectedAbsolutePath());
159+
160+
}
86161

87162
}
88163

0 commit comments

Comments
 (0)