/// <exception cref="NGit.Api.Errors.RefNotFoundException"> /// if the old branch can not be found (branch with provided old /// name does not exist or old name resolves to a tag) /// </exception> /// <exception cref="NGit.Api.Errors.InvalidRefNameException"> /// if the provided new name is <code>null</code> or otherwise /// invalid /// </exception> /// <exception cref="NGit.Api.Errors.RefAlreadyExistsException">if a branch with the new name already exists /// </exception> /// <exception cref="NGit.Api.Errors.DetachedHeadException"> /// if rename is tried without specifying the old name and HEAD /// is detached /// </exception> /// <exception cref="NGit.Api.Errors.GitAPIException"></exception> public override Ref Call() { CheckCallable(); if (newName == null) { throw new InvalidRefNameException(MessageFormat.Format(JGitText.Get().branchNameInvalid , "<null>")); } try { string fullOldName; string fullNewName; if (repo.GetRef(newName) != null) { throw new RefAlreadyExistsException(MessageFormat.Format(JGitText.Get().refAlreadyExists1 , newName)); } if (oldName != null) { Ref @ref = repo.GetRef(oldName); if (@ref == null) { throw new RefNotFoundException(MessageFormat.Format(JGitText.Get().refNotResolved , oldName)); } if (@ref.GetName().StartsWith(Constants.R_TAGS)) { throw new RefNotFoundException(MessageFormat.Format(JGitText.Get().renameBranchFailedBecauseTag , oldName)); } fullOldName = @ref.GetName(); } else { fullOldName = repo.GetFullBranch(); if (ObjectId.IsId(fullOldName)) { throw new DetachedHeadException(); } } if (fullOldName.StartsWith(Constants.R_REMOTES)) { fullNewName = Constants.R_REMOTES + newName; } else { fullNewName = Constants.R_HEADS + newName; } if (!Repository.IsValidRefName(fullNewName)) { throw new InvalidRefNameException(MessageFormat.Format(JGitText.Get().branchNameInvalid , fullNewName)); } RefRename rename = repo.RenameRef(fullOldName, fullNewName); RefUpdate.Result renameResult = rename.Rename(); SetCallable(false); if (RefUpdate.Result.RENAMED != renameResult) { throw new JGitInternalException(MessageFormat.Format(JGitText.Get().renameBranchUnexpectedResult , renameResult.ToString())); } if (fullNewName.StartsWith(Constants.R_HEADS)) { string shortOldName = Sharpen.Runtime.Substring(fullOldName, Constants.R_HEADS.Length ); StoredConfig repoConfig = repo.GetConfig(); // Copy all configuration values over to the new branch foreach (string name in repoConfig.GetNames(ConfigConstants.CONFIG_BRANCH_SECTION , shortOldName)) { string[] values = repoConfig.GetStringList(ConfigConstants.CONFIG_BRANCH_SECTION, shortOldName, name); if (values.Length == 0) { continue; } // Keep any existing values already configured for the // new branch name string[] existing = repoConfig.GetStringList(ConfigConstants.CONFIG_BRANCH_SECTION , newName, name); if (existing.Length > 0) { string[] newValues = new string[values.Length + existing.Length]; System.Array.Copy(existing, 0, newValues, 0, existing.Length); System.Array.Copy(values, 0, newValues, existing.Length, values.Length); values = newValues; } repoConfig.SetStringList(ConfigConstants.CONFIG_BRANCH_SECTION, newName, name, Arrays .AsList(values)); } repoConfig.UnsetSection(ConfigConstants.CONFIG_BRANCH_SECTION, shortOldName); repoConfig.Save(); } Ref resultRef = repo.GetRef(newName); if (resultRef == null) { throw new JGitInternalException(JGitText.Get().renameBranchFailedUnknownReason); } return(resultRef); } catch (IOException ioe) { throw new JGitInternalException(ioe.Message, ioe); } }