コード例 #1
0
 public static void ReportStashResult(IProgressMonitor monitor, MergeCommandResult result)
 {
     if (result.GetMergeStatus() == NGit.Api.MergeStatus.FAILED)
     {
         string msg = GettextCatalog.GetString("Stash operation failed.");
         DispatchService.GuiDispatch(delegate {
             IdeApp.Workbench.StatusBar.ShowWarning(msg);
         });
         string txt = msg + "\n\n" + GetMergeResultErrorDetail(result);
         monitor.ReportError(txt, null);
     }
     else if (result.GetMergeStatus() == NGit.Api.MergeStatus.NOT_SUPPORTED)
     {
         string msg = GettextCatalog.GetString("Operation not supported");
         monitor.ReportError(msg, null);
         DispatchService.GuiDispatch(delegate {
             IdeApp.Workbench.StatusBar.ShowWarning(msg);
         });
     }
     else if (result.GetMergeStatus() == NGit.Api.MergeStatus.CONFLICTING)
     {
         string msg = GettextCatalog.GetString("Stash applied with conflicts");
         DispatchService.GuiDispatch(delegate {
             IdeApp.Workbench.StatusBar.ShowWarning(msg);
         });
     }
     else
     {
         string msg = GettextCatalog.GetString("Stash successfully applied");
         DispatchService.GuiDispatch(delegate {
             IdeApp.Workbench.StatusBar.ShowMessage(msg);
         });
     }
 }
コード例 #2
0
ファイル: PullResult.cs プロジェクト: nickname100/monodevelop
		internal PullResult(FetchResult fetchResult, string fetchedFrom, MergeCommandResult
			 mergeResult)
		{
			this.fetchResult = fetchResult;
			this.fetchedFrom = fetchedFrom;
			this.mergeResult = mergeResult;
		}
コード例 #3
0
        internal static string GetMergeResultErrorDetail(MergeCommandResult result)
        {
            string msg = "";

            if (result.GetFailingPaths() != null)
            {
                foreach (var f in result.GetFailingPaths())
                {
                    if (msg.Length > 0)
                    {
                        msg += "\n";
                    }
                    switch (f.Value)
                    {
                    case NGit.Merge.ResolveMerger.MergeFailureReason.DIRTY_WORKTREE:
                        msg += GettextCatalog.GetString("The file '{0}' has unstaged changes", f.Key);
                        break;

                    case NGit.Merge.ResolveMerger.MergeFailureReason.DIRTY_INDEX:
                        msg += GettextCatalog.GetString("The file '{0}' has staged changes", f.Key);
                        break;

                    case NGit.Merge.ResolveMerger.MergeFailureReason.COULD_NOT_DELETE:
                        msg += GettextCatalog.GetString("The file '{0}' could not be deleted", f.Key);
                        break;
                    }
                }
            }
            return(msg);
        }
コード例 #4
0
        public virtual void CheckMergeConflictingNewTrees(MergeStrategy strategy)
        {
            Git git = Git.Wrap(db);

            WriteTrashFile("2", "orig");
            git.Add().AddFilepattern("2").Call();
            RevCommit first = git.Commit().SetMessage("added 2").Call();

            WriteTrashFile("d/1", "master");
            git.Add().AddFilepattern("d/1").Call();
            RevCommit masterCommit = git.Commit().SetAll(true).SetMessage("added d/1 on master"
                                                                          ).Call();

            git.Checkout().SetCreateBranch(true).SetStartPoint(first).SetName("side").Call();
            WriteTrashFile("d/1", "side");
            git.Add().AddFilepattern("d/1").Call();
            git.Commit().SetAll(true).SetMessage("added d/1 on side").Call();
            git.Rm().AddFilepattern("d/1").Call();
            git.Rm().AddFilepattern("d").Call();
            MergeCommandResult mergeRes = git.Merge().SetStrategy(strategy).Include(masterCommit
                                                                                    ).Call();

            NUnit.Framework.Assert.AreEqual(MergeStatus.CONFLICTING, mergeRes.GetMergeStatus(
                                                ));
            NUnit.Framework.Assert.AreEqual("[2, mode:100644, content:orig][d/1, mode:100644, stage:2, content:side][d/1, mode:100644, stage:3, content:master]"
                                            , IndexState(CONTENT));
        }
コード例 #5
0
ファイル: IndexDiffTest.cs プロジェクト: shoff/ngit
        public virtual void TestConflictingFromMultipleCreations()
        {
            Git git = new Git(db);

            WriteTrashFile("a", "1\na\n3\n");
            git.Add().AddFilepattern("a").Call();
            RevCommit initialCommit = git.Commit().SetMessage("initial").Call();

            CreateBranch(initialCommit, "refs/heads/side");
            CheckoutBranch("refs/heads/side");
            WriteTrashFile("b", "1\nb(side)\n3\n");
            git.Add().AddFilepattern("b").Call();
            RevCommit secondCommit = git.Commit().SetMessage("side").Call();

            CheckoutBranch("refs/heads/master");
            WriteTrashFile("b", "1\nb(main)\n3\n");
            git.Add().AddFilepattern("b").Call();
            git.Commit().SetMessage("main").Call();
            MergeCommandResult result = git.Merge().Include(secondCommit.Id).SetStrategy(MergeStrategy
                                                                                         .RESOLVE).Call();

            NUnit.Framework.Assert.AreEqual(MergeStatus.CONFLICTING, result.GetMergeStatus());
            FileTreeIterator iterator = new FileTreeIterator(db);
            IndexDiff        diff     = new IndexDiff(db, Constants.HEAD, iterator);

            diff.Diff();
            NUnit.Framework.Assert.AreEqual("[]", new TreeSet <string>(diff.GetChanged()).ToString
                                                ());
            NUnit.Framework.Assert.AreEqual("[]", diff.GetAdded().ToString());
            NUnit.Framework.Assert.AreEqual("[]", diff.GetRemoved().ToString());
            NUnit.Framework.Assert.AreEqual("[]", diff.GetMissing().ToString());
            NUnit.Framework.Assert.AreEqual("[]", diff.GetModified().ToString());
            NUnit.Framework.Assert.AreEqual("[b]", diff.GetConflicting().ToString());
        }
コード例 #6
0
ファイル: PullResult.cs プロジェクト: LunarLanding/ngit
		internal PullResult(FetchResult fetchResult, string fetchedFrom, RebaseResult rebaseResult
			)
		{
			this.fetchResult = fetchResult;
			this.fetchedFrom = fetchedFrom;
			this.mergeResult = null;
			this.rebaseResult = rebaseResult;
		}
コード例 #7
0
ファイル: Stash.cs プロジェクト: poke/monodevelop
        public MergeCommandResult Pop()
        {
            List <Stash>       stashes = ReadStashes();
            Stash              last    = stashes.Last();
            MergeCommandResult res     = last.Apply();

            Remove(stashes, last);
            return(res);
        }
コード例 #8
0
        public MergeCommandResult Pop(ProgressMonitor monitor)
        {
            List <Stash>       stashes = ReadStashes();
            Stash              last    = stashes.Last();
            MergeCommandResult res     = last.Apply(monitor);

            if (res.GetMergeStatus() != MergeStatus.FAILED && res.GetMergeStatus() != MergeStatus.NOT_SUPPORTED)
            {
                Remove(stashes, last);
            }
            return(res);
        }
コード例 #9
0
        internal MergeCommandResult Apply(ProgressMonitor monitor, Stash stash)
        {
            monitor.Start(1);
            monitor.BeginTask("Applying stash", 100);
            ObjectId  cid     = _repo.Resolve(stash.CommitId);
            RevWalk   rw      = new RevWalk(_repo);
            RevCommit wip     = rw.ParseCommit(cid);
            RevCommit oldHead = wip.Parents.First();

            rw.ParseHeaders(oldHead);
            MergeCommandResult res = GitUtil.MergeTrees(monitor, _repo, oldHead, wip, "Stash", false);

            monitor.EndTask();
            return(res);
        }
コード例 #10
0
        public virtual void TestConflicting()
        {
            Git git = new Git(db);

            WriteTrashFile("a", "1\na\n3\n");
            WriteTrashFile("b", "1\nb\n3\n");
            git.Add().AddFilepattern("a").AddFilepattern("b").Call();
            RevCommit initialCommit = git.Commit().SetMessage("initial").Call();

            // create side branch with two modifications
            CreateBranch(initialCommit, "refs/heads/side");
            CheckoutBranch("refs/heads/side");
            WriteTrashFile("a", "1\na(side)\n3\n");
            WriteTrashFile("b", "1\nb\n3\n(side)");
            git.Add().AddFilepattern("a").AddFilepattern("b").Call();
            RevCommit secondCommit = git.Commit().SetMessage("side").Call();

            // update a on master to generate conflict
            CheckoutBranch("refs/heads/master");
            WriteTrashFile("a", "1\na(main)\n3\n");
            git.Add().AddFilepattern("a").Call();
            git.Commit().SetMessage("main").Call();
            // merge side with master
            MergeCommandResult result = git.Merge().Include(secondCommit.Id).SetStrategy(MergeStrategy
                                                                                         .RESOLVE).Call();

            NUnit.Framework.Assert.AreEqual(MergeStatus.CONFLICTING, result.GetMergeStatus());
            FileTreeIterator iterator = new FileTreeIterator(db);
            IndexDiff        diff     = new IndexDiff(db, Constants.HEAD, iterator);

            diff.Diff();
            NUnit.Framework.CollectionAssert.AreEqual("[b]", new TreeSet <string>(diff.GetChanged()).ToString
                                                          ());
            NUnit.Framework.CollectionAssert.IsEmpty(diff.GetAdded());
            NUnit.Framework.CollectionAssert.IsEmpty(diff.GetRemoved());
            NUnit.Framework.CollectionAssert.IsEmpty(diff.GetMissing());
            NUnit.Framework.CollectionAssert.IsEmpty(diff.GetModified());
            NUnit.Framework.Assert.AreEqual("a", diff.GetConflicting().First());
            NUnit.Framework.Assert.AreEqual(1, diff.GetConflicting().Count());
            NUnit.Framework.CollectionAssert.IsEmpty(diff.GetUntrackedFolders());
        }
コード例 #11
0
        public virtual void CheckLockedFilesToBeDeleted(MergeStrategy strategy)
        {
            Git git = Git.Wrap(db);

            WriteTrashFile("a.txt", "orig");
            WriteTrashFile("b.txt", "orig");
            git.Add().AddFilepattern("a.txt").AddFilepattern("b.txt").Call();
            RevCommit first = git.Commit().SetMessage("added a.txt, b.txt").Call();

            // modify and delete files on the master branch
            WriteTrashFile("a.txt", "master");
            git.Rm().AddFilepattern("b.txt").Call();
            RevCommit masterCommit = git.Commit().SetMessage("modified a.txt, deleted b.txt")
                                     .SetAll(true).Call();

            // switch back to a side branch
            git.Checkout().SetCreateBranch(true).SetStartPoint(first).SetName("side").Call();
            WriteTrashFile("c.txt", "side");
            git.Add().AddFilepattern("c.txt").Call();
            git.Commit().SetMessage("added c.txt").Call();
            // Get a handle to the the file so on windows it can't be deleted.
            FileInputStream    fis      = new FileInputStream(new FilePath(db.WorkTree, "b.txt"));
            MergeCommandResult mergeRes = git.Merge().SetStrategy(strategy).Include(masterCommit
                                                                                    ).Call();

            if (mergeRes.GetMergeStatus().Equals(MergeStatus.FAILED))
            {
                // probably windows
                NUnit.Framework.Assert.AreEqual(1, mergeRes.GetFailingPaths().Count);
                NUnit.Framework.Assert.AreEqual(ResolveMerger.MergeFailureReason.COULD_NOT_DELETE
                                                , mergeRes.GetFailingPaths().Get("b.txt"));
            }
            NUnit.Framework.Assert.AreEqual("[a.txt, mode:100644, content:master]" + "[c.txt, mode:100644, content:side]"
                                            , IndexState(CONTENT));
            fis.Close();
        }
コード例 #12
0
        public virtual void CheckMergeConflictingFilesWithTreeInIndex(MergeStrategy strategy
                                                                      )
        {
            Git git = Git.Wrap(db);

            WriteTrashFile("0", "orig");
            git.Add().AddFilepattern("0").Call();
            RevCommit first = git.Commit().SetMessage("added 0").Call();

            WriteTrashFile("0", "master");
            RevCommit masterCommit = git.Commit().SetAll(true).SetMessage("modified 0 on master"
                                                                          ).Call();

            git.Checkout().SetCreateBranch(true).SetStartPoint(first).SetName("side").Call();
            WriteTrashFile("0", "side");
            git.Commit().SetAll(true).SetMessage("modified 0 on side").Call();
            git.Rm().AddFilepattern("0").Call();
            WriteTrashFile("0/0", "side");
            git.Add().AddFilepattern("0/0").Call();
            MergeCommandResult mergeRes = git.Merge().SetStrategy(strategy).Include(masterCommit
                                                                                    ).Call();

            NUnit.Framework.Assert.AreEqual(MergeStatus.FAILED, mergeRes.GetMergeStatus());
        }
コード例 #13
0
        public virtual void CheckMergeEqualTreesWithoutIndex(MergeStrategy strategy)
        {
            Git git = Git.Wrap(db);

            WriteTrashFile("d/1", "orig");
            git.Add().AddFilepattern("d/1").Call();
            RevCommit first = git.Commit().SetMessage("added d/1").Call();

            WriteTrashFile("d/1", "modified");
            RevCommit masterCommit = git.Commit().SetAll(true).SetMessage("modified d/1 on master"
                                                                          ).Call();

            git.Checkout().SetCreateBranch(true).SetStartPoint(first).SetName("side").Call();
            WriteTrashFile("d/1", "modified");
            git.Commit().SetAll(true).SetMessage("modified d/1 on side").Call();
            git.Rm().AddFilepattern("d/1").Call();
            git.Rm().AddFilepattern("d").Call();
            MergeCommandResult mergeRes = git.Merge().SetStrategy(strategy).Include(masterCommit
                                                                                    ).Call();

            NUnit.Framework.Assert.AreEqual(MergeStatus.MERGED, mergeRes.GetMergeStatus());
            NUnit.Framework.Assert.AreEqual("[d/1, mode:100644, content:modified]", IndexState
                                                (CONTENT));
        }
コード例 #14
0
ファイル: GitCommand.cs プロジェクト: pvginkel/VisualGit
        protected void RaiseMergeResults(RepositoryEntry repositoryEntry, MergeCommandResult mergeResults)
        {
            Debug.Assert(Args is IGitConflictsClientArgs, "Merge results may only be reported on Args that implement IGitConflictsClientArgs");

            // We ignore the merge results for getting a list of conflicts.
            // Instead, we go to the index directly.

            var conflicts = new HashSet<string>(FileSystemUtil.StringComparer);

            using (repositoryEntry.Lock())
            {
                var repository = repositoryEntry.Repository;

                var dirCache = repository.ReadDirCache();

                for (int i = 0, count = dirCache.GetEntryCount(); i < count; i++)
                {
                    var entry = dirCache.GetEntry(i);

                    if (entry.Stage > 0)
                    {
                        string path = entry.PathString;

                        if (!conflicts.Contains(path))
                            conflicts.Add(path);
                    }
                }
            }

            if (conflicts.Count == 0)
                return;

            foreach (var item in conflicts)
            {
                string fullPath = repositoryEntry.Repository.GetAbsoluteRepositoryPath(item);

                var args = new GitConflictEventArgs
                {
                    MergedFile = fullPath,
                    Path = item,
                    ConflictReason = GitConflictReason.Edited
                };

                try
                {
                    Args.OnConflict(args);

                    if (args.Cancel)
                        return;
                    if (args.Choice == GitAccept.Postpone)
                        continue;

                    Client.Resolve(args.MergedFile, args.Choice, new GitResolveArgs
                    {
                        ConflictArgs = args
                    });
                }
                finally
                {
                    args.Cleanup();
                }
            }
        }
コード例 #15
0
        /// <exception cref="System.Exception"></exception>
        private void CheckMergeFailedResult(MergeCommandResult result, ResolveMerger.MergeFailureReason
			 reason, string indexState, FilePath fileA)
        {
            NUnit.Framework.Assert.AreEqual(MergeStatus.FAILED, result.GetMergeStatus());
            NUnit.Framework.Assert.AreEqual(reason, result.GetFailingPaths().Get("a"));
            NUnit.Framework.Assert.AreEqual("a(modified)", Read(fileA));
            NUnit.Framework.Assert.IsFalse(new FilePath(db.WorkTree, "b").Exists());
            NUnit.Framework.Assert.AreEqual("c", Read(new FilePath(db.WorkTree, "c")));
            NUnit.Framework.Assert.AreEqual(indexState, IndexState(CONTENT));
            NUnit.Framework.Assert.AreEqual(null, result.GetConflicts());
            NUnit.Framework.Assert.AreEqual(RepositoryState.SAFE, db.GetRepositoryState());
        }
コード例 #16
0
		internal static string GetMergeResultErrorDetail (MergeCommandResult result)
		{
			string msg = "";
			if (result.GetFailingPaths () != null) {
				foreach (var f in result.GetFailingPaths ()) {
					if (msg.Length > 0)
						msg += "\n";
					switch (f.Value) {
					case NGit.Merge.ResolveMerger.MergeFailureReason.DIRTY_WORKTREE: msg += GettextCatalog.GetString ("The file '{0}' has unstaged changes", f.Key); break;
					case NGit.Merge.ResolveMerger.MergeFailureReason.DIRTY_INDEX: msg += GettextCatalog.GetString ("The file '{0}' has staged changes", f.Key); break;
					case NGit.Merge.ResolveMerger.MergeFailureReason.COULD_NOT_DELETE: msg += GettextCatalog.GetString ("The file '{0}' could not be deleted", f.Key); break;
					}
				}
			}
			return msg;
		}
コード例 #17
0
		public static void ReportStashResult (IProgressMonitor monitor, MergeCommandResult result)
		{
			if (result.GetMergeStatus () == NGit.Api.MergeStatus.FAILED) {
				string msg = GettextCatalog.GetString ("Stash operation failed.");
				DispatchService.GuiDispatch (delegate {
					IdeApp.Workbench.StatusBar.ShowWarning (msg);
				});
				string txt = msg + "\n\n" + GetMergeResultErrorDetail (result);
				monitor.ReportError (txt, null);
			}
			else if (result.GetMergeStatus () == NGit.Api.MergeStatus.NOT_SUPPORTED) {
				string msg = GettextCatalog.GetString ("Operation not supported");
				monitor.ReportError (msg, null);
				DispatchService.GuiDispatch (delegate {
					IdeApp.Workbench.StatusBar.ShowWarning (msg);
				});
			}
			else if (result.GetMergeStatus () == NGit.Api.MergeStatus.CONFLICTING) {
				string msg = GettextCatalog.GetString ("Stash applied with conflicts");
				DispatchService.GuiDispatch (delegate {
					IdeApp.Workbench.StatusBar.ShowWarning (msg);
				});
			}
			else {
				string msg = GettextCatalog.GetString ("Stash successfully applied");
				DispatchService.GuiDispatch (delegate {
					IdeApp.Workbench.StatusBar.ShowMessage (msg);
				});
			}
		}
コード例 #18
0
		public bool Rebase ()
		{
			NGit.Api.Git git = new NGit.Api.Git (repo);
			
			if (aborted)
				return false;
			
			if (starting) {
				ObjectId headId = repo.Resolve (Constants.HEAD + "^{commit}");
				RevCommit headCommit = rw.ParseCommit (headId);
				oldHead = headCommit;
				ObjectId upstreamId = repo.Resolve (upstreamRef);
				RevCommit upstreamCommit = rw.ParseCommit (upstreamId);
				
				oldHead = headCommit;
				lastGoodHead = upstreamId;
				commitChain = new List<RevCommit> ();
			
				LogCommand cmd = new NGit.Api.Git(repo).Log().AddRange(upstreamId, headCommit);
				foreach (RevCommit commit in cmd.Call())
					commitChain.Add(commit);
				
				commitChain.Reverse ();
				currentMergeIndex = 0;
				
				// Checkout the upstream commit
				// Reset head to upstream
				GitUtil.HardReset (repo, upstreamRef);
				
				string rebaseDir = Path.Combine (repo.Directory, "rebase-apply");
				if (!Directory.Exists (rebaseDir))
					Directory.CreateDirectory (rebaseDir);
				
				string rebasingFile = Path.Combine (rebaseDir, "rebasing");
				if (!File.Exists (rebasingFile))
					File.WriteAllBytes (rebasingFile, new byte[0]);
				
				starting = false;
				monitor.BeginTask ("Applying local commits", commitChain.Count);
			}
			else {
				// Conflicts resolved. Continue.
				NGit.Api.AddCommand cmd = git.Add ();
				var conflicts = LastMergeResult.GetConflicts ();
				foreach (string conflictFile in conflicts.Keys) {
					cmd.AddFilepattern (conflictFile);
				}
				cmd.Call ();
				NGit.Api.CommitCommand commit = git.Commit ();
				commit.SetMessage (currentMergeCommit.GetFullMessage ());
				commit.SetAuthor (currentMergeCommit.GetAuthorIdent ());
				commit.SetCommitter (currentMergeCommit.GetCommitterIdent ());
				commit.Call();
			}
			
			// Merge commit by commit until the current head
			
			while (currentMergeIndex < commitChain.Count) {
				currentMergeCommit = commitChain[currentMergeIndex++];
				mergeResult = GitUtil.CherryPick (repo, currentMergeCommit);
				monitor.Log.WriteLine ("Applied '{0}'", currentMergeCommit.GetShortMessage ());
				monitor.Step (1);
				if (mergeResult.GetMergeStatus () == MergeStatus.CONFLICTING || mergeResult.GetMergeStatus () == MergeStatus.FAILED)
					return false;
				lastGoodHead = mergeResult.GetNewHead ();
			}
			
			monitor.EndTask ();
			CleanRebaseFile ();
			return true;
		}