Merge branch 'migrate-logic'

This commit is contained in:
Hylke Bons 2011-11-28 20:27:31 +01:00
commit 93bb3b24f7
31 changed files with 1425 additions and 973 deletions

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "SmartIrc4net"]
path = SmartIrc4net
url = git://git.qnetp.net/smartirc4net.git

View file

@ -1,4 +1,4 @@
basedirs = build help SmartIrc4net SparkleLib data po
basedirs = build help SparkleLib data po
SUBDIRS = $(basedirs) $(GUISUBDIRS)
DIST_SUBDIRS = $(basedirs) SparkleShare

@ -1 +0,0 @@
Subproject commit 036e2233aea9bd3b4a30f8c5136daff0187eb5ec

View file

@ -137,6 +137,30 @@ namespace SparkleLib {
}
public override string [] Warnings {
get {
SparkleGit git = new SparkleGit (SparkleConfig.DefaultConfig.TmpPath,
"config --global core.excludesfile");
git.Start ();
// Reading the standard output HAS to go before
// WaitForExit, or it will hang forever on output > 4096 bytes
string output = git.StandardOutput.ReadToEnd ().Trim ();
git.WaitForExit ();
if (string.IsNullOrEmpty (output)) {
return null;
} else {
return new string [] {
string.Format ("You seem to have configured a system gitignore file. " +
"This may interfere with SparkleShare.\n({0})", output)
};
}
}
}
public override void Stop ()
{
if (this.git != null) {

View file

@ -1,172 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// 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;
using System.IO;
using System.Diagnostics;
using System.Xml;
namespace SparkleLib {
// Sets up a fetcher that can get remote folders
public class SparkleFetcherHg : SparkleFetcherBase {
public SparkleFetcherHg (string server, string remote_folder, string target_folder) :
base (server, remote_folder, target_folder) { }
public override bool Fetch ()
{
SparkleHg hg = new SparkleHg (SparklePaths.SparkleTmpPath,
"clone \"" + base.remote_url + "\" " + "\"" + base.target_folder + "\"");
hg.Start ();
hg.WaitForExit ();
SparkleHelpers.DebugInfo ("Hg", "Exit code " + hg.ExitCode.ToString ());
if (hg.ExitCode != 0) {
return false;
} else {
InstallConfiguration ();
InstallExcludeRules ();
return true;
}
}
// 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.xml");
if (!File.Exists (global_config_file_path))
return;
string repo_config_file_path = SparkleHelpers.CombineMore (base.target_folder, ".hg", "hgrc");
string config = String.Join (Environment.NewLine, File.ReadAllLines (repo_config_file_path));
// Add user info
string n = Environment.NewLine;
XmlDocument xml = new XmlDocument();
xml.Load (global_config_file_path);
XmlNode node_name = xml.SelectSingleNode ("//user/name/text()");
XmlNode node_email = xml.SelectSingleNode ("//user/email/text()");
// TODO this ignore duplicate names (FolderName (2))
string ignore_file_path = base.target_folder.Replace (SparklePaths.SparkleTmpPath,
SparklePaths.SparklePath);
ignore_file_path = SparkleHelpers.CombineMore (ignore_file_path, ".hg", "hgignore");
config += n +
"[ui]" + n +
"username = " + node_name.Value + " <" + node_email.Value + ">" + n +
"ignore = " + ignore_file_path + n;
// Write the config to the file
TextWriter writer = new StreamWriter (repo_config_file_path);
writer.WriteLine (config);
writer.Close ();
string style_file_path = SparkleHelpers.CombineMore (base.target_folder, ".hg", "log.style");
string style = "changeset = \"{file_mods}{file_adds}{file_dels}\"" + n +
"file_add = \"A {file_add}\\n\"" + n +
"file_mod = \"M {file_mod}\\n\"" + n +
"file_del = \"D {file_del}\\n\"" + n;
writer = new StreamWriter (style_file_path);
writer.WriteLine (style);
writer.Close ();
SparkleHelpers.DebugInfo ("Config", "Added configuration to '" + repo_config_file_path + "'");
}
// Add a .gitignore file to the repo
private void InstallExcludeRules ()
{
string exlude_rules_file_path = SparkleHelpers.CombineMore (
this.target_folder, ".hg", "hgignore");
TextWriter writer = new StreamWriter (exlude_rules_file_path);
writer.WriteLine ("syntax: glob");
// 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");
// 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/*");
writer.Close ();
}
}
public class SparkleHg : Process {
public SparkleHg (string path, string args) : base ()
{
EnableRaisingEvents = true;
StartInfo.FileName = "/opt/local/bin/hg";
StartInfo.Arguments = args;
StartInfo.RedirectStandardOutput = true;
StartInfo.UseShellExecute = false;
StartInfo.WorkingDirectory = path;
}
new public void Start ()
{
SparkleHelpers.DebugInfo ("Cmd", StartInfo.FileName + " " + StartInfo.Arguments);
base.Start ();
}
}
}

View file

@ -1,319 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// 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;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
namespace SparkleLib {
public class SparkleRepoHg : SparkleRepoBase {
public SparkleRepoHg (string path, SparkleBackend backend) :
base (path, backend) { }
public override string Identifier {
get {
SparkleHg hg = new SparkleHg (LocalPath, "log -r : --limit 1 --template \"{node}\"");
hg.Start ();
hg.WaitForExit ();
return hg.StandardOutput.ReadToEnd ();
}
}
public override string CurrentRevision {
get {
SparkleHg hg = new SparkleHg (LocalPath, "log --limit 1 --template \"{node}\"");
hg.Start ();
hg.WaitForExit ();
string hash = hg.StandardOutput.ReadToEnd ().Trim ();
if (hash.Length > 0)
return hash;
else
return null;
}
}
public override bool CheckForRemoteChanges ()
{
return true; // Mercurial doesn't have a way to check for the remote hash
}
public override bool SyncUp ()
{
Add ();
string message = FormatCommitMessage ();
Commit (message);
SparkleHg hg = new SparkleHg (LocalPath, "push");
hg.Start ();
hg.WaitForExit ();
if (hg.ExitCode == 0) {
return true;
} else {
return false;
}
}
public override bool SyncDown ()
{
SparkleHg hg = new SparkleHg (LocalPath, "pull");
hg.Start ();
hg.WaitForExit ();
if (hg.ExitCode == 0) {
Merge ();
return true;
} else {
return false;
}
}
public override bool AnyDifferences {
get {
SparkleHg hg = new SparkleHg (LocalPath, "status");
hg.Start ();
hg.WaitForExit ();
string output = hg.StandardOutput.ReadToEnd ().TrimEnd ();
string [] lines = output.Split ("\n".ToCharArray ());
foreach (string line in lines) {
if (line.Length > 1 && !line [1].Equals (" "))
return true;
}
return false;
}
}
public override bool HasUnsyncedChanges {
get {
string unsynced_file_path = SparkleHelpers.CombineMore (LocalPath,
".hg", "has_unsynced_changes");
return File.Exists (unsynced_file_path);
}
set {
string unsynced_file_path = SparkleHelpers.CombineMore (LocalPath,
".hg", "has_unsynced_changes");
if (value) {
if (!File.Exists (unsynced_file_path))
File.Create (unsynced_file_path).Close ();
} else {
File.Delete (unsynced_file_path);
}
}
}
// Stages the made changes
private void Add ()
{
SparkleHg hg = new SparkleHg (LocalPath, "addremove --quiet");
hg.Start ();
hg.WaitForExit ();
SparkleHelpers.DebugInfo ("Hg", "[" + Name + "] Changes staged");
}
// Commits the made changes
private void Commit (string message)
{
if (!AnyDifferences)
return;
SparkleHg hg = new SparkleHg (LocalPath, "commit -m '" + message + "'");
hg.Start ();
hg.WaitForExit ();
SparkleHelpers.DebugInfo ("Commit", "[" + Name + "] " + message);
}
// Merges the fetched changes
private void Merge ()
{
DisableWatching ();
if (AnyDifferences) {
Add ();
string commit_message = FormatCommitMessage ();
Commit (commit_message);
}
SparkleHg hg = new SparkleHg (LocalPath, "update");
hg.Start ();
hg.WaitForExit ();
EnableWatching ();
}
// Returns a list of the latest change sets
public override List<SparkleChangeSet> GetChangeSets (int count)
{
if (count < 1)
count = 30;
List <SparkleChangeSet> change_sets = new List <SparkleChangeSet> ();
SparkleHg hg_log = new SparkleHg (LocalPath, "log --limit " + count + " --style changelog --verbose --stat");
Console.OutputEncoding = System.Text.Encoding.Unicode;
hg_log.Start ();
// Reading the standard output HAS to go before
// WaitForExit, or it will hang forever on output > 4096 bytes
string output = hg_log.StandardOutput.ReadToEnd ();
hg_log.WaitForExit ();
string [] lines = output.Split ("\n".ToCharArray ());
List <string> entries = new List <string> ();
int j = 0;
string entry = "", last_entry = "";
foreach (string line in lines) {
if (line.StartsWith ("2") && line.EndsWith (")") && j > 0) {
entries.Add (entry);
entry = "";
}
entry += line + "\n";
j++;
last_entry = entry;
}
entries.Add (last_entry);
Regex regex = new Regex (@"([0-9]{4})-([0-9]{2})-([0-9]{2}).*([0-9]{2}):([0-9]{2}).*.([0-9]{4})" +
"(.+)<(.+)>.*.([a-z0-9]{12})", RegexOptions.Compiled);
foreach (string log_entry in entries) {
bool is_merge_commit = false;
Match match = regex.Match (log_entry);
if (!match.Success)
continue;
SparkleChangeSet change_set = new SparkleChangeSet () {
Revision = match.Groups [9].Value,
IsMagical = is_merge_commit
};
change_set.User.Name = match.Groups [7].Value.Trim ();
change_set.User.Email = match.Groups [8].Value;
change_set.Timestamp = new DateTime (int.Parse (match.Groups [1].Value),
int.Parse (match.Groups [2].Value), int.Parse (match.Groups [3].Value),
int.Parse (match.Groups [4].Value), int.Parse (match.Groups [5].Value), 0);
string [] entry_lines = log_entry.Split ("\n".ToCharArray ());
foreach (string entry_line in entry_lines) {
if (!entry_line.StartsWith ("\t* "))
continue;
if (entry_line.EndsWith ("new file.")) {
string files = entry_line.Substring (3, entry_line.Length - 13);
string [] added_files = files.Split (",".ToCharArray ());
foreach (string added_file in added_files) {
string file = added_file.TrimEnd (": ".ToCharArray ());
change_set.Added.Add (file);
}
} else if (entry_line.EndsWith ("deleted file.")) {
string files = entry_line.Substring (3, entry_line.Length - 17);
string [] deleted_files = files.Split (",".ToCharArray ());
foreach (string deleted_file in deleted_files) {
string file = deleted_file.TrimEnd (": ".ToCharArray ());
change_set.Deleted.Add (file);
}
} else if (!"".Equals (entry_line.Trim ())){
string files = entry_line.Substring (3);
files = files.TrimEnd (":".ToCharArray());
string [] edited_files = files.Split (",".ToCharArray ());
foreach (string edited_file in edited_files) {
if (!change_set.Added.Contains (edited_file) &&
!change_set.Deleted.Contains (edited_file)) {
change_set.Edited.Add (edited_file);
}
}
}
}
change_sets.Add (change_set);
}
return change_sets;
}
// Creates a pretty commit message based on what has changed
private string FormatCommitMessage () // TODO
{
return "SparkleShare Hg";
}
public override void CreateInitialChangeSet ()
{
base.CreateInitialChangeSet ();
Add ();
string message = FormatCommitMessage ();
Commit (message);
}
public override bool UsesNotificationCenter
{
get {
string file_path = SparkleHelpers.CombineMore (LocalPath, ".hg", "disable_notification_center");
return !File.Exists (file_path);
}
}
}
}

View file

@ -1,12 +1,6 @@
ASSEMBLY = SparkleLib
TARGET = library
if HAVE_SMARTIRC4NET
LINK = $(REF_SPARKLELIB) $(LINK_SMARTIRC4NET_SYSTEM)
else
LINK = $(REF_SPARKLELIB) $(LINK_SMARTIRC4NET_LOCAL)
endif
SOURCES = \
Defines.cs \
Git/SparkleFetcherGit.cs \
@ -17,17 +11,11 @@ SOURCES = \
SparkleFetcherBase.cs \
SparkleHelpers.cs \
SparkleListenerBase.cs \
SparkleListenerIrc.cs \
SparkleListenerTcp.cs \
SparkleOptions.cs \
SparkleRepoBase.cs \
SparkleWatcher.cs
SMARTIRC4NET_FILES_EXPANDED = $(foreach file, $(SMARTIRC4NET_FILES), $(top_builddir)/$(file))
EXTRA_BUNDLE = $(SMARTIRC4NET_FILES_EXPANDED)
install-data-hook:
for ASM in $(EXTRA_BUNDLE); do \
$(INSTALL) -m 0755 $$ASM $(DESTDIR)$(moduledir); \

View file

@ -102,7 +102,7 @@ namespace SparkleLib {
public class SparkleFolder {
public string Name;
// TODO: Uri
public Uri RemoteAddress;
public string FullPath {
get {

View file

@ -19,8 +19,9 @@ using System;
using System.IO;
using System.Collections.Generic;
using System.Xml;
using System.Security.Principal;
using Mono.Unix;
//using Mono.Unix;
namespace SparkleLib {
@ -98,11 +99,11 @@ namespace SparkleLib {
if (SparkleBackend.Platform == PlatformID.Unix ||
SparkleBackend.Platform == PlatformID.MacOSX) {
user_name = new UnixUserInfo (UnixEnvironment.UserName).RealName;
user_name = Environment.UserName;
if (string.IsNullOrEmpty (user_name))
user_name = UnixEnvironment.UserName;
user_name = "";
else
user_name = user_name.TrimEnd (",".ToCharArray());
user_name = user_name.TrimEnd (",".ToCharArray ());
} else {
user_name = Environment.UserName;

View file

@ -18,10 +18,11 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Security.AccessControl;
using System.Text.RegularExpressions;
using System.Threading;
using Mono.Unix;
//using Mono.Unix;
namespace SparkleLib {
@ -29,7 +30,7 @@ namespace SparkleLib {
public abstract class SparkleFetcherBase {
public delegate void StartedEventHandler ();
public delegate void FinishedEventHandler ();
public delegate void FinishedEventHandler (string [] warnings);
public delegate void FailedEventHandler ();
public delegate void ProgressChangedEventHandler (double percentage);
@ -52,7 +53,7 @@ namespace SparkleLib {
public abstract bool Fetch ();
public abstract string [] Warnings { get; }
// Clones the remote repository
public void Start ()
@ -83,7 +84,7 @@ namespace SparkleLib {
EnableHostKeyCheckingForHost (host);
if (Finished != null)
Finished ();
Finished (Warnings);
} else {
SparkleHelpers.DebugInfo ("Fetcher", "Failed");
@ -157,9 +158,9 @@ namespace SparkleLib {
File.WriteAllText (ssh_config_file_path, ssh_config);
}
UnixFileSystemInfo file_info = new UnixFileInfo (ssh_config_file_path);
file_info.FileAccessPermissions = (FileAccessPermissions.UserRead |
FileAccessPermissions.UserWrite);
//UnixFileSystemInfo file_info = new UnixFileInfo (ssh_config_file_path);
//file_info.FileAccessPermissions = (FileAccessPermissions.UserRead |
// FileAccessPermissions.UserWrite); TODO
SparkleHelpers.DebugInfo ("Fetcher", "Disabled host key checking " + host);
}
@ -169,8 +170,8 @@ namespace SparkleLib {
{
string path = SparkleConfig.DefaultConfig.HomePath;
if (!(SparkleBackend.Platform == PlatformID.Unix ||
SparkleBackend.Platform == PlatformID.MacOSX)) {
if (SparkleBackend.Platform != PlatformID.Unix &&
SparkleBackend.Platform != PlatformID.MacOSX) {
path = Environment.ExpandEnvironmentVariables ("%HOMEDRIVE%%HOMEPATH%");
}
@ -208,9 +209,9 @@ namespace SparkleLib {
} else {
File.WriteAllText (ssh_config_file_path, new_ssh_config.Trim ());
UnixFileSystemInfo file_info = new UnixFileInfo (ssh_config_file_path);
file_info.FileAccessPermissions = (FileAccessPermissions.UserRead |
FileAccessPermissions.UserWrite);
//UnixFileSystemInfo file_info = new UnixFileInfo (ssh_config_file_path);
//file_info.FileAccessPermissions = (FileAccessPermissions.UserRead |
// FileAccessPermissions.UserWrite); TODO
}
}

View file

@ -31,10 +31,6 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="Mono.Posix" />
<Reference Include="Meebey.SmartIrc4net, Version=0.4.5.0, Culture=neutral, PublicKeyToken=7868485fbf407e0f">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\bin\Meebey.SmartIrc4net.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="SparkleRepoBase.cs" />

View file

@ -75,9 +75,6 @@ namespace SparkleLib {
case "tcp":
listeners.Add (new SparkleListenerTcp (announce_uri, folder_identifier));
break;
case "irc":
listeners.Add (new SparkleListenerIrc (announce_uri, folder_identifier));
break;
default:
listeners.Add (new SparkleListenerTcp (announce_uri, folder_identifier));
break;

View file

@ -1,219 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// 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;
using System.Text;
using System.Threading;
using System.Security.Cryptography;
using Meebey.SmartIrc4net;
namespace SparkleLib {
public class SparkleListenerIrc : SparkleListenerBase {
private Thread thread;
private IrcClient client;
private string nick;
private string announcements_password;
private bool allow_passwordless_join;
public SparkleListenerIrc (Uri server, string folder_identifier) :
base (server, folder_identifier)
{
// Try to get a uniqueish nickname
this.nick = SHA1 (DateTime.Now.ToString ("ffffff") + "sparkles");
// Most irc servers don't allow nicknames starting
// with a number, so prefix an alphabetic character
this.nick = "s" + this.nick.Substring (0, 7);
// Optional password to make the channel access more safe
this.announcements_password =
SparkleConfig.DefaultConfig.GetConfigOption ("announcements_password");
// Option to allow access to channel when no password is defined
try {
string option = SparkleConfig.DefaultConfig.GetConfigOption ("allow_passwordless_join");
this.allow_passwordless_join = (option == null || Convert.ToBoolean (option));
} catch (Exception) {
this.allow_passwordless_join = true;
}
base.channels.Add ("#" + folder_identifier);
this.client = new IrcClient () {
PingTimeout = 180,
PingInterval = 60
};
string proxy = Environment.GetEnvironmentVariable ("http_proxy");
Uri proxy_uri = null;
if (!String.IsNullOrEmpty (proxy) &&
Uri.TryCreate (proxy, UriKind.Absolute, out proxy_uri)) {
if (proxy_uri.Scheme == "http") {
this.client.ProxyType = ProxyType.Http;
this.client.ProxyHost = proxy_uri.Host;
this.client.ProxyPort = proxy_uri.Port;
}
}
this.client.OnConnected += delegate {
base.is_connecting = false;
OnConnected ();
};
this.client.OnDisconnected += delegate {
base.is_connecting = false;
OnDisconnected ();
};
this.client.OnError += delegate {
base.is_connecting = false;
OnDisconnected ();
};
this.client.OnChannelMessage += delegate (object o, IrcEventArgs args) {
string message = args.Data.Message.Trim ();
string folder_id = args.Data.Channel.Substring (1); // remove the starting hash
OnAnnouncement (new SparkleAnnouncement (folder_id, message));
};
}
public override bool IsConnected {
get {
return this.client.IsConnected;
}
}
// Starts a new thread and listens to the channel
public override void Connect ()
{
SparkleHelpers.DebugInfo ("ListenerIrc", "Connecting to " + Server);
base.is_connecting = true;
this.thread = new Thread (
new ThreadStart (delegate {
try {
// Connect, login, and join the channel
int port = base.server.Port;
if (port < 0)
port = 6667;
this.client.Connect (base.server.Host, port);
this.client.Login (this.nick, this.nick, 8, this.nick);
foreach (string channel in base.channels) {
SparkleHelpers.DebugInfo ("ListenerIrc", "Joining channel " + channel);
if (!string.IsNullOrEmpty (this.announcements_password)) {
SparkleHelpers.DebugInfo ("ListenerIrc", "Password set to access the channel");
this.client.RfcJoin (channel, this.announcements_password);
this.client.RfcMode (channel, "+k " + this.announcements_password);
} else {
if (this.allow_passwordless_join) {
SparkleHelpers.DebugInfo ("ListenerIrc", "Accessing unprotected channel, change the setting to not access");
this.client.RfcJoin (channel);
} else {
SparkleHelpers.DebugInfo ("ListenerIrc", "Unprotected channel, change the setting to access");
base.is_connecting = false;
OnDisconnected ();
throw new ConnectionException ("Unprotected channel, change the setting to access");
}
}
this.client.RfcMode (channel, "+s");
}
// List to the channel, this blocks the thread
this.client.Listen ();
// Disconnect when we time out
this.client.Disconnect ();
} catch (ConnectionException e) {
SparkleHelpers.DebugInfo ("ListenerIrc", "Could not connect to " + Server + ": " + e.Message);
}
})
);
this.thread.Start ();
}
public override void AlsoListenTo (string folder_identifier)
{
string channel = "#" + folder_identifier;
if (!base.channels.Contains (channel)) {
base.channels.Add (channel);
if (IsConnected) {
SparkleHelpers.DebugInfo ("ListenerIrc", "Joining channel " + channel);
if (this.announcements_password != null) {
SparkleHelpers.DebugInfo ("ListenerIrc", "Password set to access the channel");
this.client.RfcJoin (channel, this.announcements_password);
this.client.RfcMode (channel, "+k " + this.announcements_password);
} else {
if (allow_passwordless_join) {
SparkleHelpers.DebugInfo ("ListenerIrc", "Accessing a dangerous channel change the setting to not access");
this.client.RfcJoin (channel);
} else {
SparkleHelpers.DebugInfo ("ListenerIrc", "Dangerous channel, change the setting to access");
}
}
this.client.RfcMode (channel, "+s");
}
}
}
public override void Announce (SparkleAnnouncement announcement)
{
string channel = "#" + announcement.FolderIdentifier;
this.client.SendMessage (SendType.Message, channel, announcement.Message);
// Also announce to ourselves for debugging purposes
// base.OnAnnouncement (announcement);
}
public override void Dispose ()
{
this.thread.Abort ();
this.thread.Join ();
base.Dispose ();
}
// Creates a 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

@ -72,7 +72,7 @@ namespace SparkleLib {
public delegate void NewChangeSetEventHandler (SparkleChangeSet change_set);
public event NewChangeSetEventHandler NewChangeSet;
public delegate void NewNoteEventHandler (string user_name, string user_email);
public delegate void NewNoteEventHandler (SparkleUser user);
public event NewNoteEventHandler NewNote;
public delegate void ConflictResolvedEventHandler ();
@ -482,7 +482,7 @@ namespace SparkleLib {
foreach (string added in change_set.Added) {
if (added.Contains (".notes")) {
if (NewNote != null)
NewNote (change_set.User.Name, change_set.User.Email);
NewNote (change_set.User);
note_added = true;
break;

View file

@ -193,7 +193,7 @@ namespace SparkleShare {
public override void DecidePolicyForNavigation (WebView web_view, NSDictionary action_info,
NSUrlRequest request, WebFrame frame, NSObject decision_token)
{
Controller.LinkClicked (request.Url.ToString ());
SparkleEventLogController.LinkClicked (request.Url.ToString ());
}
}
}

View file

@ -16,11 +16,9 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Timers;
using System.Collections.Generic;
using Mono.Unix;
using MonoMac.Foundation;
@ -54,7 +52,9 @@ namespace SparkleShare {
private NSTextField PathLabel;
private NSTextField PathHelpLabel;
private NSTextField AddProjectTextField;
private Timer timer;
private NSTextField WarningTextField;
private NSImage WarningImage;
private NSImageView WarningImageView;
private NSTableView TableView;
private NSScrollView ScrollView;
private NSTableColumn IconColumn;
@ -64,7 +64,7 @@ namespace SparkleShare {
public SparkleSetup () : base ()
{
Controller.ChangePageEvent += delegate (PageType type) {
Controller.ChangePageEvent += delegate (PageType type, string [] warnings) {
InvokeOnMainThread (delegate {
Reset ();
@ -87,8 +87,9 @@ namespace SparkleShare {
};
FullNameTextField = new NSTextField () {
Frame = new RectangleF (330, Frame.Height - 238, 196, 22),
StringValue = Controller.GuessedUserName
Frame = new RectangleF (330, Frame.Height - 238, 196, 22),
StringValue = Controller.GuessedUserName,
Delegate = new SparkleTextFieldDelegate ()
};
EmailLabel = new NSTextField () {
@ -102,42 +103,45 @@ namespace SparkleShare {
};
EmailTextField = new NSTextField () {
Frame = new RectangleF (330, Frame.Height - 268, 196, 22),
StringValue = Controller.GuessedUserEmail
Frame = new RectangleF (330, Frame.Height - 268, 196, 22),
StringValue = Controller.GuessedUserEmail,
Delegate = new SparkleTextFieldDelegate ()
};
// TODO: Ugly hack, do properly with events
timer = new Timer () {
Interval = 50
(FullNameTextField.Delegate as SparkleTextFieldDelegate).StringValueChanged += delegate {
Controller.CheckSetupPage (
FullNameTextField.StringValue,
EmailTextField.StringValue
);
};
(EmailTextField.Delegate as SparkleTextFieldDelegate).StringValueChanged += delegate {
Controller.CheckSetupPage (
FullNameTextField.StringValue,
EmailTextField.StringValue
);
};
ContinueButton = new NSButton () {
Title = "Continue",
Enabled = false
};
ContinueButton.Activated += delegate {
timer.Stop ();
timer = null;
string full_name = FullNameTextField.StringValue.Trim ();
string email = EmailTextField.StringValue.Trim ();
Controller.SetupPageCompleted (full_name, email);
};
timer.Elapsed += delegate {
Controller.UpdateSetupContinueButtonEvent += delegate (bool button_enabled) {
InvokeOnMainThread (delegate {
bool name_is_valid = !FullNameTextField.StringValue.Trim ().Equals ("");
bool email_is_valid = Program.Controller.IsValidEmail (
EmailTextField.StringValue.Trim ());
ContinueButton.Enabled = (name_is_valid && email_is_valid);
ContinueButton.Enabled = button_enabled;
});
};
timer.Start ();
ContentView.AddSubview (FullNameLabel);
ContentView.AddSubview (FullNameTextField);
@ -168,7 +172,8 @@ namespace SparkleShare {
Frame = new RectangleF (190, Frame.Height - 336, 196, 22),
Font = SparkleUI.Font,
StringValue = Controller.PreviousAddress,
Enabled = (Controller.SelectedPlugin.Address == null)
Enabled = (Controller.SelectedPlugin.Address == null),
Delegate = new SparkleTextFieldDelegate ()
};
@ -186,12 +191,12 @@ namespace SparkleShare {
Frame = new RectangleF (190 + 196 + 16, Frame.Height - 336, 196, 22),
StringValue = Controller.PreviousPath,
Enabled = (Controller.SelectedPlugin.Path == null),
Bezeled = true
Delegate = new SparkleTextFieldDelegate ()
};
AddressTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
PathTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
AddressTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
PathTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
PathHelpLabel = new NSTextField () {
@ -210,7 +215,8 @@ namespace SparkleShare {
Frame = new RectangleF (0, 0, 0, 0),
RowHeight = 30,
IntercellSpacing = new SizeF (0, 12),
HeaderView = null
HeaderView = null,
Delegate = new SparkleTableViewDelegate ()
};
ScrollView = new NSScrollView () {
@ -270,33 +276,43 @@ namespace SparkleShare {
});
};
TableView.SelectRow (Controller.SelectedPluginIndex, false);
timer = new Timer () {
Interval = 50
(AddressTextField.Delegate as SparkleTextFieldDelegate).StringValueChanged += delegate {
Controller.CheckAddPage (
AddressTextField.StringValue,
PathTextField.StringValue,
TableView.SelectedRow
);
};
// TODO: Use an event
timer.Elapsed += delegate {
if (TableView.SelectedRow != Controller.SelectedPluginIndex)
Controller.SelectedPluginChanged (TableView.SelectedRow);
(PathTextField.Delegate as SparkleTextFieldDelegate).StringValueChanged += delegate {
Controller.CheckAddPage (
AddressTextField.StringValue,
PathTextField.StringValue,
TableView.SelectedRow
);
};
(TableView.Delegate as SparkleTableViewDelegate).SelectionChanged += delegate {
Controller.SelectedPluginChanged (TableView.SelectedRow);
Controller.CheckAddPage (
AddressTextField.StringValue,
PathTextField.StringValue,
TableView.SelectedRow
);
};
Controller.UpdateAddProjectButtonEvent += delegate (bool button_enabled) {
InvokeOnMainThread (delegate {
// TODO: Move checking logic to controller
if (!string.IsNullOrWhiteSpace (AddressTextField.StringValue) &&
!string.IsNullOrWhiteSpace (PathTextField.StringValue)) {
SyncButton.Enabled = true;
} else {
SyncButton.Enabled = false;
}
SyncButton.Enabled = button_enabled;
});
};
timer.Start ();
ContentView.AddSubview (ScrollView);
ContentView.AddSubview (AddressLabel);
@ -311,9 +327,6 @@ namespace SparkleShare {
};
SyncButton.Activated += delegate {
timer.Stop ();
timer = null;
Controller.AddPageCompleted (
AddressTextField.StringValue,
PathTextField.StringValue
@ -442,6 +455,28 @@ namespace SparkleShare {
"" + Controller.SyncingFolder + " in " +
"your SparkleShare folder.";
if (warnings != null) {
WarningImage = NSImage.ImageNamed ("NSCaution");
WarningImage.Size = new SizeF (24, 24);
WarningImageView = new NSImageView () {
Image = WarningImage,
Frame = new RectangleF (190, Frame.Height - 175, 24, 24)
};
WarningTextField = new NSTextField () {
Frame = new RectangleF (230, Frame.Height - 245, 325, 100),
StringValue = warnings [0],
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
Editable = false,
Font = SparkleUI.Font
};
ContentView.AddSubview (WarningImageView);
ContentView.AddSubview (WarningTextField);
}
FinishButton = new NSButton () {
Title = "Finish"
};
@ -673,4 +708,39 @@ namespace SparkleShare {
}
}
}
public class SparkleTextFieldDelegate : NSTextFieldDelegate {
public event StringValueChangedHandler StringValueChanged;
public delegate void StringValueChangedHandler ();
public override void Changed (NSNotification notification)
{
if (StringValueChanged!= null)
StringValueChanged ();
}
public override string [] GetCompletions (NSControl control, NSTextView text_view,
string [] a, MonoMac.Foundation.NSRange range, int b)
{
return new string [0];
}
}
public class SparkleTableViewDelegate : NSTableViewDelegate {
public event SelectionChangedHandler SelectionChanged;
public delegate void SelectionChangedHandler ();
public override void SelectionDidChange (NSNotification notification)
{
if (SelectionChanged != null)
SelectionChanged ();
}
}
}

View file

@ -143,7 +143,7 @@ namespace SparkleShare {
public override void PerformClose (NSObject sender)
{
OrderOut (this);
base.OrderOut (this);
NSApplication.SharedApplication.RemoveWindowsItem (this);
return;
}

View file

@ -38,6 +38,7 @@ SOURCES = \
SparkleEntry.cs \
SparkleEventLog.cs \
SparkleEventLogController.cs \
SparkleOptions.cs \
SparkleSetup.cs \
SparkleSetupController.cs \
SparkleSetupWindow.cs \

View file

@ -25,7 +25,6 @@ using System.Text;
using Mono.Unix;
//using Mono.Unix.Native;
using SparkleLib;
using SparkleLib.Options;
namespace SparkleShare {

View file

@ -16,6 +16,7 @@
using System;
using SparkleLib;
namespace SparkleShare {
@ -29,14 +30,18 @@ namespace SparkleShare {
{
Program.Controller.ConflictNotificationRaised += delegate {
ShowBubble ("Ouch! Mid-air collision!",
"Don't worry, SparkleShare made a copy of each conflicting file.",
null);
"Don't worry, SparkleShare made a copy of each conflicting file.",
null);
};
Program.Controller.NotificationRaised += delegate (string user_name, string user_email,
string message, string folder_path) {
ShowBubble (user_name, message,
Program.Controller.GetAvatar (user_email, 36));
Program.Controller.NotificationRaised += delegate (SparkleChangeSet change_set) {
ShowBubble (change_set.User.Name, FormatMessage (change_set),
Program.Controller.GetAvatar (change_set.User.Email, 36));
};
Program.Controller.NoteNotificationRaised += delegate (SparkleUser user, string folder_name) {
ShowBubble (user.Name, "added a note to '" + folder_name + "'",
Program.Controller.GetAvatar (user.Email, 36));
};
}
@ -46,5 +51,47 @@ namespace SparkleShare {
if (ShowBubbleEvent != null && Program.Controller.NotificationsEnabled)
ShowBubbleEvent (title, subtext, image_path);
}
private string FormatMessage (SparkleChangeSet change_set)
{
string file_name = "";
string message = "";
if (change_set.Added.Count > 0) {
file_name = change_set.Added [0];
message = String.Format ("added {0}", file_name);
}
if (change_set.MovedFrom.Count > 0) {
file_name = change_set.MovedFrom [0];
message = String.Format ("moved {0}", file_name);
}
if (change_set.Edited.Count > 0) {
file_name = change_set.Edited [0];
message = String.Format ("edited {0}", file_name);
}
if (change_set.Deleted.Count > 0) {
file_name = change_set.Deleted [0];
message = String.Format ("deleted {0}", file_name);
}
int changes_count = (change_set.Added.Count +
change_set.Edited.Count +
change_set.Deleted.Count +
change_set.MovedFrom.Count) - 1;
if (changes_count > 0) {
string msg = string.Format ("and {0} more", changes_count);
message += " " + String.Format (msg, changes_count);
} else if (changes_count < 0) {
message += "did something magical";
}
return message;
}
}
}

View file

@ -42,7 +42,7 @@ namespace SparkleShare {
public delegate void OnQuitWhileSyncingEventHandler ();
public event FolderFetchedEventHandler FolderFetched;
public delegate void FolderFetchedEventHandler ();
public delegate void FolderFetchedEventHandler (string [] warnings);
public event FolderFetchErrorEventHandler FolderFetchError;
public delegate void FolderFetchErrorEventHandler (string remote_url);
@ -75,8 +75,10 @@ namespace SparkleShare {
public delegate void ConflictNotificationRaisedEventHandler ();
public event NotificationRaisedEventHandler NotificationRaised;
public delegate void NotificationRaisedEventHandler (string user_name, string user_email,
string message, string repository_path);
public delegate void NotificationRaisedEventHandler (SparkleChangeSet change_set);
public event NoteNotificationRaisedEventHandler NoteNotificationRaised;
public delegate void NoteNotificationRaisedEventHandler (SparkleUser user, string folder_name);
public abstract string PluginsPath { get; }
@ -581,16 +583,15 @@ namespace SparkleShare {
SparkleRepoBase repo = new SparkleRepoGit (folder_path, SparkleBackend.DefaultBackend);
repo.NewChangeSet += delegate (SparkleChangeSet change_set) {
string message = FormatMessage (change_set);
if (NotificationRaised != null)
NotificationRaised (change_set.User.Name, change_set.User.Email, message, repo.LocalPath);
NotificationRaised (change_set);
};
repo.NewNote += delegate (string user_name, string user_email) {
if (NotificationRaised != null)
NotificationRaised (user_name, user_email,
"added a note to " + Path.GetFileName (repo.LocalPath), repo.LocalPath);
repo.NewNote += delegate (SparkleUser user) {
if (NoteNotificationRaised != null)
NoteNotificationRaised (user, repo.Name);
};
repo.ConflictResolved += delegate {
@ -702,48 +703,6 @@ namespace SparkleShare {
}
private string FormatMessage (SparkleChangeSet change_set)
{
string file_name = "";
string message = "";
if (change_set.Added.Count > 0) {
file_name = change_set.Added [0];
message = String.Format (_("added {0}"), file_name);
}
if (change_set.MovedFrom.Count > 0) {
file_name = change_set.MovedFrom [0];
message = String.Format (_("moved {0}"), file_name);
}
if (change_set.Edited.Count > 0) {
file_name = change_set.Edited [0];
message = String.Format (_("edited {0}"), file_name);
}
if (change_set.Deleted.Count > 0) {
file_name = change_set.Deleted [0];
message = String.Format (_("deleted {0}"), file_name);
}
int changes_count = (change_set.Added.Count +
change_set.Edited.Count +
change_set.Deleted.Count +
change_set.MovedFrom.Count) - 1;
if (changes_count > 0) {
string msg = Catalog.GetPluralString ("and {0} more", "and {0} more", changes_count);
message += " " + String.Format (msg, changes_count);
} else if (changes_count < 0) {
message += _("did something magical");
}
return message;
} // TODO: move to bubbles controller
// Recursively gets a folder's size in bytes
private double CalculateFolderSize (DirectoryInfo parent)
{
@ -1054,7 +1013,7 @@ namespace SparkleShare {
if (i > 1)
target_folder_name += " (" + i + ")";
this.fetcher.Finished += delegate {
this.fetcher.Finished += delegate (string [] warnings) {
// Needed to do the moving
SparkleHelpers.ClearAttributes (tmp_folder);
@ -1071,7 +1030,7 @@ namespace SparkleShare {
AddRepository (target_folder_path);
if (FolderFetched != null)
FolderFetched ();
FolderFetched (warnings);
FolderSize = GetFolderSize ();
@ -1155,16 +1114,6 @@ namespace SparkleShare {
}
// Checks to see if an email address is valid
public bool IsValidEmail (string email)
{
Regex regex = new Regex (@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$", RegexOptions.IgnoreCase);
return regex.IsMatch (email);
}
public void AddNoteToFolder (string folder_name, string revision, string note)
{
folder_name = folder_name.Replace ("%20", " ");
@ -1177,8 +1126,6 @@ namespace SparkleShare {
}
private string [] tango_palette = new string [] {"#eaab00", "#e37222",
"#3892ab", "#33c2cb", "#19b271", "#9eab05", "#8599a8", "#9ca696",
"#b88454", "#cc0033", "#8f6678", "#8c6cd0", "#796cbf", "#4060af",

File diff suppressed because it is too large Load diff

View file

@ -461,7 +461,31 @@ namespace SparkleShare {
Close ();
};
Add (null);
if (warnings != null) {
WarningImage = NSImage.ImageNamed ("NSCaution");
WarningImage.Size = new SizeF (24, 24);
WarningImageView = new NSImageView () {
Image = WarningImage,
Frame = new RectangleF (190, Frame.Height - 175, 24, 24)
};
Image warning_image = new Image (SparkleUIHelpers.GetIcon ("dialog-warning", 24));
Label warning_label = new Label (warnings [0]) {
Xalign = 0
};
HBox warning_layout = new HBox (false, 0);
warning_layout.PackStart (warning_image, false, false, 0);
warning_layout.PackStart (warning_label, true, true, 0);
Add (warning_layout);
} else {
Add (null);
}
AddButton (open_folder_button);
AddButton (finish_button);
@ -575,42 +599,6 @@ namespace SparkleShare {
}
// Enables or disables the 'Next' button depending on the
// entries filled in by the user
private void CheckSetupPage ()
{
if (NameEntry.Text.Length > 0 &&
Program.Controller.IsValidEmail (EmailEntry.Text)) {
NextButton.Sensitive = true;
} else {
NextButton.Sensitive = false;
}
}
// Enables or disables the 'Next' button depending on the
// entries filled in by the user
public void CheckAddPage ()
{
SyncButton.Sensitive = false;
if (PathEntry.ExampleTextActive ||
(AddressEntry.Sensitive && AddressEntry.ExampleTextActive))
return;
bool IsFolder = !PathEntry.Text.Trim ().Equals ("");
bool IsServer = !AddressEntry.Text.Trim ().Equals ("");
if (AddressEntry.Sensitive == true) {
if (IsServer && IsFolder)
SyncButton.Sensitive = true;
} else if (IsFolder) {
SyncButton.Sensitive = true;
}
}
private void RenderServiceColumn (TreeViewColumn column, CellRenderer cell,
TreeModel model, TreeIter iter)
{

View file

@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using SparkleLib;
@ -32,15 +33,26 @@ namespace SparkleShare {
Tutorial
}
public enum FieldState {
Enabled,
Disabled
}
public class SparkleSetupController {
public event ChangePageEventHandler ChangePageEvent;
public delegate void ChangePageEventHandler (PageType page);
public delegate void ChangePageEventHandler (PageType page, string [] warnings);
public event UpdateProgressBarEventHandler UpdateProgressBarEvent;
public delegate void UpdateProgressBarEventHandler (double percentage);
public event UpdateSetupContinueButtonEventHandler UpdateSetupContinueButtonEvent;
public delegate void UpdateSetupContinueButtonEventHandler (bool button_enabled);
public event UpdateAddProjectButtonEventHandler UpdateAddProjectButtonEvent;
public delegate void UpdateAddProjectButtonEventHandler (bool button_enabled);
public event ChangeAddressFieldEventHandler ChangeAddressFieldEvent;
public delegate void ChangeAddressFieldEventHandler (string text,
string example_text, FieldState state);
@ -140,7 +152,7 @@ namespace SparkleShare {
SelectedPlugin = Plugins [0];
ChangePageEvent += delegate (PageType page) {
ChangePageEvent += delegate (PageType page, string [] warning) {
this.previous_page = page;
};
}
@ -149,7 +161,20 @@ namespace SparkleShare {
public void ShowSetupPage ()
{
if (ChangePageEvent != null)
ChangePageEvent (PageType.Setup);
ChangePageEvent (PageType.Setup, null);
}
public void CheckSetupPage (string full_name, string email)
{
full_name = full_name.Trim ();
email = email.Trim ();
bool fields_valid = (!string.IsNullOrWhiteSpace (full_name) &&
IsValidEmail (email));
if (UpdateSetupContinueButtonEvent != null)
UpdateSetupContinueButtonEvent (fields_valid);
}
@ -162,7 +187,7 @@ namespace SparkleShare {
Program.Controller.UpdateState ();
if (ChangePageEvent != null)
ChangePageEvent (PageType.Tutorial);
ChangePageEvent (PageType.Tutorial, null);
}
@ -171,7 +196,7 @@ namespace SparkleShare {
this.tutorial_page_number++;
if (ChangePageEvent != null)
ChangePageEvent (PageType.Tutorial);
ChangePageEvent (PageType.Tutorial, null);
}
@ -180,19 +205,35 @@ namespace SparkleShare {
this.tutorial_page_number = 4;
if (ChangePageEvent != null)
ChangePageEvent (PageType.Tutorial);
ChangePageEvent (PageType.Tutorial, null);
}
public void ShowAddPage ()
{
if (ChangePageEvent != null)
ChangePageEvent (PageType.Add);
ChangePageEvent (PageType.Add, null);
SelectedPluginChanged (SelectedPluginIndex);
}
public void CheckAddPage (string address, string remote_path, int selected_plugin)
{
if (SelectedPluginIndex != selected_plugin)
SelectedPluginChanged (selected_plugin);
address = address.Trim ();
remote_path = remote_path.Trim ();
bool fields_valid = (!string.IsNullOrWhiteSpace (address) &&
!string.IsNullOrWhiteSpace (remote_path));
if (UpdateAddProjectButtonEvent != null)
UpdateAddProjectButtonEvent (fields_valid);
}
public void AddPageCompleted (string address, string path)
{
this.syncing_folder = Path.GetFileNameWithoutExtension (path);
@ -200,11 +241,13 @@ namespace SparkleShare {
this.previous_path = path;
if (ChangePageEvent != null)
ChangePageEvent (PageType.Syncing);
ChangePageEvent (PageType.Syncing, null);
Program.Controller.FolderFetched += delegate {
// TODO: Remove events afterwards
Program.Controller.FolderFetched += delegate (string [] warnings) {
if (ChangePageEvent != null)
ChangePageEvent (PageType.Finished);
ChangePageEvent (PageType.Finished, warnings);
this.previous_address = "";
this.syncing_folder = "";
@ -216,7 +259,7 @@ namespace SparkleShare {
this.previous_url = remote_url;
if (ChangePageEvent != null)
ChangePageEvent (PageType.Error);
ChangePageEvent (PageType.Error, null);
this.syncing_folder = "";
};
@ -233,7 +276,7 @@ namespace SparkleShare {
public void ErrorPageCompleted ()
{
if (ChangePageEvent != null)
ChangePageEvent (PageType.Add);
ChangePageEvent (PageType.Add, null);
}
@ -242,7 +285,7 @@ namespace SparkleShare {
Program.Controller.StopFetcher ();
if (ChangePageEvent != null)
ChangePageEvent (PageType.Add);
ChangePageEvent (PageType.Add, null);
}
@ -283,11 +326,14 @@ namespace SparkleShare {
ChangePathFieldEvent ("", "", FieldState.Enabled);
}
}
}
public enum FieldState {
Enabled,
Disabled
private bool IsValidEmail (string email)
{
Regex regex = new Regex (@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$",
RegexOptions.IgnoreCase);
return regex.IsMatch (email);
}
}
}

View file

@ -104,7 +104,7 @@ namespace SparkleShare {
case IconState.Syncing:
StateText = _("Syncing…");
UpdateStateText (); // TODO
UpdateStateText ();
if (!Animation.Enabled)
Animation.Start ();

View file

@ -22,6 +22,8 @@ namespace SparkleShare {
public enum IconState {
Idle,
SyncingUp,
SyncingDown,
Syncing,
Error
}
@ -71,8 +73,6 @@ namespace SparkleShare {
Program.Controller.OnSyncing += delegate {
CurrentState = IconState.Syncing;
// TODO up down both
if (UpdateMenuEvent != null)
UpdateMenuEvent (IconState.Syncing);
};

View file

@ -73,10 +73,6 @@ else
touch gnome-doc-utils.make
fi
if git --help &>/dev/null; then
git submodule update --init
fi
run intltoolize --force --copy
run $LIBTOOLIZE --force --copy --automake
run aclocal -I build/m4/sparkleshare -I build/m4/shamrock -I build/m4/shave $ACLOCAL_FLAGS
@ -85,12 +81,6 @@ run autoconf
run automake --gnu --add-missing --force --copy \
-Wno-portability -Wno-portability
if test -d $srcdir/SmartIrc4net; then
echo Running SmartIrc4net/autogen.sh ...
(cd $srcdir/SmartIrc4net; NOCONFIGURE=1 ./autogen.sh "$@")
echo Done running SmartIrc4net/autogen.sh ...
fi
if [ ! -z "$NOCONFIGURE" ]; then
echo "Done. ./configure skipped."
exit $?

View file

@ -15,8 +15,6 @@ LINK_GTK = $(GTKSHARP_LIBS)
LINK_GNOME = $(GNOME_SHARP_LIBS)
LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS)
LINK_SMARTIRC4NET_SYSTEM = $(SMARTIRC4NET_LIBS)
LINK_SMARTIRC4NET_LOCAL = -r:$(abs_top_builddir)/$(SMARTIRC4NET_ASSEMBLY)
LINK_APP_INDICATOR = $(APP_INDICATOR_LIBS)
REF_NOTIFY_SHARP = $(LINK_SYSTEM) $(LINK_DBUS) $(GTKSHARP_LIBS) $(GLIBSHARP_LIBS)

View file

@ -26,7 +26,7 @@ ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
if ENABLE_TESTS
LINK += " $(NUNIT_LIBS)"
LINK = " $(NUNIT_LIBS)"
ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
endif

View file

@ -1,16 +0,0 @@
AC_DEFUN([SPARKLESHARE_SMARTIRC4NET],
[
if test ! -d "$srcdir/SmartIrc4net"; then
AC_MSG_ERROR([SmartIrc4net folder not found])
fi
ac_configure_args="$ac_configure_args --disable-pkg-config --disable-pkg-lib --disable-pkg-gac"
AC_CONFIG_SUBDIRS([SmartIrc4net])
asm="SmartIrc4net/bin/Meebey.SmartIrc4net.dll"
SMARTIRC4NET_ASSEMBLY="$asm"
SMARTIRC4NET_FILES="$asm"
[[ -r "$asm.mdb" ]] && SMARTIRC4NET_FILES="$SMARTIRC4NET_FILES $asm.mdb"
AC_SUBST([SMARTIRC4NET_ASSEMBLY])
AC_SUBST([SMARTIRC4NET_FILES])
])

View file

@ -87,18 +87,6 @@ dnl package checks, common for all configs
SPARKLESHARE_CHECK_GTK_SHARP
SPARKLESHARE_SMARTIRC4NET
PKG_CHECK_MODULES([SMARTIRC4NET], [smartirc4net >= 0.5],
SMARTIRC4NET_ASSEMBLY=""
AC_SUBST(SMARTIRC4NET_ASSEMBLY)
,
SMARTIRC4NET_LIBS=""
AC_SUBST(SMARTIRC4NET_LIBS)
SPARKLE_SMARTIRC4NETDIR=SmartIrc4Net
AC_SUBST(SPARKLE_SMARTIRC4NETDIR)
)
AM_CONDITIONAL([HAVE_SMARTIRC4NET], test x$SPARKLE_SMARTIRC4NETDIR = x)
AC_ARG_ENABLE(gtkui,
AS_HELP_STRING([--disable-gtkui], [Do not build the Gtk+ user interface]),
[ enable_gtkui=no ], [ enable_gtkui=yes ])