예제 #1
0
        /// <summary>
        /// Removes a reference from the references linked list
        /// </summary>
        /// <param name="reference"></param>
        internal void RemoveReference(SccProjectFileReference reference)
        {
            if (reference == null)
            {
                throw new ArgumentNullException("reference");
            }

            if (reference == FirstReference)
            {
                _firstReference          = reference.NextReference;
                reference._nextReference = null;

                if (_firstReference == null)
                {
                    _map.RemoveFile(this.FullPath);
                }
                return;
            }

            SccProjectFileReference rf = FirstReference;

            while (rf != null)
            {
                if (rf.NextReference == reference)
                {
                    rf._nextReference        = reference.NextReference;
                    reference._nextReference = null;
                    return;
                }

                rf = rf.NextReference;
            }

            throw new InvalidOperationException("Reference list invalid; scc project mapping corrupted; please reopen the solution");
        }
예제 #2
0
        public IEnumerable <string> GetAllFiles()
        {
            HybridCollection <string> mapped = null;

            yield return(FullPath);

            SccProjectFileReference rf = FirstReference;

            while (rf != null)
            {
                IList <string> subFiles = rf.GetSubFiles();

                if (subFiles.Count > 0)
                {
                    if (mapped == null)
                    {
                        mapped = new HybridCollection <string>(StringComparer.OrdinalIgnoreCase);
                        mapped.Add(FullPath);
                    }

                    foreach (string sf in subFiles)
                    {
                        if (mapped.Contains(sf))
                        {
                            continue;
                        }

                        mapped.Add(sf);
                        yield return(sf);
                    }
                }
                rf = rf.NextReference;
            }
        }
예제 #3
0
        public IEnumerable <SccProjectFileReference> GetAllReferences()
        {
            List <SccProjectFileReference> refs = new List <SccProjectFileReference>();

            SccProjectFileReference rf = FirstReference;

            while (rf != null)
            {
                yield return(rf);

                rf = rf.NextReference;
            }
        }
예제 #4
0
 public void OnClose()
 {
     Hook(false);
     while (_files.Count > 0)
     {
         SccProjectFileReference r = _files[0];
         while (r.ReferenceCount > 0)
         {
             r.ReleaseReference();
         }
     }
     _loaded = false;
 }
예제 #5
0
        public void OnClose()
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            Hook(false);
            while (_files.Count > 0)
            {
                SccProjectFileReference r = _files[0];
                while (r.ReferenceCount > 0)
                {
                    r.ReleaseReference();
                }
            }
            _loaded = false;
        }
예제 #6
0
        /// <summary>
        /// Gets the owner projects.
        /// </summary>
        /// <returns></returns>
        public IList <SccProjectData> GetOwnerProjects()
        {
            List <SccProjectData> pd = new List <SccProjectData>();

            SccProjectFileReference rf = FirstReference;

            while (rf != null)
            {
                pd.Add(rf.Project);

                rf = rf.NextReference;
            }

            return(pd);
        }
예제 #7
0
        internal void AddReference(SccProjectFileReference reference)
        {
            if (reference == null)
            {
                throw new ArgumentNullException("reference");
            }

            if (reference.NextReference != null || reference.ProjectFile != this)
            {
                throw new InvalidOperationException();
            }

            reference._nextReference = FirstReference;
            _firstReference          = reference;
        }
예제 #8
0
 internal void InvokeRemoveReference(SccProjectFileReference sccProjectFileReference)
 {
     _files.Remove(sccProjectFileReference);
 }
예제 #9
0
        public void AddPath(string path)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            if (ExcludedFromScc)
            {
                return;
            }

            bool alreadyLoaded = _loaded && !_inLoad;

            if (alreadyLoaded && WebLikeFileHandling)
            {
                uint fid = VSItemId.Nil;

                if (TryGetProjectFileId(path, out fid))
                {
                    // OK: Websites try to add everything they see below their directory
                    // We only add these files if they are actually SCC items

                    bool add = false;
                    ISccProjectWalker walker = GetService <ISccProjectWalker>();

                    foreach (string file in walker.GetSccFiles(ProjectHierarchy, fid, ProjectWalkDepth.SpecialFiles, null))
                    {
                        if (string.Equals(file, path, StringComparison.OrdinalIgnoreCase))
                        {
                            add = true;
                            break;
                        }
                    }

                    if (!add)
                    {
                        return;
                    }
                }
                else
                {
                    // File is either not in project or a scc special file
                    // Pass
                }
            }

            if (alreadyLoaded && GetService <IAnkhConfigurationService>().Instance.AutoAddEnabled)
            {
                GetService <IFileStatusMonitor>().ScheduleAddFile(path);
            }

            SccProjectFileReference reference;

            if (_files.TryGetValue(path, out reference))
            {
                reference.AddReference();
            }
            else
            {
                reference = new SccProjectFileReference(_context, this, Map.GetFile(path));
                _files.Add(reference);

                if (alreadyLoaded)
                {
                    GetService <IFileStatusMonitor>().ScheduleGlyphUpdate(path);
                }
            }

            if (string.Equals(path, ProjectFile, StringComparison.OrdinalIgnoreCase))
            {
                reference.IsProjectFile = true;
            }

            if (alreadyLoaded && !string.IsNullOrEmpty(ProjectFile))
            {
                ISccProjectWalker walker = GetService <ISccProjectWalker>();

                if (walker != null)
                {
                    walker.SetPrecreatedFilterItem(null, VSItemId.Nil);
                }

                ClearIdCache();

                SetDirty();
            }
        }