mirror of
https://github.com/chylex/Code-Statistics.git
synced 2025-05-29 12:34:05 +02:00
Work on GitHub (branch list, repo download, basic form)
This commit is contained in:
parent
1693f300bd
commit
cba89fc070
CodeStatistics
8
CodeStatistics/App.config
Normal file
8
CodeStatistics/App.config
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<system.net>
|
||||
<settings>
|
||||
<httpWebRequest useUnsafeHeaderParsing="true" />
|
||||
</settings>
|
||||
</system.net>
|
||||
</configuration>
|
@ -53,6 +53,7 @@
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
@ -154,6 +155,9 @@
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
140
CodeStatistics/Forms/GitHubForm.Designer.cs
generated
Normal file
140
CodeStatistics/Forms/GitHubForm.Designer.cs
generated
Normal file
@ -0,0 +1,140 @@
|
||||
namespace CodeStatistics.Forms {
|
||||
partial class GitHubForm {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if (disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.textBoxRepository = new System.Windows.Forms.TextBox();
|
||||
this.labelRepository = new System.Windows.Forms.Label();
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.btnListBranches = new System.Windows.Forms.Button();
|
||||
this.labelBranch = new System.Windows.Forms.Label();
|
||||
this.listBranches = new System.Windows.Forms.ComboBox();
|
||||
this.btnDownload = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// textBoxRepository
|
||||
//
|
||||
this.textBoxRepository.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.textBoxRepository.Location = new System.Drawing.Point(15, 25);
|
||||
this.textBoxRepository.Name = "textBoxRepository";
|
||||
this.textBoxRepository.Size = new System.Drawing.Size(298, 20);
|
||||
this.textBoxRepository.TabIndex = 0;
|
||||
//
|
||||
// labelRepository
|
||||
//
|
||||
this.labelRepository.AutoSize = true;
|
||||
this.labelRepository.BackColor = System.Drawing.Color.Transparent;
|
||||
this.labelRepository.Location = new System.Drawing.Point(12, 9);
|
||||
this.labelRepository.Name = "labelRepository";
|
||||
this.labelRepository.Size = new System.Drawing.Size(91, 13);
|
||||
this.labelRepository.TabIndex = 1;
|
||||
this.labelRepository.Text = "Repository Name:";
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnCancel.Location = new System.Drawing.Point(238, 113);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnCancel.TabIndex = 2;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
|
||||
//
|
||||
// btnListBranches
|
||||
//
|
||||
this.btnListBranches.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnListBranches.Location = new System.Drawing.Point(139, 113);
|
||||
this.btnListBranches.Name = "btnListBranches";
|
||||
this.btnListBranches.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnListBranches.TabIndex = 3;
|
||||
this.btnListBranches.Text = "List Branches";
|
||||
this.btnListBranches.UseVisualStyleBackColor = true;
|
||||
this.btnListBranches.Click += new System.EventHandler(this.btnListBranches_Click);
|
||||
//
|
||||
// labelBranch
|
||||
//
|
||||
this.labelBranch.AutoSize = true;
|
||||
this.labelBranch.BackColor = System.Drawing.Color.Transparent;
|
||||
this.labelBranch.Location = new System.Drawing.Point(12, 57);
|
||||
this.labelBranch.Name = "labelBranch";
|
||||
this.labelBranch.Size = new System.Drawing.Size(44, 13);
|
||||
this.labelBranch.TabIndex = 4;
|
||||
this.labelBranch.Text = "Branch:";
|
||||
//
|
||||
// listBranches
|
||||
//
|
||||
this.listBranches.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.listBranches.FormattingEnabled = true;
|
||||
this.listBranches.Location = new System.Drawing.Point(15, 73);
|
||||
this.listBranches.Name = "listBranches";
|
||||
this.listBranches.Size = new System.Drawing.Size(298, 21);
|
||||
this.listBranches.TabIndex = 6;
|
||||
//
|
||||
// btnDownload
|
||||
//
|
||||
this.btnDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnDownload.Location = new System.Drawing.Point(58, 113);
|
||||
this.btnDownload.Name = "btnDownload";
|
||||
this.btnDownload.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnDownload.TabIndex = 7;
|
||||
this.btnDownload.Text = "Download";
|
||||
this.btnDownload.UseVisualStyleBackColor = true;
|
||||
this.btnDownload.Click += new System.EventHandler(this.btnDownload_Click);
|
||||
//
|
||||
// GitHubForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.White;
|
||||
this.ClientSize = new System.Drawing.Size(325, 148);
|
||||
this.Controls.Add(this.btnDownload);
|
||||
this.Controls.Add(this.listBranches);
|
||||
this.Controls.Add(this.labelBranch);
|
||||
this.Controls.Add(this.btnListBranches);
|
||||
this.Controls.Add(this.btnCancel);
|
||||
this.Controls.Add(this.labelRepository);
|
||||
this.Controls.Add(this.textBoxRepository);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.MaximizeBox = false;
|
||||
this.Name = "GitHubForm";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Load += new System.EventHandler(this.OnLoad);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TextBox textBoxRepository;
|
||||
private System.Windows.Forms.Label labelRepository;
|
||||
private System.Windows.Forms.Button btnCancel;
|
||||
private System.Windows.Forms.Button btnListBranches;
|
||||
private System.Windows.Forms.Label labelBranch;
|
||||
private System.Windows.Forms.ComboBox listBranches;
|
||||
private System.Windows.Forms.Button btnDownload;
|
||||
}
|
||||
}
|
45
CodeStatistics/Forms/GitHubForm.cs
Normal file
45
CodeStatistics/Forms/GitHubForm.cs
Normal file
@ -0,0 +1,45 @@
|
||||
using CodeStatistics.Input.Methods;
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace CodeStatistics.Forms{
|
||||
public partial class GitHubForm : Form{
|
||||
public GitHub GitHub { get; private set; }
|
||||
|
||||
public GitHubForm(){
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void OnLoad(object sender, EventArgs e){
|
||||
listBranches.Items.Add("master");
|
||||
listBranches.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
private void btnDownload_Click(object sender, EventArgs e){
|
||||
string[] data = textBoxRepository.Text.Split('/');
|
||||
GitHub = new GitHub(data[0],data[1]);
|
||||
GitHub.Branch = (string)listBranches.SelectedItem;
|
||||
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
}
|
||||
|
||||
private void btnListBranches_Click(object sender, EventArgs e){
|
||||
string[] data = textBoxRepository.Text.Split('/');
|
||||
GitHub github = new GitHub(data[0],data[1]);
|
||||
|
||||
github.RetrieveBranchList(branches => this.InvokeOnUIThread(() => {
|
||||
listBranches.Items.Clear();
|
||||
|
||||
foreach(string branch in branches){
|
||||
listBranches.Items.Add(branch);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, EventArgs e){
|
||||
DialogResult = DialogResult.Cancel;
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
1
CodeStatistics/Forms/MainForm.Designer.cs
generated
1
CodeStatistics/Forms/MainForm.Designer.cs
generated
@ -60,6 +60,7 @@
|
||||
this.btnProjectGitHub.Size = new System.Drawing.Size(312, 38);
|
||||
this.btnProjectGitHub.TabIndex = 1;
|
||||
this.btnProjectGitHub.UseVisualStyleBackColor = false;
|
||||
this.btnProjectGitHub.Click += new System.EventHandler(this.btnProjectGitHub_Click);
|
||||
//
|
||||
// btnViewSourceCode
|
||||
//
|
||||
|
@ -56,6 +56,16 @@ namespace CodeStatistics.Forms{
|
||||
}
|
||||
}
|
||||
|
||||
private void btnProjectGitHub_Click(object sender, EventArgs e){
|
||||
GitHubForm form = new GitHubForm();
|
||||
|
||||
if (form.ShowDialog() == DialogResult.OK){
|
||||
InputMethod = form.GitHub;
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void btnViewSourceCode_Click(object sender, EventArgs e){
|
||||
Process.Start("https://github.com/chylex/Code-Statistics");
|
||||
}
|
||||
|
@ -1,18 +1,28 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Web.Script.Serialization;
|
||||
using CodeStatistics.Forms;
|
||||
|
||||
namespace CodeStatistics.Input.Methods{
|
||||
public class GitHub : IDisposable{
|
||||
public class GitHub : IInputMethod, IDisposable{
|
||||
public enum DownloadStatus{
|
||||
NoInternet, NoConnection, Started
|
||||
}
|
||||
|
||||
public delegate void BranchListRetrieved(IEnumerable<string> branches);
|
||||
|
||||
private readonly string target;
|
||||
private WebClient downloader;
|
||||
private WebClient dlBranches, dlRepo;
|
||||
|
||||
public string Branch = "master";
|
||||
|
||||
public string RepositoryName { get { return target; } }
|
||||
public string ZipUrl { get { return "https://github.com/"+target+"/zipball/master"; } }
|
||||
public string BranchesUrl { get { return "https://api.github.com/repos/"+target+"/branches"; } }
|
||||
public string ZipUrl { get { return "https://github.com/"+target+"/zipball/"+Branch; } }
|
||||
|
||||
public event DownloadProgressChangedEventHandler DownloadProgressChanged;
|
||||
public event AsyncCompletedEventHandler DownloadFinished;
|
||||
@ -21,18 +31,53 @@ namespace CodeStatistics.Input.Methods{
|
||||
this.target = username+"/"+repository;
|
||||
}
|
||||
|
||||
public DownloadStatus DownloadRepositoryZip(string targetFile){
|
||||
if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()){
|
||||
public DownloadStatus RetrieveBranchList(BranchListRetrieved onRetrieved){
|
||||
if (dlBranches != null)Reset();
|
||||
|
||||
if (!NetworkInterface.GetIsNetworkAvailable()){
|
||||
return DownloadStatus.NoInternet;
|
||||
}
|
||||
|
||||
downloader = new WebClient();
|
||||
dlBranches = CreateWebClient();
|
||||
|
||||
if (DownloadProgressChanged != null)downloader.DownloadProgressChanged += DownloadProgressChanged;
|
||||
if (DownloadFinished != null)downloader.DownloadFileCompleted += DownloadFinished;
|
||||
dlBranches.DownloadStringCompleted += (sender, args) => {
|
||||
if (args.Cancelled || args.Error != null){
|
||||
onRetrieved(null);
|
||||
return;
|
||||
}
|
||||
|
||||
List<string> branches = new List<string>(2);
|
||||
|
||||
foreach(object entry in (object[])new JavaScriptSerializer().DeserializeObject(args.Result)){
|
||||
branches.Add((string)((Dictionary<string,object>)entry)["name"]);
|
||||
}
|
||||
|
||||
if (branches.Remove("master"))onRetrieved(Enumerable.Repeat("master",1).Concat(branches));
|
||||
else onRetrieved(branches);
|
||||
};
|
||||
|
||||
try{
|
||||
downloader.DownloadFileAsync(new Uri(ZipUrl),targetFile);
|
||||
dlBranches.DownloadStringAsync(new Uri(BranchesUrl));
|
||||
return DownloadStatus.Started;
|
||||
}catch(WebException){
|
||||
return DownloadStatus.NoConnection;
|
||||
}
|
||||
}
|
||||
|
||||
public DownloadStatus DownloadRepositoryZip(string targetFile){
|
||||
if (dlRepo != null)Reset();
|
||||
|
||||
if (!NetworkInterface.GetIsNetworkAvailable()){
|
||||
return DownloadStatus.NoInternet;
|
||||
}
|
||||
|
||||
dlRepo = CreateWebClient();
|
||||
|
||||
if (DownloadProgressChanged != null)dlRepo.DownloadProgressChanged += DownloadProgressChanged;
|
||||
if (DownloadFinished != null)dlRepo.DownloadFileCompleted += DownloadFinished;
|
||||
|
||||
try{
|
||||
dlRepo.DownloadFileAsync(new Uri(ZipUrl),targetFile);
|
||||
return DownloadStatus.Started;
|
||||
}catch(WebException){
|
||||
return DownloadStatus.NoConnection;
|
||||
@ -40,11 +85,55 @@ namespace CodeStatistics.Input.Methods{
|
||||
}
|
||||
|
||||
public void Cancel(){
|
||||
if (downloader != null)downloader.CancelAsync();
|
||||
if (dlBranches != null)dlBranches.CancelAsync();
|
||||
if (dlRepo != null)dlRepo.CancelAsync();
|
||||
}
|
||||
|
||||
public void Dispose(){
|
||||
if (downloader != null)downloader.Dispose();
|
||||
if (dlBranches != null)dlBranches.Dispose();
|
||||
if (dlRepo != null)dlRepo.Dispose();
|
||||
}
|
||||
|
||||
private void Reset(){
|
||||
Cancel();
|
||||
Dispose();
|
||||
}
|
||||
|
||||
public void BeginProcess(ProjectLoadForm.UpdateCallbacks callbacks){ // TODO
|
||||
DownloadProgressChanged += (sender, args) => {
|
||||
callbacks.UpdateProgress(args.ProgressPercentage);
|
||||
callbacks.UpdateDataLabel(args.TotalBytesToReceive/1024 == 0 ? (args.BytesReceived/1024)+" kB" : (args.BytesReceived/1024)+" / "+(args.TotalBytesToReceive/1024)+" kB");
|
||||
};
|
||||
|
||||
DownloadFinished += (sender, args) => {
|
||||
callbacks.UpdateInfoLabel("Extracting repository...");
|
||||
// TODO extraction
|
||||
};
|
||||
|
||||
switch(DownloadRepositoryZip("tmp.zip")){
|
||||
case DownloadStatus.Started:
|
||||
callbacks.UpdateInfoLabel("Downloading repository...");
|
||||
break;
|
||||
|
||||
case DownloadStatus.NoInternet:
|
||||
callbacks.UpdateInfoLabel("No internet connection.");
|
||||
break;
|
||||
|
||||
case DownloadStatus.NoConnection:
|
||||
callbacks.UpdateInfoLabel("Could not establish connection with GitHub.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void CancelProcess(Action onCancelFinish){
|
||||
Reset();
|
||||
onCancelFinish();
|
||||
}
|
||||
|
||||
private static WebClient CreateWebClient(){
|
||||
WebClient client = new WebClient();
|
||||
client.Headers.Add("User-Agent","CodeStatistics");
|
||||
return client;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user