示例#1
0
        private void InlineClearcaseFileVersion(string elementPath, string elementOid, string version, IEnumerable <string> names, bool writeNames)
        {
            string fullName = elementPath + "@@" + version;
            string fileName = _cleartool.Get(fullName);
            var    fileInfo = new FileInfo(fileName);

            if (!fileInfo.Exists)
            {
                // in incremental import, elements may have been moved, without a new version, we try to use the oid
                // (we don't always do that to avoid unecessary calls to cleartool)
                string newElementName = _cleartool.GetElement(elementOid);
                if (!string.IsNullOrEmpty(newElementName))
                {
                    // GetElement returns a "real" element name, ie ending with "@@"
                    fullName = newElementName + version;
                    fileName = _cleartool.Get(fullName);
                    fileInfo = new FileInfo(fileName);
                }
                else
                {
                    Logger.TraceData(TraceEventType.Warning, (int)TraceId.ApplyChangeSet, "Element with oid " + elementOid + " could not be found in clearcase");
                }
            }
            if (!fileInfo.Exists)
            {
                Logger.TraceData(TraceEventType.Warning, (int)TraceId.ApplyChangeSet, "Version " + fullName + " could not be read from clearcase");
                // still create a file for later delete or rename
                foreach (string name in names)
                {
                    if (writeNames)
                    {
                        _writer.Write("M 644 inline " + name + "\n");
                    }
                    InlineString("// clearcase error while retrieving " + fullName);
                }
                return;
            }
            // clearcase always create as ReadOnly
            fileInfo.IsReadOnly = false;
            foreach (string name in names)
            {
                foreach (var hook in PreWritingHooks)
                {
                    if (hook.Target.IsMatch(name))
                    {
                        hook.Hook(fileName);
                    }
                }

                if (writeNames)
                {
                    _writer.Write("M 644 inline " + name + "\n");
                }
                _writer.Write("data " + fileInfo.Length + "\n");
                // Flush() before using BaseStream directly
                _writer.Flush();
                using (var s = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                    s.CopyTo(_writer.BaseStream);
                _writer.Write("\n");
                foreach (var hook in PostWritingHooks)
                {
                    if (hook.Target.IsMatch(name))
                    {
                        hook.Hook(fileName, _writer);
                    }
                }
            }
            fileInfo.Delete();
        }