Esempio n. 1
0
        private List <WebhooksData> GetData(GeminiContext context, bool create, bool update)
        {
            var data = context.GlobalConfigurationWidgetStore.Get <List <WebhooksData> >(AppConstants.AppId);

            if (data == null || data.Value == null)
            {
                data       = new Countersoft.Gemini.Commons.Entity.GlobalConfigurationWidgetData <List <WebhooksData> >();
                data.Value = new List <WebhooksData>();
            }

            if (create && update)
            {
                data.Value.RemoveAll(a => !a.Create && !a.Update);
            }
            else if (create)
            {
                data.Value.RemoveAll(a => !a.Create);
            }
            else if (update)
            {
                data.Value.RemoveAll(a => !a.Update);
            }
            else
            {
                data.Value.RemoveAll(a => a.Create || a.Update);
            }

            return(data.Value);
        }
Esempio n. 2
0
        /// <summary>
        /// Add user with the same domain (superuser) as watcher.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="issueParam"></param>
        /// <param name="user"></param>
        /// <param name="createAudit"></param>
        private void AddSuperuser(GeminiContext context, IssueDto issueParam, User user, bool createAudit)
        {
            try
            {
                IssueDto issue  = issueParam;
                Helper   helper = new Helper();
                if ((issue.CustomFields.Count > 0) && (!issue.CustomFields.Find(field => field.Name.Equals(helper.GetAppConfigValue("customFieldNameDomain"))).ToString().Equals(null)))
                {
                    // Alternatively .Entity.Data could be chosen.
                    string domain = helper.GetFormattedDataErstellerOE(issue);

                    // If there is something to consider
                    if (helper.GetAppConfigValue("blacklist") != null)
                    {
                        // It has to be considered that we already are the superusers of erz.be.ch (and potentially other domains)
                        string   forbiddenDomains = helper.GetAppConfigValue("blacklist");
                        string[] domains          = forbiddenDomains.Split(',');

                        if (!Array.Exists(domains, element => element == domain))
                        {
                            AddWatcherFromDomain(context, domain, issue, user.Id, user.Fullname, createAudit);
                        }
                    }
                    else
                    {
                        AddWatcherFromDomain(context, domain, issue, user.Id, user.Fullname, createAudit);
                    }
                }
            }
            catch (Exception exception)
            {
                GeminiApp.LogException(exception, false, exception.Message);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Adds a watcher if it has the same domain as the email address. Only if user is not watcher as on this task.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="domain"></param>
        /// <param name="issueParam"></param>
        /// <param name="userId"></param>
        /// <param name="username"></param>
        /// <param name="createAudit"></param>
        private void AddWatcherFromDomain(GeminiContext context, string domain, IssueDto issueParam, int userId, string username, bool createAudit)
        {
            try
            {
                IssueDto       issue       = issueParam;
                Helper         helper      = new Helper();
                UserManager    usermanager = new UserManager(GeminiApp.Cache(), GeminiApp.UserContext(), context);
                List <UserDto> users       = usermanager.GetActiveUsers();

                foreach (UserDto user in users)
                {
                    // Only if not already watcher on this task
                    if (!issue.Entity.Watchers.Contains(user.Entity.Id.ToString()))
                    {
                        string activeUserDomain = helper.FindDomain(user.Entity.Email);
                        if (domain == activeUserDomain)
                        {
                            issue.Entity.AddWatcher(user.Entity.Id);

                            if (createAudit)
                            {
                                string watcher = user.Entity.Fullname;
                                helper.CreateAuditlog(context, issue.Id, issue.Project.Id, null, "", watcher, userId, username);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                GeminiApp.LogException(exception, false, exception.Message);
            }
        }
Esempio n. 4
0
        public bool AuthenticateUser(UserDto user, string repositoryUrl, GeminiContext gemini)
        {
            //UserWidgetData<List<UserWidgetDataDetails>> userDataRaw = gemini.UserWidgetStore.Get<List<UserWidgetDataDetails>>(user.Entity.Id, Constants.AppId, Constants.ControlId);

            var allUserDataRaw = gemini.UserWidgetStore.GetAll().Where(f => f.AppId == Constants.AppId && f.ControlId == Constants.ControlId);

            if (allUserDataRaw == null || allUserDataRaw.Count() == 0)
            {
                return(false);
            }

            var data = allUserDataRaw.Select(f => f.Value.FromJson <List <UserWidgetDataDetails> >()).First().Find(s => s.Provider == SourceControlProvider.GitHub && s.RepositoryUrl == repositoryUrl);

            if (data == null)
            {
                return(false);
            }

            if (data.AccessToken.IsEmpty())
            {
                return(false);
            }

            Username = data.Username;

            Password = SecretsHelper.Decrypt(data.Password, SecretsHelper.EncryptionKey);

            AccessToken = data.AccessToken;

            return(true);
        }
Esempio n. 5
0
        /// <summary>
        /// This creates an auditlog (history) for the watcher and custom field manipulations
        /// </summary>
        /// <param name="context"></param>
        /// <param name="issueId"></param>
        /// <param name="issueProjectId"></param>
        /// <param name="customField"></param>
        /// <param name="beforeValue"></param>
        /// <param name="afterValue"></param>
        /// <param name="userId"></param>
        /// <param name="username"></param>
        public void CreateAuditlog(GeminiContext context, int issueId, int issueProjectId, CustomFieldDataDto customField, string beforeValue, string afterValue, int userId, string username)
        {
            try
            {
                IssueAuditManager issueAuditManager = new IssueAuditManager(GeminiApp.Cache(), GeminiApp.UserContext(), context);
                UserManager       userManager       = new UserManager(GeminiApp.Cache(), GeminiApp.UserContext(), context);
                IssueAudit        audit             = issueAuditManager.GetIssueAuditObject(issueId, issueProjectId);
                audit.UserId   = userId;
                audit.Fullname = username;

                if (customField == null)
                {
                    issueAuditManager.LogChange(audit, ItemAttributeVisibility.AssociatedWatchers,
                                                string.Empty, string.Empty, beforeValue, afterValue);
                }
                else
                {
                    issueAuditManager.LogChange(audit, ItemAttributeVisibility.AssociatedCustomFields, customField.Entity.CustomFieldId.ToString(),
                                                string.Empty, string.Empty, beforeValue, afterValue);
                }
            }
            catch (Exception exception)
            {
                GeminiApp.LogException(exception, false, exception.Message);
            }
        }
Esempio n. 6
0
        public void SaveLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini)
        {
            UserWidgetData <UserWidgetDataDetails> userDataRaw = gemini.UserWidgetStore.Get <UserWidgetDataDetails>(user.Entity.Id, Constants.AppId, Constants.ControlId);

            if (userDataRaw == null)
            {
                var data = new UserWidgetData <UserWidgetDataDetails>();

                data.Value = new UserWidgetDataDetails();

                data.Value = userData;

                gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, data.Value);
            }
            else
            {
                userDataRaw.Value.Password = userData.Password;

                userDataRaw.Value.Username = userData.Username;

                userDataRaw.Value.RepositoryUrl = userData.RepositoryUrl;

                gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value);
            }
        }
Esempio n. 7
0
        /// <summary>
        /// This creates an auditlog for the custom field manipulations
        /// </summary>
        /// <param name="context"></param>
        /// <param name="issueId"></param>
        /// <param name="issueProjectId"></param>
        /// <param name="customField"></param>
        /// <param name="beforeValue"></param>
        /// <param name="afterValue"></param>
        public void CreateAuditlog(GeminiContext context, int issueId, int issueProjectId, CustomFieldDataDto customField, string beforeValue, string afterValue)
        {
            IssueAuditManager issueAuditManager = new IssueAuditManager(GeminiApp.Cache(), GeminiApp.UserContext(), context);
            IssueAudit        audit             = issueAuditManager.GetIssueAuditObject(issueId, issueProjectId);

            issueAuditManager.LogChange(audit, ItemAttributeVisibility.AssociatedCustomFields, customField.Entity.CustomFieldId.ToString(),
                                        string.Empty, string.Empty, beforeValue, afterValue);
        }
Esempio n. 8
0
        public string GetFileContent(GeminiContext gemini, int issueid, string repositoryUrl, string filename, string revisionId, bool getPreviousRevision = false)
        {
            if (filename.IsEmpty())
            {
                return(string.Empty);
            }

            if (getPreviousRevision)
            {
                var allIssueCommits = gemini.CodeCommits.GetAll(issueid);

                if (allIssueCommits == null || allIssueCommits.Count() == 0)
                {
                    return(string.Empty);
                }

                var fileCommits = allIssueCommits.Where(f => f.Provider == SourceControlProvider.SVN && f.Data.Contains(repositoryUrl) && f.Data.Contains(filename) && f.Data.Contains(string.Concat("\"RevisionId\":", revisionId)));

                if (fileCommits == null || fileCommits.Count() != 1)
                {
                    return(string.Empty);
                }

                var fileCommitsJson = fileCommits.First().Data.FromJson <SourceControlCommit>();

                revisionId = fileCommitsJson.Files.Where(f => f.Filename == filename).First().PreviousFileRevisionId;

                if (revisionId.IsEmpty())
                {
                    return(string.Empty);
                }
            }

            RestSharp.IRestResponse response;

            try
            {
                response = GetResponse(string.Format("{0}{1}?p={2}", repositoryUrl, filename, revisionId), RestSharp.Method.GET);
            }
            catch (FileNotFoundException ex)
            {
                GeminiApp.LogException(ex, false);

                return(string.Empty);
            }
            catch (UnauthorizedAccessException)
            {
                throw;
            }
            catch (Exception ex)
            {
                GeminiApp.LogException(ex, false);

                return(string.Empty);
            }

            return(response.Content);
        }
Esempio n. 9
0
        public string GetFileContent(GeminiContext gemini, int issueid, string repositoryUrl, string revisionId, string filename, string fileId, bool getPreviousRevision = false)
        {
            if (filename.IsEmpty() || repositoryUrl.IsEmpty())
            {
                return(string.Empty);
            }

            var result = string.Empty;

            if (getPreviousRevision)
            {
                var allIssueCommits = gemini.CodeCommits.GetAll(issueid);

                if (allIssueCommits == null || allIssueCommits.Count() == 0)
                {
                    return(string.Empty);
                }

                var fileCommits = allIssueCommits.Where(f => f.Provider == SourceControlProvider.GitHub && f.Data.Contains(repositoryUrl) && f.Data.Contains(filename) && f.Data.Contains(string.Concat("\"RevisionId\":\"", revisionId, "\"")));

                if (fileCommits == null || fileCommits.Count() != 1)
                {
                    return(string.Empty);
                }

                var fileCommitsJson = fileCommits.First().Data.FromJson <SourceControlCommit>();

                fileId = fileCommitsJson.Files.Where(f => f.Filename == filename).First().PreviousFileRevisionId;
            }

            if (fileId.IsEmpty())
            {
                return(string.Empty);
            }

            RestSharp.IRestResponse response;

            repositoryUrl = repositoryUrl.Replace("https://api.github.com", "https://api.github.com/repos");

            try
            {
                response = GetResponse(string.Format("{0}/git/blobs/{1}", repositoryUrl, fileId), RestSharp.Method.GET);

                result = Encoding.Default.GetString(Convert.FromBase64String(response.Content.FromJson <GitHubFileContent>().content));
            }
            catch (Exception ex)
            {
                GeminiApp.LogException(ex, false);

                return(string.Empty);
            }

            return(result);
        }
Esempio n. 10
0
 private static GlobalConfigurationWidgetData <SlackConfigData> GetConfig(GeminiContext ctx)
 {
     try
     {
         return(ctx.GlobalConfigurationWidgetStore.Get <SlackConfigData>(AppConstants.AppId));
     }
     catch
     {
         return(null);
     }
 }
Esempio n. 11
0
        public void SaveLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini)
        {
            UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId);

            if (userDataRaw == null)
            {
                var data = new UserWidgetData <List <UserWidgetDataDetails> >();

                data.Value = new List <UserWidgetDataDetails>();

                data.Value.Add(userData);

                gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, data.Value);
            }
            else
            {
                /**
                 * We need to make sure there are NO github Authentication records with an empty access token otherwise when we receive the access_token back from them we will not be able to associate that request to the right
                 * Repository with an empty access token
                 * check if there is already an entry for github with empty access token, if yes then delete it
                 */
                var incompleteAuthentication = userDataRaw.Value.Find(f => f.Provider == userData.Provider && f.AccessToken.IsEmpty());

                if (incompleteAuthentication != null)
                {
                    //var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider && f.AccessToken.IsEmpty());
                    DeleteLoginDetails(user, incompleteAuthentication, gemini);

                    userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId);
                }

                var tmpUser = userDataRaw.Value.Find(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider);

                // If a password for this rep already exist, update the details only
                if (tmpUser != null)
                {
                    var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider);

                    userDataRaw.Value[index].Username = userData.Username;

                    userDataRaw.Value[index].Password = userData.Password;

                    userDataRaw.Value[index].AccessToken = userData.AccessToken;
                }
                else
                {
                    // Add a new user authentication for this user
                    userDataRaw.Value.Add(userData);
                }

                gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value);
            }
        }
Esempio n. 12
0
        public void DeleteLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini)
        {
            UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId);

            if (userDataRaw != null)
            {
                var tmpUser = userDataRaw.Value.FindAll(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider);

                // If a password for this rep already exist, update the details only
                if (tmpUser != null)
                {
                    var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider);

                    userDataRaw.Value.RemoveAt(index);
                }

                gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value);
            }
        }
Esempio n. 13
0
        public bool AuthenticateUser(UserDto user, string repositoryUrl, GeminiContext gemini)
        {
            UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId);

            if (userDataRaw == null)
            {
                return(false);
            }

            var data = userDataRaw.Value.Find(f => f.RepositoryUrl == repositoryUrl && f.Provider == SourceControlProvider.Git);

            if (data == null)
            {
                return(false);
            }

            Username = data.Username;

            Password = SecretsHelper.Decrypt(data.Password, SecretsHelper.EncryptionKey);

            return(true);
        }
Esempio n. 14
0
        public void SaveLoginDetails(UserDto user, UserWidgetDataDetails userData, GeminiContext gemini)
        {
            UserWidgetData <List <UserWidgetDataDetails> > userDataRaw = gemini.UserWidgetStore.Get <List <UserWidgetDataDetails> >(user.Entity.Id, Constants.AppId, Constants.ControlId);

            if (userDataRaw == null)
            {
                var data = new UserWidgetData <List <UserWidgetDataDetails> >();

                data.Value = new List <UserWidgetDataDetails>();

                data.Value.Add(userData);

                gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, data.Value);
            }
            else
            {
                var tmpUser = userDataRaw.Value.Find(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider);

                // If a password for this rep already exist, update the details only
                if (tmpUser != null)
                {
                    var index = userDataRaw.Value.FindIndex(f => f.RepositoryUrl == userData.RepositoryUrl && f.Provider == userData.Provider);

                    userDataRaw.Value[index].Password = userData.Password;

                    userDataRaw.Value[index].Username = userData.Username;
                }
                else
                {
                    // Add a new user authentication for this user
                    userDataRaw.Value.Add(userData);
                }

                gemini.UserWidgetStore.Save(user.Entity.Id, Constants.AppId, Constants.ControlId, userDataRaw.Value);
            }
        }
Esempio n. 15
0
        public string GetFileContent(GeminiContext gemini, int issueid, string filename, string fullfilename, string workspace, string changesetid, string fileid, string repositoryUrl, bool getPreviousRevision = false)
        {
            ConnectByImplementingCredentialsProvider connect = new ConnectByImplementingCredentialsProvider();

            ICredentials iCred = new NetworkCredential(Username, Password);

            connect.setLoginDetails(Username, Password, workspace);

            connect.GetCredentials(new Uri(Uri), iCred);

            TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(Uri));

            configurationServer.Credentials = iCred;


            if (TFS2012.IsBasicAuth)
            {
                configurationServer.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred));
            }
            else
            {
                configurationServer.ClientCredentials = new TfsClientCredentials(new WindowsCredential(iCred));
            }

            configurationServer.EnsureAuthenticated();

            CatalogNode catalogNode = configurationServer.CatalogNode;

            ReadOnlyCollection <CatalogNode> tpcNodes = catalogNode.QueryChildren(new Guid[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);

            foreach (CatalogNode tpcNode in tpcNodes)
            {
                Guid tpcId = new Guid(tpcNode.Resource.Properties["InstanceId"]);

                TfsTeamProjectCollection tpc = configurationServer.GetTeamProjectCollection(tpcId);

                if (TFS2012.IsBasicAuth)
                {
                    tpc.ClientCredentials = new TfsClientCredentials(new BasicAuthCredential(iCred));
                }

                VersionControlServer versionControl = (VersionControlServer)tpc.GetService(typeof(VersionControlServer));

                Item file = null;

                try
                {
                    //IF file was just added in tfs
                    if (fileid.ToInt() == 0)
                    {
                        Item tmpFile = null;
                        //Need to catch error if file was deleted, we'll get an error and call the file with parameters as below.
                        //This would only happen to newly added file, which will not have a itemid as we wouldn't know what it is on first commit of a file
                        try
                        {
                            tmpFile = versionControl.GetItem(string.Concat(fullfilename, "/", filename));
                        }
                        catch (VersionControlException ex)
                        {
                            tmpFile = versionControl.GetItem(fullfilename + "/" + filename, VersionSpec.Latest, DeletedState.Deleted);
                        }

                        if (tmpFile != null)
                        {
                            fileid = tmpFile.ItemId.ToString();
                        }
                    }

                    if (fileid.ToInt() > 0)
                    {
                        if (getPreviousRevision)
                        {
                            if (changesetid.ToInt() > 1)
                            {
                                file = versionControl.GetItem(fileid.ToInt(), changesetid.ToInt() - 1, true);
                            }
                        }
                        else
                        {
                            file = versionControl.GetItem(fileid.ToInt(), changesetid.ToInt());
                        }

                        if (file != null)
                        {
                            if (file.DeletionId > 0)
                            {
                                return(string.Empty);
                            }
                            else
                            {
                                using (Stream stream = file.DownloadFile())
                                {
                                    StreamReader rdr = new StreamReader(stream);

                                    return(rdr.ReadToEnd());
                                }
                            }
                        }
                    }
                }
                catch (VersionControlException ex)
                {
                    GeminiApp.LogException(ex, false);

                    return(string.Empty);
                }
                catch (Exception ex)
                {
                    GeminiApp.LogException(ex, false);

                    return(string.Empty);
                }
            }

            return(string.Empty);
        }
Esempio n. 16
0
        public string GetFileContent(GeminiContext gemini, int issueid, string repositoryUrl, string filename, string revisionId, bool getPreviousRevision = false)
        {
            if (filename.IsEmpty())
            {
                return(string.Empty);
            }


            var allIssueCommits = gemini.CodeCommits.GetAll(issueid);

            if (allIssueCommits == null || allIssueCommits.Count() == 0)
            {
                return(string.Empty);
            }

            var fileCommits = allIssueCommits.Where(f => f.Provider == SourceControlProvider.Git && f.Data.Contains(repositoryUrl) && f.Data.Contains(filename) && f.Data.Contains(string.Concat("\"RevisionId\":\"", revisionId, "\"")));

            if (fileCommits == null || fileCommits.Count() != 1)
            {
                return(string.Empty);
            }

            var fileCommitsJson = fileCommits.First().Data.FromJson <SourceControlCommit>();

            var currentFile = fileCommitsJson.Files.Where(s => s.FullFilename == filename);



            if (getPreviousRevision)
            {
                if (currentFile.Count() > 0 && currentFile.First().PreviousFileRevisionId.Equals("deleted", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(string.Empty);
                }

                revisionId = fileCommitsJson.PreviousRevisionId;
            }
            else if (currentFile.Count() > 0 && currentFile.First().FileId.IsEmpty())
            {
                //If fileId is empty means the file was deleted
                return(string.Empty);
            }

            if (revisionId.IsEmpty())
            {
                return(string.Empty);
            }


            RestSharp.IRestResponse response;

            try
            {
                response = GetResponse(string.Format("{0}/Raw/{1}/{2}?display=True", repositoryUrl, revisionId, Uri.EscapeDataString(filename)), RestSharp.Method.GET);
            }
            catch (FileNotFoundException ex)
            {
                GeminiApp.LogException(ex, false);

                return(string.Empty);
            }
            catch (UnauthorizedAccessException)
            {
                throw;
            }
            catch (Exception ex)
            {
                GeminiApp.LogException(ex, false);

                return(string.Empty);
            }

            return(response.Content);
        }
Esempio n. 17
0
 public ReportManager(ICacheContainer cache, UserContext userContext, GeminiContext geminiContext)
     : base(cache, userContext, geminiContext)
 {
 }
Esempio n. 18
0
        public string updateFileIds(GeminiContext gemini, string repositoryUrl, string revisionId, string filename, int issueId)
        {
            var allCommits = gemini.CodeCommits.GetAll(issueId);

            string result = string.Empty;

            if (allCommits != null)
            {
                var sourceCommits = allCommits.Where(f => f.Provider == SourceControlProvider.GitHub);

                if (sourceCommits != null)
                {
                    var commit = sourceCommits.Where(f => f.Data.Contains(string.Concat("\"RevisionId\":\"", revisionId, "\"")) && f.Data.Contains(filename));

                    if (commit != null && commit.Count() > 0)
                    {
                        var data = commit.First().Data.FromJson <SourceControlCommit>();

                        var emptyFileIds = data.Files.Where(f => f.FileId.IsEmpty());

                        // If there are empty fielid's go and get them
                        if (emptyFileIds.Count() > 0)
                        {
                            var githubCommit = GetResponse(string.Concat(data.RepositoryUrl.ReplaceIgnoreCase("https://api.github.com", "https://api.github.com/repos"), "/git/commits/", revisionId), RestSharp.Method.GET);

                            var githubCommitJson = githubCommit.Content.FromJson <TreeUrl>();

                            var githubPreviousCommit = GetResponse(string.Concat(data.RepositoryUrl.ReplaceIgnoreCase("https://api.github.com", "https://api.github.com/repos"), "/git/commits/", githubCommitJson.parents.First().sha), RestSharp.Method.GET);

                            var githubPreviousCommitJson = githubPreviousCommit.Content.FromJson <TreeUrl>();

                            var githubCommitTree = GetResponse(string.Concat(githubCommitJson.tree.url, "?recursive=1"), RestSharp.Method.GET);

                            var githubPreviousCommitTree = GetResponse(string.Concat(githubPreviousCommitJson.tree.url, "?recursive=1"), RestSharp.Method.GET);

                            var gitCommitTreeJson = githubCommitTree.Content.FromJson <TreeFiles>();

                            var gitPreviousCommitTreeJson = githubPreviousCommitTree.Content.FromJson <TreeFiles>();

                            if (gitCommitTreeJson != null || gitPreviousCommitTreeJson != null)
                            {
                                foreach (var blob in data.Files)
                                {
                                    if (gitCommitTreeJson != null)
                                    {
                                        var fileExist = gitCommitTreeJson.tree.Where(f => f.path == blob.Filename);

                                        if (fileExist != null && fileExist.Count() == 1)
                                        {
                                            blob.FileId = fileExist.Select(f => f.sha).First();

                                            if (filename == blob.Filename)
                                            {
                                                result = blob.FileId;
                                            }
                                        }
                                    }

                                    if (gitPreviousCommitTreeJson != null)
                                    {
                                        var fileExist = gitPreviousCommitTreeJson.tree.Where(f => f.path == blob.Filename);

                                        if (fileExist != null && fileExist.Count() == 1)
                                        {
                                            blob.PreviousFileRevisionId = fileExist.Select(f => f.sha).First();
                                        }
                                    }
                                }

                                if (data.PreviousRevisionId.IsEmpty())
                                {
                                    data.PreviousRevisionId = githubCommitJson.parents.First().sha;
                                }

                                commit.First().Data = data.ToJson();
                            }

                            gemini.CodeCommits.Update(commit.First());
                        }
                        else
                        {
                            result = data.Files.Where(f => f.Filename == filename).Select(f => f.FileId).First();
                        }
                    }
                }
            }

            return(result);
        }