public SettingsChangedNotification(string status, Repository repository)
 {
     Status = status;
     RepoName = repository.Name;
     RepoOwner = repository.Owner;
     RequireCla = repository.RequireCla;
 }
Example #2
0
        public async Task<bool> SetCommitStatus(Repository repository, string commitSha, bool isSuccess, string description, string detailsUrl)
        {
            var commitStatusUri = string.Format("https://api.github.com/repos/{0}/{1}/statuses/{2}?access_token={3}", repository.Owner, repository.Name, commitSha, repository.AccessToken);

            var payload = new { state = isSuccess ? "success" : "error", target_url = detailsUrl, description };

            var request = await HttpClient.PostAsync(commitStatusUri, new StringContent(JsonConvert.SerializeObject(payload)));
            return request.IsSuccessStatusCode;
        }
Example #3
0
        public static SettingsViewModel From(Repository repository)
        {
            if (repository == null)
                return null;

            return new SettingsViewModel()
                {
                    AccessToken = repository.AccessToken,
                    LicenseText = repository.LicenseText,
                    RepoName = repository.Name,
                    RequireCla = repository.RequireCla,
                    RepoOwner = repository.Owner
                };
        }
Example #4
0
        public async Task<ActionResult> Settings(SettingsViewModel model)
        {
            if (!ModelState.IsValid) 
                return View(model);

            // TODO: Setup/move validation to EF model?
            // TODO: Support ajax submit?
            // TODO: Wrap in a try/catch

            var repository = DataContext.Repositories.Where(model.RepoOwner, model.RepoName);
            if (repository != null)
            {
                repository.AccessToken = model.AccessToken;
                repository.RequireCla = model.RequireCla;
                repository.LicenseText = model.LicenseText;
            }
            else
            {
                repository = new Repository(
                    owner: model.RepoOwner,
                    name: model.RepoName,
                    requireCla: model.RequireCla,
                    accessToken: model.AccessToken,
                    licenseText: model.LicenseText);
                DataContext.Repositories.Add(repository);
            }

            DataContext.SaveChanges();

            await GitHubService.EnableWebHook(repository);

            TempData["settingsChanged"] = new SettingsChangedNotification(repository.RequireCla ? "success" : "warning", repository);
            return Redirect(string.Format("/{0}/{1}/", model.RepoOwner, model.RepoName));
        }
Example #5
0
        private async Task<IEnumerable<Task<bool>>> UpdateCommitsFor(Repository repository, string committer)
        {
            var pullRequests = await GitHubService.GetPullRequests(repository.Owner, repository.Name);

            var tasks = new List<Task<bool>>();

            foreach (var pullRequest in pullRequests.Where(pr => pr.RequesterUsername.Equals(committer, StringComparison.InvariantCultureIgnoreCase)))
            {
                    tasks.Add(GitHubService.SetCommitStatus(repository, pullRequest.HeadCommitSha, true,
                                                  committer + " has signed this repository's CLA.",
                                                  string.Format("{2}/{0}/{1}/", repository.Owner, repository.Name, Signatory.Settings.Authority)));
            }

            return tasks;
        }
Example #6
0
        public async Task<bool> EnableWebHook(Repository repository)
        {
            var createHook = string.Format("https://api.github.com/repos/{0}/{1}/hooks?access_token={2}", repository.Owner, repository.Name, repository.AccessToken);

            var payload = new { name = "web", active = true, events = new[] { "pull_request" }, config = new { url = Settings.Authority + "hook", content_type = "json", secret = Guid.NewGuid().ToString()} };

            var serializeObject = JsonConvert.SerializeObject(payload);
            var request = await HttpClient.PostAsync(createHook, new StringContent(serializeObject));
            return request.IsSuccessStatusCode;
        }