示例#1
0
        public bool Status(StatusLevel statusLevel, DetailLevel detailLevel)
        {
            if (!active)
            {
                return(false);
            }

            string arguments = "status --xml";

            if (statusLevel == StatusLevel.Remote)
            {
                arguments += " -u";
            }
            if (detailLevel == DetailLevel.Verbose)
            {
                arguments += " -v";
            }

            CommandLineOutput commandLineOutput;

            using (var svnStatusTask = CreateSVNCommandLine(arguments))
            {
                commandLineOutput = ExecuteOperation(svnStatusTask);
            }

            if (commandLineOutput == null || commandLineOutput.Failed || string.IsNullOrEmpty(commandLineOutput.OutputStr) || !active)
            {
                return(false);
            }
            try
            {
                var db = SVNStatusXMLParser.SVNParseStatusXML(commandLineOutput.OutputStr);
                lock (statusDatabaseLockToken)
                {
                    foreach (var statusIt in db)
                    {
                        var status = statusIt.Value;
                        status.reflectionLevel       = statusLevel == StatusLevel.Remote ? VCReflectionLevel.Repository : VCReflectionLevel.Local;
                        statusDatabase[statusIt.Key] = status;
                    }
                }
                lock (requestQueueLockToken)
                {
                    foreach (var assetIt in db.Keys)
                    {
                        if (statusLevel == StatusLevel.Remote)
                        {
                            remoteRequestQueue.Remove(assetIt.Compose());
                        }
                        localRequestQueue.Remove(assetIt.Compose());
                    }
                }
                OnStatusCompleted();
            }
            catch (XmlException)
            {
                return(false);
            }
            return(true);
        }
示例#2
0
        public bool Status(IEnumerable <string> assets, StatusLevel statusLevel)
        {
            if (!active)
            {
                return(false);
            }
            if (statusLevel == StatusLevel.Previous)
            {
                statusLevel = StatusLevel.Local;
                foreach (var assetIt in assets)
                {
                    if (GetAssetStatus(assetIt).reflectionLevel == VCReflectionLevel.Repository && statusLevel == StatusLevel.Local)
                    {
                        statusLevel = StatusLevel.Remote;
                    }
                }
            }

            if (statusLevel == StatusLevel.Remote)
            {
                assets = RemoveFilesIfParentFolderInList(assets);
            }
            const int assetsPerStatus = 20;

            if (assets.Count() > assetsPerStatus)
            {
                return(Status(assets.Take(assetsPerStatus), statusLevel) && Status(assets.Skip(assetsPerStatus), statusLevel));
            }

            string arguments = "status --xml -q -v ";

            if (statusLevel == StatusLevel.Remote)
            {
                arguments += "-u ";
            }
            else
            {
                arguments += " --depth=infinity ";
            }
            arguments += ConcatAssetPaths(RemoveFilesIfParentFolderInList(RemoveWorkingDirectoryFromPath(assets)));

            SetPending(assets);

            CommandLineOutput commandLineOutput;

            using (var svnStatusTask = CreateSVNCommandLine(arguments))
            {
                commandLineOutput = ExecuteOperation(svnStatusTask);
            }
            if (commandLineOutput == null || commandLineOutput.Failed || string.IsNullOrEmpty(commandLineOutput.OutputStr) || !active)
            {
                return(false);
            }
            try
            {
                var db = SVNStatusXMLParser.SVNParseStatusXML(commandLineOutput.OutputStr);
                lock (statusDatabaseLockToken)
                {
                    foreach (var statusIt in db)
                    {
                        var status = statusIt.Value;
                        status.reflectionLevel       = statusLevel == StatusLevel.Remote ? VCReflectionLevel.Repository : VCReflectionLevel.Local;
                        statusDatabase[statusIt.Key] = status;
                    }
                }
                lock (requestQueueLockToken)
                {
                    foreach (var assetIt in db.Keys)
                    {
                        if (statusLevel == StatusLevel.Remote)
                        {
                            remoteRequestQueue.Remove(assetIt.Compose());
                        }
                        localRequestQueue.Remove(assetIt.Compose());
                    }
                }
                OnStatusCompleted();
            }
            catch (XmlException e)
            {
                D.ThrowException(e);
                return(false);
            }
            return(true);
        }