Merge branch 'conflicts-fix'

This commit is contained in:
Hylke Bons 2011-05-01 15:43:16 +02:00
commit 1bb20d581e
10 changed files with 226 additions and 321 deletions

View file

@ -13,7 +13,6 @@ SOURCES = \
SparkleListener.cs \
SparkleOptions.cs \
SparklePaths.cs \
SparklePlatform.cs \
SparkleRepo.cs
SMARTIRC4NET_FILES_EXPANDED = $(foreach file, $(SMARTIRC4NET_FILES), $(top_builddir)/$(file))

View file

@ -14,39 +14,24 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
namespace SparkleLib {
public class SparkleCommit
{
public class SparkleCommit {
public string UserName;
public string UserEmail;
public DateTime DateTime;
public string Hash;
public bool IsMerge;
public List <string> Added;
public List <string> Deleted;
public List <string> Edited;
public List <string> MovedFrom;
public List <string> MovedTo;
public SparkleCommit ()
{
Edited = new List <string> ();
Added = new List <string> ();
Deleted = new List <string> ();
MovedFrom = new List <string> ();
MovedTo = new List <string> ();
IsMerge = false;
}
}
public string UserName;
public string UserEmail;
public string Hash;
public DateTime DateTime;
public bool IsMerge = false;
public List<string> Added = new List<string> ();
public List<string> Deleted = new List<string> ();
public List<string> Edited = new List<string> ();
public List<string> MovedFrom = new List<string> ();
public List<string> MovedTo = new List<string> ();
}
}

View file

@ -19,26 +19,21 @@ using System;
namespace SparkleLib {
// Arguments for most events
public class SparkleEventArgs : System.EventArgs {
public class SparkleEventArgs : EventArgs {
public string Type;
public string Message;
public SparkleEventArgs (string type)
{
Type = type;
}
}
// Arguments for the NewCommit event
public class NewCommitArgs : System.EventArgs {
public class NewCommitArgs : EventArgs {
public string Author;
public string Email;
public string Message;
@ -46,14 +41,10 @@ namespace SparkleLib {
public NewCommitArgs (string author, string email, string message, string repository_path)
{
Author = author;
Email = email;
Message = message;
RepositoryPath = repository_path;
}
}
}

View file

@ -18,96 +18,86 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Timers;
namespace SparkleLib {
// A helper class that fetches and configures
// a remote repository
public class SparkleFetcher {
// A helper class that fetches and configures
// a remote repository
public class SparkleFetcher {
public delegate void CloningStartedEventHandler (object o, SparkleEventArgs args);
public delegate void CloningFinishedEventHandler (object o, SparkleEventArgs args);
public delegate void CloningFailedEventHandler (object o, SparkleEventArgs args);
// TODO: remove 'cloning' prefix
public delegate void CloningStartedEventHandler (object o, SparkleEventArgs args);
public delegate void CloningFinishedEventHandler (object o, SparkleEventArgs args);
public delegate void CloningFailedEventHandler (object o, SparkleEventArgs args);
public event CloningStartedEventHandler CloningStarted;
public event CloningFinishedEventHandler CloningFinished;
public event CloningFailedEventHandler CloningFailed;
public event CloningStartedEventHandler CloningStarted;
public event CloningFinishedEventHandler CloningFinished;
public event CloningFailedEventHandler CloningFailed;
private string TargetFolder;
private string RemoteOriginUrl;
private string TargetFolder;
private string RemoteOriginUrl;
public SparkleFetcher (string url, string folder)
{
TargetFolder = folder;
RemoteOriginUrl = url;
}
public SparkleFetcher (string url, string folder)
{
TargetFolder = folder;
RemoteOriginUrl = url;
}
// Clones the remote repository
public void Start ()
{
// Clones the remote repository
public void Start ()
{
SparkleHelpers.DebugInfo ("Git", "[" + TargetFolder + "] Cloning Repository");
if (Directory.Exists (TargetFolder))
Directory.Delete (TargetFolder, true);
SparkleHelpers.DebugInfo ("Git", "[" + TargetFolder + "] Cloning Repository");
if (CloningStarted != null)
CloningStarted (this, new SparkleEventArgs ("CloningStarted"));
if (Directory.Exists (TargetFolder))
Directory.Delete (TargetFolder, true);
SparkleGit git = new SparkleGit (SparklePaths.SparkleTmpPath,
if (CloningStarted != null)
CloningStarted (this, new SparkleEventArgs ("CloningStarted"));
SparkleGit git = new SparkleGit (SparklePaths.SparkleTmpPath,
"clone \"" + RemoteOriginUrl + "\" " + "\"" + TargetFolder + "\"");
git.Exited += delegate {
git.Exited += delegate {
SparkleHelpers.DebugInfo ("Git", "Exit code " + git.ExitCode.ToString ());
SparkleHelpers.DebugInfo ("Git", "Exit code " + git.ExitCode.ToString ());
if (git.ExitCode != 0) {
SparkleHelpers.DebugInfo ("Git", "[" + TargetFolder + "] Cloning failed");
if (git.ExitCode != 0) {
if (CloningFailed != null)
CloningFailed (this, new SparkleEventArgs ("CloningFailed"));
} else {
InstallConfiguration ();
InstallExcludeRules ();
SparkleHelpers.DebugInfo ("Git", "[" + TargetFolder + "] Repository cloned");
SparkleHelpers.DebugInfo ("Git", "[" + TargetFolder + "] Cloning failed");
if (CloningFinished != null)
CloningFinished (this, new SparkleEventArgs ("CloningFinished"));
}
};
if (CloningFailed != null)
CloningFailed (this, new SparkleEventArgs ("CloningFailed"));
} else {
InstallConfiguration ();
InstallExcludeRules ();
SparkleHelpers.DebugInfo ("Git", "[" + TargetFolder + "] Repository cloned");
if (CloningFinished != null)
CloningFinished (this, new SparkleEventArgs ("CloningFinished"));
}
};
git.Start ();
}
git.Start ();
}
// Install the user's name and email and some config into
// the newly cloned repository
private void InstallConfiguration ()
{
string global_config_file_path = SparkleHelpers.CombineMore (SparklePaths.SparkleConfigPath, "config");
// Install the user's name and email and some config into
// the newly cloned repository
private void InstallConfiguration ()
{
string global_config_file_path = Path.Combine (SparklePaths.SparkleConfigPath, "config");
if (File.Exists (global_config_file_path)) {
StreamReader reader = new StreamReader (global_config_file_path);
string user_info = reader.ReadToEnd ();
reader.Close ();
string repo_config_file_path = SparkleHelpers.CombineMore (TargetFolder, ".git", "config");
string config = String.Join ("\n", File.ReadAllLines (repo_config_file_path));
// Be case sensitive explicitly to work on Mac
config = config.Replace ("ignorecase = true", "ignorecase = false");
config += Environment.NewLine + user_info;
@ -116,60 +106,54 @@ namespace SparkleLib {
writer.Close ();
SparkleHelpers.DebugInfo ("Config", "Added configuration to '" + repo_config_file_path + "'");
}
}
// Add a .gitignore file to the repo
private void InstallExcludeRules ()
{
// Add a .gitignore file to the repo
private void InstallExcludeRules ()
{
string exlude_rules_file_path = SparkleHelpers.CombineMore (
TargetFolder, ".git", "info", "exclude");
string exlude_rules_file_path = SparkleHelpers.CombineMore
(TargetFolder, ".git", "info", "exclude");
TextWriter writer = new StreamWriter (exlude_rules_file_path);
TextWriter writer = new StreamWriter (exlude_rules_file_path);
// gedit and emacs
writer.WriteLine ("*~");
// gedit and emacs
writer.WriteLine ("*~");
// vi(m)
writer.WriteLine (".*.sw[a-z]");
writer.WriteLine ("*.un~");
writer.WriteLine ("*.swp");
writer.WriteLine ("*.swo");
// KDE
writer.WriteLine (".directory");
// Mac OSX
writer.WriteLine (".DS_Store");
writer.WriteLine ("Icon?");
writer.WriteLine ("._*");
writer.WriteLine (".Spotlight-V100");
writer.WriteLine (".Trashes");
// vi(m)
writer.WriteLine (".*.sw[a-z]");
writer.WriteLine ("*.un~");
writer.WriteLine ("*.swp");
writer.WriteLine ("*.swo");
// KDE
writer.WriteLine (".directory");
// Mac OSX
writer.WriteLine (".DS_Store");
writer.WriteLine ("Icon?");
writer.WriteLine ("._*");
writer.WriteLine (".Spotlight-V100");
writer.WriteLine (".Trashes");
// Mac OSX
writer.WriteLine ("*(Autosaved).graffle");
// Windows
writer.WriteLine ("Thumbs.db");
writer.WriteLine ("Desktop.ini");
// Mac OSX
writer.WriteLine ("*(Autosaved).graffle");
// Windows
writer.WriteLine ("Thumbs.db");
writer.WriteLine ("Desktop.ini");
// CVS
writer.WriteLine ("*/CVS/*");
writer.WriteLine (".cvsignore");
writer.WriteLine ("*/.cvsignore");
// Subversion
writer.WriteLine ("/.svn/*");
writer.WriteLine ("*/.svn/*");
// CVS
writer.WriteLine ("*/CVS/*");
writer.WriteLine (".cvsignore");
writer.WriteLine ("*/.cvsignore");
// Subversion
writer.WriteLine ("/.svn/*");
writer.WriteLine ("*/.svn/*");
writer.Close ();
}
}
writer.Close ();
}
}
}

View file

@ -20,17 +20,17 @@ using System.Diagnostics;
namespace SparkleLib {
public class SparkleGit : Process {
public class SparkleGit : Process {
public SparkleGit (string path, string args) : base ()
{
EnableRaisingEvents = true;
StartInfo.FileName = SparklePaths.GitPath;
StartInfo.Arguments = args;
StartInfo.RedirectStandardOutput = true;
StartInfo.UseShellExecute = false;
StartInfo.WorkingDirectory = path;
}
public SparkleGit (string path, string args) : base ()
{
EnableRaisingEvents = true;
StartInfo.FileName = SparklePaths.GitPath;
StartInfo.Arguments = args;
StartInfo.RedirectStandardOutput = true;
StartInfo.UseShellExecute = false;
StartInfo.WorkingDirectory = path;
}
new public void Start ()
@ -38,5 +38,5 @@ namespace SparkleLib {
SparkleHelpers.DebugInfo ("Cmd", StartInfo.FileName + " " + StartInfo.Arguments);
base.Start ();
}
}
}
}
}

View file

@ -25,126 +25,105 @@ using Meebey.SmartIrc4net;
namespace SparkleLib {
public enum NotificationServerType
{
Own,
Central
}
public enum NotificationServerType
{
Own,
Central
}
// A persistent connection to the server that
// listens for change notifications
public class SparkleListener {
// A persistent connection to the server that
// listens for change notifications
public class SparkleListener {
// FIXME: The IrcClient is a public property because
// extending it causes crashes
public IrcClient Client;
private Thread Thread;
public readonly string Server;
public readonly string FallbackServer;
public readonly string Channel;
public readonly string Nick;
private Thread Thread;
// FIXME: The IrcClient is a public property because
// extending it causes crashes
public IrcClient Client;
public readonly string Server;
public readonly string FallbackServer;
public readonly string Channel;
public readonly string Nick;
public SparkleListener (string server, string folder_name,
string user_email, NotificationServerType type)
{
public SparkleListener (string server, string folder_name,
string user_email, NotificationServerType type)
{
if (type == NotificationServerType.Own) {
Server = server;
} else {
if (type == NotificationServerType.Own) {
// This is SparkleShare's centralized notification service.
// Don't worry, we only use this server as a backup if you
// don't have your own. All data needed to connect is hashed and
// we don't store any personal information ever.
Server = "204.62.14.135";
}
Server = server;
if (!String.IsNullOrEmpty (user_email))
Nick = SHA1 (folder_name + user_email + "sparkles");
else
Nick = SHA1 (DateTime.Now.ToString () + "sparkles");
} else {
Nick = "s" + Nick.Substring (0, 7);
Channel = "#" + SHA1 (server + folder_name + "sparkles");
// This is SparkleShare's centralized notification service.
// Don't worry, we only use this server as a backup if you
// don't have your own. All data needed to connect is hashed and
// we don't store any personal information ever.
Server = "204.62.14.135";
}
if (!user_email.Equals ("") && user_email != null)
Nick = GetSHA1 (folder_name + user_email + "sparkles");
else
Nick = GetSHA1 (DateTime.Now.ToString () + "sparkles");
Nick = "s" + Nick.Substring (0, 7);
Channel = "#" + GetSHA1 (server + folder_name + "sparkles");
Client = new IrcClient () {
PingTimeout = 180,
PingInterval = 90
};
}
Client = new IrcClient () {
PingTimeout = 180,
PingInterval = 90
};
}
// Starts a new thread and listens to the channel
public void Listen ()
{
// Starts a new thread and listens to the channel
public void Listen ()
{
Thread = new Thread (
new ThreadStart (delegate {
try {
Thread = new Thread (
new ThreadStart (delegate {
// Connect, login, and join the channel
Client.Connect (new string [] {Server}, 6667);
Client.Login (Nick, Nick);
Client.RfcJoin (Channel);
try {
// List to the channel, this blocks the thread
Client.Listen ();
Client.Disconnect ();
} catch (Meebey.SmartIrc4net.ConnectionException e) {
Console.WriteLine ("Could not connect: " + e.Message);
}
})
);
// Connect to the server
Client.Connect (new string [] {Server}, 6667);
// Login to the server
Client.Login (Nick, Nick);
// Join the channel
Client.RfcJoin (Channel);
Client.Listen ();
Client.Disconnect ();
} catch (Meebey.SmartIrc4net.ConnectionException e) {
Console.WriteLine ("Could not connect: " + e.Message);
}
})
);
Thread.Start ();
}
public void Announce (string message)
{
Client.SendMessage (SendType.Message, Channel, message);
}
Thread.Start ();
}
// Frees all resources for this Listener
public void Dispose ()
{
public void Announce (string message)
{
Client.SendMessage (SendType.Message, Channel, message);
}
Thread.Abort ();
Thread.Join ();
}
// Frees all resources for this Listener
public void Dispose ()
{
Thread.Abort ();
Thread.Join ();
}
// Creates an SHA-1 hash of input
private static string GetSHA1 (string s)
{
SHA1 sha1 = new SHA1CryptoServiceProvider ();
Byte[] bytes = ASCIIEncoding.Default.GetBytes (s);
Byte[] encoded_bytes = sha1.ComputeHash (bytes);
return BitConverter.ToString (encoded_bytes).ToLower ().Replace ("-", "");
}
}
// Creates an SHA-1 hash of input
private string SHA1 (string s)
{
SHA1 sha1 = new SHA1CryptoServiceProvider ();
Byte[] bytes = ASCIIEncoding.Default.GetBytes (s);
Byte[] encoded_bytes = sha1.ComputeHash (bytes);
return BitConverter.ToString (encoded_bytes).ToLower ().Replace ("-", "");
}
}
}

View file

@ -26,9 +26,7 @@ namespace SparkleLib {
public static string Name = "Git";
public static string Path {
get {
string [] possible_git_paths = {"/usr/bin/git",
"/usr/local/git/bin/git",
"/usr/local/bin/git"};
@ -38,37 +36,29 @@ namespace SparkleLib {
return git_path;
return null;
}
}
public static bool IsPresent {
get {
return (Path != null);
}
}
}
public static class SparklePaths {
public static string GitPath = Backend.Path;
public static string HomePath = new UnixUserInfo (UnixEnvironment.UserName).HomeDirectory;
public static string SparklePath = Path.Combine (HomePath ,"SparkleShare");
public static string SparkleTmpPath = Path.Combine (SparklePath, ".tmp");
public static string SparkleConfigPath = SparkleHelpers.CombineMore (HomePath, ".config", "sparkleshare");
public static string SparkleKeysPath = SparkleHelpers.CombineMore (HomePath, ".config", "sparkleshare");
public static string SparkleInstallPath = Path.Combine (Defines.PREFIX, "sparkleshare");
public static string SparkleLocalIconPath = SparkleHelpers.CombineMore (SparkleConfigPath, "icons");
public static string SparkleIconPath = SparkleHelpers.CombineMore (Defines.DATAROOTDIR, "sparkleshare", "icons");
}
public static class SparklePaths {
public static string GitPath = Backend.Path;
public static string HomePath = new UnixUserInfo (UnixEnvironment.UserName).HomeDirectory;
public static string SparklePath = Path.Combine (HomePath ,"SparkleShare");
public static string SparkleTmpPath = Path.Combine (SparklePath, ".tmp");
public static string SparkleConfigPath = SparkleHelpers.CombineMore (HomePath, ".config", "sparkleshare");
public static string SparkleKeysPath = SparkleHelpers.CombineMore (HomePath, ".config", "sparkleshare");
public static string SparkleInstallPath = Path.Combine (Defines.PREFIX, "sparkleshare");
public static string SparkleLocalIconPath = SparkleHelpers.CombineMore (SparkleConfigPath, "icons");
public static string SparkleIconPath = SparkleHelpers.CombineMore (Defines.DATAROOTDIR, "sparkleshare", "icons");
}
}

View file

@ -1,28 +0,0 @@
// SparkleShare, an instant update workflow to Git.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace SparkleShare {
public static class SparklePlatform {
// Detect OSX, Windows, GNOME or KDE here
public static string Name = "GNOME";
}
}

View file

@ -682,29 +682,23 @@ namespace SparkleShare {
public bool NotificationsEnabled {
get {
string notify_setting_file_path = SparkleHelpers.CombineMore (SparklePaths.SparkleConfigPath,
string notify_setting_file_path = Path.Combine (SparklePaths.SparkleConfigPath,
"sparkleshare.notify");
return File.Exists (notify_setting_file_path);
}
}
public void ToggleNotifications () {
string notify_setting_file_path = SparkleHelpers.CombineMore (SparklePaths.SparkleConfigPath,
string notify_setting_file_path = Path.Combine (SparklePaths.SparkleConfigPath,
"sparkleshare.notify");
if (File.Exists (notify_setting_file_path))
File.Delete (notify_setting_file_path);
else
File.Create (notify_setting_file_path);
}

View file

@ -645,6 +645,7 @@ namespace SparkleShare {
};
Button button = new Button () {
Sensitive = false,
Label = _("Finish")
@ -671,6 +672,16 @@ namespace SparkleShare {
box.PackStart (table, false, false, 0);
Progressbar bar = new Progressbar ();
box.PackStart (bar, true, true, 0);
Timer timer = new Timer () {
Interval = 500
};
timer.Elapsed += delegate {
bar.Pulse ();
};
timer.Start ();
layout_vertical.PackStart (box, false, false, 0);
Add (layout_vertical);