/// <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; } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); } }
public IFetchResult FetchWithMerge(int mergeChangesetId, bool stopOnFailMergeCommit = false, IRenameResult renameResult = null, params string[] parentCommitsHashes) { throw DerivedRemoteException; }
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); }
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); }
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); }
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; }
public IFetchResult FetchWithMerge(int mergeChangesetId, bool stopOnFailMergeCommit = false, IRenameResult renameResult = null, params string[] parentCommitsHashes) { return FetchWithMerge(mergeChangesetId, stopOnFailMergeCommit, -1, renameResult, parentCommitsHashes); }
/// <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; } }
/// <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); } }
public IGitTfsRemote InitBranch(RemoteOptions remoteOptions, string tfsRepositoryPath, int shaRootChangesetId, bool fetchParentBranch, string gitBranchNameExpected = null, IRenameResult renameResult = null) { throw new NotImplementedException(); }
/// <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; }
public IFetchResult Fetch(bool stopOnFailMergeCommit = false, IRenameResult renameResult = null) { return FetchWithMerge(-1, stopOnFailMergeCommit, renameResult); }
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); }
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; }
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; }
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; }
public IFetchResult FetchWithMerge(long mergeChangesetId, bool stopOnFailMergeCommit = false, IRenameResult renameResult = null, params string[] parentCommitsHashes) { return(FetchWithMerge(mergeChangesetId, stopOnFailMergeCommit, -1, renameResult, parentCommitsHashes)); }
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; }
private string FindRootRemoteAndFetch(int parentChangesetId, IRenameResult renameResult = null) { string omittedParentBranch; return(FindRemoteAndFetch(parentChangesetId, false, false, renameResult, out omittedParentBranch)); }
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(); } }
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); }
public IFetchResult Fetch(bool stopOnFailMergeCommit = false, IRenameResult renameResult = null) { return(FetchWithMerge(-1, stopOnFailMergeCommit, renameResult)); }
public IFetchResult Fetch(bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null) { throw DerivedRemoteException; }
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); }
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); }
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); }
public IFetchResult Fetch(bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null) { return FetchWithMerge(-1, stopOnFailMergeCommit,lastChangesetIdToFetch, renameResult); }
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(); } }
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; }
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)); }
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; }
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); }
private string FindRootRemoteAndFetch(int parentChangesetId, IRenameResult renameResult = null) { string omittedParentBranch; return FindRemoteAndFetch(parentChangesetId, false, false, renameResult, out omittedParentBranch); }
public IFetchResult Fetch(bool stopOnFailMergeCommit = false, int lastChangesetIdToFetch = -1, IRenameResult renameResult = null) { return(FetchWithMerge(-1, stopOnFailMergeCommit, lastChangesetIdToFetch, renameResult)); }
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; }