Index: RepositoryBrowser.cpp
===================================================================
--- RepositoryBrowser.cpp	(revision 13765)
+++ RepositoryBrowser.cpp	(working copy)
@@ -49,6 +49,8 @@
 #include "XPTheme.h"
 
 
+// tags\1.2.3.4 to branches\1.2 & checkout (JIM-59)
+#define ID_MAKE_BRANCH		99
 enum RepoBrowserContextMenuCommands
 {
 	// needs to start with 1, since 0 is the return value if *nothing* is clicked on in the context menu
@@ -989,12 +991,20 @@
 
 		hNewItem = m_RepoTree.InsertItem(&tvinsert);
 		sTemp.ReleaseBuffer();
-		m_RepoTree.SortChildren(hNewItem);
+
 		return hNewItem;
 	}
 	return NULL;
 }
 
+int CALLBACK TreeNumericCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
+{
+    CItem *pItem1 = (CItem *)lParam1;
+    CItem *pItem2 = (CItem *)lParam2;
+
+    return (pItem1 && pItem2) ? CStringUtils::CompareNumerical(pItem1->path, pItem2->path) : 0;
+}
+
 bool CRepositoryBrowser::RefreshNode(const CString& url, bool force /* = false*/, bool recursive /* = false*/)
 {
 	HTREEITEM hNode = FindUrl(url);
@@ -1047,6 +1057,15 @@
 	{
 		FillList(&pTreeItem->children);
 	}
+
+    if(pTreeItem->has_child_folders)
+    {
+        TVSORTCB tvs;
+        tvs.hParent = hNode;
+        tvs.lpfnCompare = TreeNumericCompareProc;
+        tvs.lParam = (LPARAM)&m_RepoTree;
+        m_RepoTree.SortChildrenCB(&tvs);
+    }
 	return true;
 }
 
@@ -2044,6 +2063,11 @@
 		}
 		if (urlList.GetCount() == 1)
 		{
+			if (nFolders==1)
+			{
+                    temp = _T("Make branch...");
+                    popup.AppendMenu(MF_STRING | MF_ENABLED, ID_MAKE_BRANCH, temp);		// "Make branch"
+			}
 			if (nFolders)
 			{
 				temp.LoadString(IDS_REPOBROWSE_REFRESH);
@@ -2373,6 +2397,67 @@
 				CAppUtils::LaunchApplication(sCmd, NULL, false);
 			}
 			break;
+            case ID_MAKE_BRANCH:
+                {
+                    // tags\1.2.3.4 to branches\1.2 & checkout (JIM-59)
+                    CString url = urlList[0].GetSVNPathString();
+                    int tPos = url.Find(_T("/tags/"));
+                    if(tPos>0)
+                    {
+                        CString burl = url.Left(tPos) + _T("/branches/");
+                        tPos+=6;
+                        int tPos2=url.Find(_T('.'), tPos);
+                        if(tPos2>tPos) 
+                        {
+                            tPos2=url.Find(_T('.'), tPos2+1);
+                            if(tPos2>tPos)
+                            {
+                                CString br=url.Mid(tPos, tPos2-tPos);
+                                burl+=br;
+                                if(CMessageBox::Show(this->m_hWnd, _T("Copy ") + url + _T(" to ") + burl, _T("TortoiseSVN"), 
+                                    MB_ICONQUESTION | MB_YESNO) == IDYES)
+                                {
+                                    CWaitCursorEx wait_cursor;
+                                    SVN svn;
+                                    svn.SetPromptApp(&theApp);
+									if (!svn.Copy(CTSVNPathList(CTSVNPath(url)), CTSVNPath(burl), GetRevision(), GetRevision(), _T("# Auto branch")))
+                                    {
+                                        wait_cursor.Hide();
+                                        CMessageBox::Show(this->m_hWnd, svn.GetLastErrorMessage(), _T("TortoiseSVN"), MB_ICONERROR);
+                                        return;
+                                    }
+                                    if (GetRevision().IsHead())
+                                    {
+                                        RefreshNode(burl);
+                                    }
+                                    CCheckoutDlg dlg;
+                                    dlg.m_URL = burl;
+                                    ::PathCanonicalize(dlg.m_strCheckoutDirectory.GetBuffer(MAX_PATH), m_path.GetWinPathString() + _T("\\..\\branches\\") + br);
+                                    dlg.m_strCheckoutDirectory.ReleaseBuffer();
+                                    dlg.Revision = GetRevision();
+                                    if (dlg.DoModal()==IDOK)
+                                    {
+                                        CreateDirectory(dlg.m_strCheckoutDirectory, NULL);
+                                        CTSVNPath checkoutDirectory;
+                                        checkoutDirectory.SetFromWin(dlg.m_strCheckoutDirectory, true);
+
+                                        CSVNProgressDlg progDlg;
+                                        int opts = (dlg.m_depth == svn_depth_infinity) ? ProgOptRecursive : ProgOptNonRecursive;
+                                        if (dlg.m_bNoExternals)
+                                            opts |= ProgOptIgnoreExternals;
+                                        progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Checkout);
+                                        progDlg.SetOptions(opts);
+                                        progDlg.SetPathList(CTSVNPathList(checkoutDirectory));
+                                        progDlg.SetRevision(dlg.Revision);
+                                        progDlg.SetUrl(dlg.m_URL); //, _T("")
+                                        progDlg.DoModal();
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                break;
 		case ID_EXPORT:
 			{
 				CExportDlg dlg;


