internal void Start(string[] args) { var programArgs = new ProgramArguments(args); if (programArgs.Flags.ContainsKey("help")) { Console.WriteLine("usage: {0} [options]", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name); Console.WriteLine("TODO: documentation"); return; } ProcessArguments(programArgs); #if DEBUG Trace.Listeners.Add(new ConsoleTraceListener()); #endif Run(); }
private void ProcessArguments(ProgramArguments args) { _args = args; var fooOptions = new Options(); if (_args.Flags.ContainsKey("casesensitive")) { fooOptions.CaseInsensitive = _args.Flags["casesensitive"]; } else { // // default to case-sensitive on Unix // fooOptions.CaseInsensitive = !(Environment.OSVersion.Platform == PlatformID.Unix); } _listenPort = DefaultPort; if (_args.Options.ContainsKey("port")) { try { _listenPort = int.Parse(_args.Options["port"]); } catch (FormatException) { // keep default port } } var configPath = DefaultConfig; if (_args.Options.ContainsKey("config")) { configPath = _args.Options["config"]; } try { string err = string.Empty; _config = ServerRepositoryConfigLoader.GetConfig(configPath, out err); if (_config == null) { Trace.TraceError("Error loading FooSync daemon config: {0}", err); throw new Exception(string.Format("Error loading FooSync daemon config: {0}", err)); } } catch (Exception ex) { Trace.TraceError("Error loading FooSync daemon config: {0}: {1}{2}", ex.GetType().Name, ex.Message, ex.StackTrace); throw; } _exceptions = new Dictionary<string, ICollection<string>>(); foreach (var repo in _config.Repositories) { _exceptions.Add(repo.Key, FooSyncEngine.PrepareExceptions(repo.Value.IgnorePatterns)); } _foo = new FooSyncEngine(fooOptions); }
string CommandLineGetMode(ProgramArguments args, string defaultMode) { string mode = null; IQueryable<string> modes = MODES.AsQueryable<string>(); foreach (string flag in args.Flags.Keys) { if (modes.Contains(flag)) { if (mode != null) { return null; } mode = flag; } } return mode ?? defaultMode; }
void Run(ProgramArguments args) { string mode = CommandLineGetMode(args, "sync"); switch (mode) { case null: Console.WriteLine("usage: {0} <command>", ProgramName); Console.WriteLine("where <command> is one of: {0}", string.Join(", ", MODES)); break; case "create": { if (args.Ordinals.Count != 2) { Console.WriteLine("usage: {0} --create <sync group name> <filename>.fsg", ProgramName); return; } CreateSyncGroup(args.Ordinals[0], args.Ordinals[1]); } break; case "add": { if (args.Ordinals.Count != 2) { Console.WriteLine("usage: {0} --add <filename>.fsg <url/path>", ProgramName); return; } SyncGroupConfig syncGroup = LoadSyncGroupConfig(args.Ordinals[0]); SyncGroupConfigMember newMember = new SyncGroupConfigMember(); FooSyncUrl newUrl = NormalizePath(args.Ordinals[1]); if (newUrl == null) { Console.WriteLine("Invalid path or URL \"{0}\"", args.Ordinals[1]); return; } newMember.UrlString = newUrl.ToString(); if (newUrl.IsLocal) { newMember.Host = Environment.MachineName; } if (!newMember.UrlString.Equals(args.Ordinals[1])) { Console.WriteLine("Path or URL {0} interpreted as {1}", args.Ordinals[1], newMember.UrlString); } foreach (SyncGroupConfigMember existingMember in syncGroup.Members) { try { if (existingMember.Url.Equals(newUrl, Foo.Options.CaseInsensitive) && existingMember.Host.Equals(newMember.Host, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(newMember.Host)) { Console.WriteLine("{0} is already a member of that sync group. Aborting.", newMember.UrlString); return; } } catch (FormatException) { } } if (args.Options.ContainsKey("user")) { newMember.Auth = new SyncGroupConfigMemberAuth(); newMember.Auth.User = args.Options["user"]; if (args.Options.ContainsKey("pass")) { newMember.Auth.Password = args.Options["pass"]; } //TODO: option for prompting at console } syncGroup.Members.Add(newMember); XmlConfigLoader.Write(syncGroup, args.Ordinals[0]); Console.WriteLine("Added {0} to sync group \"{1}\"",newMember.UrlString, syncGroup.Name); } break; case "rm": { if (args.Ordinals.Count != 2) { Console.WriteLine("usage: {0} --rm <filename>.fsg <url/path>", ProgramName); return; } SyncGroupConfig syncGroup = LoadSyncGroupConfig(args.Ordinals[0]); FooSyncUrl rmUrl = NormalizePath(args.Ordinals[1]); if (rmUrl == null) { Console.WriteLine("Invalid path or URL \"{0}\"", args.Ordinals[1]); return; } if (!args.Ordinals[1].Equals(rmUrl.ToString())) { Console.WriteLine("Path or URL {0} interpreted as {1}", args.Ordinals[1], rmUrl.ToString()); } SyncGroupConfigMember rmMember = null; foreach (SyncGroupConfigMember member in syncGroup.Members) { if (member.Url.Equals(rmUrl, Foo.Options.CaseInsensitive) && !string.IsNullOrEmpty(member.Host) && member.Host.Equals(Environment.MachineName)) { rmMember = member; break; } } if (rmMember != null) { syncGroup.Members.Remove(rmMember); } else { Console.WriteLine("Sync group member {0} not found.", rmUrl.ToString()); return; } XmlConfigLoader.Write(syncGroup, args.Ordinals[0]); Console.WriteLine("Removed {0} from sync group \"{1}\"", rmMember.UrlString, syncGroup.Name); } break; case "sync": { if (args.Ordinals.Count != 1) { Console.WriteLine("usage: {0} --sync <filename>.fsg", ProgramName); return; } SyncGroupConfig syncGroup = LoadSyncGroupConfig(args.Ordinals[0]); Console.WriteLine("Syncing sync group \"{0}\" with {1} members.", syncGroup.Name, syncGroup.Members.Count); Sync(syncGroup); Console.WriteLine("Done syncing \"{0}\".", syncGroup.Name); } break; } }
static void Main(string[] args) { var programArgs = new ProgramArguments(args); var fooOptions = new Options(); if (programArgs.Flags.ContainsKey("casesensitive")) { fooOptions.CaseInsensitive = !programArgs.Flags["casesensitive"]; } var foo = new FooSyncEngine(fooOptions); Console.WriteLine("FooSync.ConsoleApp v{0} / FooSync v{1}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, foo.GetType().Assembly.GetName().Version.ToString()); Console.WriteLine("{0} / {1} / {2}", Environment.MachineName, Environment.OSVersion.Platform, Environment.OSVersion.VersionString); if (Type.GetType("Mono.Runtime") != null) { Console.WriteLine("Using the Mono runtime."); } Console.WriteLine(); if (programArgs.Flags.ContainsKey("help")) { Console.WriteLine("usage: {0} [options]", ProgramName); //TODO return; } var program = new Program(foo); program.Run(programArgs); }