public void AddFilesToStorageTest()
        {
            string projectFile = Path.GetTempFileName();
            string storageFile = projectFile + ".storage";
            if (File.Exists(storageFile))
            {
                File.Delete(storageFile);
            }

            SccProviderStorage target = new SccProviderStorage(projectFile);

            IList<string> files = new List<string>();
            files.Add(projectFile);
            files.Add("dummy.txt");
            target.AddFilesToStorage(files);
            // Test that project file is now controlled
            Assert.AreEqual(SourceControlStatus.scsCheckedIn, target.GetFileStatus(projectFile), "Failed to add the project file");
            // Test the storage file was written
            Assert.IsTrue(File.Exists(storageFile), "Storage file was not created");

            // Cleanup the files written by the test
            File.SetAttributes(projectFile, FileAttributes.Normal);
            File.Delete(projectFile);
            File.Delete(storageFile);
        }
        public void CheckinCheckoutFileTest()
        {
            string projectFile = Path.GetTempFileName();
            SccProviderStorage target = new SccProviderStorage(projectFile);

            target.CheckinFile(projectFile);
            // Test the file is readonly
            Assert.AreEqual(File.GetAttributes(projectFile) & FileAttributes.ReadOnly, FileAttributes.ReadOnly, "Checkin failed");

            // Cleanup the files written by the test
            File.SetAttributes(projectFile, FileAttributes.Normal);
            File.Delete(projectFile);
        }
        /// <summary>
        /// One of the most important methods in a source control provider, is called by projects that are under source control when they are first opened to register project settings
        /// </summary>
        public int RegisterSccProject([InAttribute] IVsSccProject2 pscp2Project, [InAttribute] string pszSccProjectName, [InAttribute] string pszSccAuxPath, [InAttribute] string pszSccLocalPath, [InAttribute] string pszProvider)
        {
            if (pszProvider.CompareTo(_sccProvider.ProviderName)!=0)
            {
                // If the provider name controlling this project is not our provider, the user may be adding to a 
                // solution controlled by this provider an existing project controlled by some other provider.
                // We'll deny the registration with scc in such case.
                return VSConstants.E_FAIL;
            }

            if (pscp2Project == null)
            {
                // Manual registration with source control of the solution, from OnAfterOpenSolution
                Debug.WriteLine(String.Format(CultureInfo.CurrentUICulture, "Solution {0} is registering with source control - {1}, {2}, {3}, {4}", _sccProvider.GetSolutionFileName(), pszSccProjectName, pszSccAuxPath, pszSccLocalPath, pszProvider));

                IVsHierarchy solHier = (IVsHierarchy)_sccProvider.GetService(typeof(SVsSolution));
                string solutionFile = _sccProvider.GetSolutionFileName();
                SccProviderStorage storage = new SccProviderStorage(solutionFile);
                _controlledProjects[solHier] = storage;
            }
            else
            {
                Debug.WriteLine(String.Format(CultureInfo.CurrentUICulture, "Project {0} is registering with source control - {1}, {2}, {3}, {4}", _sccProvider.GetProjectFileName(pscp2Project), pszSccProjectName, pszSccAuxPath, pszSccLocalPath, pszProvider));

                // Add the project to the list of controlled projects
                IVsHierarchy hierProject = (IVsHierarchy)pscp2Project;
                SccProviderStorage storage = new SccProviderStorage(_sccProvider.GetProjectFileName(pscp2Project));
                _controlledProjects[hierProject] = storage;
            }

            return VSConstants.S_OK;
        }
        /// <summary>
        /// Adds the specified projects and solution to source control
        /// </summary>
        public void AddProjectsToSourceControl(ref Hashtable hashUncontrolledProjects, bool addSolutionToSourceControl)
        {
            // A real source control provider will ask the user for a location where the projects will be controlled
            // From the user input it should create up to 4 strings that will pass them to the projects to persist, 
            // so next time the project is open from disk, it will callback source control package, and the package
            // could use the 4 binding strings to identify the correct database location of the project files.
            foreach (IVsHierarchy pHier in hashUncontrolledProjects.Keys)
            {
                IVsSccProject2 sccProject2 = (IVsSccProject2)pHier;
                sccProject2.SetSccLocation("<Project Location In Database>", "<Source Control Database>", "<Local Binding Root of Project>", _sccProvider.ProviderName);

                // Add the newly controlled projects now to the list of controlled projects in this solution
                _controlledProjects[pHier] = null;
            }

            // Also, if the solution was selected to be added to scc, write in the solution properties the controlled status
            if (addSolutionToSourceControl)
            {
                IVsHierarchy solHier = (IVsHierarchy)_sccProvider.GetService(typeof(SVsSolution));
                _controlledProjects[solHier] = null;
                _sccProvider.SolutionHasDirtyProps = true;
            }

            // Now save all the modified files
            IVsSolution sol = (IVsSolution)_sccProvider.GetService(typeof(SVsSolution));
            sol.SaveSolutionElement((uint)__VSSLNSAVEOPTIONS.SLNSAVEOPT_SaveIfDirty, null, 0);

            // Add now the solution and project files to the source control database
            // which in our case means creating a text file containing the list of controlled files
            foreach (IVsHierarchy pHier in hashUncontrolledProjects.Keys)
            {
                IVsSccProject2 sccProject2 = (IVsSccProject2)pHier;
                IList<string> files = _sccProvider.GetProjectFiles(sccProject2);
                SccProviderStorage storage = new SccProviderStorage(_sccProvider.GetProjectFileName(sccProject2));
                storage.AddFilesToStorage(files);
                _controlledProjects[pHier] = storage;
            }

            // If adding solution to source control, create a storage for the solution, too
            if (addSolutionToSourceControl)
            {
                IVsHierarchy solHier = (IVsHierarchy)_sccProvider.GetService(typeof(SVsSolution));
                IList<string> files = new List<string>();
                string solutionFile = _sccProvider.GetSolutionFileName();
                files.Add(solutionFile);
                SccProviderStorage storage = new SccProviderStorage(solutionFile);
                storage.AddFilesToStorage(files);
                _controlledProjects[solHier] = storage;
            }

            // For all the projects added to source control, refresh their source control glyphs
            IList<VSITEMSELECTION> nodes = new List<VSITEMSELECTION>();
            foreach (IVsHierarchy pHier in hashUncontrolledProjects.Keys)
            {
                VSITEMSELECTION vsItem;
                vsItem.itemid = VSConstants.VSITEMID_ROOT;
                vsItem.pHier = pHier;
                nodes.Add(vsItem);
            }

            // Also, add the solution if necessary to the list of glyphs to refresh
            if (addSolutionToSourceControl)
            {
                VSITEMSELECTION vsItem;
                vsItem.itemid = VSConstants.VSITEMID_ROOT;
                vsItem.pHier = null;
                nodes.Add(vsItem);
            }

            _sccProvider.RefreshNodesGlyphs(nodes);
        }
        public void RenameFileInStorageTest()
        {
            string projectFile = Path.GetTempFileName();
            string storageFile = projectFile + ".storage";
            string newStorageFile = "dummy.txt.storage";
            if (File.Exists(storageFile))
            {
                File.Delete(storageFile);
            }
            if (File.Exists(newStorageFile))
            {
                File.Delete(newStorageFile);
            }

            SccProviderStorage target = new SccProviderStorage(projectFile);

            IList<string> files = new List<string>();
            files.Add(projectFile);
            target.AddFilesToStorage(files);
            target.RenameFileInStorage(projectFile, "dummy.txt");
            // Test that project file is now uncontrolled
            Assert.AreEqual(SourceControlStatus.scsUncontrolled, target.GetFileStatus(projectFile), "GetFileStatus failed for old name");
            // Test that dummy file is now controlled (and checked in since it's missing from disk)
            Assert.AreEqual(SourceControlStatus.scsCheckedIn, target.GetFileStatus("Dummy.txt"), "GetFileStatus failed for new name");

            // Cleanup the files written by the test
            File.SetAttributes(projectFile, FileAttributes.Normal);
            File.Delete(projectFile);
            File.Delete(newStorageFile);
        }
        public void ReadStorageFileTest()
        {
            string projectFile = Path.GetTempFileName();
            string storageFile = projectFile + ".storage";
            if (File.Exists(storageFile))
            {
                File.Delete(storageFile);
            }

            StreamWriter objWriter = new StreamWriter(storageFile, false, System.Text.Encoding.Unicode);
            objWriter.Write("dummy.txt\r\n");
            objWriter.Close();
            objWriter.Dispose();

            SccProviderStorage target = new SccProviderStorage(projectFile);
            // Test that dummy file is now controlled (and checked in since it's missing from disk)
            Assert.AreEqual(SourceControlStatus.scsCheckedIn, target.GetFileStatus("Dummy.txt"), "GetFileStatus failed for new name");

            // Cleanup the files written by the test
            File.SetAttributes(projectFile, FileAttributes.Normal);
            File.Delete(projectFile);
            File.Delete(storageFile);
        }
        public void GetFileStatusTest()
        {
            string projectFile = Path.GetTempFileName();
            string storageFile = projectFile + ".storage";
            if (File.Exists(storageFile))
            {
                File.Delete(storageFile);
            }

            SccProviderStorage target = new SccProviderStorage(projectFile);

            IList<string> files = new List<string>();
            files.Add(projectFile);
            target.AddFilesToStorage(files);
            // Test that project file is now controlled
            Assert.AreEqual(SourceControlStatus.scsCheckedIn, target.GetFileStatus(projectFile), "GetFileStatus failed for project file");
            // Checkout the file and test status again
            target.CheckoutFile(projectFile);
            Assert.AreEqual(SourceControlStatus.scsCheckedOut, target.GetFileStatus(projectFile), "GetFileStatus failed for project file");
            // Test that a dummy file is uncontrolled
            Assert.AreEqual(SourceControlStatus.scsUncontrolled, target.GetFileStatus("Dummy.txt"), "GetFileStatus failed for uncontrolled file");

            // Cleanup the files written by the test
            File.Delete(projectFile);
            File.Delete(storageFile);
        }
 public void ConstructorTest()
 {
     SccProviderStorage target = new SccProviderStorage("Dummy.txt");
     Assert.IsNotNull(target, "SccProviderStorage cannot be created");
 }