X-Git-Url: http://git.sourceforge.jp/view?p=tortoisegit%2FTortoiseGitJp.git;a=blobdiff_plain;f=src%2FTortoiseShell%2FContextMenu.cpp;h=5f819b6abadc1b4785596be252201d25ffc05e2d;hp=204d8ca30c58479090a47d92cea17fcba7ca6dc6;hb=703f1ff224b15857e804497c62a346371d1264a8;hpb=7871739bd2587ecd83af72ab337d0ccdfcaf89a4;ds=sidebyside diff --git a/src/TortoiseShell/ContextMenu.cpp b/src/TortoiseShell/ContextMenu.cpp index 204d8ca..5f819b6 100644 --- a/src/TortoiseShell/ContextMenu.cpp +++ b/src/TortoiseShell/ContextMenu.cpp @@ -35,10 +35,14 @@ CShellExt::MenuInfo CShellExt::menuInfo[] = { ShellMenuClone, MENUCLONE, IDI_CLONE, IDS_MENUCLONE, IDS_MENUDESCCHECKOUT, ITEMIS_FOLDER, ITEMIS_INSVN|ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0, 0 }, - { ShellMenuPull, MENUPULL, IDI_PULL, IDS_MENUPULL, - ITEMIS_INSVN, ITEMIS_INSVN, ITEMIS_FOLDERINSVN, 0,0,0, 0,0,0}, - { ShellMenuPush, MENUPUSH, IDI_PUSH, IDS_MENUPUSH, - ITEMIS_INSVN, ITEMIS_INSVN, ITEMIS_FOLDERINSVN, 0,0,0, 0,0,0}, + { ShellMenuPull, MENUPULL, IDI_PULL, IDS_MENUPULL, IDS_MENUPULL, + ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, + + { ShellMenuFetch, MENUFETCH, IDI_PULL, IDS_MENUFETCH, IDS_MENUFETCH, + ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, + + { ShellMenuPush, MENUPUSH, IDI_PUSH, IDS_MENUPUSH, IDS_MENUPULL, + ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, // { ShellMenuCheckout, MENUCHECKOUT, IDI_CHECKOUT, IDS_MENUCHECKOUT, IDS_MENUDESCCHECKOUT, // ITEMIS_FOLDER, ITEMIS_INSVN|ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0, 0 }, @@ -69,6 +73,9 @@ CShellExt::MenuInfo CShellExt::menuInfo[] = { ShellMenuShowChanged, MENUSHOWCHANGED, IDI_SHOWCHANGED, IDS_MENUSHOWCHANGED, IDS_MENUDESCSHOWCHANGED, ITEMIS_INSVN|ITEMIS_ONLYONE, 0, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0}, + { ShellMenuRebase, MENUREBASE, IDI_SHOWCHANGED, IDS_MENUREBASE, IDS_MENUREBASE, + ITEMIS_INSVN|ITEMIS_ONLYONE, 0, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0}, + // { ShellMenuRevisionGraph, MENUREVISIONGRAPH, IDI_REVISIONGRAPH, IDS_MENUREVISIONGRAPH, IDS_MENUDESCREVISIONGRAPH, // ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, 0, 0, 0, 0}, @@ -77,8 +84,8 @@ CShellExt::MenuInfo CShellExt::menuInfo[] = { ShellMenuConflictEditor, MENUCONFLICTEDITOR, IDI_CONFLICT, IDS_MENUCONFLICT, IDS_MENUDESCCONFLICT, ITEMIS_INSVN|ITEMIS_CONFLICTED, ITEMIS_FOLDER, 0, 0, 0, 0, 0, 0 }, -// { ShellMenuResolve, MENURESOLVE, IDI_RESOLVE, IDS_MENURESOLVE, IDS_MENUDESCRESOLVE, -// ITEMIS_INSVN|ITEMIS_CONFLICTED, 0, ITEMIS_INSVN|ITEMIS_FOLDER, 0, ITEMIS_FOLDERINSVN, 0, 0, 0 }, + { ShellMenuResolve, MENURESOLVE, IDI_RESOLVE, IDS_MENURESOLVE, IDS_MENUDESCRESOLVE, + ITEMIS_INSVN|ITEMIS_CONFLICTED, 0, ITEMIS_INSVN|ITEMIS_FOLDER, 0, ITEMIS_FOLDERINSVN, 0, 0, 0 }, // { ShellMenuUpdateExt, MENUUPDATEEXT, IDI_UPDATE, IDS_MENUUPDATEEXT, IDS_MENUDESCUPDATEEXT, // ITEMIS_INSVN, ITEMIS_ADDED, ITEMIS_FOLDERINSVN, ITEMIS_ADDED, 0, 0, 0, 0 }, @@ -118,16 +125,21 @@ CShellExt::MenuInfo CShellExt::menuInfo[] = // { ShellMenuCopy, MENUCOPY, IDI_COPY, IDS_MENUBRANCH, IDS_MENUDESCCOPY, // ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 }, -// { ShellMenuSwitch, MENUSWITCH, IDI_SWITCH, IDS_MENUSWITCH, IDS_MENUDESCSWITCH, -// ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 }, + { ShellMenuSwitch, MENUSWITCH, IDI_SWITCH, IDS_MENUSWITCH, IDS_MENUDESCSWITCH, + ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 }, { ShellMenuMerge, MENUMERGE, IDI_MERGE, IDS_MENUMERGE, IDS_MENUDESCMERGE, ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 }, { ShellMenuMergeAll, MENUMERGEALL, IDI_MERGE, IDS_MENUMERGEALL, IDS_MENUDESCMERGEALL, ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 0, 0, 0, 0, 0 }, + { ShellMenuBranch, MENUCOPY, IDI_COPY, IDS_MENUBRANCH, IDS_MENUDESCCOPY, + ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, + { ShellMenuTag, MENUTAG, IDI_TAG, IDS_MENUTAG, IDS_MENUDESCCOPY, + ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, + { ShellMenuExport, MENUEXPORT, IDI_EXPORT, IDS_MENUEXPORT, IDS_MENUDESCEXPORT, - ITEMIS_INSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0, 0, 0 }, + ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, // { ShellMenuRelocate, MENURELOCATE, IDI_RELOCATE, IDS_MENURELOCATE, IDS_MENUDESCRELOCATE, // ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 }, @@ -147,16 +159,28 @@ CShellExt::MenuInfo CShellExt::menuInfo[] = // ITEMIS_FOLDER, ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 }, { ShellMenuBlame, MENUBLAME, IDI_BLAME, IDS_MENUBLAME, IDS_MENUDESCBLAME, - ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_FOLDER|ITEMIS_ADDED, 0, 0, 0, 0, 0, 0 }, + ITEMIS_NORMAL|ITEMIS_ONLYONE, ITEMIS_FOLDER|ITEMIS_ADDED, 0, 0, 0, 0, 0, 0 }, + // TODO: original code is ITEMIS_INSVN|ITEMIS_ONLYONE, makes sense to only allow blaming of versioned files + // why was this changed, is this related to GitStatus? -// { ShellMenuIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUIGNORE, IDS_MENUDESCIGNORE, -// ITEMIS_INVERSIONEDFOLDER, ITEMIS_IGNORED|ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 }, + { ShellMenuIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUIGNORE, IDS_MENUDESCIGNORE, + ITEMIS_INVERSIONEDFOLDER, ITEMIS_IGNORED|ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 }, -// { ShellMenuUnIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUUNIGNORE, IDS_MENUDESCUNIGNORE, -// ITEMIS_IGNORED, 0, 0, 0, 0, 0, 0, 0 }, + { ShellMenuUnIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUUNIGNORE, IDS_MENUDESCUNIGNORE, + ITEMIS_IGNORED, 0, 0, 0, 0, 0, 0, 0 }, { ShellSeparator, 0, 0, 0, 0, 0, 0, 0, 0}, +// { ShellMenuCherryPick, MENUCHERRYPICK, IDI_CREATEPATCH, IDS_MENUCHERRYPICK, IDS_MENUDESCCREATEPATCH, +// ITEMIS_INSVN, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, + + { ShellMenuFormatPatch, MENUFORMATPATCH, IDI_CREATEPATCH, IDS_MENUFORMATPATCH, IDS_MENUDESCCREATEPATCH, + ITEMIS_INSVN, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, + + { ShellMenuImportPatch, MENUIMPORTPATCH, IDI_PATCH, IDS_MENUIMPORTPATCH, IDS_MENUDESCCREATEPATCH, + ITEMIS_INSVN, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, + + { ShellMenuCreatePatch, MENUCREATEPATCH, IDI_CREATEPATCH, IDS_MENUCREATEPATCH, IDS_MENUDESCCREATEPATCH, ITEMIS_INSVN, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 }, @@ -289,12 +313,12 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, fetchedstatus = status; //if ((stat.status->entry)&&(stat.status->entry->lock_token)) // itemStates |= (stat.status->entry->lock_token[0] != 0) ? ITEMIS_LOCKED : 0; - //if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir)) - //{ - // itemStates |= ITEMIS_FOLDER; - // if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) - // itemStates |= ITEMIS_FOLDERINGit; - //} + if ( askedpath.IsDirectory() )//if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir)) + { + itemStates |= ITEMIS_FOLDER; + if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) + itemStates |= ITEMIS_FOLDERINSVN; + } //if ((stat.status->entry)&&(stat.status->entry->present_props)) //{ // if (strstr(stat.status->entry->present_props, "svn:needs-lock")) @@ -314,7 +338,15 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, } catch ( ... ) { - ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n")); + ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n")); + } + + // TODO: should we really assume any sub-directory to be versioned + // or only if it contains versioned files + if ( askedpath.IsDirectory() ) + { + if (askedpath.HasAdminDir()) + itemStates |= ITEMIS_INSVN; } if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) itemStates |= ITEMIS_INSVN; @@ -382,14 +414,15 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, fetchedstatus = status; //if ((stat.status->entry)&&(stat.status->entry->lock_token)) // itemStates |= (stat.status->entry->lock_token[0] != 0) ? ITEMIS_LOCKED : 0; - //if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir)) - //{ - // itemStates |= ITEMIS_FOLDER; - // if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) - // itemStates |= ITEMIS_FOLDERINGit; - //} - //if ((stat.status->entry)&&(stat.status->entry->conflict_wrk)) - // itemStates |= ITEMIS_CONFLICTED; + if ( strpath.IsDirectory() )//if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir)) + { + itemStates |= ITEMIS_FOLDER; + if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) + itemStates |= ITEMIS_FOLDERINSVN; + } + // TODO: do we need to check that it's not a dir? does conflict options makes sense for dir in git? + if (status == git_wc_status_conflicted)//if ((stat.status->entry)&&(stat.status->entry->conflict_wrk)) + itemStates |= ITEMIS_CONFLICTED; //if ((stat.status->entry)&&(stat.status->entry->present_props)) //{ // if (strstr(stat.status->entry->present_props, "svn:needs-lock")) @@ -413,9 +446,17 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, } catch ( ... ) { - ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n")); + ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n")); } } + + // TODO: should we really assume any sub-directory to be versioned + // or only if it contains versioned files + if ( strpath.IsDirectory() ) + { + if (strpath.HasAdminDir()) + itemStates |= ITEMIS_INSVN; + } if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) itemStates |= ITEMIS_INSVN; if (status == git_wc_status_ignored) @@ -449,13 +490,13 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, } } // for (int i = 0; i < count; ++i) ItemIDList child (GetPIDLItem (cida, 0), &parent); -// if (g_ShellCache.HasGitAdminDir(child.toString().c_str(), FALSE)) -// itemStates |= ITEMIS_INVERSIONEDFOLDER; + if (g_ShellCache.HasSVNAdminDir(child.toString().c_str(), FALSE)) + itemStates |= ITEMIS_INVERSIONEDFOLDER; GlobalUnlock(medium.hGlobal); // if the item is a versioned folder, check if there's a patch file // in the clipboard to be used in "Apply Patch" - UINT cFormatDiff = RegisterClipboardFormat(_T("Tgit_UNIFIEDDIFF")); + UINT cFormatDiff = RegisterClipboardFormat(_T("TGIT_UNIFIEDDIFF")); if (cFormatDiff) { if (IsClipboardFormatAvailable(cFormatDiff)) @@ -484,10 +525,13 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, git_wc_status_kind status = git_wc_status_none; if (IsClipboardFormatAvailable(CF_HDROP)) itemStatesFolder |= ITEMIS_PATHINCLIPBOARD; + + CTGitPath askedpath; + askedpath.SetFromWin(folder_.c_str()); + if ((folder_.compare(statuspath)!=0)&&(g_ShellCache.IsContextPathAllowed(folder_.c_str()))) { - CTGitPath askedpath; - askedpath.SetFromWin(folder_.c_str()); + try { GitStatus stat; @@ -504,16 +548,7 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, // } // if ((stat.status->entry)&&(stat.status->entry->uuid)) // uuidTarget = CUnicodeUtils::StdGetUnicode(stat.status->entry->uuid); - if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) - itemStatesFolder |= ITEMIS_INSVN; - if (status == git_wc_status_normal) - itemStatesFolder |= ITEMIS_NORMAL; - if (status == git_wc_status_conflicted) - itemStatesFolder |= ITEMIS_CONFLICTED; - if (status == git_wc_status_added) - itemStatesFolder |= ITEMIS_ADDED; - if (status == git_wc_status_deleted) - itemStatesFolder |= ITEMIS_DELETED; + } else { @@ -523,17 +558,31 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, if (askedpath.HasAdminDir()) status = git_wc_status_normal; } + + //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) + if (askedpath.HasAdminDir()) + itemStatesFolder |= ITEMIS_INSVN; + if (status == git_wc_status_normal) + itemStatesFolder |= ITEMIS_NORMAL; + if (status == git_wc_status_conflicted) + itemStatesFolder |= ITEMIS_CONFLICTED; + if (status == git_wc_status_added) + itemStatesFolder |= ITEMIS_ADDED; + if (status == git_wc_status_deleted) + itemStatesFolder |= ITEMIS_DELETED; + } catch ( ... ) { - ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n")); + ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n")); } } else { status = fetchedstatus; } - if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) + //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) + if (askedpath.HasAdminDir()) { itemStatesFolder |= ITEMIS_FOLDERINSVN; } @@ -558,10 +607,11 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, { folder_ = files_.front(); git_wc_status_kind status = git_wc_status_none; + CTGitPath askedpath; + askedpath.SetFromWin(folder_.c_str()); + if (folder_.compare(statuspath)!=0) - { - CTGitPath askedpath; - askedpath.SetFromWin(folder_.c_str()); + { try { GitStatus stat; @@ -582,14 +632,15 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, } catch ( ... ) { - ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n")); + ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n")); } } else { status = fetchedstatus; } - if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) + //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none)) + if (askedpath.HasAdminDir()) itemStates |= ITEMIS_FOLDERINSVN; if (status == git_wc_status_ignored) itemStates |= ITEMIS_IGNORED; @@ -756,7 +807,7 @@ bool CShellExt::WriteClipboardPathsToTempFile(stdstring& tempfile) TCHAR * path = new TCHAR[pathlength+1]; TCHAR * tempFile = new TCHAR[pathlength + 100]; GetTempPath (pathlength+1, path); - GetTempFileName (path, _T("svn"), 0, tempFile); + GetTempFileName (path, _T("git"), 0, tempFile); tempfile = stdstring(tempFile); HANDLE file = ::CreateFile (tempFile, @@ -810,7 +861,7 @@ stdstring CShellExt::WriteFileListToTempFile() TCHAR * path = new TCHAR[pathlength+1]; TCHAR * tempFile = new TCHAR[pathlength + 100]; GetTempPath (pathlength+1, path); - GetTempFileName (path, _T("svn"), 0, tempFile); + GetTempFileName (path, _T("git"), 0, tempFile); stdstring retFilePath = stdstring(tempFile); HANDLE file = ::CreateFile (tempFile, @@ -1032,10 +1083,12 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu, int menuIndex = 0; bool bAddSeparator = false; bool bMenuEntryAdded = false; + bool bMenuEmpty = true; // insert separator at start InsertMenu(hMenu, indexMenu++, MF_SEPARATOR|MF_BYPOSITION, 0, NULL); idCmd++; bool bShowIcons = !!DWORD(CRegStdWORD(_T("Software\\TortoiseGit\\ShowContextMenuIcons"), TRUE)); - if (fullver <= 0x0500) + // ?? TortoiseSVN had this as (fullver <= 0x0500) this disabled icons in win2k, but icons work fine in win2k + if (fullver < 0x0500) bShowIcons = false; while (menuInfo[menuIndex].command != ShellMenuLastEntry) { @@ -1045,7 +1098,8 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu, // another 'normal' menu entry after we insert a separator. // we simply set a flag here, indicating that before the next // 'normal' menu entry, a separator should be added. - bAddSeparator = true; + if (!bMenuEmpty) + bAddSeparator = true; } else { @@ -1118,16 +1172,12 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu, { InsertIgnoreSubmenus(idCmd, idCmdFirst, hMenu, subMenu, indexMenu, indexSubMenu, topmenu, bShowIcons); bMenuEntryAdded = true; + bMenuEmpty = false; } else { - // the 'get lock' command is special bool bIsTop = ((topmenu & menuInfo[menuIndex].menuID) != 0); - if (menuInfo[menuIndex].command == ShellMenuLock) - { - if ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop()) - bIsTop = true; - } + // insert the menu entry InsertGitMenu( bIsTop, bIsTop ? hMenu : subMenu, @@ -1139,7 +1189,10 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu, menuInfo[menuIndex].command, uFlags); if (!bIsTop) + { bMenuEntryAdded = true; + bMenuEmpty = false; + } } } } @@ -1565,6 +1618,14 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) svnCmd += folder_; svnCmd += _T("\""); break; + case ShellMenuRebase: + svnCmd += _T("rebase /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; + svnCmd += _T("\""); + break; case ShellMenuShowChanged: if (files_.size() > 1) { @@ -1612,7 +1673,7 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) { // if there's a patch file in the clipboard, we save it // to a temporary file and tell TortoiseMerge to use that one - UINT cFormat = RegisterClipboardFormat(_T("Tgit_UNIFIEDDIFF")); + UINT cFormat = RegisterClipboardFormat(_T("TGIT_UNIFIEDDIFF")); if ((cFormat)&&(OpenClipboard(NULL))) { HGLOBAL hglb = GetClipboardData(cFormat); @@ -1622,7 +1683,7 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) TCHAR * path = new TCHAR[len+1]; TCHAR * tempF = new TCHAR[len+100]; GetTempPath (len+1, path); - GetTempFileName (path, TEXT("svn"), 0, tempF); + GetTempFileName (path, TEXT("git"), 0, tempF); std::wstring sTempFile = std::wstring(tempF); delete [] path; delete [] tempF; @@ -1704,28 +1765,6 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) svnCmd += folder_; svnCmd += _T("\""); break; - case ShellMenuLock: - tempfile = WriteFileListToTempFile(); - svnCmd += _T("lock /pathfile:\""); - svnCmd += tempfile; - svnCmd += _T("\""); - svnCmd += _T(" /deletepathfile"); - break; - case ShellMenuUnlock: - tempfile = WriteFileListToTempFile(); - svnCmd += _T("unlock /pathfile:\""); - svnCmd += tempfile; - svnCmd += _T("\""); - svnCmd += _T(" /deletepathfile"); - break; - case ShellMenuUnlockForce: - tempfile = WriteFileListToTempFile(); - svnCmd += _T("unlock /pathfile:\""); - svnCmd += tempfile; - svnCmd += _T("\""); - svnCmd += _T(" /deletepathfile"); - svnCmd += _T(" /force"); - break; case ShellMenuProperties: tempfile = WriteFileListToTempFile(); svnCmd += _T("properties /pathfile:\""); @@ -1773,19 +1812,74 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) svnCmd += _T("\""); break; case ShellMenuPull: - tempfile = WriteFileListToTempFile(); - svnCmd += _T("pull /pathfile:\""); - svnCmd += tempfile; + svnCmd += _T("pull /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; svnCmd += _T("\""); - svnCmd += _T(" /deletepathfile"); break; case ShellMenuPush: - tempfile = WriteFileListToTempFile(); - svnCmd += _T("push /pathfile:\""); - svnCmd += tempfile; + svnCmd += _T("push /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; + svnCmd += _T("\""); + break; + case ShellMenuBranch: + svnCmd += _T("branch /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; + svnCmd += _T("\""); + break; + + case ShellMenuTag: + svnCmd += _T("tag /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; svnCmd += _T("\""); - svnCmd += _T(" /deletepathfile"); break; + + case ShellMenuFormatPatch: + svnCmd += _T("formatpatch /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; + svnCmd += _T("\""); + break; + + case ShellMenuImportPatch: + svnCmd += _T("importpatch /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; + svnCmd += _T("\""); + break; + + case ShellMenuCherryPick: + svnCmd += _T("cherrypick /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; + svnCmd += _T("\""); + break; + case ShellMenuFetch: + svnCmd += _T("fetch /path:\""); + if (files_.size() > 0) + svnCmd += files_.front(); + else + svnCmd += folder_; + svnCmd += _T("\""); + break; + default: break; //#endregion @@ -2039,18 +2133,6 @@ LPCTSTR CShellExt::GetMenuTextFromResource(int id) resource = MAKEINTRESOURCE(menuInfo[menuIndex].iconID); switch (id) { - case ShellMenuLock: - // menu lock is special because it can be set to the top - // with a separate option in the registry - space = ((layout & MENULOCK) || ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop())) ? 0 : 6; - if ((layout & MENULOCK) || ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop())) - { - _tcscpy_s(textbuf, 255, _T("Git ")); - _tcscat_s(textbuf, 255, stringtablebuffer); - _tcscpy_s(stringtablebuffer, 255, textbuf); - } - break; - // the sub menu entries are special because they're *always* on the top level menu case ShellSubMenuMultiple: case ShellSubMenuLink: case ShellSubMenuFolder: