Example #1
0
        /// <summary>
        /// Rename elements in all referenced lua files.
        /// </summary>
        /// <param name="elementType">Type of element.</param>
        /// <param name="oldName">Old name of element.</param>
        /// <param name="newName">New name of element.</param>
        /// <param name="result">Rename result.</param>
        private IRenameResult RenameAllReferences(vsCMElement elementType, string oldName, string newName,
                                                  IRenameResult result)
        {
            Trace.WriteLine("RenameAllReferences started...");
            try
            {
                var                multiResult           = new MultiRenameResult(oldName, newName);
                Project            currentProject        = DTE.ActiveDocument.ProjectItem.ContainingProject;
                ProjectItem        activeProjectItem     = DTE.ActiveDocument.ProjectItem;
                string             activeProjectFileName = activeProjectItem.get_FileNames(1);
                List <ProjectItem> projectItems          = GetLuaProjectItems(currentProject);

                foreach (ProjectItem projectItem in projectItems)
                {
                    string fileName = projectItem.get_FileNames(1);
                    if (!string.IsNullOrEmpty(fileName))
                    {
                        //If projectItem is the active then merge changes into MultiRenameResult
                        if (activeProjectFileName == fileName)
                        {
                            multiResult.MergeChanges(projectItem, result);
                        }
                        else
                        {
                            if (IsLuaFile(fileName))
                            {
                                LuaFileCodeModel fileCodeModel = GetFileCodeModel(projectItem);
                                if (fileCodeModel != null)
                                {
                                    CodeElement   root = GetRootElement(fileCodeModel);
                                    IRenameResult renameResult;
                                    //Rename references in Lua file.
                                    if (root != null)
                                    {
                                        renameResult = refactoringService.Rename(null, root, elementType, oldName, newName);
                                        renameResult.Parents.Add(fileCodeModel);
                                    }
                                    else
                                    {
                                        string message = String.Format(Resources.RootElementCannotBeFoundMessage, fileName);
                                        renameResult = new RenameResult(false, message);
                                        Trace.WriteLine(message);
                                    }
                                    multiResult.MergeChanges(projectItem, renameResult);
                                }
                            }
                        }
                    }
                }
                return(multiResult);
            }
            catch (Exception e)
            {
                Trace.WriteLine(e);
                throw;
            }
        }
Example #2
0
        /// <summary>
        /// Rename the selected code element.
        /// </summary>
        /// <param name="element">Element to rename.</param>
        /// <param name="newName">Element's new name.</param>
        /// <param name="useToolWindow">Show/Hide rename tool window.</param>
        /// <returns></returns>
        public IRenameResult Rename(CodeElement element, string newName, bool useToolWindow)
        {
            if (element == null)
            {
                return(null);
            }

            IRenameResult result  = null;
            string        oldName = element.Name;
            bool          openAllChangedDocument = true;
            bool          success = refactoringService.CanRenameSymbol(element, element.Kind, oldName);

            if (success)
            {
                //Cannot rename element without new name.
                if (!useToolWindow && string.IsNullOrEmpty(newName))
                {
                    MessageBox.Show(Resources.RenameNewNameEmptyMessage,
                                    Resources.RenameCommandName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    //Show Rename Form if required.
                    if (useToolWindow)
                    {
                        success = ReSolveConflicts(element, oldName,
                                                   ref newName, out openAllChangedDocument) == ConflictType.None;
                    }
                    //Rename operation approved by user.
                    if (success)
                    {
                        var codeModel = GetFileCodeModel();
                        result = refactoringService.Rename(element, codeModel.RootElement,
                                                           element.Kind, oldName, newName);
                        result.Parents.Add(codeModel);
                        //If renamed element is declared in project scope then
                        //rename all references in code files.
                        if (result.RenameReferences)
                        {
                            result = RenameAllReferences(element.Kind, oldName, newName, result);
                        }

                        try
                        {
                            DTE.UndoContext.Open("Undo Code Merge", false);
                            //Merge changed elements into code files from FileCodeModel.
                            MergeChanges(result, openAllChangedDocument);
                        }
                        finally
                        {
                            DTE.UndoContext.Close();
                        }
                    }
                }
            }
            return(result);
        }
Example #3
0
        /// <summary>
        /// Rename element in scope of parentElement.
        /// </summary>
        /// <param name="element">Element to rename.</param>
        /// <param name="parentElement">Containing element.</param>
        /// <param name="elementType">Type of element.</param>
        /// <param name="oldName">Old name of element.</param>
        /// <param name="newName">New name of element.</param>
        public IRenameResult Rename(CodeElement element, CodeElement parentElement, vsCMElement elementType,
                                    string oldName, string newName)
        {
            var renameContext = new CodeElementRenameContext
                                    (RenameStrategyFactory.Create(elementType));
            IRenameResult result = renameContext.CodeElementRename
                                   .RenameSymbols(element, (LuaCodeClass)parentElement, elementType, oldName, newName);

            return(result);
        }
Example #4
0
        /// <summary>
        /// Rename the selected code element.
        /// </summary>
        /// <param name="element">Element to rename.</param>
        /// <param name="newName">Element's new name.</param>
        /// <returns></returns>
        public IRenameResult Rename(CodeElement element, string newName)
        {
            IRenameResult result = Rename(element, string.Empty, true);

            if (result != null)
            {
                luaUndoService.Add(new RenameUndoUnit(result));
            }

            return(result);
        }
Example #5
0
        /// <summary>
        /// Rename the selected code element.
        /// </summary>
        /// <returns></returns>
        public IRenameResult Rename()
        {
            IRenameResult    result    = null;
            LuaFileCodeModel codeModel = GetFileCodeModel();
            CodeElement      element   = codeModel.GetElementByEditPoint();

            if (element != null)
            {
                dte.StatusBar.Text = String.Format(Resources.RenameStartedMessage, element.Name);
                DTE.StatusBar.Highlight(true);

                //Rename element.
                result = Rename(element, string.Empty);

                dte.StatusBar.Clear();
            }
            else
            {
                dte.StatusBar.Text = Resources.RenameNotAllowedMessage;
            }

            return(result);
        }
Example #6
0
        /// <summary>
        /// Merges changes from IRenameResult.
        /// </summary>
        /// <param name="renameResult">IRenameResult provider.</param>
        /// <param name="openAllChangedDocument">Indicates that open code files in Visual Studio Text Editor</param>
        /// <returns></returns>
        private void MergeChanges(IRenameResult renameResult, bool openAllChangedDocument)
        {
            if (renameResult == null)
            {
                throw new ArgumentNullException("renameResult");
            }

            //Rename element and all refernces in other code files.
            if (renameResult is MultiRenameResult)
            {
                var      multiRenameResult = renameResult as MultiRenameResult;
                Document currentWindow     = DTE.ActiveDocument;
                foreach (var item in multiRenameResult)
                {
                    if (item.Value.Success && item.Value.HasChanges)
                    {
                        if (openAllChangedDocument && !item.Key.get_IsOpen(Constants.vsViewKindCode))
                        {
                            //Open code file in Visual Studio Text Editor
                            DTE.ItemOperations.OpenFile(item.Key.get_FileNames(1), Constants.vsViewKindPrimary);
                        }
                        //Merge changed elements into code file from FileCodeModel.
                        MergeChanges(GetFileCodeModel(item.Key), item.Value.ChangedElements, multiRenameResult.OldName);
                    }
                }
                if (currentWindow != null)
                {
                    currentWindow.Activate();
                }
            }
            else if (renameResult is RenameResult)
            {
                //Rename element in actual code file.
                MergeChanges(GetFileCodeModel(), renameResult.ChangedElements, renameResult.OldName);
            }
        }
Example #7
0
 public IFetchResult FetchWithMerge(int mergeChangesetId, bool stopOnFailMergeCommit = false, IRenameResult renameResult = null, params string[] parentCommitsHashes)
 {
     throw DerivedRemoteException;
 }
Example #8
0
        private IGitTfsRemote InitTfsRemoteOfChangeset(IBranchObject tfsBranch, int parentChangesetId, IRenameResult renameResult = null)
        {
            if (tfsBranch.IsRoot)
            {
                return(InitTfsBranch(this.remoteOptions, tfsBranch.Path));
            }

            var branchesDatas = Tfs.GetRootChangesetForBranch(tfsBranch.Path, parentChangesetId);

            IGitTfsRemote remote = null;

            foreach (var branch in branchesDatas)
            {
                var rootChangesetId = branch.RootChangeset;
                remote = InitBranch(this.remoteOptions, tfsBranch.Path, rootChangesetId, true);
                if (remote == null)
                {
                    stdout.WriteLine("warning: root commit not found corresponding to changeset " + rootChangesetId);
                    stdout.WriteLine("=> continuing anyway by creating a branch without parent...");
                    return(InitTfsBranch(this.remoteOptions, tfsBranch.Path));
                }

                if (branch.IsRenamedBranch)
                {
                    try
                    {
                        remote.Fetch(renameResult: renameResult);
                    }
                    finally
                    {
                        Trace.WriteLine("Cleaning...");
                        remote.CleanupWorkspaceDirectory();

                        if (remote.Repository.IsBare)
                        {
                            remote.Repository.UpdateRef(GitRepository.ShortToLocalName(remote.Id), remote.MaxCommitHash);
                        }
                    }
                }
            }

            return(remote);
        }
Example #9
0
        private string FindRemoteAndFetch(int parentChangesetId, bool stopOnFailMergeCommit, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            var tfsRemote = FindOrInitTfsRemoteOfChangeset(parentChangesetId, mergeChangeset, renameResult, out omittedParentBranch);

            if (tfsRemote != null && string.Compare(tfsRemote.TfsRepositoryPath, TfsRepositoryPath, StringComparison.InvariantCultureIgnoreCase) != 0)
            {
                stdout.WriteLine("\tFetching from dependent TFS remote '{0}'...", tfsRemote.Id);
                try
                {
                    var fetchResult = ((GitTfsRemote)tfsRemote).FetchWithMerge(-1, stopOnFailMergeCommit, parentChangesetId, renameResult);
                }
                finally
                {
                    Trace.WriteLine("Cleaning...");
                    tfsRemote.CleanupWorkspaceDirectory();

                    if (tfsRemote.Repository.IsBare)
                    {
                        tfsRemote.Repository.UpdateRef(GitRepository.ShortToLocalName(tfsRemote.Id), tfsRemote.MaxCommitHash);
                    }
                }
                return(Repository.FindCommitHashByChangesetId(parentChangesetId));
            }
            return(null);
        }
Example #10
0
        public IFetchResult FetchWithMerge(long mergeChangesetId, bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null, params string[] parentCommitsHashes)
        {
            var fetchResult = new FetchResult {
                IsSuccess = true, NewChangesetCount = 0
            };
            var latestChangesetId = GetLatestChangesetId();

            if (lastChangesetIdToFetch != -1)
            {
                latestChangesetId = Math.Min(latestChangesetId, lastChangesetIdToFetch);
            }
            // TFS 2010 doesn't like when we ask for history past its last changeset.
            if (MaxChangesetId >= latestChangesetId)
            {
                return(fetchResult);
            }
            IEnumerable <ITfsChangeset> fetchedChangesets;

            do
            {
                fetchedChangesets = FetchChangesets(true, lastChangesetIdToFetch);
                if (!fetchedChangesets.Any())
                {
                    return(fetchResult);
                }

                var objects = BuildEntryDictionary();
                foreach (var changeset in fetchedChangesets)
                {
                    fetchResult.NewChangesetCount++;
                    if (lastChangesetIdToFetch > 0 && changeset.Summary.ChangesetId > lastChangesetIdToFetch)
                    {
                        return(fetchResult);
                    }
                    string parentCommitSha = null;
                    if (changeset.IsMergeChangeset && !ProcessMergeChangeset(changeset, stopOnFailMergeCommit, ref parentCommitSha))
                    {
                        fetchResult.IsSuccess = false;
                        return(fetchResult);
                    }
                    var parentSha = (renameResult != null && renameResult.IsProcessingRenameChangeset) ? renameResult.LastParentCommitBeforeRename : MaxCommitHash;
                    var isFirstCommitInRepository = (parentSha == null);
                    var log = Apply(parentSha, changeset, objects);
                    if (changeset.IsRenameChangeset && !isFirstCommitInRepository)
                    {
                        if (renameResult == null || !renameResult.IsProcessingRenameChangeset)
                        {
                            fetchResult.IsProcessingRenameChangeset  = true;
                            fetchResult.LastParentCommitBeforeRename = MaxCommitHash;
                            return(fetchResult);
                        }
                        renameResult.IsProcessingRenameChangeset  = false;
                        renameResult.LastParentCommitBeforeRename = null;
                    }
                    if (parentCommitSha != null)
                    {
                        log.CommitParents.Add(parentCommitSha);
                    }
                    if (changeset.Summary.ChangesetId == mergeChangesetId)
                    {
                        foreach (var parent in parentCommitsHashes)
                        {
                            log.CommitParents.Add(parent);
                        }
                    }
                    var commitSha = ProcessChangeset(changeset, log);
                    fetchResult.LastFetchedChangesetId = changeset.Summary.ChangesetId;
                    // set commit sha for added git objects
                    foreach (var commit in objects)
                    {
                        if (commit.Value.Commit == null)
                        {
                            commit.Value.Commit = commitSha;
                        }
                    }
                    DoGcIfNeeded();
                }
            } while (fetchedChangesets.Any() && latestChangesetId > fetchResult.LastFetchedChangesetId);
            return(fetchResult);
        }
Example #11
0
        private string FindRemoteAndFetch(int parentChangesetId, bool stopOnFailMergeCommit, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            var tfsRemote = FindOrInitTfsRemoteOfChangeset(parentChangesetId, mergeChangeset, renameResult, out omittedParentBranch);

            if (tfsRemote != null && string.Compare(tfsRemote.TfsRepositoryPath, TfsRepositoryPath, StringComparison.InvariantCultureIgnoreCase) != 0)
            {
                stdout.WriteLine("\tFetching from dependent TFS remote '{0}'...", tfsRemote.Id);
                try
                {
                    var fetchResult = ((GitTfsRemote) tfsRemote).FetchWithMerge(-1, stopOnFailMergeCommit, parentChangesetId, renameResult);
                }
                finally
                {
                    Trace.WriteLine("Cleaning...");
                    tfsRemote.CleanupWorkspaceDirectory();

                    if (tfsRemote.Repository.IsBare)
                        tfsRemote.Repository.UpdateRef(GitRepository.ShortToLocalName(tfsRemote.Id), tfsRemote.MaxCommitHash);
                }
                return Repository.FindCommitHashByChangesetId(parentChangesetId);
            }
            return null;
        }
Example #12
0
 public IFetchResult FetchWithMerge(int mergeChangesetId, bool stopOnFailMergeCommit = false, IRenameResult renameResult = null, params string[] parentCommitsHashes)
 {
     return FetchWithMerge(mergeChangesetId, stopOnFailMergeCommit, -1, renameResult, parentCommitsHashes);
 }
Example #13
0
        /// <summary>
        /// Rename elements in all referenced lua files.
        /// </summary>
        /// <param name="elementType">Type of element.</param>
        /// <param name="oldName">Old name of element.</param>
        /// <param name="newName">New name of element.</param>
        /// <param name="result">Rename result.</param>
        private IRenameResult RenameAllReferences(vsCMElement elementType, string oldName, string newName,
            IRenameResult result)
        {
            Trace.WriteLine("RenameAllReferences started...");
            try
            {
                var multiResult = new MultiRenameResult(oldName, newName);
                Project currentProject = DTE.ActiveDocument.ProjectItem.ContainingProject;
                ProjectItem activeProjectItem = DTE.ActiveDocument.ProjectItem;
                string activeProjectFileName = activeProjectItem.get_FileNames(1);
                List<ProjectItem> projectItems = GetLuaProjectItems(currentProject);

                foreach (ProjectItem projectItem in projectItems)
                {
                    string fileName = projectItem.get_FileNames(1);
                    if (!string.IsNullOrEmpty(fileName))
                    {
                        //If projectItem is the active then merge changes into MultiRenameResult
                        if (activeProjectFileName == fileName)
                        {
                            multiResult.MergeChanges(projectItem, result);
                        }
                        else
                        {
                            if (IsLuaFile(fileName))
                            {
                                LuaFileCodeModel fileCodeModel = GetFileCodeModel(projectItem);
                                if (fileCodeModel != null)
                                {
                                    CodeElement root = GetRootElement(fileCodeModel);
                                    IRenameResult renameResult;
                                    //Rename references in Lua file.
                                    if (root != null)
                                    {
                                        renameResult = refactoringService.Rename(null, root, elementType, oldName, newName);
                                        renameResult.Parents.Add(fileCodeModel);
                                    }
                                    else
                                    {
                                        string message = String.Format(Resources.RootElementCannotBeFoundMessage, fileName);
                                        renameResult = new RenameResult(false, message);
                                        Trace.WriteLine(message);
                                    }
                                    multiResult.MergeChanges(projectItem, renameResult);
                                }
                            }
                        }
                    }
                }
                return multiResult;
            }
            catch (Exception e)
            {
                Trace.WriteLine(e);
                throw;
            }
        }
Example #14
0
        /// <summary>
        /// Merges changes from IRenameResult.
        /// </summary>
        /// <param name="renameResult">IRenameResult provider.</param>
        /// <param name="openAllChangedDocument">Indicates that open code files in Visual Studio Text Editor</param>
        /// <returns></returns>
        private void MergeChanges(IRenameResult renameResult, bool openAllChangedDocument)
        {
            if (renameResult == null)
                throw new ArgumentNullException("renameResult");

            //Rename element and all refernces in other code files.
            if (renameResult is MultiRenameResult)
            {
                var multiRenameResult = renameResult as MultiRenameResult;
                Document currentWindow = DTE.ActiveDocument;
                foreach (var item in multiRenameResult)
                {
                    if (item.Value.Success && item.Value.HasChanges)
                    {
                        if (openAllChangedDocument && !item.Key.get_IsOpen(Constants.vsViewKindCode))
                        {
                            //Open code file in Visual Studio Text Editor
                            DTE.ItemOperations.OpenFile(item.Key.get_FileNames(1), Constants.vsViewKindPrimary);
                        }
                        //Merge changed elements into code file from FileCodeModel.
                        MergeChanges(GetFileCodeModel(item.Key), item.Value.ChangedElements, multiRenameResult.OldName);
                    }
                }
                if (currentWindow != null) currentWindow.Activate();
            }
            else if (renameResult is RenameResult)
            {
                //Rename element in actual code file.
                MergeChanges(GetFileCodeModel(), renameResult.ChangedElements, renameResult.OldName);
            }
        }
Example #15
0
 public IGitTfsRemote InitBranch(RemoteOptions remoteOptions, string tfsRepositoryPath, int shaRootChangesetId, bool fetchParentBranch, string gitBranchNameExpected = null, IRenameResult renameResult = null)
 {
     throw new NotImplementedException();
 }
Example #16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RenameUndoUnit"/> class.
 /// </summary>
 /// <param name="renameResult">The rename result.</param>
 public RenameUndoUnit(IRenameResult renameResult)
 {
     this.renameResult = renameResult;
 }
Example #17
0
 public IFetchResult FetchWithMerge(int mergeChangesetId, bool stopOnFailMergeCommit = false, IRenameResult renameResult = null, params string[] parentCommitsHashes)
 {
     throw DerivedRemoteException;
 }
Example #18
0
 public IFetchResult Fetch(bool stopOnFailMergeCommit = false, IRenameResult renameResult = null)
 {
     return FetchWithMerge(-1, stopOnFailMergeCommit, renameResult);
 }
Example #19
0
 public IGitTfsRemote InitBranch(RemoteOptions remoteOptions, string tfsRepositoryPath, int rootChangesetId, bool fetchParentBranch, string gitBranchNameExpected = null, IRenameResult renameResult = null)
 {
     return InitTfsBranch(remoteOptions, tfsRepositoryPath, rootChangesetId, fetchParentBranch, gitBranchNameExpected, renameResult);
 }
Example #20
0
        private IGitTfsRemote FindOrInitTfsRemoteOfChangeset(int parentChangesetId, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            omittedParentBranch = null;
            IGitTfsRemote tfsRemote;
            IChangeset parentChangeset = Tfs.GetChangeset(parentChangesetId);
            //I think you want something that uses GetPathInGitRepo and ShouldSkip. See TfsChangeset.Apply.
            //Don't know if there is a way to extract remote tfs repository path from changeset datas! Should be better!!!
            var remote = Repository.ReadAllTfsRemotes().FirstOrDefault(r => parentChangeset.Changes.Any(c => r.GetPathInGitRepo(c.Item.ServerItem) != null));
            if (remote != null)
                tfsRemote = remote;
            else
            {
                var tfsPath = parentChangeset.Changes.First().Item.ServerItem;
                tfsPath = tfsPath.EndsWith("/") ? tfsPath : tfsPath + "/";
                var tfsBranch = Tfs.GetBranches(true).SingleOrDefault(b => tfsPath.StartsWith(b.Path.EndsWith("/") ? b.Path : b.Path + "/"));

                if (mergeChangeset && tfsBranch != null && Repository.GetConfig(GitTfsConstants.IgnoreNotInitBranches) == true.ToString())
                {
                    stdout.WriteLine("warning: skip not initialized branch for path " + tfsBranch.Path);
                    tfsRemote = null;
                    omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                }
                else if (tfsBranch == null)
                {
                    stdout.WriteLine("error: branch not found. Verify that all the folders have been converted to branches (or something else :().\n\tpath {0}", tfsPath);
                    tfsRemote = null;
                    omittedParentBranch = ";C" + parentChangesetId;
                }
                else
                {
                    tfsRemote = InitTfsRemoteOfChangeset(tfsBranch, parentChangeset.ChangesetId, renameResult);
                    if (tfsRemote == null)
                        omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                }
            }
            return tfsRemote;
        }
Example #21
0
        private IGitTfsRemote InitTfsBranch(RemoteOptions remoteOptions, string tfsRepositoryPath, int rootChangesetId = -1, bool fetchParentBranch = false, string gitBranchNameExpected = null, IRenameResult renameResult = null)
        {
            Trace.WriteLine("Begin process of creating branch for remote :" + tfsRepositoryPath);
            // TFS string representations of repository paths do not end in trailing slashes
            tfsRepositoryPath = (tfsRepositoryPath ?? string.Empty).TrimEnd('/');

            string gitBranchName = ExtractGitBranchNameFromTfsRepositoryPath(
                string.IsNullOrWhiteSpace(gitBranchNameExpected) ? tfsRepositoryPath : gitBranchNameExpected);
            if (string.IsNullOrWhiteSpace(gitBranchName))
                throw new GitTfsException("error: The Git branch name '" + gitBranchName + "' is not valid...\n");
            Trace.WriteLine("Git local branch will be :" + gitBranchName);

            string sha1RootCommit = null;
            if (rootChangesetId != -1)
            {
                sha1RootCommit = Repository.FindCommitHashByChangesetId(rootChangesetId);
                if (fetchParentBranch && string.IsNullOrWhiteSpace(sha1RootCommit))
                    sha1RootCommit = FindRootRemoteAndFetch(rootChangesetId, renameResult);
                if (string.IsNullOrWhiteSpace(sha1RootCommit))
                    return null;

                Trace.WriteLine("Found commit " + sha1RootCommit + " for changeset :" + rootChangesetId);
            }

            IGitTfsRemote tfsRemote;
            if (Repository.HasRemote(gitBranchName))
            {
                Trace.WriteLine("Remote already exist");
                tfsRemote = Repository.ReadTfsRemote(gitBranchName);
                if (tfsRemote.TfsUrl != TfsUrl)
                    Trace.WriteLine("warning: Url is different");
                if (tfsRemote.TfsRepositoryPath != tfsRepositoryPath)
                    Trace.WriteLine("warning: TFS repository path is different");
            }
            else
            {
                Trace.WriteLine("Try creating remote...");
                tfsRemote = Repository.CreateTfsRemote(new RemoteInfo
                {
                    Id = gitBranchName,
                    Url = TfsUrl,
                    Repository = tfsRepositoryPath,
                    RemoteOptions = remoteOptions
                }, string.Empty);
            }
            if (sha1RootCommit != null && !Repository.HasRef(tfsRemote.RemoteRef))
            {
                if (!Repository.CreateBranch(tfsRemote.RemoteRef, sha1RootCommit))
                    throw new GitTfsException("error: Fail to create remote branch ref file!");
            }
            Trace.WriteLine("Remote created!");
            return tfsRemote;
        }
Example #22
0
        private string FindRemoteAndFetch(int parentChangesetId, bool stopOnFailMergeCommit, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            var tfsRemote = FindOrInitTfsRemoteOfChangeset(parentChangesetId, mergeChangeset, renameResult, out omittedParentBranch);

            if (tfsRemote != null && string.Compare(tfsRemote.TfsRepositoryPath, TfsRepositoryPath, StringComparison.InvariantCultureIgnoreCase) != 0)
            {
                stdout.WriteLine("\tFetching from dependent TFS remote '{0}'...", tfsRemote.Id);
                var fetchResult = ((GitTfsRemote)tfsRemote).FetchWithMerge(-1, stopOnFailMergeCommit, parentChangesetId, renameResult);
                return Repository.FindCommitHashByChangesetId(parentChangesetId);
            }
            return null;
        }
Example #23
0
 public IFetchResult FetchWithMerge(long mergeChangesetId, bool stopOnFailMergeCommit = false, IRenameResult renameResult = null, params string[] parentCommitsHashes)
 {
     return(FetchWithMerge(mergeChangesetId, stopOnFailMergeCommit, -1, renameResult, parentCommitsHashes));
 }
Example #24
0
        private IGitTfsRemote InitTfsRemoteOfChangeset(IBranchObject tfsBranch, int parentChangesetId, IRenameResult renameResult = null)
        {
            if (tfsBranch.IsRoot)
            {
                return InitTfsBranch(this.remoteOptions, tfsBranch.Path);
            }

            var branchesDatas = Tfs.GetRootChangesetForBranch(tfsBranch.Path, parentChangesetId);

            IGitTfsRemote remote = null;
            foreach (var branch in branchesDatas)
            {
                var rootChangesetId = branch.RootChangeset;
                remote = InitBranch(this.remoteOptions, tfsBranch.Path, rootChangesetId, true);
                if (remote == null)
                {
                    stdout.WriteLine("warning: root commit not found corresponding to changeset " + rootChangesetId);
                    stdout.WriteLine("=> continuing anyway by creating a branch without parent...");
                    return InitTfsBranch(this.remoteOptions, tfsBranch.Path);
                }

                if (branch.IsRenamedBranch)
                    remote.Fetch(renameResult:renameResult);
            }

            return remote;
        }
Example #25
0
        private string FindRootRemoteAndFetch(int parentChangesetId, IRenameResult renameResult = null)
        {
            string omittedParentBranch;

            return(FindRemoteAndFetch(parentChangesetId, false, false, renameResult, out omittedParentBranch));
        }
Example #26
0
        private IFetchResult FetchRemote(IGitTfsRemote tfsRemote, bool stopOnFailMergeCommit, bool createBranch = true, IRenameResult renameResult = null)
        {
            try
            {
                Trace.WriteLine("Try fetching changesets...");
                var fetchResult = tfsRemote.Fetch(stopOnFailMergeCommit, renameResult: renameResult);
                Trace.WriteLine("Changesets fetched!");

                if (fetchResult.IsSuccess && createBranch && tfsRemote.Id != GitTfsConstants.DefaultRepositoryId)
                {
                    Trace.WriteLine("Try creating the local branch...");
                    var branchRef = tfsRemote.Id.ToLocalGitRef();
                    if (!_globals.Repository.HasRef(branchRef))
                    {
                        if (!_globals.Repository.CreateBranch(branchRef, tfsRemote.MaxCommitHash))
                            _stdout.WriteLine("warning: Fail to create local branch ref file!");
                        else
                            Trace.WriteLine("Local branch created!");
                    }
                    else
                    {
                        _stdout.WriteLine("info: local branch ref already exists!");
                    }
                }
                return fetchResult;
            }
            finally
            {
                Trace.WriteLine("Cleaning...");
                tfsRemote.CleanupWorkspaceDirectory();
            }
        }
Example #27
0
        private IGitTfsRemote FindOrInitTfsRemoteOfChangeset(int parentChangesetId, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            omittedParentBranch = null;
            IGitTfsRemote tfsRemote;
            IChangeset    parentChangeset = Tfs.GetChangeset(parentChangesetId);
            //I think you want something that uses GetPathInGitRepo and ShouldSkip. See TfsChangeset.Apply.
            //Don't know if there is a way to extract remote tfs repository path from changeset datas! Should be better!!!
            var remote = Repository.ReadAllTfsRemotes().FirstOrDefault(r => parentChangeset.Changes.Any(c => r.GetPathInGitRepo(c.Item.ServerItem) != null));

            if (remote != null)
            {
                tfsRemote = remote;
            }
            else
            {
                // If the changeset has created multiple folders, the expected branch folder will not always be the first
                // so we scan all the changes of type folder to try to detect the first one which is a branch.
                // In most cases it will change nothing: the first folder is the good one
                IBranchObject tfsBranch   = null;
                string        tfsPath     = null;
                var           allBranches = Tfs.GetBranches(true);
                foreach (var change in parentChangeset.Changes)
                {
                    tfsPath = change.Item.ServerItem;
                    tfsPath = tfsPath.EndsWith("/") ? tfsPath : tfsPath + "/";

                    tfsBranch = allBranches.SingleOrDefault(b => tfsPath.StartsWith(b.Path.EndsWith("/") ? b.Path : b.Path + "/"));
                    if (tfsBranch != null)
                    {
                        // we found a branch, we stop here
                        break;
                    }
                }

                if (mergeChangeset && tfsBranch != null && Repository.GetConfig(GitTfsConstants.IgnoreNotInitBranches) == true.ToString())
                {
                    stdout.WriteLine("warning: skip not initialized branch for path " + tfsBranch.Path);
                    tfsRemote           = null;
                    omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                }
                else if (tfsBranch == null)
                {
                    stdout.WriteLine("error: branch not found. Verify that all the folders have been converted to branches (or something else :().\n\tpath {0}", tfsPath);
                    tfsRemote           = null;
                    omittedParentBranch = ";C" + parentChangesetId;
                }
                else
                {
                    tfsRemote = InitTfsRemoteOfChangeset(tfsBranch, parentChangeset.ChangesetId, renameResult);
                    if (tfsRemote == null)
                    {
                        omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                    }
                }
            }
            return(tfsRemote);
        }
Example #28
0
 public IFetchResult Fetch(bool stopOnFailMergeCommit = false, IRenameResult renameResult = null)
 {
     return(FetchWithMerge(-1, stopOnFailMergeCommit, renameResult));
 }
Example #29
0
 public IFetchResult Fetch(bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null)
 {
     throw DerivedRemoteException;
 }
Example #30
0
        private string FindRemoteAndFetch(int parentChangesetId, bool stopOnFailMergeCommit, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            var tfsRemote = FindOrInitTfsRemoteOfChangeset(parentChangesetId, mergeChangeset, renameResult, out omittedParentBranch);

            if (tfsRemote != null && string.Compare(tfsRemote.TfsRepositoryPath, TfsRepositoryPath, StringComparison.InvariantCultureIgnoreCase) != 0)
            {
                stdout.WriteLine("\tFetching from dependent TFS remote '{0}'...", tfsRemote.Id);
                var fetchResult = ((GitTfsRemote)tfsRemote).FetchWithMerge(-1, stopOnFailMergeCommit, parentChangesetId, renameResult);
                return(Repository.FindCommitHashByChangesetId(parentChangesetId));
            }
            return(null);
        }
Example #31
0
 public IGitTfsRemote InitBranch(RemoteOptions remoteOptions, string tfsRepositoryPath, int shaRootChangesetId, bool fetchParentBranch, string gitBranchNameExpected = null, IRenameResult renameResult = null)
 {
     throw new NotImplementedException();
 }
Example #32
0
        private IGitTfsRemote FindOrInitTfsRemoteOfChangeset(int parentChangesetId, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            omittedParentBranch = null;
            IGitTfsRemote tfsRemote;
            IChangeset    parentChangeset = Tfs.GetChangeset(parentChangesetId);
            //I think you want something that uses GetPathInGitRepo and ShouldSkip. See TfsChangeset.Apply.
            //Don't know if there is a way to extract remote tfs repository path from changeset datas! Should be better!!!
            var remote = Repository.ReadAllTfsRemotes().FirstOrDefault(r => parentChangeset.Changes.Any(c => r.GetPathInGitRepo(c.Item.ServerItem) != null));

            if (remote != null)
            {
                tfsRemote = remote;
            }
            else
            {
                var tfsPath = parentChangeset.Changes.First().Item.ServerItem;
                tfsPath = tfsPath.EndsWith("/") ? tfsPath : tfsPath + "/";
                var tfsBranch = Tfs.GetBranches(true).SingleOrDefault(b => tfsPath.StartsWith(b.Path.EndsWith("/") ? b.Path : b.Path + "/"));

                if (mergeChangeset && tfsBranch != null && Repository.GetConfig(GitTfsConstants.IgnoreNotInitBranches) == true.ToString())
                {
                    stdout.WriteLine("warning: skip not initialized branch for path " + tfsBranch.Path);
                    tfsRemote           = null;
                    omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                }
                else if (tfsBranch == null)
                {
                    stdout.WriteLine("error: branch not found. Verify that all the folders have been converted to branches (or something else :().\n\tpath {0}", tfsPath);
                    tfsRemote           = null;
                    omittedParentBranch = ";C" + parentChangesetId;
                }
                else
                {
                    tfsRemote = InitTfsRemoteOfChangeset(tfsBranch, parentChangeset.ChangesetId, renameResult);
                    if (tfsRemote == null)
                    {
                        omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                    }
                }
            }
            return(tfsRemote);
        }
Example #33
0
 public IFetchResult Fetch(bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null)
 {
     throw DerivedRemoteException;
 }
Example #34
0
        private IGitTfsRemote InitTfsRemoteOfChangeset(IBranchObject tfsBranch, int parentChangesetId, IRenameResult renameResult = null)
        {
            if (tfsBranch.IsRoot)
            {
                return(InitTfsBranch(this.remoteOptions, tfsBranch.Path));
            }

            var branchesDatas = Tfs.GetRootChangesetForBranch(tfsBranch.Path, parentChangesetId);

            IGitTfsRemote remote = null;

            foreach (var branch in branchesDatas)
            {
                var rootChangesetId = branch.RootChangeset;
                remote = InitBranch(this.remoteOptions, tfsBranch.Path, rootChangesetId, true);
                if (remote == null)
                {
                    stdout.WriteLine("warning: root commit not found corresponding to changeset " + rootChangesetId);
                    stdout.WriteLine("=> continuing anyway by creating a branch without parent...");
                    return(InitTfsBranch(this.remoteOptions, tfsBranch.Path));
                }

                if (branch.IsRenamedBranch)
                {
                    remote.Fetch(renameResult: renameResult);
                }
            }

            return(remote);
        }
Example #35
0
 public IFetchResult Fetch(bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null)
 {
     return FetchWithMerge(-1, stopOnFailMergeCommit,lastChangesetIdToFetch, renameResult);
 }
Example #36
0
        private IFetchResult FetchRemote(IGitTfsRemote tfsRemote, bool stopOnFailMergeCommit, bool createBranch = true, IRenameResult renameResult = null)
        {
            try
            {
                Trace.WriteLine("Try fetching changesets...");
                var fetchResult = tfsRemote.Fetch(stopOnFailMergeCommit, renameResult);
                Trace.WriteLine("Changesets fetched!");

                if (fetchResult.IsSuccess && createBranch && tfsRemote.Id != GitTfsConstants.DefaultRepositoryId)
                {
                    Trace.WriteLine("Try creating the local branch...");
                    var branchRef = tfsRemote.Id.ToLocalGitRef();
                    if (!_globals.Repository.HasRef(branchRef))
                    {
                        if (!_globals.Repository.CreateBranch(branchRef, tfsRemote.MaxCommitHash))
                        {
                            _stdout.WriteLine("warning: Fail to create local branch ref file!");
                        }
                        else
                        {
                            Trace.WriteLine("Local branch created!");
                        }
                    }
                    else
                    {
                        _stdout.WriteLine("info: local branch ref already exists!");
                    }
                }
                return(fetchResult);
            }
            finally
            {
                Trace.WriteLine("Cleaning...");
                tfsRemote.CleanupWorkspaceDirectory();
            }
        }
Example #37
0
        public IFetchResult FetchWithMerge(int mergeChangesetId, bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null, params string[] parentCommitsHashes)
        {
            var fetchResult = new FetchResult { IsSuccess = true, NewChangesetCount = 0 };
            var latestChangesetId = GetLatestChangesetId();
            if (lastChangesetIdToFetch != -1)
                latestChangesetId = Math.Min(latestChangesetId, lastChangesetIdToFetch);
            // TFS 2010 doesn't like when we ask for history past its last changeset.
            if (MaxChangesetId >= latestChangesetId)
                return fetchResult;
            IEnumerable<ITfsChangeset> fetchedChangesets;
            do
            {
                fetchedChangesets = FetchChangesets(true, lastChangesetIdToFetch);
                if(!fetchedChangesets.Any())
                    return fetchResult;

                var objects = BuildEntryDictionary();
                foreach (var changeset in fetchedChangesets)
                {
                    fetchResult.NewChangesetCount++;
                    if (lastChangesetIdToFetch > 0 && changeset.Summary.ChangesetId > lastChangesetIdToFetch)
                        return fetchResult;
                    string parentCommitSha = null;
                    if (changeset.IsMergeChangeset && !ProcessMergeChangeset(changeset, stopOnFailMergeCommit, ref parentCommitSha))
                    {
                        fetchResult.IsSuccess = false;
                        return fetchResult;
                    }
                    var parentSha = (renameResult != null && renameResult.IsProcessingRenameChangeset) ? renameResult.LastParentCommitBeforeRename : MaxCommitHash;
                    var isFirstCommitInRepository = (parentSha == null);
                    var log = Apply(parentSha, changeset, objects);
                    if (changeset.IsRenameChangeset && !isFirstCommitInRepository)
                    {
                        if (renameResult == null || !renameResult.IsProcessingRenameChangeset)
                        {
                            fetchResult.IsProcessingRenameChangeset = true;
                            fetchResult.LastParentCommitBeforeRename = MaxCommitHash;
                            return fetchResult;
                        }
                        renameResult.IsProcessingRenameChangeset = false;
                        renameResult.LastParentCommitBeforeRename = null;
                    }
                    if (parentCommitSha != null)
                        log.CommitParents.Add(parentCommitSha);
                    if (changeset.Summary.ChangesetId == mergeChangesetId)
                    {
                        foreach (var parent in parentCommitsHashes)
                            log.CommitParents.Add(parent);
                    }
                    var commitSha = ProcessChangeset(changeset, log);
                    fetchResult.LastFetchedChangesetId = changeset.Summary.ChangesetId;
                    // set commit sha for added git objects
                    foreach (var commit in objects)
                    {
                        if (commit.Value.Commit == null)
                            commit.Value.Commit = commitSha;
                    }
                    DoGcIfNeeded();
                }
            } while (fetchedChangesets.Any() && latestChangesetId > fetchResult.LastFetchedChangesetId);
            return fetchResult;
        }
Example #38
0
 public IGitTfsRemote InitBranch(RemoteOptions remoteOptions, string tfsRepositoryPath, long rootChangesetId, bool fetchParentBranch, string gitBranchNameExpected = null, IRenameResult renameResult = null)
 {
     return(InitTfsBranch(remoteOptions, tfsRepositoryPath, rootChangesetId, fetchParentBranch, gitBranchNameExpected, renameResult));
 }
Example #39
0
        private IGitTfsRemote FindOrInitTfsRemoteOfChangeset(int parentChangesetId, bool mergeChangeset, IRenameResult renameResult, out string omittedParentBranch)
        {
            omittedParentBranch = null;
            IGitTfsRemote tfsRemote;
            IChangeset parentChangeset = Tfs.GetChangeset(parentChangesetId);
            //I think you want something that uses GetPathInGitRepo and ShouldSkip. See TfsChangeset.Apply.
            //Don't know if there is a way to extract remote tfs repository path from changeset datas! Should be better!!!
            var remote = Repository.ReadAllTfsRemotes().FirstOrDefault(r => parentChangeset.Changes.Any(c => r.GetPathInGitRepo(c.Item.ServerItem) != null));
            if (remote != null)
                tfsRemote = remote;
            else
            {
                // If the changeset has created multiple folders, the expected branch folder will not always be the first
                // so we scan all the changes of type folder to try to detect the first one which is a branch.
                // In most cases it will change nothing: the first folder is the good one
                IBranchObject tfsBranch = null;
                string tfsPath = null;
                var allBranches = Tfs.GetBranches(true);
                foreach (var change in parentChangeset.Changes)
                {
                    tfsPath = change.Item.ServerItem;
                    tfsPath = tfsPath.EndsWith("/") ? tfsPath : tfsPath + "/";

                    tfsBranch = allBranches.SingleOrDefault(b => tfsPath.StartsWith(b.Path.EndsWith("/") ? b.Path : b.Path + "/"));
                    if(tfsBranch != null)
                    {
                        // we found a branch, we stop here
                        break;
                    }
                }

                if (mergeChangeset && tfsBranch != null && Repository.GetConfig(GitTfsConstants.IgnoreNotInitBranches) == true.ToString())
                {
                    stdout.WriteLine("warning: skip not initialized branch for path " + tfsBranch.Path);
                    tfsRemote = null;
                    omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                }
                else if (tfsBranch == null)
                {
                    stdout.WriteLine("error: branch not found. Verify that all the folders have been converted to branches (or something else :().\n\tpath {0}", tfsPath);
                    tfsRemote = null;
                    omittedParentBranch = ";C" + parentChangesetId;
                }
                else
                {
                    tfsRemote = InitTfsRemoteOfChangeset(tfsBranch, parentChangeset.ChangesetId, renameResult);
                    if (tfsRemote == null)
                        omittedParentBranch = tfsBranch.Path + ";C" + parentChangesetId;
                }
            }
            return tfsRemote;
        }
Example #40
0
        private IGitTfsRemote InitTfsBranch(RemoteOptions remoteOptions, string tfsRepositoryPath, long rootChangesetId = -1, bool fetchParentBranch = false, string gitBranchNameExpected = null, IRenameResult renameResult = null)
        {
            Trace.WriteLine("Begin process of creating branch for remote :" + tfsRepositoryPath);
            // TFS string representations of repository paths do not end in trailing slashes
            tfsRepositoryPath = (tfsRepositoryPath ?? string.Empty).TrimEnd('/');

            string gitBranchName = ExtractGitBranchNameFromTfsRepositoryPath(
                string.IsNullOrWhiteSpace(gitBranchNameExpected) ? tfsRepositoryPath : gitBranchNameExpected);

            if (string.IsNullOrWhiteSpace(gitBranchName))
            {
                throw new GitTfsException("error: The Git branch name '" + gitBranchName + "' is not valid...\n");
            }
            Trace.WriteLine("Git local branch will be :" + gitBranchName);

            string sha1RootCommit = null;

            if (rootChangesetId != -1)
            {
                sha1RootCommit = Repository.FindCommitHashByChangesetId(rootChangesetId);
                if (fetchParentBranch && string.IsNullOrWhiteSpace(sha1RootCommit))
                {
                    sha1RootCommit = FindRootRemoteAndFetch((int)rootChangesetId, renameResult);
                }
                if (string.IsNullOrWhiteSpace(sha1RootCommit))
                {
                    return(null);
                }

                Trace.WriteLine("Found commit " + sha1RootCommit + " for changeset :" + rootChangesetId);
            }

            IGitTfsRemote tfsRemote;

            if (Repository.HasRemote(gitBranchName))
            {
                Trace.WriteLine("Remote already exist");
                tfsRemote = Repository.ReadTfsRemote(gitBranchName);
                if (tfsRemote.TfsUrl != TfsUrl)
                {
                    Trace.WriteLine("warning: Url is different");
                }
                if (tfsRemote.TfsRepositoryPath != tfsRepositoryPath)
                {
                    Trace.WriteLine("warning: TFS repository path is different");
                }
            }
            else
            {
                Trace.WriteLine("Try creating remote...");
                tfsRemote = Repository.CreateTfsRemote(new RemoteInfo
                {
                    Id            = gitBranchName,
                    Url           = TfsUrl,
                    Repository    = tfsRepositoryPath,
                    RemoteOptions = remoteOptions
                }, string.Empty);
            }
            if (sha1RootCommit != null && !Repository.HasRef(tfsRemote.RemoteRef))
            {
                if (!Repository.CreateBranch(tfsRemote.RemoteRef, sha1RootCommit))
                {
                    throw new GitTfsException("error: Fail to create remote branch ref file!");
                }
            }
            Trace.WriteLine("Remote created!");
            return(tfsRemote);
        }
Example #41
0
 private string FindRootRemoteAndFetch(int parentChangesetId, IRenameResult renameResult = null)
 {
     string omittedParentBranch;
     return FindRemoteAndFetch(parentChangesetId, false, false, renameResult, out omittedParentBranch);
 }
Example #42
0
 public IFetchResult Fetch(bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null)
 {
     return(FetchWithMerge(-1, stopOnFailMergeCommit, lastChangesetIdToFetch, renameResult));
 }
Example #43
0
        private IGitTfsRemote InitTfsRemoteOfChangeset(IBranchObject tfsBranch, int parentChangesetId, IRenameResult renameResult = null)
        {
            if (tfsBranch.IsRoot)
            {
                return InitTfsBranch(this.remoteOptions, tfsBranch.Path);
            }

            var branchesDatas = Tfs.GetRootChangesetForBranch(tfsBranch.Path, parentChangesetId);

            IGitTfsRemote remote = null;
            foreach (var branch in branchesDatas)
            {
                var rootChangesetId = branch.RootChangeset;
                remote = InitBranch(this.remoteOptions, tfsBranch.Path, rootChangesetId, true);
                if (remote == null)
                {
                    stdout.WriteLine("warning: root commit not found corresponding to changeset " + rootChangesetId);
                    stdout.WriteLine("=> continuing anyway by creating a branch without parent...");
                    return InitTfsBranch(this.remoteOptions, tfsBranch.Path);
                }

                if (branch.IsRenamedBranch)
                {
                    try
                    {
                        remote.Fetch(renameResult: renameResult);
                    }
                    finally
                    {
                        Trace.WriteLine("Cleaning...");
                        remote.CleanupWorkspaceDirectory();

                        if (remote.Repository.IsBare)
                            remote.Repository.UpdateRef(GitRepository.ShortToLocalName(remote.Id), remote.MaxCommitHash);
                    }
                }
            }

            return remote;
        }
 public IFetchResult Fetch(bool stopOnFailMergeCommit = false, IRenameResult renameResult = null)
 {
     throw DerivedRemoteException;
 }