From 9e4a2eb24ad1882cee1cc9d43f0af0faff2ba861 Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Thu, 10 Sep 2020 14:30:00 +0300 Subject: Working on Tango.Git and Tag creation upon release. --- .../Tango.Git/GitRepositoryManager.cs | 132 +++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 Software/Visual_Studio/Tango.Git/GitRepositoryManager.cs (limited to 'Software/Visual_Studio/Tango.Git/GitRepositoryManager.cs') diff --git a/Software/Visual_Studio/Tango.Git/GitRepositoryManager.cs b/Software/Visual_Studio/Tango.Git/GitRepositoryManager.cs new file mode 100644 index 000000000..e7fdf8e32 --- /dev/null +++ b/Software/Visual_Studio/Tango.Git/GitRepositoryManager.cs @@ -0,0 +1,132 @@ +using LibGit2Sharp; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core; + +namespace Tango.Git +{ + public class GitRepositoryManager : IDisposable + { + private Repository _repo; + private String _pat; + private String _userEmail; + + public event EventHandler> Progress; + + public GitRepositoryManager(String localFolder, String userEmail, String personalAccessToken) + { + _pat = personalAccessToken; + _userEmail = userEmail; + _repo = new Repository(localFolder); + } + + public void CreatePushTag(String name, String description, String userName) + { + var tag = _repo.ApplyTag(name, new Signature(userName, _userEmail, DateTime.Now), description); + + _repo.Network.Push(_repo.Network.Remotes.First(), tag.CanonicalName, new PushOptions() + { + CredentialsProvider = new LibGit2Sharp.Handlers.CredentialsHandler(CredentialsHandlerMethod), + OnPushTransferProgress = new LibGit2Sharp.Handlers.PushTransferProgressHandler(PushTagProgressHandlerMethod) + }); + } + + private bool PushTagProgressHandlerMethod(int current, int total, long bytes) + { + //TODO: Implement via TangoProgress & event... + RaiseProgress("Pushing Tag...", false, 0, total); + return true; + } + + public List GetOutgoingCommits(String branchName = "master") + { + List commits = new List(); + + var branch = _repo.Branches.FirstOrDefault(x => x.FriendlyName == branchName); + + if (branch.TrackingDetails.AheadBy != null) + { + foreach (var commit in _repo.Commits.Take(branch.TrackingDetails.AheadBy.Value)) + { + commits.Add(new GitCommit() + { + Message = commit.Message + }); + } + } + + return commits; + } + + public List GetIncomingCommits() + { + List commits = new List(); + + var trackingBranch = _repo.Head.TrackedBranch; + var log = _repo.Commits.QueryBy(new CommitFilter { IncludeReachableFrom = trackingBranch.Tip.Id, ExcludeReachableFrom = _repo.Head.Tip.Id }); + + var count = log.Count(); + + foreach (var commit in log) + { + commits.Add(new GitCommit() + { + Message = commit.Message + }); + } + + return commits; + } + + public List GetChanges() + { + List files = new List(); + + var status = _repo.RetrieveStatus(); + + foreach (var file in status.Added) + { + files.Add(new GitFile() + { + File = file.FilePath, + State = GitFileState.Added + }); + } + + foreach (var file in status.Modified) + { + files.Add(new GitFile() + { + File = file.FilePath, + State = GitFileState.Modified + }); + } + + return files; + } + + private Credentials CredentialsHandlerMethod(string url, string usernameFromUrl, SupportedCredentialTypes types) + { + return new UsernamePasswordCredentials { Username = _userEmail, Password = _pat }; + } + + protected virtual void RaiseProgress(String message, bool isIndeterminate = true, double value = 0, double maximum = 100) + { + Progress?.Invoke(this, new TangoProgressChangedEventArgs(new TangoProgress() + { + IsIndeterminate = isIndeterminate, + Message = message, + Value = value, + Maximum = maximum + })); + } + + public void Dispose() + { + _repo.Dispose(); + } + } +} -- cgit v1.3.1