예제 #1
0
 private void UpdateChildNames(DirectoryVersion version, string baseName)
 {
     foreach (var child in version.Content)
     {
         _elementsNames.AddToCollection(child.Value, baseName + child.Key);
         ElementVersion childVersion;
         if (child.Value.IsDirectory && _elementsVersions.TryGetValue(child.Value, out childVersion))
         {
             UpdateChildNames((DirectoryVersion)childVersion, baseName + child.Key + "/");
         }
     }
 }
        private void ComputeDiffWithPrevious(DirectoryVersion version,
                                             List <KeyValuePair <Element, List <Tuple <Element, string> > > > removedElements,
                                             List <KeyValuePair <Element, List <Tuple <Element, string> > > > addedElements)
        {
            // we never put (uninteresting) version 0 of a directory element in a changeSet,
            // but it is still in the ElementBranch.Versions
            var previousVersion = (DirectoryVersion)version.GetPreviousVersion();

            // however, if this is indeed the branching point, then previousVersion may
            // not correspond to what is currently in the branch, because clearcase branches
            // are independent for different elements
            // we don't always use _oldVersions because there may be several successive versions in a single ChangeSet
            if (previousVersion.VersionNumber == 0)
            {
                ElementVersion oldVersion;
                _oldVersions.TryGetValue(version.Element, out oldVersion);
                // if there is no oldVersion, it means the whole element has been created after
                // the branch had been spawned, we consider version the first version (by keeping null for previousVersion)
                previousVersion = (DirectoryVersion)oldVersion;
            }
            if (previousVersion != null)
            {
                foreach (var pair in previousVersion.Content)
                {
                    Element childElement = pair.Value;
                    // an element may appear under different names
                    // KeyValuePair.Equals seems to be slow
                    if (version.Content.Any(p => p.Key == pair.Key && p.Value == pair.Value))
                    {
                        continue;
                    }

                    var namedInElement = new Tuple <Element, string>(version.Element, pair.Key);
                    if (!addedElements.RemoveFromCollection(childElement, namedInElement))
                    {
                        removedElements.AddToCollection(childElement, namedInElement);
                    }
                }
            }
            foreach (var pair in version.Content)
            {
                if (previousVersion == null || !previousVersion.Content.Any(p => p.Key == pair.Key && p.Value == pair.Value))
                {
                    addedElements.AddToCollection(pair.Value, new Tuple <Element, string>(version.Element, pair.Key));
                }
            }
        }
예제 #3
0
        private void ComputeDiffWithPrevious(DirectoryVersion version,
                                             List <KeyValuePair <Element, List <Tuple <Element, string> > > > removedElements,
                                             List <KeyValuePair <Element, List <Tuple <Element, string> > > > addedElements)
        {
            // we never put (uninteresting) version 0 of a directory element in a changeSet,
            // but it is still in the ElementBranch.Versions
            var previousVersion = (DirectoryVersion)version.GetPreviousVersion();

            // however, if this is indeed the branching point, then previousVersion may
            // not correspond to what is currently in the branch, because clearcase branches
            // are independent for different elements
            // we don't always use _oldVersions because there may be several successive versions in a single ChangeSet
            if (previousVersion.VersionNumber == 0)
            {
                ElementVersion oldVersion;
                _oldVersions.TryGetValue(version.Element, out oldVersion);
                // if there is no oldVersion, it means the whole element has been created after
                // the branch had been spawned, we consider version the first version (by keeping null for previousVersion)
                previousVersion = (DirectoryVersion)oldVersion;
            }
            if (previousVersion != null)
            {
                foreach (var pair in previousVersion.Content)
                {
                    Element childElement = pair.Value;
                    // an element may appear under different names
                    // KeyValuePair.Equals seems to be slow
                    if (version.Content.Any(p => p.Key == pair.Key && p.Value == pair.Value))
                    {
                        continue;
                    }

                    var namedInElement = new Tuple <Element, string>(version.Element, pair.Key);
                    if (!addedElements.RemoveFromCollection(childElement, namedInElement))
                    {
                        removedElements.AddToCollection(childElement, namedInElement);
                    }
                }
            }
            foreach (var pair in version.Content)
            {
                if (previousVersion == null || !previousVersion.Content.Any(p => p.Key == pair.Key && p.Value == pair.Value))
                {
                    addedElements.AddToCollection(pair.Value, new Tuple <Element, string>(version.Element, pair.Key));
                }
            }

            foreach (var pair in addedElements)
            {
                if (!removedElements.Any(p => p.Key.Oid == pair.Key.Oid))
                {
                    continue;
                }
                List <Tuple <Element, string> > added   = pair.Value;
                List <Tuple <Element, string> > removed = removedElements.Find(p => p.Key.Oid == pair.Key.Oid).Value;
                for (int i = added.Count - 1; i >= 0; i--)
                {
                    Tuple <Element, string> a        = added[i];
                    Tuple <Element, string> matching = removed.Find(r => r.Item1.Oid == a.Item1.Oid && r.Item2 == a.Item2);
                    if (matching != null && previousVersion != null && !previousVersion.Content.Any(p => p.Value == matching.Item1))
                    {
                        Logger.TraceData(TraceEventType.Warning, (int)TraceId.CreateChangeSet,
                                         "Erasing added and at the same time removed version", matching.Item1, matching.Item2);
                        added.RemoveAt(i);
                        removed.Remove(matching);
                        _changeSet.Versions.RemoveAll(v => v.Version.Element.Oid == matching.Item1.Oid); // TODO: Oid -> Name?
                    }
                }
            }
        }
예제 #4
0
        private bool AddVersionToBranch(ElementBranch branch, int versionNumber, bool isDir, List <ElementVersion> newVersions, Cleartool cleartool)
        {
            ElementVersion version;

            if (isDir)
            {
                var dirVersion = new DirectoryVersion(branch, versionNumber);
                Dictionary <string, string> res;
                lock (cleartool)
                    res = cleartool.Ls(dirVersion.ToString());
                foreach (var child in res)
                {
                    lock (ElementsByOid)
                    {
                        Element childElement;
                        if (ElementsByOid.TryGetValue(child.Value, out childElement))
                        {
                            dirVersion.Content.Add(new KeyValuePair <string, Element>(child.Key, childElement));
                        }
                        else if (child.Value.StartsWith(SymLinkElement.SYMLINK))
                        {
                            Element symLink = new SymLinkElement(branch.Element, child.Value);
                            Element existing;
                            if (ElementsByOid.TryGetValue(symLink.Oid, out existing))
                            {
                                symLink = existing;
                            }
                            else
                            {
                                ElementsByOid.Add(symLink.Oid, symLink);
                            }
                            dirVersion.Content.Add(new KeyValuePair <string, Element>(child.Key, symLink));
                        }
                        else
                        {
                            _contentFixups.Add(new Tuple <DirectoryVersion, string, string>(dirVersion, child.Key, child.Value));
                        }
                    }
                }

                version = dirVersion;
            }
            else
            {
                version = new ElementVersion(branch, versionNumber);
            }
            List <Tuple <string, int> > mergesTo, mergesFrom;

            lock (cleartool)
                cleartool.GetVersionDetails(version, out mergesTo, out mergesFrom);
            if (mergesTo != null)
            {
                foreach (var merge in mergesTo)
                {
                    // only merges between branches are interesting
                    if (merge.Item1 != branch.BranchName)
                    {
                        lock (_mergeFixups)
                            _mergeFixups.Add(new Tuple <ElementVersion, string, int, bool>(version, merge.Item1, merge.Item2, true));
                    }
                }
            }
            if (mergesFrom != null)
            {
                foreach (var merge in mergesFrom)
                {
                    // only merges between branches are interesting
                    if (merge.Item1 != branch.BranchName)
                    {
                        lock (_mergeFixups)
                            _mergeFixups.Add(new Tuple <ElementVersion, string, int, bool>(version, merge.Item1, merge.Item2, false));
                    }
                }
            }

            if (version.Date > _originDate)
            {
                Logger.TraceData(TraceEventType.Information, (int)TraceId.ReadCleartool,
                                 string.Format("Skipping version {0} : {1} > {2}", version, version.Date, _originDate));
                return(false);
            }

            branch.Versions.Add(version);
            if (newVersions != null)
            {
                newVersions.Add(version);
            }
            return(true);
        }