コード例 #1
0
        public override Annotation[] GetAnnotations(Repository repo, FilePath file, SvnRevision revStart, SvnRevision revEnd)
        {
            if (file == FilePath.Null)
            {
                throw new ArgumentNullException();
            }

            var target         = new SvnPathTarget(file, SharpSvn.SvnRevision.Base);
            int numAnnotations = 0;

            using (var data = new MemoryStream()) {
                lock (client)
                    client.Write(target, data);

                using (var reader = new StreamReader(data)) {
                    reader.BaseStream.Seek(0, SeekOrigin.Begin);
                    while (reader.ReadLine() != null)
                    {
                        numAnnotations++;
                    }
                }
            }

            System.Collections.ObjectModel.Collection <SvnBlameEventArgs> list;
            var args = new SvnBlameArgs {
                Start = GetRevision(revStart),
                End   = GetRevision(revEnd),
            };

            bool success;

            lock (client) {
                success = client.GetBlame(target, args, out list);
            }
            if (success)
            {
                var annotations = new Annotation [numAnnotations];
                foreach (var annotation in list)
                {
                    if (annotation.LineNumber < annotations.Length)
                    {
                        annotations [(int)annotation.LineNumber] = new Annotation(annotation.Revision.ToString(),
                                                                                  annotation.Author, annotation.Time);
                    }
                }
                return(annotations);
            }
            return(new Annotation[0]);
        }
コード例 #2
0
ファイル: BlameTests.cs プロジェクト: riiiqpl/sharpsvn
        public void Blame_BlameBasic()
        {
            SvnSandBox sbox = new SvnSandBox(this);
            sbox.Create(SandBoxRepository.AnkhSvnCases);
            string WcPath = sbox.Wc;

            string path = Path.Combine(WcPath, "Form.cs");
            string blame = this.RunCommand("svn", "blame -v " + path);
            Blame[] cmdline = this.ParseCommandLineBlame(blame);

            SvnBlameArgs a = new SvnBlameArgs();
            Assert.That(this.Client.Blame(path, a, this.Receiver));

            Assert.That(this.blames.Count, Is.EqualTo(cmdline.Length));
            for (int i = 0; i < cmdline.Length; i++)
            {
                Blame.CheckEqual(cmdline[i], (Blame)this.blames[i]);
            }
        }
コード例 #3
0
ファイル: BlameTests.cs プロジェクト: riiiqpl/sharpsvn
        public void Blame_WithEmptyEntries()
        {
            SvnSandBox sbox = new SvnSandBox(this);

            sbox.Create(SandBoxRepository.AnkhSvnCases);
            string WcPath = sbox.Wc;

            string path = Path.Combine(WcPath, "Form.cs");

            SvnBlameArgs a = new SvnBlameArgs();

            a.Start = SvnRevision.Head;
            a.End   = SvnRevision.Head;
            // this won't give any results - verify that there are no exceptions
            Assert.That(this.Client.Blame(path, a, this.Receiver));

            Blame[] b = (Blame[])this.blames.ToArray(typeof(Blame));

            Assert.That(b[0].Revision, Is.EqualTo(-1));
            Assert.That(b[0].Author, Is.EqualTo(null));
            Assert.That(b[0].Date, Is.EqualTo(DateTime.MinValue));
        }
コード例 #4
0
ファイル: BlameTests.cs プロジェクト: riiiqpl/sharpsvn
        public void Blame_BlameBasic()
        {
            SvnSandBox sbox = new SvnSandBox(this);

            sbox.Create(SandBoxRepository.AnkhSvnCases);
            string WcPath = sbox.Wc;

            string path  = Path.Combine(WcPath, "Form.cs");
            string blame = this.RunCommand("svn", "blame -v " + path);

            Blame[] cmdline = this.ParseCommandLineBlame(blame);

            SvnBlameArgs a = new SvnBlameArgs();

            Assert.That(this.Client.Blame(path, a, this.Receiver));

            Assert.That(this.blames.Count, Is.EqualTo(cmdline.Length));
            for (int i = 0; i < cmdline.Length; i++)
            {
                Blame.CheckEqual(cmdline[i], (Blame)this.blames[i]);
            }
        }
コード例 #5
0
ファイル: BlameTests.cs プロジェクト: riiiqpl/sharpsvn
        public void Blame_TestMore()
        {
            SvnSandBox sbox      = new SvnSandBox(this);
            string     reposPath = sbox.CreateRepository(SandBoxRepository.MergeScenario).AbsolutePath;
            Uri        reposUri  = SvnTools.LocalPathToUri(reposPath, true);

            Uri uri = new Uri(reposUri, "trunk/index.html");

            int          n  = 0;
            SvnBlameArgs ba = new SvnBlameArgs();

            ba.Notify += delegate(object sender, SvnNotifyEventArgs e)
            {
                Assert.That(e.Uri, Is.EqualTo(uri));
                Assert.That(e.RevisionProperties, Is.Not.Null);
                n++;
            };

            int lines = 0;

            Client.Blame(uri, ba,
                         delegate(object sender, SvnBlameEventArgs e)
            {
                Assert.That(e.Author, Is.Not.Null);
                Assert.That(e.RevisionProperties, Is.Not.Null);
                Assert.That(e.RevisionProperties.Contains(SvnPropertyNames.SvnAuthor));
                Assert.That(e.RevisionProperties.Contains(SvnPropertyNames.SvnLog));
                Assert.That(e.RevisionProperties[SvnPropertyNames.SvnAuthor].StringValue, Is.Not.Null);
                Assert.That(e.RevisionProperties[SvnPropertyNames.SvnLog].StringValue, Is.Not.Null);
                Assert.That(e.MergedAuthor, Is.Null);
                Assert.That(e.MergedRevisionProperties, Is.Null);
                lines++;
            });

            Assert.That(n, Is.EqualTo(3));
            Assert.That(lines, Is.EqualTo(32));
        }
コード例 #6
0
		public override Annotation[] GetAnnotations (Repository repo, FilePath file, SvnRevision revStart, SvnRevision revEnd)
		{
			if (file == FilePath.Null)
				throw new ArgumentNullException ();

			SvnPathTarget target = new SvnPathTarget (file, SharpSvn.SvnRevision.Base);
			MemoryStream data = new MemoryStream ();
			int numAnnotations = 0;
			client.Write (target, data);

			using (StreamReader reader = new StreamReader (data)) {
				reader.BaseStream.Seek (0, SeekOrigin.Begin);
				while (reader.ReadLine () != null)
					numAnnotations++;
			}

			System.Collections.ObjectModel.Collection<SvnBlameEventArgs> list;
			SvnBlameArgs args = new SvnBlameArgs ();
			args.Start = GetRevision (revStart);
			args.End = GetRevision (revEnd);

			if (client.GetBlame (target, args, out list)) {
				Annotation[] annotations = new Annotation [numAnnotations];
				foreach (var annotation in list) {
					if (annotation.LineNumber < annotations.Length)
						annotations [(int)annotation.LineNumber] = new Annotation (annotation.Revision.ToString (),
																					annotation.Author, annotation.Time);
				}
				return annotations;
			}
			return new Annotation[0];
		}
コード例 #7
0
        public void DoBlame(CommandEventArgs e,
                            SvnOrigin origin,
                            SvnRevision revisionStart,
                            SvnRevision revisionEnd,
                            bool ignoreEols,
                            SvnIgnoreSpacing ignoreSpacing,
                            bool retrieveMergeInfo)
        {
            // There are two SVN related operations:
            // [1] Getting the file at revisionEnd, which will be displayed in the editor
            // [2] Getting the blame information, which will be displayed in the margin

            // This is the parameter structure for [1] getting the file
            SvnWriteArgs wa = new SvnWriteArgs();

            wa.Revision = revisionEnd;

            // This is the parameter structure for [2] getting the blame information
            SvnBlameArgs ba = new SvnBlameArgs();

            ba.Start                   = revisionStart;
            ba.End                     = revisionEnd;
            ba.IgnoreLineEndings       = ignoreEols;
            ba.IgnoreSpacing           = ignoreSpacing;
            ba.RetrieveMergedRevisions = retrieveMergeInfo;

            SvnTarget target = origin.Target;

            // Can we make this an MEF service?
            IAnkhTempFileManager tempMgr = e.GetService <IAnkhTempFileManager>();
            string tempFile = tempMgr.GetTempFileNamed(target.FileName);

            Collection <SvnBlameEventArgs> blameResult = null;

            bool retry             = false;
            ProgressRunnerResult r = e.GetService <IProgressRunner>().RunModal("Annotating", delegate(object sender, ProgressWorkerArgs ee)
            {
                // Here we [1] get the file at revisionEnd
                using (FileStream fs = File.Create(tempFile))
                {
                    ee.Client.Write(target, fs, wa);
                }

                // Here we [2] get the blame information
                ba.SvnError +=
                    delegate(object errorSender, SvnErrorEventArgs errorEventArgs)
                {
                    if (errorEventArgs.Exception is SvnClientBinaryFileException)
                    {
                        retry = true;
                        errorEventArgs.Cancel = true;
                    }
                };
                ee.Client.GetBlame(target, ba, out blameResult);
            });

            if (retry)
            {
                using (AnkhMessageBox mb = new AnkhMessageBox(e.Context))
                {
                    // Move to resources later :)
                    if (DialogResult.Yes != mb.Show("You are trying to annotate a binary file. Are you sure you want to continue?",
                                                    "Binary file detected",
                                                    MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                    {
                        return;
                    }

                    r = e.GetService <IProgressRunner>()
                        .RunModal("Annotating",
                                  delegate(object sender, ProgressWorkerArgs ee)
                    {
                        ba.IgnoreMimeType = true;
                        ee.Client.GetBlame(target, ba, out blameResult);
                    });
                }
            }

            if (!r.Succeeded)
            {
                return;
            }

            // Create a parameter struture and add it to our internal map.
            // Creating the actual view model class is now deferred to the GetModel method.
            var annParam = new AnnotateMarginParameters {
                Context = e.Context, Origin = origin, BlameResult = blameResult
            };

            _ViewModelMap.Add(tempFile, annParam);

            // Open the editor.
            // ToDo: Open files like resx as code.
            var dte = e.GetService <DTE> (typeof(SDTE));

            dte.ItemOperations.OpenFile(tempFile, EnvDTE.Constants.vsViewKindTextView);
        }
コード例 #8
0
        /*private void TryObtainBlock(CommandEventArgs e)
         * {
         *  ISelectionContextEx ex = e.GetService<ISelectionContextEx>(typeof(ISelectionContext));
         *
         *  if (ex == null)
         *      return;
         *
         *  IVsTextView view = ex.ActiveDocumentFrameTextView;
         *  IVsTextLines lines;
         *  Guid languageService;
         *  IVsLanguageInfo info;
         *
         *  if (view != null
         *      && VSErr.Succeeded(view.GetBuffer(out lines))
         *      && VSErr.Succeeded(lines.GetLanguageServiceID(out languageService))
         *      && null != (info = e.QueryService<IVsLanguageInfo>(languageService)))
         *  {
         *      GC.KeepAlive(info);
         *      IVsLanguageBlock b = info as IVsLanguageBlock;
         *      if (b != null)
         *      {
         *          GC.KeepAlive(b);
         *      }
         *  }
         *  //IVsLanguageBlock
         *
         *
         *  GC.KeepAlive(ex);
         * }*/

        static void DoBlame(CommandEventArgs e, SvnOrigin item, SvnRevision revisionStart, SvnRevision revisionEnd, bool ignoreEols, SvnIgnoreSpacing ignoreSpacing, bool retrieveMergeInfo)
        {
            SvnWriteArgs wa = new SvnWriteArgs();

            wa.Revision = revisionEnd;

            SvnBlameArgs ba = new SvnBlameArgs();

            ba.Start                   = revisionStart;
            ba.End                     = revisionEnd;
            ba.IgnoreLineEndings       = ignoreEols;
            ba.IgnoreSpacing           = ignoreSpacing;
            ba.RetrieveMergedRevisions = retrieveMergeInfo;

            SvnTarget target = item.Target;

            IAnkhTempFileManager tempMgr = e.GetService <IAnkhTempFileManager>();
            string tempFile = tempMgr.GetTempFileNamed(target.FileName);

            Collection <SvnBlameEventArgs> blameResult = null;

            bool retry             = false;
            ProgressRunnerResult r = e.GetService <IProgressRunner>().RunModal(CommandStrings.Annotating, delegate(object sender, ProgressWorkerArgs ee)
            {
                using (FileStream fs = File.Create(tempFile))
                {
                    ee.Client.Write(target, fs, wa);
                }

                ba.SvnError +=
                    delegate(object errorSender, SvnErrorEventArgs errorEventArgs)
                {
                    if (errorEventArgs.Exception is SvnClientBinaryFileException)
                    {
                        retry = true;
                        errorEventArgs.Cancel = true;
                    }
                };
                ee.Client.GetBlame(target, ba, out blameResult);
            });

            if (retry)
            {
                using (AnkhMessageBox mb = new AnkhMessageBox(e.Context))
                {
                    if (DialogResult.Yes != mb.Show(
                            CommandStrings.AnnotateBinaryFileContinueAnywayText,
                            CommandStrings.AnnotateBinaryFileContinueAnywayTitle,
                            MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                    {
                        return;
                    }

                    r = e.GetService <IProgressRunner>()
                        .RunModal(CommandStrings.Annotating,
                                  delegate(object sender, ProgressWorkerArgs ee)
                    {
                        ba.IgnoreMimeType = true;
                        ee.Client.GetBlame(target, ba, out blameResult);
                    });
                }
            }

            if (!r.Succeeded)
            {
                return;
            }

            AnnotateEditorControl annEditor = new AnnotateEditorControl();
            IAnkhEditorResolver   er        = e.GetService <IAnkhEditorResolver>();

            annEditor.Create(e.Context, tempFile);
            annEditor.LoadFile(tempFile);
            annEditor.AddLines(item, blameResult);

            // Detect and set the language service
            Guid language;

            if (er.TryGetLanguageService(Path.GetExtension(target.FileName), out language))
            {
                // Extension is mapped -> user
                annEditor.SetLanguageService(language);
            }
            else if (blameResult != null && blameResult.Count > 0 && blameResult[0].Line != null)
            {
                // Extension is not mapped -> Check if this is xml (like project files)
                string line = blameResult[0].Line.Trim();

                if (line.StartsWith("<?xml") ||
                    (line.StartsWith("<") && line.Contains("xmlns=\"http://schemas.microsoft.com/developer/msbuild/")))
                {
                    if (er.TryGetLanguageService(".xml", out language))
                    {
                        annEditor.SetLanguageService(language);
                    }
                }
            }
        }
コード例 #9
0
ファイル: BlameTests.cs プロジェクト: riiiqpl/sharpsvn
        public void Blame_TestMore()
        {
            SvnSandBox sbox = new SvnSandBox(this);
            string reposPath = sbox.CreateRepository(SandBoxRepository.MergeScenario).AbsolutePath;
            Uri reposUri = SvnTools.LocalPathToUri(reposPath, true);

            Uri uri = new Uri(reposUri, "trunk/index.html");

            int n = 0;
            SvnBlameArgs ba = new SvnBlameArgs();
            ba.Notify += delegate(object sender, SvnNotifyEventArgs e)
            {
                Assert.That(e.Uri, Is.EqualTo(uri));
                Assert.That(e.RevisionProperties, Is.Not.Null);
                n++;
            };

            int lines = 0;
            Client.Blame(uri, ba,
            delegate(object sender, SvnBlameEventArgs e)
            {
                Assert.That(e.Author, Is.Not.Null);
                Assert.That(e.RevisionProperties, Is.Not.Null);
                Assert.That(e.RevisionProperties.Contains(SvnPropertyNames.SvnAuthor));
                Assert.That(e.RevisionProperties.Contains(SvnPropertyNames.SvnLog));
                Assert.That(e.RevisionProperties[SvnPropertyNames.SvnAuthor].StringValue, Is.Not.Null);
                Assert.That(e.RevisionProperties[SvnPropertyNames.SvnLog].StringValue, Is.Not.Null);
                Assert.That(e.MergedAuthor, Is.Null);
                Assert.That(e.MergedRevisionProperties, Is.Null);
                lines++;
            });

            Assert.That(n, Is.EqualTo(3));
            Assert.That(lines, Is.EqualTo(32));
        }
コード例 #10
0
ファイル: BlameTests.cs プロジェクト: riiiqpl/sharpsvn
        public void Blame_WithEmptyEntries()
        {
            SvnSandBox sbox = new SvnSandBox(this);
            sbox.Create(SandBoxRepository.AnkhSvnCases);
            string WcPath = sbox.Wc;

            string path = Path.Combine(WcPath, "Form.cs");

            SvnBlameArgs a = new SvnBlameArgs();
            a.Start = SvnRevision.Head;
            a.End = SvnRevision.Head;
            // this won't give any results - verify that there are no exceptions
            Assert.That(this.Client.Blame(path, a, this.Receiver));

            Blame[] b = (Blame[])this.blames.ToArray(typeof(Blame));

            Assert.That(b[0].Revision, Is.EqualTo(-1));
            Assert.That(b[0].Author, Is.EqualTo(null));
            Assert.That(b[0].Date, Is.EqualTo(DateTime.MinValue));
        }
コード例 #11
0
ファイル: ItemAnnotateCommand.cs プロジェクト: necora/ank_git
        static void DoBlame(CommandEventArgs e, SvnOrigin item, SvnRevision revisionStart, SvnRevision revisionEnd, bool ignoreEols, SvnIgnoreSpacing ignoreSpacing, bool retrieveMergeInfo)
        {
            SvnWriteArgs wa = new SvnWriteArgs();
            wa.Revision = revisionEnd;

            SvnBlameArgs ba = new SvnBlameArgs();
            ba.Start = revisionStart;
            ba.End = revisionEnd;
            ba.IgnoreLineEndings = ignoreEols;
            ba.IgnoreSpacing = ignoreSpacing;
            ba.RetrieveMergedRevisions = retrieveMergeInfo;

            SvnTarget target = item.Target;

            IAnkhTempFileManager tempMgr = e.GetService<IAnkhTempFileManager>();
            string tempFile = tempMgr.GetTempFileNamed(target.FileName);

            Collection<SvnBlameEventArgs> blameResult = null;
            Dictionary<long, string> logMessages = new Dictionary<long, string>();

            ba.Notify += delegate(object sender, SvnNotifyEventArgs ee)
            {
                if (ee.Action == SvnNotifyAction.BlameRevision && ee.RevisionProperties != null)
                {
                    if (ee.RevisionProperties.Contains(SvnPropertyNames.SvnLog))
                        logMessages[ee.Revision] = ee.RevisionProperties[SvnPropertyNames.SvnLog].StringValue;
                }
            };

            bool retry = false;
            ProgressRunnerResult r = e.GetService<IProgressRunner>().RunModal(CommandStrings.Annotating, delegate(object sender, ProgressWorkerArgs ee)
            {
                using (FileStream fs = File.Create(tempFile))
                {
                    ee.Client.Write(target, fs, wa);
                }

                ba.SvnError +=
                    delegate(object errorSender, SvnErrorEventArgs errorEventArgs)
                    {
                        if (errorEventArgs.Exception is SvnClientBinaryFileException)
                        {
                            retry = true;
                            errorEventArgs.Cancel = true;
                        }
                    };
                ee.Client.GetBlame(target, ba, out blameResult);
            });

            if (retry)
            {
                using (AnkhMessageBox mb = new AnkhMessageBox(e.Context))
                {
                    if (DialogResult.Yes == mb.Show(
                                                CommandStrings.AnnotateBinaryFileContinueAnywayText,
                                                CommandStrings.AnnotateBinaryFileContinueAnywayTitle,
                                                MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                    {
                        r = e.GetService<IProgressRunner>()
                            .RunModal(CommandStrings.Annotating,
                                      delegate(object sender, ProgressWorkerArgs ee)
                                      {
                                          ba.IgnoreMimeType = true;
                                          ee.Client.GetBlame(target, ba, out blameResult);
                                      });
                    }
                }
            }

            if (!r.Succeeded)
                return;

            AnnotateEditorControl annEditor = new AnnotateEditorControl();
            IAnkhEditorResolver er = e.GetService<IAnkhEditorResolver>();

            annEditor.Create(e.Context, tempFile);
            annEditor.LoadFile(tempFile);
            annEditor.AddLines(item, blameResult, logMessages);

            // Detect and set the language service
            Guid language;
            if (er.TryGetLanguageService(Path.GetExtension(target.FileName), out language))
            {
                // Extension is mapped -> user
                annEditor.SetLanguageService(language);
            }
            else if (blameResult != null && blameResult.Count > 0 && blameResult[0].Line != null)
            {
                // Extension is not mapped -> Check if this is xml (like project files)
                string line = blameResult[0].Line.Trim();

                if (line.StartsWith("<?xml")
                    || (line.StartsWith("<") && line.Contains("xmlns=\"http://schemas.microsoft.com/developer/msbuild/")))
                {
                    if (er.TryGetLanguageService(".xml", out language))
                    {
                        annEditor.SetLanguageService(language);
                    }
                }
            }
        }