노현종

Fixed Downloader

...@@ -38,6 +38,9 @@ ...@@ -38,6 +38,9 @@
38 <Reference Include="LibGit2Sharp, Version=0.25.0.0, Culture=neutral, PublicKeyToken=7cbde695407f0333, processorArchitecture=MSIL"> 38 <Reference Include="LibGit2Sharp, Version=0.25.0.0, Culture=neutral, PublicKeyToken=7cbde695407f0333, processorArchitecture=MSIL">
39 <HintPath>..\packages\LibGit2Sharp.0.25.0\lib\netstandard2.0\LibGit2Sharp.dll</HintPath> 39 <HintPath>..\packages\LibGit2Sharp.0.25.0\lib\netstandard2.0\LibGit2Sharp.dll</HintPath>
40 </Reference> 40 </Reference>
41 + <Reference Include="Octokit, Version=0.29.0.0, Culture=neutral, processorArchitecture=MSIL">
42 + <HintPath>..\packages\Octokit.0.29.0\lib\net45\Octokit.dll</HintPath>
43 + </Reference>
41 <Reference Include="System" /> 44 <Reference Include="System" />
42 <Reference Include="System.Core" /> 45 <Reference Include="System.Core" />
43 <Reference Include="System.Xml.Linq" /> 46 <Reference Include="System.Xml.Linq" />
......
...@@ -6,19 +6,28 @@ using System.Threading.Tasks; ...@@ -6,19 +6,28 @@ using System.Threading.Tasks;
6 6
7 namespace DownloaderGithubClone 7 namespace DownloaderGithubClone
8 { 8 {
9 - using LibGit2Sharp; 9 + // using LibGit2Sharp;
10 + using System.IO;
10 using System.Text.RegularExpressions; 11 using System.Text.RegularExpressions;
12 + using LibGit2Sharp;
13 +
11 14
12 class Program 15 class Program
13 { 16 {
14 static void Main(string[] args) { 17 static void Main(string[] args) {
15 18
19 + string dir = @"c:\VulnPy";
20 + if (!Directory.Exists(dir)) {
21 + Directory.CreateDirectory(dir);
22 + Console.WriteLine($"디렉토리 생성 : {dir}");
23 + }
24 +
16 Console.Write("Git Repository URL을 입력하세요 : "); 25 Console.Write("Git Repository URL을 입력하세요 : ");
17 string url = Console.ReadLine(); 26 string url = Console.ReadLine();
18 //https://github.com/django/django.git 27 //https://github.com/django/django.git
19 28
20 29
21 - string pattern = @"https://github.com/(?<ProjectName>\w+)/\w+\.git"; 30 + string pattern = @"https://github.com/.+/(?<ProjectName>.+)\.(.+)";
22 31
23 var match = Regex.Match(url, pattern); 32 var match = Regex.Match(url, pattern);
24 33
...@@ -26,11 +35,29 @@ namespace DownloaderGithubClone ...@@ -26,11 +35,29 @@ namespace DownloaderGithubClone
26 Console.WriteLine($"패턴이 맞지 않습니다. Pattern : {pattern}"); 35 Console.WriteLine($"패턴이 맞지 않습니다. Pattern : {pattern}");
27 return; 36 return;
28 } 37 }
38 +
39 +
29 string prName = match.Groups["ProjectName"].Value; 40 string prName = match.Groups["ProjectName"].Value;
30 Console.WriteLine(prName); 41 Console.WriteLine(prName);
31 -
32 42
33 - string clone = Repository.Clone(url, $@"c:\VulnPy\{prName}", new CloneOptions { OnTransferProgress = TransferProgress, OnCheckoutProgress = CheckoutProcess }); 43 + int idx = 1;
44 + string path = Path.Combine(dir, prName);
45 + if (Directory.Exists(path)) {
46 + while (true) {
47 + path = Path.Combine(dir, prName + idx);
48 + if (!Directory.Exists(path)) {
49 + Directory.CreateDirectory(path);
50 + Console.WriteLine($"레파지토리 디렉토리 생성 : {path}");
51 + break;
52 + }
53 + }
54 + }
55 +
56 + Console.WriteLine($"다운로드를 진행합니다. 경로 : {path}");
57 +
58 +
59 + string clone = Repository.Clone(url, $@"{path}", new CloneOptions { OnTransferProgress = TransferProgress, OnCheckoutProgress = CheckoutProcess });
60 + Console.ResetColor();
34 Console.WriteLine(clone); 61 Console.WriteLine(clone);
35 } 62 }
36 63
...@@ -44,13 +71,14 @@ namespace DownloaderGithubClone ...@@ -44,13 +71,14 @@ namespace DownloaderGithubClone
44 int receivedBytes = progress.ReceivedObjects; 71 int receivedBytes = progress.ReceivedObjects;
45 long receivedTotal = progress.ReceivedBytes; 72 long receivedTotal = progress.ReceivedBytes;
46 double received = progress.ReceivedBytes / 1000000; 73 double received = progress.ReceivedBytes / 1000000;
47 - double percent = ((double)receivedBytes / (double)totalBytes) * 10; 74 + double percent = ((double)receivedBytes / (double)totalBytes);
48 75
49 Console.WriteLine($"진행률: {percent.ToString("P2")}, 남은 파일: {receivedBytes} of {totalBytes}"); //, 받은 용량: {received.ToString()}MB"); 76 Console.WriteLine($"진행률: {percent.ToString("P2")}, 남은 파일: {receivedBytes} of {totalBytes}"); //, 받은 용량: {received.ToString()}MB");
50 Console.ForegroundColor = ConsoleColor.DarkGreen; 77 Console.ForegroundColor = ConsoleColor.DarkGreen;
51 return true; 78 return true;
52 } 79 }
53 80
81 +
54 public static void CheckoutProcess(string path, int completedSteps, int totalSteps) { 82 public static void CheckoutProcess(string path, int completedSteps, int totalSteps) {
55 Console.WriteLine($"{completedSteps}, {totalSteps}, {path}"); 83 Console.WriteLine($"{completedSteps}, {totalSteps}, {path}");
56 } 84 }
......
...@@ -2,4 +2,5 @@ ...@@ -2,4 +2,5 @@
2 <packages> 2 <packages>
3 <package id="LibGit2Sharp" version="0.25.0" targetFramework="net461" /> 3 <package id="LibGit2Sharp" version="0.25.0" targetFramework="net461" />
4 <package id="LibGit2Sharp.NativeBinaries" version="1.0.210" targetFramework="net461" /> 4 <package id="LibGit2Sharp.NativeBinaries" version="1.0.210" targetFramework="net461" />
5 + <package id="Octokit" version="0.29.0" targetFramework="net461" />
5 </packages> 6 </packages>
...\ No newline at end of file ...\ No newline at end of file
......