Skip to content

Commit f6b2481

Browse files
committed
Added lock, unlock and unlock force menu items.
1 parent 70a6834 commit f6b2481

File tree

2 files changed

+133
-6
lines changed

2 files changed

+133
-6
lines changed

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics;
7+
using System.IO;
78
using System.Threading.Tasks;
89
using UnityEngine;
910

@@ -23,6 +24,8 @@ public static class Git
2324
public static string GitLFSPath => "/usr/local/bin/git-lfs";
2425
#endif
2526

27+
public static string RepoPath => $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}";
28+
2629
private static Process GenerateProcess(string path, string arguments)
2730
{
2831

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

112115
}
113116

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

@@ -145,6 +159,23 @@ public static async Task<string[]> LockedFiles()
145159

146160
}
147161

162+
public static async Task LockFile(string path)
163+
{
164+
165+
var process = await GenerateProcessAsync(GitLFSPath,
166+
$@"lock ""{path.Replace(RepoPath, "")}""");
167+
168+
if (process?.StandardError.ReadLine() is string line && line.StartsWith("Lock failed: missing protocol"))
169+
{
170+
171+
throw new Exception("Locking requires git repo has been pushed to a remote.");
172+
173+
}
174+
175+
process?.WaitForExit();
176+
177+
}
178+
148179
public static async Task<string> Status()
149180
{
150181

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

162193
}
163194

195+
public static async Task UnlockFile(string path)
196+
{
197+
198+
var process = await GenerateProcessAsync(GitLFSPath,
199+
$@"unlock ""{path.Replace(RepoPath, "")}""");
200+
201+
process?.WaitForExit();
202+
203+
}
204+
164205
public static async Task<string[]> UntrackedFiles()
165206
{
166207

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

Lines changed: 92 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,84 @@ 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+
try
114+
{
115+
116+
await Git.LockFile(GetSelectedAbsolutePath());
117+
118+
}
119+
catch (Exception error)
120+
{
121+
122+
EditorUtility.DisplayDialog("Error", error.Message, "Ok");
123+
124+
}
125+
126+
}
127+
128+
[MenuItem("Git/Unlock File", true, PRIORITY)]
129+
[MenuItem("Assets/Unlock File", true, PRIORITY)]
130+
private static bool ValidateUnlockFile()
131+
{
132+
133+
return Selection.activeObject && File.Exists(GetSelectedAbsolutePath()) &&
134+
GitStatus.lockedFiles.Contains(GetSelectedRelativePath());
135+
136+
}
137+
138+
[MenuItem("Git/Unlock File", false, PRIORITY)]
139+
[MenuItem("Assets/Unlock File", false, PRIORITY)]
140+
private static async void UnlockFile()
141+
{
142+
143+
await Git.UnlockFile(GetSelectedAbsolutePath());
144+
145+
}
146+
147+
[MenuItem("Git/Force Unlock File", true, PRIORITY)]
148+
[MenuItem("Assets/Force Unlock File", true, PRIORITY)]
149+
private static bool ValidateForceUnlockFile()
150+
{
151+
152+
return Selection.activeObject && File.Exists(GetSelectedAbsolutePath()) &&
153+
GitStatus.lockedFiles.Contains(GetSelectedRelativePath());
154+
155+
}
156+
157+
[MenuItem("Git/Force Unlock File", false, PRIORITY)]
158+
[MenuItem("Assets/Force Unlock File", false, PRIORITY)]
159+
private static async void ForceUnlockFile()
160+
{
161+
162+
if (EditorUtility.DisplayDialog(
163+
"Force unlock file",
164+
$"Are you sure you want to force unlock {Selection.activeObject.name}?",
165+
"Yes",
166+
"Cancel"))
167+
{
168+
169+
await Git.ForceUnlockFile(GetSelectedAbsolutePath());
170+
171+
}
86172

87173
}
88174

0 commit comments

Comments
 (0)