static void Main(string[] args)
        {
            NameValueCollection appSettings = System.Configuration.ConfigurationManager.AppSettings;

            _mainFilePath = appSettings["MainFolderPath"];

            _emailOnError = bool.Parse(appSettings["EmailOnError"]);
            _emailServer = appSettings["EmailServer"];
            _emailFrom = appSettings["EmailFrom"];
            _emailTo = appSettings["EmailTo"];

            System.Console.WriteLine("Config Ok");

            SourceControlProvider scp = (SourceControlProvider)System.Enum.Parse(typeof(SourceControlProvider), appSettings["SourceControl"]);

            SourceControl.ISourceControl sourceControl;

            if (scp == SourceControlProvider.git)
            {
                sourceControl = new SourceControl.git();
            }
            else if (scp == SourceControlProvider.SVN)
            {
                sourceControl = new SourceControl.SVN();
            }
            else
            {
                throw new Exception("Bad SourceControlProvider");
            }

            try
            {
                XDocument runSteps = XDocument.Load(ConfigurationManager.AppSettings["RunStepsPath"].ToString());

                var LogJobServers = from c in runSteps.Elements("LogServers").Elements("LogJobs").Elements("server")
                                    select (string)c.Attribute("serverName");

                foreach (string serverName in LogJobServers)
                {
                    string srvPath = _mainFilePath + "\\" + serverName;

                    Database.IDatabase db = new Database.SqlServer2008(serverName);

                    NameValueCollection nv;
                    nv = db.GetConfiguration();
                    if (nv != null)
                    {
                        sourceControl.LogObjects(srvPath, "Configuration", nv);
                    }
                    sourceControl.LogObjects(srvPath, "Databases", db.GetDatabases());
                    sourceControl.LogObjects(srvPath, "Logins", db.GetLogins());
                    sourceControl.LogObjects(srvPath, "Jobs", db.GetJobs());
                }

                var LogObjectServers = from c in runSteps.Elements("LogServers").Elements("LogObjects").Elements("server")
                                       select c;

                foreach (var logObjectServer in LogObjectServers)
                {
                    string serverName = (string)logObjectServer.Attribute("serverName");
                    //switch to regex match on database name - need to select
                    Database.IDatabase db = new Database.SqlServer2008(serverName);
                    List<string> databases = db.ListDatabasesForPattern((string)logObjectServer.Attribute("databaseName"));
                    foreach (string dbName in databases)
                    {
                        string dbPath = _mainFilePath + "\\" + serverName + @"\" + dbName;
                        bool newDb = false;

                        if (!Directory.Exists(dbPath))
                        {
                            newDb = true;
                        }

                        if (db.SelectDatabase(dbName))
                        {

                            Console.WriteLine(DateTime.Now.ToString() + " Object Log Start for server " + serverName +
                                              " database " + dbName);

                            try
                            {
                                sourceControl.LogObjects(dbPath, "StoredProcedures", db.GetStoredProcedures());
                                sourceControl.LogObjects(dbPath, "Functions", db.GetFunctions());
                                sourceControl.LogObjects(dbPath, "Views", db.GetViews());
                                sourceControl.LogObjects(dbPath, "Tables", db.GetTables());
                                sourceControl.LogObjects(dbPath, "PartitionFunctions", db.GetPartitionFunctions());
                                sourceControl.LogObjects(dbPath, "PartitionSchemes", db.GetPartitionSchemes());
                                sourceControl.LogObjects(dbPath, "Indexes", db.GetIndexes());
                                sourceControl.LogObjects(dbPath, "Users", db.GetUsers());
                                if (newDb)
                                {
                                    sourceControl.Add(dbPath);
                                }
                            }
                            catch
                            {
                                // eh.  db is usually unavailable.
                            }
                        }
                    }
                }

                //git is one giant repo.  SVN is usually one working copy per "server"
                if (scp == SourceControlProvider.git)
                {
                    sourceControl.Commit("");
                }
                else if (scp == SourceControlProvider.SVN)
                {
                    // loop through all dirs in main folder and commit..
                    string[] dirs = Directory.GetDirectories(_mainFilePath);

                    foreach (string dir in dirs)
                    {
                        sourceControl.Commit(dir);
                    }
                }

                Console.WriteLine("done");
                //Console.ReadLine();

            }
            catch (Exception ex)
            {
                if (_emailOnError)
                {
                    string MailServer = _emailServer;
                    string From = _emailFrom;
                    string To = _emailTo;
                    string Subject = "SQLSchemaSourceControl Failed";
                    string Body = ex.Message + " " + ex.InnerException + " " + ex.StackTrace;
                    bool IsHtml = true;
                    SendMail(MailServer, From, To, Subject, Body, IsHtml);

                }
                else
                {
                    Console.WriteLine(ex.Message + " " + ex.InnerException + " " + ex.StackTrace);
                    throw ex;
                }

            }
        }