{ ShellMenuClone, MENUCLONE, IDI_CLONE, IDS_MENUCLONE, IDS_MENUDESCCHECKOUT,\r
ITEMIS_FOLDER, ITEMIS_INSVN|ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0, 0 },\r
\r
- { ShellMenuPull, MENUPULL, IDI_PULL, IDS_MENUPULL,\r
+ { ShellMenuPull, MENUPULL, IDI_PULL, IDS_MENUPULL, IDS_MENUPULL,\r
ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
- { ShellMenuPush, MENUPUSH, IDI_PUSH, IDS_MENUPUSH,\r
+\r
+ { ShellMenuFetch, MENUFETCH, IDI_PULL, IDS_MENUFETCH, IDS_MENUFETCH,\r
+ ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+\r
+ { ShellMenuPush, MENUPUSH, IDI_PUSH, IDS_MENUPUSH, IDS_MENUPULL,\r
ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
\r
// { ShellMenuCheckout, MENUCHECKOUT, IDI_CHECKOUT, IDS_MENUCHECKOUT, IDS_MENUDESCCHECKOUT,\r
// ITEMIS_FOLDER, ITEMIS_INSVN|ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0, 0 },\r
\r
-// { ShellMenuUpdate, MENUUPDATE, IDI_UPDATE, IDS_MENUUPDATE, IDS_MENUDESCUPDATE, \r
-// ITEMIS_INSVN, ITEMIS_ADDED, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+// { ShellMenuUpdate, MENUSUBUPDATE, IDI_UPDATE, IDS_MENUUPDATE, IDS_MENUDESCUPDATE, \r
+// ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+\r
\r
{ ShellMenuCommit, MENUCOMMIT, IDI_COMMIT, IDS_MENUCOMMIT, IDS_MENUDESCCOMMIT,\r
ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
{ ShellMenuLog, MENULOG, IDI_LOG, IDS_MENULOG, IDS_MENUDESCLOG,\r
ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, 0, 0 },\r
\r
+ { ShellMenuRefLog, MENUREFLOG, IDI_LOG, IDS_MENUREFLOG, IDS_MENUDESCREFLOG,\r
+ ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, ITEMIS_ADDED, ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, ITEMIS_ADDED, 0, 0 },\r
+\r
// { ShellMenuRepoBrowse, MENUREPOBROWSE, IDI_REPOBROWSE, IDS_MENUREPOBROWSE, IDS_MENUDESCREPOBROWSE,\r
// ITEMIS_ONLYONE, 0, ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 },\r
\r
{ ShellMenuShowChanged, MENUSHOWCHANGED, IDI_SHOWCHANGED, IDS_MENUSHOWCHANGED, IDS_MENUDESCSHOWCHANGED,\r
ITEMIS_INSVN|ITEMIS_ONLYONE, 0, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0},\r
\r
+ { ShellMenuRebase, MENUREBASE, IDI_REBASE, IDS_MENUREBASE, IDS_MENUREBASE,\r
+ ITEMIS_INSVN|ITEMIS_ONLYONE, 0, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0},\r
+\r
// { ShellMenuRevisionGraph, MENUREVISIONGRAPH, IDI_REVISIONGRAPH, IDS_MENUREVISIONGRAPH, IDS_MENUDESCREVISIONGRAPH,\r
// ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, 0, 0, 0, 0},\r
\r
+ { ShellMenuStashSave, MENUSTASHSAVE, IDI_COMMIT, IDS_MENUSTASHSAVE, IDS_MENUSTASHSAVE,\r
+ ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+ { ShellMenuStashApply, MENUSTASHAPPLY, IDI_RELOCATE, IDS_MENUSTASHAPPLY, IDS_MENUSTASHAPPLY,\r
+ ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+ { ShellMenuStashList, MENUSTASHAPPLY, IDI_LOG, IDS_MENUSTASHLIST, IDS_MENUSTASHLIST,\r
+ ITEMIS_INSVN|ITEMIS_EXTENDED, 0, ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED, 0, 0, 0, 0, 0 },\r
+\r
+\r
{ ShellSeparator, 0, 0, 0, 0, 0, 0, 0, 0},\r
\r
{ ShellMenuConflictEditor, MENUCONFLICTEDITOR, IDI_CONFLICT, IDS_MENUCONFLICT, IDS_MENUDESCCONFLICT,\r
ITEMIS_INSVN|ITEMIS_CONFLICTED, ITEMIS_FOLDER, 0, 0, 0, 0, 0, 0 },\r
\r
-// { ShellMenuResolve, MENURESOLVE, IDI_RESOLVE, IDS_MENURESOLVE, IDS_MENUDESCRESOLVE,\r
-// ITEMIS_INSVN|ITEMIS_CONFLICTED, 0, ITEMIS_INSVN|ITEMIS_FOLDER, 0, ITEMIS_FOLDERINSVN, 0, 0, 0 },\r
+ { ShellMenuResolve, MENURESOLVE, IDI_RESOLVE, IDS_MENURESOLVE, IDS_MENUDESCRESOLVE,\r
+ ITEMIS_INSVN|ITEMIS_CONFLICTED, 0, ITEMIS_INSVN|ITEMIS_FOLDER, 0, ITEMIS_FOLDERINSVN, 0, 0, 0 },\r
\r
-// { ShellMenuUpdateExt, MENUUPDATEEXT, IDI_UPDATE, IDS_MENUUPDATEEXT, IDS_MENUDESCUPDATEEXT,\r
-// ITEMIS_INSVN, ITEMIS_ADDED, ITEMIS_FOLDERINSVN, ITEMIS_ADDED, 0, 0, 0, 0 },\r
\r
{ ShellMenuRename, MENURENAME, IDI_RENAME, IDS_MENURENAME, IDS_MENUDESCRENAME,\r
ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_INVERSIONEDFOLDER, 0, 0, 0, 0, 0, 0, 0 },\r
\r
{ ShellMenuMerge, MENUMERGE, IDI_MERGE, IDS_MENUMERGE, IDS_MENUDESCMERGE,\r
ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 },\r
- { ShellMenuMergeAll, MENUMERGEALL, IDI_MERGE, IDS_MENUMERGEALL, IDS_MENUDESCMERGEALL,\r
- ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 0, 0, 0, 0, 0 },\r
+// { ShellMenuMergeAll, MENUMERGEALL, IDI_MERGE, IDS_MENUMERGEALL, IDS_MENUDESCMERGEALL,\r
+// ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, ITEMIS_ADDED, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 0, 0, 0, 0, 0 },\r
+\r
+ { ShellMenuBranch, MENUCOPY, IDI_COPY, IDS_MENUBRANCH, IDS_MENUDESCCOPY,\r
+ ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+ { ShellMenuTag, MENUTAG, IDI_TAG, IDS_MENUTAG, IDS_MENUDESCCOPY,\r
+ ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
\r
{ ShellMenuExport, MENUEXPORT, IDI_EXPORT, IDS_MENUEXPORT, IDS_MENUDESCEXPORT,\r
- ITEMIS_INSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0, 0, 0 },\r
+ ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
\r
// { ShellMenuRelocate, MENURELOCATE, IDI_RELOCATE, IDS_MENURELOCATE, IDS_MENUDESCRELOCATE,\r
// ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 0, 0, 0, 0, 0 },\r
// ITEMIS_FOLDER, ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 },\r
\r
{ ShellMenuBlame, MENUBLAME, IDI_BLAME, IDS_MENUBLAME, IDS_MENUDESCBLAME,\r
- ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_FOLDER|ITEMIS_ADDED, 0, 0, 0, 0, 0, 0 },\r
+ ITEMIS_NORMAL|ITEMIS_ONLYONE, ITEMIS_FOLDER|ITEMIS_ADDED, 0, 0, 0, 0, 0, 0 },\r
+ // TODO: original code is ITEMIS_INSVN|ITEMIS_ONLYONE, makes sense to only allow blaming of versioned files\r
+ // why was this changed, is this related to GitStatus?\r
\r
-// { ShellMenuIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUIGNORE, IDS_MENUDESCIGNORE,\r
-// ITEMIS_INVERSIONEDFOLDER, ITEMIS_IGNORED|ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 },\r
+ { ShellMenuIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUIGNORE, IDS_MENUDESCIGNORE,\r
+ ITEMIS_INVERSIONEDFOLDER, ITEMIS_IGNORED|ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 },\r
\r
-// { ShellMenuUnIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUUNIGNORE, IDS_MENUDESCUNIGNORE,\r
-// ITEMIS_IGNORED, 0, 0, 0, 0, 0, 0, 0 },\r
+ { ShellMenuUnIgnoreSub, MENUIGNORE, IDI_IGNORE, IDS_MENUUNIGNORE, IDS_MENUDESCUNIGNORE,\r
+ ITEMIS_IGNORED, 0, 0, 0, 0, 0, 0, 0 },\r
\r
{ ShellSeparator, 0, 0, 0, 0, 0, 0, 0, 0},\r
\r
- { ShellMenuCreatePatch, MENUCREATEPATCH, IDI_CREATEPATCH, IDS_MENUCREATEPATCH, IDS_MENUDESCCREATEPATCH,\r
+ { ShellMenuSubAdd, MENUSUBADD, IDI_ADD, IDS_MENUSUBADD, IDS_MENUSUBADD,\r
+ ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+\r
+ { ShellMenuUpdateExt, MENUUPDATEEXT, IDI_UPDATE, IDS_MENUUPDATEEXT, IDS_MENUDESCUPDATEEXT,\r
+ ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_SUBMODULE, 0, 0, 0, 0, 0, 0, 0 },\r
+\r
+ { ShellMenuSubSync, MENUSUBSYNC, IDI_MENUSYNC, IDS_MENUSUBSYNC, IDS_MENUSUBSYNC,\r
+ ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_SUBMODULE|ITEMIS_EXTENDED, 0, 0, 0, 0, 0, 0, 0 },\r
+\r
+\r
+\r
+ { ShellSeparator, 0, 0, 0, 0, 0, 0, 0, 0},\r
+\r
+// { ShellMenuCherryPick, MENUCHERRYPICK, IDI_CREATEPATCH, IDS_MENUCHERRYPICK, IDS_MENUDESCCREATEPATCH,\r
+// ITEMIS_INSVN, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+\r
+ { ShellMenuFormatPatch, MENUFORMATPATCH, IDI_CREATEPATCH, IDS_MENUFORMATPATCH, IDS_MENUDESCCREATEPATCH,\r
ITEMIS_INSVN, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
\r
+ { ShellMenuImportPatch, MENUIMPORTPATCH, IDI_PATCH, IDS_MENUIMPORTPATCH, IDS_MENUDESCCREATEPATCH,\r
+ ITEMIS_INSVN, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN, 0, ITEMIS_PATCHFILE, 0, 0, 0 },\r
+\r
+\r
+ { ShellMenuCreatePatch, MENUCREATEPATCH, IDI_CREATEPATCH, IDS_MENUCREATEPATCH, IDS_MENUDESCCREATEPATCH,\r
+ ITEMIS_INSVN|ITEMIS_EXTENDED, ITEMIS_NORMAL, ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED, 0, 0, 0, 0, 0 },\r
+\r
{ ShellMenuApplyPatch, MENUAPPLYPATCH, IDI_PATCH, IDS_MENUAPPLYPATCH, IDS_MENUDESCAPPLYPATCH,\r
- ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN, ITEMIS_ADDED, ITEMIS_ONLYONE|ITEMIS_PATCHFILE, 0, ITEMIS_FOLDERINSVN, ITEMIS_ADDED, 0, 0 },\r
+ ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED, ITEMIS_ADDED, ITEMIS_ONLYONE|ITEMIS_PATCHFILE, 0, ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED, ITEMIS_ADDED, 0, 0 },\r
\r
- { ShellMenuProperties, MENUPROPERTIES, IDI_PROPERTIES, IDS_MENUPROPERTIES, IDS_MENUDESCPROPERTIES,\r
- ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+ { ShellMenuSendMail, MENUSENDMAIL, IDI_MENUSENDMAIL, IDS_MENUSENDMAIL, IDS_MENUDESSENDMAIL,\r
+ ITEMIS_PATCHFILE, 0, 0, 0, 0, 0, 0, 0 },\r
+\r
+// { ShellMenuProperties, MENUPROPERTIES, IDI_PROPERTIES, IDS_MENUPROPERTIES, IDS_MENUDESCPROPERTIES,\r
+// ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
\r
{ ShellSeparator, 0, 0, 0, 0, 0, 0, 0, 0},\r
// { ShellMenuClipPaste, MENUCLIPPASTE, IDI_CLIPPASTE, IDS_MENUCLIPPASTE, IDS_MENUDESCCLIPPASTE,\r
fetchedstatus = status;\r
//if ((stat.status->entry)&&(stat.status->entry->lock_token))\r
// itemStates |= (stat.status->entry->lock_token[0] != 0) ? ITEMIS_LOCKED : 0;\r
- //if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
- //{\r
- // itemStates |= ITEMIS_FOLDER;\r
- // if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
- // itemStates |= ITEMIS_FOLDERINGit;\r
- //}\r
+ if ( askedpath.IsDirectory() )//if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
+ {\r
+ itemStates |= ITEMIS_FOLDER;\r
+ if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+ itemStates |= ITEMIS_FOLDERINSVN;\r
+ }\r
//if ((stat.status->entry)&&(stat.status->entry->present_props))\r
//{\r
// if (strstr(stat.status->entry->present_props, "svn:needs-lock"))\r
}\r
catch ( ... )\r
{\r
- ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n"));\r
+ ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
+ }\r
+\r
+ // TODO: should we really assume any sub-directory to be versioned\r
+ // or only if it contains versioned files\r
+ if ( askedpath.IsDirectory() )\r
+ {\r
+ if (askedpath.HasAdminDir())\r
+ itemStates |= ITEMIS_INSVN;\r
+ if (askedpath.HasSubmodules())\r
+ {\r
+ itemStates |= ITEMIS_SUBMODULE;\r
+ }\r
}\r
if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
itemStates |= ITEMIS_INSVN;\r
fetchedstatus = status;\r
//if ((stat.status->entry)&&(stat.status->entry->lock_token))\r
// itemStates |= (stat.status->entry->lock_token[0] != 0) ? ITEMIS_LOCKED : 0;\r
- //if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
- //{\r
- // itemStates |= ITEMIS_FOLDER;\r
- // if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
- // itemStates |= ITEMIS_FOLDERINGit;\r
- //}\r
- //if ((stat.status->entry)&&(stat.status->entry->conflict_wrk))\r
- // itemStates |= ITEMIS_CONFLICTED;\r
+ if ( strpath.IsDirectory() )//if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
+ {\r
+ itemStates |= ITEMIS_FOLDER;\r
+ if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+ itemStates |= ITEMIS_FOLDERINSVN;\r
+ }\r
+ // TODO: do we need to check that it's not a dir? does conflict options makes sense for dir in git?\r
+ if (status == git_wc_status_conflicted)//if ((stat.status->entry)&&(stat.status->entry->conflict_wrk))\r
+ itemStates |= ITEMIS_CONFLICTED;\r
//if ((stat.status->entry)&&(stat.status->entry->present_props))\r
//{\r
// if (strstr(stat.status->entry->present_props, "svn:needs-lock"))\r
}\r
catch ( ... )\r
{\r
- ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n"));\r
+ ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
+ }\r
+ }\r
+\r
+ // TODO: should we really assume any sub-directory to be versioned\r
+ // or only if it contains versioned files\r
+ if ( strpath.IsDirectory() )\r
+ {\r
+ if (strpath.HasAdminDir())\r
+ itemStates |= ITEMIS_INSVN;\r
+ if (strpath.HasSubmodules())\r
+ {\r
+ itemStates |= ITEMIS_SUBMODULE;\r
}\r
}\r
if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
}\r
} // for (int i = 0; i < count; ++i)\r
ItemIDList child (GetPIDLItem (cida, 0), &parent);\r
-// if (g_ShellCache.HasGitAdminDir(child.toString().c_str(), FALSE))\r
-// itemStates |= ITEMIS_INVERSIONEDFOLDER;\r
+ if (g_ShellCache.HasSVNAdminDir(child.toString().c_str(), FALSE))\r
+ itemStates |= ITEMIS_INVERSIONEDFOLDER;\r
GlobalUnlock(medium.hGlobal);\r
\r
// if the item is a versioned folder, check if there's a patch file\r
// in the clipboard to be used in "Apply Patch"\r
- UINT cFormatDiff = RegisterClipboardFormat(_T("Tgit_UNIFIEDDIFF"));\r
+ UINT cFormatDiff = RegisterClipboardFormat(_T("TGIT_UNIFIEDDIFF"));\r
if (cFormatDiff)\r
{\r
if (IsClipboardFormatAvailable(cFormatDiff)) \r
git_wc_status_kind status = git_wc_status_none;\r
if (IsClipboardFormatAvailable(CF_HDROP)) \r
itemStatesFolder |= ITEMIS_PATHINCLIPBOARD;\r
+ \r
+ CTGitPath askedpath;\r
+ askedpath.SetFromWin(folder_.c_str());\r
+\r
if ((folder_.compare(statuspath)!=0)&&(g_ShellCache.IsContextPathAllowed(folder_.c_str())))\r
{\r
- CTGitPath askedpath;\r
- askedpath.SetFromWin(folder_.c_str());\r
+ \r
try\r
{\r
GitStatus stat;\r
// }\r
// if ((stat.status->entry)&&(stat.status->entry->uuid))\r
// uuidTarget = CUnicodeUtils::StdGetUnicode(stat.status->entry->uuid);\r
- if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
- itemStatesFolder |= ITEMIS_INSVN;\r
- if (status == git_wc_status_normal)\r
- itemStatesFolder |= ITEMIS_NORMAL;\r
- if (status == git_wc_status_conflicted)\r
- itemStatesFolder |= ITEMIS_CONFLICTED;\r
- if (status == git_wc_status_added)\r
- itemStatesFolder |= ITEMIS_ADDED;\r
- if (status == git_wc_status_deleted)\r
- itemStatesFolder |= ITEMIS_DELETED;\r
+ \r
}\r
else\r
{\r
if (askedpath.HasAdminDir())\r
status = git_wc_status_normal;\r
}\r
+ \r
+ //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+ if (askedpath.HasAdminDir())\r
+ itemStatesFolder |= ITEMIS_INSVN;\r
+ if (status == git_wc_status_normal)\r
+ itemStatesFolder |= ITEMIS_NORMAL;\r
+ if (status == git_wc_status_conflicted)\r
+ itemStatesFolder |= ITEMIS_CONFLICTED;\r
+ if (status == git_wc_status_added)\r
+ itemStatesFolder |= ITEMIS_ADDED;\r
+ if (status == git_wc_status_deleted)\r
+ itemStatesFolder |= ITEMIS_DELETED;\r
+\r
}\r
catch ( ... )\r
{\r
- ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n"));\r
+ ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
}\r
}\r
else\r
{\r
status = fetchedstatus;\r
}\r
- if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+ //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+ if (askedpath.HasAdminDir())\r
{\r
itemStatesFolder |= ITEMIS_FOLDERINSVN;\r
}\r
+ if (askedpath.HasSubmodules())\r
+ {\r
+ itemStatesFolder |= ITEMIS_SUBMODULE;\r
+ }\r
if (status == git_wc_status_ignored)\r
itemStatesFolder |= ITEMIS_IGNORED;\r
itemStatesFolder |= ITEMIS_FOLDER;\r
itemStates |= ITEMIS_ONLYONE;\r
if (m_State != FileStateDropHandler)\r
itemStates |= itemStatesFolder;\r
+ \r
\r
}\r
if (files_.size() == 2)\r
{\r
folder_ = files_.front();\r
git_wc_status_kind status = git_wc_status_none;\r
+ CTGitPath askedpath;\r
+ askedpath.SetFromWin(folder_.c_str());\r
+\r
if (folder_.compare(statuspath)!=0)\r
- {\r
- CTGitPath askedpath;\r
- askedpath.SetFromWin(folder_.c_str());\r
+ { \r
try\r
{\r
GitStatus stat;\r
}\r
catch ( ... )\r
{\r
- ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n"));\r
+ ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
}\r
}\r
else\r
{\r
status = fetchedstatus;\r
}\r
- if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+ //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+ if (askedpath.HasAdminDir())\r
itemStates |= ITEMIS_FOLDERINSVN;\r
if (status == git_wc_status_ignored)\r
itemStates |= ITEMIS_IGNORED;\r
\r
void CShellExt::InsertGitMenu(BOOL istop, HMENU menu, UINT pos, UINT_PTR id, UINT stringid, UINT icon, UINT idCmdFirst, GitCommands com, UINT uFlags)\r
{\r
- TCHAR menutextbuffer[255] = {0};\r
+ TCHAR menutextbuffer[512] = {0};\r
TCHAR verbsbuffer[255] = {0};\r
MAKESTRING(stringid);\r
\r
_tcscpy_s(menutextbuffer, 255, _T("Git "));\r
}\r
_tcscat_s(menutextbuffer, 255, stringtablebuffer);\r
- if ((fullver < 0x500)||(fullver == 0x500 && !uFlags))\r
+#if 1\r
+ // insert branch name into "Git Commit..." entry, so it looks like "Git Commit "master"..."\r
+ // so we have an easy and fast way to check the current branch\r
+ // (the other alternative is using a separate disabled menu entry, the code is already done but commented out)\r
+ if (com == ShellMenuCommit)\r
{\r
+ // get branch name\r
+ CTGitPath path(folder_.empty() ? files_.front().c_str() : folder_.c_str());\r
+ CString sProjectRoot;\r
+ CString sBranchName;\r
+\r
+ if (path.HasAdminDir(&sProjectRoot) && !g_Git.GetCurrentBranchFromFile(sProjectRoot, sBranchName))\r
+ {\r
+ if (sBranchName.GetLength() == 40)\r
+ {\r
+ // if SHA1 only show 4 first bytes\r
+ BOOL bIsSha1 = TRUE;\r
+ for (int i=0; i<40; i++)\r
+ if ( !iswxdigit(sBranchName[i]) )\r
+ {\r
+ bIsSha1 = FALSE;\r
+ break;\r
+ }\r
+ if (bIsSha1)\r
+ sBranchName = sBranchName.Left(8) + _T("....");\r
+ }\r
+\r
+ // sanity check\r
+ if (sBranchName.GetLength() > 64)\r
+ sBranchName = sBranchName.Left(64) + _T("...");\r
+\r
+ // scan to before "..."\r
+ LPTSTR s = menutextbuffer + _tcslen(menutextbuffer)-1;\r
+ if (s > menutextbuffer)\r
+ {\r
+ while (s > menutextbuffer)\r
+ {\r
+ if (*s != _T('.'))\r
+ {\r
+ s++;\r
+ break;\r
+ }\r
+ s--;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ s = menutextbuffer;\r
+ }\r
+\r
+ // append branch name and end with ...\r
+ _tcscpy(s, _T(" -> \"") + sBranchName + _T("\"..."));\r
+ }\r
+ }\r
+#endif\r
+ if ((fullver < 0x500)||(fullver == 0x500 && !(uFlags&~(CMF_RESERVED|CMF_EXPLORE|CMF_EXTENDEDVERBS))))\r
+ {\r
+ // on win2k, the context menu does not work properly if we use\r
+ // icon bitmaps. At least the menu text is empty in the context menu\r
+ // for folder backgrounds (seems like a win2k bug).\r
+ // the workaround is to use the check/unchecked bitmaps, which are drawn\r
+ // with AND raster op, but it's better than nothing at all\r
InsertMenu(menu, pos, MF_BYPOSITION | MF_STRING , id, menutextbuffer);\r
- if (fullver >= 0x500)\r
+ if (icon)\r
{\r
- // on win2k, the context menu does not work properly if we use\r
- // icon bitmaps. At least the menu text is empty in the context menu\r
- // for folder backgrounds (seems like a win2k bug).\r
HBITMAP bmp = IconToBitmap(icon); \r
SetMenuItemBitmaps(menu, pos, MF_BYPOSITION, bmp, bmp);\r
}\r
}\r
else\r
{\r
- MENUITEMINFO menuiteminfo = {0};\r
+ MENUITEMINFO menuiteminfo;\r
+ SecureZeroMemory(&menuiteminfo, sizeof(menuiteminfo));\r
menuiteminfo.cbSize = sizeof(menuiteminfo);\r
- menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_BITMAP | MIIM_STRING;\r
+ menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING;\r
menuiteminfo.fType = MFT_STRING;\r
menuiteminfo.dwTypeData = menutextbuffer;\r
if (icon)\r
+ {\r
+ menuiteminfo.fMask |= MIIM_BITMAP;\r
menuiteminfo.hbmpItem = (fullver >= 0x600) ? IconToBitmapPARGB32(icon) : HBMMENU_CALLBACK;\r
+ }\r
menuiteminfo.wID = id;\r
InsertMenuItem(menu, pos, TRUE, &menuiteminfo);\r
}\r
TCHAR * path = new TCHAR[pathlength+1];\r
TCHAR * tempFile = new TCHAR[pathlength + 100];\r
GetTempPath (pathlength+1, path);\r
- GetTempFileName (path, _T("svn"), 0, tempFile);\r
+ GetTempFileName (path, _T("git"), 0, tempFile);\r
tempfile = stdstring(tempFile);\r
\r
HANDLE file = ::CreateFile (tempFile,\r
TCHAR * path = new TCHAR[pathlength+1];\r
TCHAR * tempFile = new TCHAR[pathlength + 100];\r
GetTempPath (pathlength+1, path);\r
- GetTempFileName (path, _T("svn"), 0, tempFile);\r
+ GetTempFileName (path, _T("git"), 0, tempFile);\r
stdstring retFilePath = stdstring(tempFile);\r
\r
HANDLE file = ::CreateFile (tempFile,\r
int menuIndex = 0;\r
bool bAddSeparator = false;\r
bool bMenuEntryAdded = false;\r
+ bool bMenuEmpty = true;\r
// insert separator at start\r
InsertMenu(hMenu, indexMenu++, MF_SEPARATOR|MF_BYPOSITION, 0, NULL); idCmd++;\r
bool bShowIcons = !!DWORD(CRegStdWORD(_T("Software\\TortoiseGit\\ShowContextMenuIcons"), TRUE));\r
- if (fullver <= 0x0500)\r
- bShowIcons = false;\r
+ // ?? TSV disabled icons for win2k and earlier, but they work for win2k and should work for win95 and up\r
+ /*if (fullver <= 0x500)\r
+ bShowIcons = false;*/\r
+\r
+#if 0\r
+ if (itemStates & (ITEMIS_INSVN|ITEMIS_FOLDERINSVN))\r
+ {\r
+ // show current branch name (as a "read-only" menu entry)\r
+\r
+ CTGitPath path(folder_.empty() ? files_.front().c_str() : folder_.c_str());\r
+ CString sProjectRoot;\r
+ CString sBranchName;\r
+\r
+ if (path.HasAdminDir(&sProjectRoot) && !g_Git.GetCurrentBranchFromFile(sProjectRoot, sBranchName))\r
+ {\r
+ if (sBranchName.GetLength() == 40)\r
+ {\r
+ // if SHA1 only show 4 first bytes\r
+ BOOL bIsSha1 = TRUE;\r
+ for (int i=0; i<40; i++)\r
+ if ( !iswxdigit(sBranchName[i]) )\r
+ {\r
+ bIsSha1 = FALSE;\r
+ break;\r
+ }\r
+ if (bIsSha1)\r
+ sBranchName = sBranchName.Left(8) + _T("....");\r
+ }\r
+\r
+ sBranchName = _T('"') + sBranchName + _T('"');\r
+\r
+ const int icon = IDI_COPY;\r
+ const int pos = indexMenu++;\r
+ const int id = idCmd++;\r
+\r
+ if ((fullver < 0x500)||(fullver == 0x500 && !(uFlags&~(CMF_RESERVED|CMF_EXPLORE|CMF_EXTENDEDVERBS))))\r
+ {\r
+ InsertMenu(hMenu, pos, MF_DISABLED|MF_GRAYED|MF_BYPOSITION|MF_STRING, id, sBranchName);\r
+ HBITMAP bmp = IconToBitmap(icon); \r
+ SetMenuItemBitmaps(hMenu, pos, MF_BYPOSITION, bmp, bmp);\r
+ }\r
+ else\r
+ {\r
+ MENUITEMINFO menuiteminfo;\r
+ SecureZeroMemory(&menuiteminfo, sizeof(menuiteminfo));\r
+ menuiteminfo.cbSize = sizeof(menuiteminfo);\r
+ menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING | MIIM_STATE;\r
+ menuiteminfo.fState = MFS_DISABLED;\r
+ menuiteminfo.fType = MFT_STRING;\r
+ menuiteminfo.dwTypeData = (LPWSTR)sBranchName.GetString();\r
+ if (icon)\r
+ {\r
+ menuiteminfo.fMask |= MIIM_BITMAP;\r
+ menuiteminfo.hbmpItem = (fullver >= 0x600) ? IconToBitmapPARGB32(icon) : HBMMENU_CALLBACK;\r
+\r
+ if (menuiteminfo.hbmpItem == HBMMENU_CALLBACK)\r
+ {\r
+ // WM_DRAWITEM uses myIDMap to get icon, we use the same icon as create branch\r
+ myIDMap[id - idCmdFirst] = ShellMenuBranch;\r
+ myIDMap[id] = ShellMenuBranch;\r
+ }\r
+ }\r
+ menuiteminfo.wID = id;\r
+ InsertMenuItem(hMenu, pos, TRUE, &menuiteminfo);\r
+ }\r
+ }\r
+ }\r
+#endif\r
+\r
while (menuInfo[menuIndex].command != ShellMenuLastEntry)\r
{\r
if (menuInfo[menuIndex].command == ShellSeparator)\r
// another 'normal' menu entry after we insert a separator.\r
// we simply set a flag here, indicating that before the next\r
// 'normal' menu entry, a separator should be added.\r
- bAddSeparator = true;\r
+ if (!bMenuEmpty)\r
+ bAddSeparator = true;\r
}\r
else\r
{\r
// handle special cases (sub menus)\r
if ((menuInfo[menuIndex].command == ShellMenuIgnoreSub)||(menuInfo[menuIndex].command == ShellMenuUnIgnoreSub))\r
{\r
- InsertIgnoreSubmenus(idCmd, idCmdFirst, hMenu, subMenu, indexMenu, indexSubMenu, topmenu, bShowIcons);\r
+ InsertIgnoreSubmenus(idCmd, idCmdFirst, hMenu, subMenu, indexMenu, indexSubMenu, topmenu, bShowIcons, uFlags);\r
bMenuEntryAdded = true;\r
+ bMenuEmpty = false;\r
}\r
else\r
{\r
- // the 'get lock' command is special\r
bool bIsTop = ((topmenu & menuInfo[menuIndex].menuID) != 0);\r
- if (menuInfo[menuIndex].command == ShellMenuLock)\r
- {\r
- if ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop())\r
- bIsTop = true;\r
- }\r
+\r
// insert the menu entry\r
InsertGitMenu( bIsTop,\r
bIsTop ? hMenu : subMenu,\r
menuInfo[menuIndex].command,\r
uFlags);\r
if (!bIsTop)\r
+ {\r
bMenuEntryAdded = true;\r
+ bMenuEmpty = false;\r
+ }\r
}\r
}\r
}\r
myIDMap[idCmd] = ShellSubMenu;\r
}\r
HBITMAP bmp = NULL;\r
- if ((fullver < 0x500)||(fullver == 0x500 && !uFlags))\r
+ if ((fullver < 0x500)||(fullver == 0x500 && !(uFlags&~(CMF_RESERVED|CMF_EXPLORE|CMF_EXTENDEDVERBS))))\r
{\r
- bmp = IconToBitmap(uIcon);\r
- menuiteminfo.fMask = MIIM_STRING | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_DATA;\r
+ menuiteminfo.fMask = MIIM_STRING | MIIM_ID | MIIM_SUBMENU | MIIM_DATA;\r
+ if (uIcon)\r
+ {\r
+ menuiteminfo.fMask |= MIIM_CHECKMARKS;\r
+ bmp = IconToBitmap(uIcon);\r
+ menuiteminfo.hbmpChecked = bmp;\r
+ menuiteminfo.hbmpUnchecked = bmp;\r
+ }\r
}\r
else\r
{\r
- menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_SUBMENU | MIIM_DATA | MIIM_BITMAP | MIIM_STRING;\r
- if (bShowIcons)\r
+ menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_SUBMENU | MIIM_DATA | MIIM_STRING;\r
+ if (uIcon)\r
+ {\r
+ menuiteminfo.fMask |= MIIM_BITMAP;\r
menuiteminfo.hbmpItem = (fullver >= 0x600) ? IconToBitmapPARGB32(uIcon) : HBMMENU_CALLBACK;\r
+ }\r
}\r
- menuiteminfo.hbmpChecked = bmp;\r
- menuiteminfo.hbmpUnchecked = bmp;\r
menuiteminfo.hSubMenu = subMenu;\r
menuiteminfo.wID = idCmd++;\r
InsertMenuItem(hMenu, indexMenu++, TRUE, &menuiteminfo);\r
svnCmd += _T("\"");\r
svnCmd += _T(" /deletepathfile");\r
break;\r
+ case ShellMenuSubSync:\r
+ tempfile = WriteFileListToTempFile();\r
+ svnCmd += _T("subsync /pathfile:\"");\r
+ svnCmd += tempfile;\r
+ svnCmd += _T("\"");\r
+ svnCmd += _T(" /deletepathfile");\r
+ if(itemStatesFolder&ITEMIS_SUBMODULE)\r
+ {\r
+ svnCmd += _T(" /bkpath:");\r
+ svnCmd += folder_;\r
+ }\r
+ break;\r
case ShellMenuUpdateExt:\r
tempfile = WriteFileListToTempFile();\r
- svnCmd += _T("update /pathfile:\"");\r
+ svnCmd += _T("subupdate /pathfile:\"");\r
svnCmd += tempfile;\r
svnCmd += _T("\"");\r
svnCmd += _T(" /deletepathfile");\r
- svnCmd += _T(" /rev");\r
+ if(itemStatesFolder&ITEMIS_SUBMODULE)\r
+ {\r
+ svnCmd += _T(" /bkpath:");\r
+ svnCmd += folder_;\r
+ }\r
break;\r
case ShellMenuCommit:\r
tempfile = WriteFileListToTempFile();\r
svnCmd += _T("\"");\r
svnCmd += _T(" /deletepathfile");\r
break;\r
+ case ShellMenuSendMail:\r
+ tempfile = WriteFileListToTempFile();\r
+ svnCmd += _T("sendmail /pathfile:\"");\r
+ svnCmd += tempfile;\r
+ svnCmd += _T("\"");\r
+ svnCmd += _T(" /deletepathfile");\r
+ break;\r
case ShellMenuResolve:\r
tempfile = WriteFileListToTempFile();\r
svnCmd += _T("resolve /pathfile:\"");\r
svnCmd += _T("\"");\r
break;\r
case ShellMenuSettings:\r
- svnCmd += _T("settings");\r
+ svnCmd += _T("settings /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
break;\r
case ShellMenuHelp:\r
svnCmd += _T("help");\r
svnCmd += folder_;\r
svnCmd += _T("\"");\r
break;\r
+ case ShellMenuRebase:\r
+ svnCmd += _T("rebase /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
case ShellMenuShowChanged:\r
if (files_.size() > 1)\r
{\r
svnCmd += _T("\"");\r
}\r
break;\r
- case ShellMenuRepoBrowse:\r
- svnCmd += _T("repobrowser /path:\"");\r
+ case ShellMenuRefLog:\r
+ svnCmd += _T("reflog /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+\r
+ case ShellMenuStashSave:\r
+ svnCmd += _T("stashsave /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+\r
+ case ShellMenuStashApply:\r
+ svnCmd += _T("stashapply /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+\r
+ case ShellMenuStashList:\r
+ svnCmd += _T("reflog /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\" /ref:refs/stash");\r
+ break;\r
+\r
+ case ShellMenuSubAdd:\r
+ svnCmd += _T("subadd /path:\"");\r
if (files_.size() > 0)\r
svnCmd += files_.front();\r
else\r
svnCmd += folder_;\r
svnCmd += _T("\"");\r
break;\r
+\r
case ShellMenuBlame:\r
svnCmd += _T("blame /path:\"");\r
if (files_.size() > 0)\r
{\r
// if there's a patch file in the clipboard, we save it\r
// to a temporary file and tell TortoiseMerge to use that one\r
- UINT cFormat = RegisterClipboardFormat(_T("Tgit_UNIFIEDDIFF"));\r
+ UINT cFormat = RegisterClipboardFormat(_T("TGIT_UNIFIEDDIFF"));\r
if ((cFormat)&&(OpenClipboard(NULL)))\r
{ \r
HGLOBAL hglb = GetClipboardData(cFormat); \r
TCHAR * path = new TCHAR[len+1];\r
TCHAR * tempF = new TCHAR[len+100];\r
GetTempPath (len+1, path);\r
- GetTempFileName (path, TEXT("svn"), 0, tempF);\r
+ GetTempFileName (path, TEXT("git"), 0, tempF);\r
std::wstring sTempFile = std::wstring(tempF);\r
delete [] path;\r
delete [] tempF;\r
svnCmd += folder_;\r
svnCmd += _T("\"");\r
break;\r
- case ShellMenuLock:\r
- tempfile = WriteFileListToTempFile();\r
- svnCmd += _T("lock /pathfile:\"");\r
- svnCmd += tempfile;\r
- svnCmd += _T("\"");\r
- svnCmd += _T(" /deletepathfile");\r
- break;\r
- case ShellMenuUnlock:\r
- tempfile = WriteFileListToTempFile();\r
- svnCmd += _T("unlock /pathfile:\"");\r
- svnCmd += tempfile;\r
- svnCmd += _T("\"");\r
- svnCmd += _T(" /deletepathfile");\r
- break;\r
- case ShellMenuUnlockForce:\r
- tempfile = WriteFileListToTempFile();\r
- svnCmd += _T("unlock /pathfile:\"");\r
- svnCmd += tempfile;\r
- svnCmd += _T("\"");\r
- svnCmd += _T(" /deletepathfile");\r
- svnCmd += _T(" /force");\r
- break;\r
case ShellMenuProperties:\r
tempfile = WriteFileListToTempFile();\r
svnCmd += _T("properties /pathfile:\"");\r
svnCmd += _T("\"");\r
break;\r
case ShellMenuPull:\r
- tempfile = WriteFileListToTempFile();\r
- svnCmd += _T("pull /pathfile:\"");\r
- svnCmd += tempfile;\r
+ svnCmd += _T("pull /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
svnCmd += _T("\"");\r
- svnCmd += _T(" /deletepathfile");\r
break;\r
case ShellMenuPush:\r
+ svnCmd += _T("push /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+ case ShellMenuBranch:\r
+ svnCmd += _T("branch /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+ \r
+ case ShellMenuTag:\r
+ svnCmd += _T("tag /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+\r
+ case ShellMenuFormatPatch:\r
+ svnCmd += _T("formatpatch /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+\r
+ case ShellMenuImportPatch:\r
tempfile = WriteFileListToTempFile();\r
- svnCmd += _T("push /pathfile:\"");\r
+ svnCmd += _T("importpatch /pathfile:\"");\r
svnCmd += tempfile;\r
svnCmd += _T("\"");\r
svnCmd += _T(" /deletepathfile");\r
break;\r
+\r
+ case ShellMenuCherryPick:\r
+ svnCmd += _T("cherrypick /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+ case ShellMenuFetch:\r
+ svnCmd += _T("fetch /path:\"");\r
+ if (files_.size() > 0)\r
+ svnCmd += files_.front();\r
+ else\r
+ svnCmd += folder_;\r
+ svnCmd += _T("\"");\r
+ break;\r
+\r
default:\r
break;\r
//#endregion\r
case WM_MEASUREITEM:\r
{\r
MEASUREITEMSTRUCT* lpmis = (MEASUREITEMSTRUCT*)lParam;\r
- if (lpmis==NULL)\r
+ if (lpmis==NULL||lpmis->CtlType!=ODT_MENU)\r
break;\r
lpmis->itemWidth += 2;\r
if (lpmis->itemHeight < 16)\r
resource = MAKEINTRESOURCE(menuInfo[menuIndex].iconID);\r
switch (id)\r
{\r
- case ShellMenuLock:\r
- // menu lock is special because it can be set to the top\r
- // with a separate option in the registry\r
- space = ((layout & MENULOCK) || ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop())) ? 0 : 6;\r
- if ((layout & MENULOCK) || ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop()))\r
- {\r
- _tcscpy_s(textbuf, 255, _T("Git "));\r
- _tcscat_s(textbuf, 255, stringtablebuffer);\r
- _tcscpy_s(stringtablebuffer, 255, textbuf);\r
- }\r
- break;\r
- // the sub menu entries are special because they're *always* on the top level menu\r
case ShellSubMenuMultiple:\r
case ShellSubMenuLink:\r
case ShellSubMenuFolder:\r
return false;\r
}\r
\r
-void CShellExt::InsertIgnoreSubmenus(UINT &idCmd, UINT idCmdFirst, HMENU hMenu, HMENU subMenu, UINT &indexMenu, int &indexSubMenu, unsigned __int64 topmenu, bool bShowIcons)\r
+void CShellExt::InsertIgnoreSubmenus(UINT &idCmd, UINT idCmdFirst, HMENU hMenu, HMENU subMenu, UINT &indexMenu, int &indexSubMenu, unsigned __int64 topmenu, bool bShowIcons, UINT uFlags)\r
{\r
HMENU ignoresubmenu = NULL;\r
int indexignoresub = 0;\r
MENUITEMINFO menuiteminfo;\r
SecureZeroMemory(&menuiteminfo, sizeof(menuiteminfo));\r
menuiteminfo.cbSize = sizeof(menuiteminfo);\r
- menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_SUBMENU | MIIM_DATA | MIIM_BITMAP | MIIM_STRING;\r
+ if (fullver < 0x500 || (fullver == 0x500 && !(uFlags&~(CMF_RESERVED|CMF_EXPLORE|CMF_EXTENDEDVERBS))))\r
+ {\r
+ menuiteminfo.fMask = MIIM_STRING | MIIM_ID | MIIM_SUBMENU | MIIM_DATA;\r
+ if (icon)\r
+ {\r
+ HBITMAP bmp = IconToBitmap(icon);\r
+ menuiteminfo.fMask |= MIIM_CHECKMARKS;\r
+ menuiteminfo.hbmpChecked = bmp;\r
+ menuiteminfo.hbmpUnchecked = bmp;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_SUBMENU | MIIM_DATA | MIIM_STRING;\r
+ if (icon)\r
+ {\r
+ menuiteminfo.fMask |= MIIM_BITMAP;\r
+ menuiteminfo.hbmpItem = (fullver >= 0x600) ? IconToBitmapPARGB32(icon) : HBMMENU_CALLBACK;\r
+ }\r
+ }\r
menuiteminfo.fType = MFT_STRING;\r
- HBITMAP bmp = (fullver >= 0x600) ? IconToBitmapPARGB32(icon) : IconToBitmap(icon);\r
- if (icon)\r
- menuiteminfo.hbmpItem = (fullver >= 0x600) ? bmp : HBMMENU_CALLBACK;\r
- menuiteminfo.hbmpChecked = bmp;\r
- menuiteminfo.hbmpUnchecked = bmp;\r
menuiteminfo.hSubMenu = ignoresubmenu;\r
menuiteminfo.wID = idCmd;\r
SecureZeroMemory(stringtablebuffer, sizeof(stringtablebuffer));\r