diff options
Diffstat (limited to 'SparkleLib/Git/SparkleFetcherGit.cs')
-rwxr-xr-x | SparkleLib/Git/SparkleFetcherGit.cs | 224 |
1 files changed, 161 insertions, 63 deletions
diff --git a/SparkleLib/Git/SparkleFetcherGit.cs b/SparkleLib/Git/SparkleFetcherGit.cs index f924195..e04a304 100755 --- a/SparkleLib/Git/SparkleFetcherGit.cs +++ b/SparkleLib/Git/SparkleFetcherGit.cs @@ -31,53 +31,54 @@ namespace SparkleLib { public SparkleFetcherGit (string server, string remote_folder, string target_folder) : base (server, remote_folder, target_folder) { - remote_folder = remote_folder.Trim ("/".ToCharArray ()); + if (server.EndsWith ("/")) + server = server.Substring (0, server.Length - 1); - if (server.StartsWith ("http")) { - base.target_folder = target_folder; - base.remote_url = server; - return; - } + if (!remote_folder.StartsWith ("/")) + remote_folder = "/" + remote_folder; - // Gitorious formatting - if (server.Contains ("gitorious.org")) { - server = "ssh://git@gitorious.org"; - if (!remote_folder.EndsWith (".git")) { + Uri uri; - if (!remote_folder.Contains ("/")) - remote_folder = remote_folder + "/" + remote_folder; + try { + uri = new Uri (server + remote_folder); - remote_folder += ".git"; - } + } catch (UriFormatException) { + uri = new Uri ("ssh://" + server + remote_folder); + } - } else if (server.Contains ("github.com")) { - server = "ssh://git@github.com"; - } else if (server.Contains ("gnome.org")) { - server = "ssh://git@gnome.org/git"; + if (!uri.Scheme.Equals ("ssh") && + !uri.Scheme.Equals ("git")) { + + uri = new Uri ("ssh://" + server); + } - } else { - server = server.TrimEnd ("/".ToCharArray ()); - string protocol = "ssh://"; + if (uri.Host.Equals ("gitorious.org")) { + if (!uri.AbsolutePath.Equals ("/") && + !uri.AbsolutePath.EndsWith (".git")) { - if (server.StartsWith ("ssh://")) - server = server.Substring (6); + uri = new Uri ("ssh://git@gitorious.org" + uri.AbsolutePath + ".git"); - if (server.StartsWith ("git://")) { - server = server.Substring (6); - protocol = "git://"; + } else { + uri = new Uri ("ssh://git@gitorious.org" + uri.AbsolutePath); } - if (!server.Contains ("@")) - server = "git@" + server; + } else if (uri.Host.Equals ("github.com")) { + uri = new Uri ("ssh://git@github.com" + uri.AbsolutePath); + + } else if (uri.Host.Equals ("gnome.org")) { + uri = new Uri ("ssh://git@gnome.org/git" + uri.AbsolutePath); - server = protocol + server; + } else { + if (string.IsNullOrEmpty (uri.UserInfo)) + uri = new Uri (uri.Scheme + "://git@" + uri.Host + uri.AbsolutePath); } + base.target_folder = target_folder; - base.remote_url = server + "/" + remote_folder; + base.remote_url = uri.ToString (); } @@ -93,7 +94,10 @@ namespace SparkleLib { double percentage = 1.0; Regex progress_regex = new Regex (@"([0-9]+)%", RegexOptions.Compiled); - + + DateTime last_change = DateTime.Now; + TimeSpan change_interval = new TimeSpan (0, 0, 0, 1); + while (!this.git.StandardError.EndOfStream) { string line = this.git.StandardError.ReadLine (); Match match = progress_regex.Match (line); @@ -107,7 +111,7 @@ namespace SparkleLib { // the "Receiving objects" stage which we count as the last 80% if (line.Contains ("|")) // "Receiving objects" stage - number = (number / 100 * 75 + 20); + number = (number / 100 * 80 + 20); else // "Compressing objects" stage number = (number / 100 * 20); @@ -115,20 +119,21 @@ namespace SparkleLib { if (number >= percentage) { percentage = number; - - // FIXME: for some reason it doesn't go above 95% - base.OnProgressChanged (percentage); + + if (DateTime.Compare (last_change, DateTime.Now.Subtract (change_interval)) < 0) { + base.OnProgressChanged (percentage); + last_change = DateTime.Now; + } } - - System.Threading.Thread.Sleep (100); } this.git.WaitForExit (); - SparkleHelpers.DebugInfo ("Git", "Exit code " + this.git.ExitCode.ToString ()); + if (this.git.ExitCode != 0) { return false; + } else { InstallConfiguration (); InstallExcludeRules (); @@ -181,9 +186,17 @@ namespace SparkleLib { string n = Environment.NewLine; - // Show special characters in the logs config = config.Replace ("[core]" + n, - "[core]" + n + "quotepath = false" + n); + "[core]" + n + "\tquotepath = false" + n + // Show special characters in the logs + "\tpackedGitLimit = 128m" + n + + "\tpackedGitWindowSize = 128m" + n); + + config = config.Replace ("[remote \"origin\"]" + n, + "[pack]" + n + + "\tdeltaCacheSize = 128m" + n + + "\tpackSizeLimit = 128m" + n + + "\twindowMemory = 128m" + n + + "[remote \"origin\"]" + n); // Be case sensitive explicitly to work on Mac config = config.Replace ("ignorecase = true", "ignorecase = false"); @@ -203,9 +216,10 @@ namespace SparkleLib { // Add a .gitignore file to the repo private void InstallExcludeRules () { - DirectoryInfo info = Directory.CreateDirectory (SparkleHelpers.CombineMore ( - this.target_folder, ".git", "info")); + DirectoryInfo info = Directory.CreateDirectory ( + SparkleHelpers.CombineMore (this.target_folder, ".git", "info")); + // File that lists the files we want git to ignore string exlude_rules_file_path = Path.Combine (info.FullName, "exclude"); TextWriter writer = new StreamWriter (exlude_rules_file_path); @@ -225,14 +239,14 @@ namespace SparkleLib { // KDE writer.WriteLine (".directory"); - // Mac OSX + // Mac OS X writer.WriteLine (".DS_Store"); writer.WriteLine ("Icon?"); writer.WriteLine ("._*"); writer.WriteLine (".Spotlight-V100"); writer.WriteLine (".Trashes"); - // Mac OSX + // Omnigraffle writer.WriteLine ("*(Autosaved).graffle"); // Windows @@ -245,16 +259,16 @@ namespace SparkleLib { writer.WriteLine ("*~*.tmp"); writer.WriteLine ("*~*.TMP"); writer.WriteLine ("~*.ppt"); - writer.WriteLine ("~*.pptx"); writer.WriteLine ("~*.PPT"); + writer.WriteLine ("~*.pptx"); writer.WriteLine ("~*.PPTX"); writer.WriteLine ("~*.xls"); - writer.WriteLine ("~*.xlsx"); writer.WriteLine ("~*.XLS"); + writer.WriteLine ("~*.xlsx"); writer.WriteLine ("~*.XLSX"); writer.WriteLine ("~*.doc"); - writer.WriteLine ("~*.docx"); writer.WriteLine ("~*.DOC"); + writer.WriteLine ("~*.docx"); writer.WriteLine ("~*.DOCX"); // CVS @@ -266,28 +280,112 @@ namespace SparkleLib { writer.WriteLine ("/.svn/*"); writer.WriteLine ("*/.svn/*"); + // Mercurial + writer.WriteLine ("/.hg/*"); + writer.WriteLine ("*/.hg/*"); + writer.WriteLine ("*/.hgignore"); + + // Bazaar + writer.WriteLine ("/.bzr/*"); + writer.WriteLine ("*/.bzr/*"); + writer.WriteLine ("*/.bzrignore"); + writer.Close (); - } - } - public class SparkleGit : Process { + // File that lists the files we want don't want git to compress. + // Not compressing the already compressed files saves us memory + // usage and increases speed + string no_compression_rules_file_path = Path.Combine (info.FullName, "attributes"); + writer = new StreamWriter (no_compression_rules_file_path); - public SparkleGit (string path, string args) : base () - { - EnableRaisingEvents = true; - StartInfo.FileName = SparkleBackend.DefaultBackend.Path; - StartInfo.Arguments = args; - StartInfo.RedirectStandardOutput = true; - StartInfo.UseShellExecute = false; - StartInfo.WorkingDirectory = path; - } + // Images + writer.WriteLine ("*.jpg -delta"); + writer.WriteLine ("*.jpeg -delta"); + writer.WriteLine ("*.JPG -delta"); + writer.WriteLine ("*.JPEG -delta"); + writer.WriteLine ("*.png -delta"); + writer.WriteLine ("*.PNG -delta"); - new public void Start () - { - SparkleHelpers.DebugInfo ("Cmd", StartInfo.FileName + " " + StartInfo.Arguments); - base.Start (); + writer.WriteLine ("*.tiff -delta"); + writer.WriteLine ("*.TIFF -delta"); + + // Audio + writer.WriteLine ("*.flac -delta"); + writer.WriteLine ("*.FLAC -delta"); + + writer.WriteLine ("*.mp3 -delta"); + writer.WriteLine ("*.MP3 -delta"); + + writer.WriteLine ("*.ogg -delta"); + writer.WriteLine ("*.OGG -delta"); + + writer.WriteLine ("*.oga -delta"); + writer.WriteLine ("*.OGA -delta"); + + // Video + writer.WriteLine ("*.avi -delta"); + writer.WriteLine ("*.AVI -delta"); + + writer.WriteLine ("*.mov -delta"); + writer.WriteLine ("*.MOV -delta"); + + writer.WriteLine ("*.mpg -delta"); + writer.WriteLine ("*.MPG -delta"); + writer.WriteLine ("*.mpeg -delta"); + writer.WriteLine ("*.MPEG -delta"); + + writer.WriteLine ("*.mkv -delta"); + writer.WriteLine ("*.MKV -delta"); + + writer.WriteLine ("*.ogv -delta"); + writer.WriteLine ("*.OGV -delta"); + + writer.WriteLine ("*.ogx -delta"); + writer.WriteLine ("*.OGX -delta"); + + writer.WriteLine ("*.webm -delta"); + writer.WriteLine ("*.WEBM -delta"); + + // Archives + writer.WriteLine ("*.zip -delta"); + writer.WriteLine ("*.ZIP -delta"); + + writer.WriteLine ("*.gz -delta"); + writer.WriteLine ("*.GZ -delta"); + + writer.WriteLine ("*.bz -delta"); + writer.WriteLine ("*.BZ -delta"); + + writer.WriteLine ("*.bz2 -delta"); + writer.WriteLine ("*.BZ2 -delta"); + + writer.WriteLine ("*.rpm -delta"); + writer.WriteLine ("*.RPM -delta"); + + writer.WriteLine ("*.deb -delta"); + writer.WriteLine ("*.DEB -delta"); + + writer.WriteLine ("*.tgz -delta"); + writer.WriteLine ("*.TGZ -delta"); + + writer.WriteLine ("*.rar -delta"); + writer.WriteLine ("*.RAR -delta"); + + writer.WriteLine ("*.ace -delta"); + writer.WriteLine ("*.ACE -delta"); + + writer.WriteLine ("*.7z -delta"); + writer.WriteLine ("*.7Z -delta"); + + writer.WriteLine ("*.pak -delta"); + writer.WriteLine ("*.PAK -delta"); + + writer.WriteLine ("*.tar -delta"); + writer.WriteLine ("*.TAR -delta"); + + writer.Close (); } } } |