-
Notifications
You must be signed in to change notification settings - Fork 204
/
Copy pathAddRemote.cs
124 lines (107 loc) · 3.95 KB
/
AddRemote.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Threading.Tasks;
namespace SourceGit.ViewModels
{
public class AddRemote : Popup
{
[Required(ErrorMessage = "Remote name is required!!!")]
[RegularExpression(@"^[\w\-\.]+$", ErrorMessage = "Bad remote name format!!!")]
[CustomValidation(typeof(AddRemote), nameof(ValidateRemoteName))]
public string Name
{
get => _name;
set => SetProperty(ref _name, value, true);
}
[Required(ErrorMessage = "Remote URL is required!!!")]
[CustomValidation(typeof(AddRemote), nameof(ValidateRemoteURL))]
public string Url
{
get => _url;
set
{
if (SetProperty(ref _url, value, true))
UseSSH = Models.Remote.IsSSH(value);
}
}
public bool UseSSH
{
get => _useSSH;
set
{
if (SetProperty(ref _useSSH, value))
ValidateProperty(_sshkey, nameof(SSHKey));
}
}
[CustomValidation(typeof(AddRemote), nameof(ValidateSSHKey))]
public string SSHKey
{
get => _sshkey;
set => SetProperty(ref _sshkey, value, true);
}
public AddRemote(Repository repo)
{
_repo = repo;
}
public static ValidationResult ValidateRemoteName(string name, ValidationContext ctx)
{
if (ctx.ObjectInstance is AddRemote add)
{
var exists = add._repo.Remotes.Find(x => x.Name == name);
if (exists != null)
return new ValidationResult("A remote with given name already exists!!!");
}
return ValidationResult.Success;
}
public static ValidationResult ValidateRemoteURL(string url, ValidationContext ctx)
{
if (ctx.ObjectInstance is AddRemote add)
{
if (!Models.Remote.IsValidURL(url))
return new ValidationResult("Bad remote URL format!!!");
var exists = add._repo.Remotes.Find(x => x.URL == url);
if (exists != null)
return new ValidationResult("A remote with the same url already exists!!!");
}
return ValidationResult.Success;
}
public static ValidationResult ValidateSSHKey(string sshkey, ValidationContext ctx)
{
if (ctx.ObjectInstance is AddRemote { _useSSH: true } && !string.IsNullOrEmpty(sshkey))
{
if (!File.Exists(sshkey))
return new ValidationResult("Given SSH private key can NOT be found!");
}
return ValidationResult.Success;
}
public override Task<bool> Sure()
{
_repo.SetWatcherEnabled(false);
ProgressDescription = "Adding remote ...";
var log = _repo.CreateLog("Add Remote");
Use(log);
return Task.Run(() =>
{
var succ = new Commands.Remote(_repo.FullPath).Use(log).Add(_name, _url);
if (succ)
{
new Commands.Config(_repo.FullPath).Use(log).Set($"remote.{_name}.sshkey", _useSSH ? SSHKey : null);
new Commands.Fetch(_repo.FullPath, _name, false, false).Use(log).Exec();
}
log.Complete();
CallUIThread(() =>
{
_repo.MarkFetched();
_repo.MarkBranchesDirtyManually();
_repo.SetWatcherEnabled(true);
});
return succ;
});
}
private readonly Repository _repo = null;
private string _name = string.Empty;
private string _url = string.Empty;
private bool _useSSH = false;
private string _sshkey = string.Empty;
}
}