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); }
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); }
void QueueIndexJob(IndexJobData jobData) { _indexQueueLimit.WaitOne(); lock (_indexQueue) { _indexQueue.Enqueue(jobData); _indexQueueHasData.Set(); _indexQueueIsEmpty.Reset(); } }
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); }
/// <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); }
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/")); }
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); } }
void QueueFetchJob(IndexJobData jobData) { _pendingFetchJobs.Increment(); ThreadPool.QueueUserWorkItem(FetchJob, jobData); }