Beispiel #1
0
        void DeletePath(string path, int revision, bool recursive)
        {
            IndexJobData jobData;

            lock (_headJobs) _headJobs.TryGetValue(path, out jobData);
            if (jobData != null)
            {
                lock (_headJobs) _headJobs.Remove(path);
            }
            else
            {
                int highest = _highestRevision.Get(path);
                if (highest == 0)
                {
                    return;               // an atomic delete inside a svn copy operation
                }
                jobData               = new IndexJobData();
                jobData.Path          = path;
                jobData.RevisionFirst = highest;
                jobData.Info          = _svn.GetPathInfo(path, highest);
            }
            jobData.RevisionLast = revision - 1;
            _highestRevision.Set(path, 0);

            if (jobData.Info == null)
            {
                return;                       // workaround for issues with forbidden characters in local repository access
            }
            if (recursive && jobData.Info.IsDirectory)
            {
                _svn.ForEachChild(path, revision, Change.Delete, QueueAnalyzeJob);
            }
            QueueFetchJob(jobData);
        }
Beispiel #2
0
        void IndexRevisionRange(int startRevision, int stopRevision)
        {
            foreach (var data in _svn.GetRevisionData(startRevision, stopRevision))
            {
                IndexJobData jobData = new IndexJobData();
                if (!_args.SingleRevision)
                {
                    jobData.Path           = "$Revision " + data.Revision;
                    jobData.RevisionFirst  = data.Revision;
                    jobData.RevisionLast   = data.Revision;
                    jobData.Info           = new PathInfo();
                    jobData.Info.Author    = data.Author;
                    jobData.Info.Timestamp = data.Timestamp;
                    QueueIndexJob(jobData);
                }
                data.Changes.ForEach(QueueAnalyzeJobRecursive);
                _pendingAnalyzeJobs.Wait();
            }

            foreach (var job in _headJobs.Values) // no lock necessary because no analyzeJobs are running
            {
                QueueFetchJob(job);
            }
            _headJobs.Clear();

            _pendingFetchJobs.Wait();
            _indexQueueIsEmpty.WaitOne();

            IndexProperty.SetRevision(_indexWriter, stopRevision);
            Console.WriteLine("Index revision is now " + stopRevision);
        }
Beispiel #3
0
 void QueueIndexJob(IndexJobData jobData)
 {
     _indexQueueLimit.WaitOne();
     lock (_indexQueue)
     {
         _indexQueue.Enqueue(jobData);
         _indexQueueHasData.Set();
         _indexQueueIsEmpty.Reset();
     }
 }
Beispiel #4
0
        void IndexDocument(IndexJobData data)
        {
            if (_args.Verbosity == 0 && data.Path[0] == '$')
            {
                Console.WriteLine("Revision " + data.RevisionFirst);
            }
            else
            {
                Console.WriteLine("Index {0}   {1}:{2}", data.Path, data.RevisionFirst, data.RevisionLast);
            }

            string idText = data.Path[0] == '$' ? data.Path : data.Path + "@" + data.RevisionFirst;
            Term   id     = _idTerm.CreateTerm(idText);

            _indexWriter.DeleteDocuments(id);

            if (_args.SingleRevision && data.RevisionLast != Revision.Head)
            {
                return;
            }

            Document doc = MakeDocument();

            _idField.SetValue(idText);
            _pathTokenStream.SetText(data.Path);
            _revFirstField.SetValue(data.RevisionFirst.ToString(RevisionFilter.RevFormat));
            _revLastField.SetValue(data.RevisionLast.ToString(RevisionFilter.RevFormat));
            _authorField.SetValue(data.Info.Author.ToLowerInvariant());
            SetTimestampField(data.Info.Timestamp);
            _messageTokenStream.SetText(_svn.GetLogMessage(data.RevisionFirst));

            if (!data.Info.IsDirectory)
            {
                _sizeField.SetValue(PackedSizeConverter.ToSortableString(data.Info.Size));
                doc.Add(_sizeField);
            }

            _contentTokenStream.SetText(data.Content);
            if (!_contentTokenStream.IsEmpty)
            {
                doc.Add(_contentField);
            }

            IndexProperties(doc, data.Properties);

            _indexWriter.AddDocument(doc);
        }
Beispiel #5
0
        /// <summary>
        /// Fetches some more information from the repository for an item
        /// </summary>
        /// <param name="jobData"></param>
        void FetchJob(IndexJobData jobData)
        {
            if (!_args.SingleRevision || jobData.RevisionLast == Revision.Head) // don't fetch if this data would be deleted anyway
            {
                if (_args.Verbosity > 1)
                {
                    Console.WriteLine("Fetch          " + jobData.Path + "   " + jobData.RevisionFirst + ":" + jobData.RevisionLast);
                }

                jobData.Properties = _svn.GetPathProperties(jobData.Path, jobData.RevisionFirst);
                if (IsIndexable(jobData))
                {
                    jobData.Content = _svn.GetPathContent(jobData.Path, jobData.RevisionFirst, jobData.Info.Size);
                }
            }
            QueueIndexJob(jobData);
        }
Beispiel #6
0
        bool IsIndexable(IndexJobData jobData)
        {
            if (jobData.Info.IsDirectory)
            {
                return(false);
            }
            if (jobData.Info.Size <= 0 || jobData.Info.Size > MaxDocumentSize)
            {
                return(false);
            }
            if (_args.IgnoreBinaryFilter.IsMatch(jobData.Path))
            {
                return(true);
            }

            string mime;

            return(!jobData.Properties.TryGetValue("svn:mime-type", out mime) || mime.StartsWith("text/"));
        }
Beispiel #7
0
        void AddPath(string path, int revision, bool recursive)
        {
            if (!_highestRevision.Set(path, revision))
            {
                return;
            }

            IndexJobData jobData = new IndexJobData();

            jobData.Path          = path;
            jobData.RevisionFirst = revision;
            jobData.RevisionLast  = Revision.Head;
            jobData.Info          = _svn.GetPathInfo(path, revision);
            if (jobData.Info == null)
            {
                return;                       // workaround for issues with forbidden characters in local repository access
            }
            lock (_headJobs) _headJobs[path] = jobData;

            if (recursive && jobData.Info.IsDirectory)
            {
                _svn.ForEachChild(path, revision, Change.Add, QueueAnalyzeJob);
            }
        }
Beispiel #8
0
 void QueueFetchJob(IndexJobData jobData)
 {
     _pendingFetchJobs.Increment();
     ThreadPool.QueueUserWorkItem(FetchJob, jobData);
 }