OSDN Git Service

Fixed issue #185. "Can't find Super-project" when pathname include space.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseShell / ContextMenu.cpp
index 5d6db7f..c483382 100644 (file)
@@ -35,20 +35,39 @@ CShellExt::MenuInfo CShellExt::menuInfo[] =
        { 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
-       ITEMIS_INSVN,   ITEMIS_INSVN, ITEMIS_FOLDERINSVN, 0,0,0, 0,0,0},\r
-       { ShellMenuPush,                                                MENUPUSH,                       IDI_PUSH,                               IDS_MENUPUSH,\r
-       ITEMIS_INSVN,   ITEMIS_INSVN, ITEMIS_FOLDERINSVN, 0,0,0, 0,0,0},\r
+       { ShellMenuPull,                                                MENUPULL,                       IDI_PULL,                               IDS_MENUPULL,                   IDS_MENUPULL,\r
+       ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\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_MENUPUSH,\r
+       ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+\r
+       { ShellMenuSync,                                                MENUSYNC,                       IDI_RELOCATE,                           IDS_MENUSYNC,                   IDS_MENUDESCSYNC,\r
+       ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
+\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
+       { ShellSeparator, ITEMIS_GITSVN, 0, 0, 0, 0, 0, 0, 0},\r
 \r
        { ShellMenuCommit,                                              MENUCOMMIT,                     IDI_COMMIT,                             IDS_MENUCOMMIT,                         IDS_MENUDESCCOMMIT,\r
        ITEMIS_INSVN, 0, ITEMIS_FOLDERINSVN, 0, 0, 0, 0, 0 },\r
 \r
+       { ShellMenuGitSVNDCommit,                               MENUSVNDCOMMIT,                 IDI_COMMIT,                     IDS_MENUSVNDCOMMIT,                     IDS_MENUSVNDCOMMIT_DESC,\r
+       ITEMIS_INSVN|ITEMIS_GITSVN, 0, ITEMIS_FOLDERINSVN|ITEMIS_GITSVN, 0, 0, 0, 0, 0 },\r
+\r
+       { ShellMenuGitSVNRebase,                                MENUSVNREBASE,          IDI_REBASE,                             IDS_MENUSVNREBASE,                              IDS_MENUSVNREBASE_DESC,\r
+       ITEMIS_INSVN|ITEMIS_GITSVN, 0, ITEMIS_FOLDERINSVN|ITEMIS_GITSVN, 0, 0, 0, 0, 0},\r
+\r
+       { ShellMenuGitSVNIgnore,                                MENUSVNIGNORE,          IDI_IGNORE,                             IDS_MENUSVNIGNORE,                              IDS_MENUSVNIGNORE_DESC,\r
+       ITEMIS_INSVN|ITEMIS_GITSVN|ITEMIS_EXTENDED, 0, ITEMIS_FOLDERINSVN|ITEMIS_GITSVN|ITEMIS_EXTENDED, 0, 0, 0, 0, 0},\r
+\r
        { ShellSeparator, 0, 0, 0, 0, 0, 0, 0, 0},\r
 \r
        { ShellMenuDiff,                                                MENUDIFF,                       IDI_DIFF,                               IDS_MENUDIFF,                           IDS_MENUDESCDIFF,\r
@@ -63,25 +82,43 @@ CShellExt::MenuInfo CShellExt::menuInfo[] =
        { 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
+       { ShellMenuRefBrowse,                                   MENUREFBROWSE,          IDI_REPOBROWSE,                 IDS_MENUREFBROWSE,                      IDS_MENUDESCREFBROWSE,\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
+\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, 0, ITEMIS_FOLDER|ITEMIS_FOLDERINSVN, 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|ITEMIS_STASH, 0, ITEMIS_FOLDERINSVN|ITEMIS_STASH, 0, 0, 0, 0, 0 },\r
+       { ShellMenuStashPop,                                MENUSTASHPOP,           IDI_RELOCATE,                       IDS_MENUSTASHPOP,                               IDS_MENUSTASHPOP,\r
+       ITEMIS_INSVN|ITEMIS_STASH, 0, ITEMIS_FOLDERINSVN|ITEMIS_STASH, 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
@@ -123,11 +160,16 @@ CShellExt::MenuInfo CShellExt::menuInfo[] =
 \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
@@ -147,28 +189,56 @@ CShellExt::MenuInfo CShellExt::menuInfo[] =
 //     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
-//     ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_PATHINCLIPBOARD, 0, 0, 0, 0, 0, 0, 0 },\r
+       { ShellMenuClipPaste,                                   MENUCLIPPASTE,          IDI_CLIPPASTE,                  IDS_MENUCLIPPASTE,                      IDS_MENUDESCCLIPPASTE,\r
+       ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_PATHINCLIPBOARD, 0, 0, 0, 0, 0, 0, 0 },\r
 \r
        { ShellSeparator, 0, 0, 0, 0, 0, 0, 0, 0},\r
 \r
@@ -289,12 +359,12 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                                        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
@@ -314,10 +384,16 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                        }\r
                                                        catch ( ... )\r
                                                        {\r
-                                                               ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n"));\r
+                                                               ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
                                                        }\r
-                                                       if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
-                                                               itemStates |= ITEMIS_INSVN;\r
+\r
+                                                       // TODO: should we really assume any sub-directory to be versioned\r
+                                                       //       or only if it contains versioned files\r
+                                                       itemStates |= askedpath.GetAdminDirMask();\r
+                                                       \r
+                                                       if ((status == git_wc_status_unversioned) || (status == git_wc_status_ignored) || (status == git_wc_status_none))\r
+                                                               itemStates &= ~ITEMIS_INSVN;\r
+\r
                                                        if (status == git_wc_status_ignored)\r
                                                                itemStates |= ITEMIS_IGNORED;\r
                                                        if (status == git_wc_status_normal)\r
@@ -382,14 +458,15 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                                                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
@@ -413,11 +490,14 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                                }\r
                                                                catch ( ... )\r
                                                                {\r
-                                                                       ATLTRACE2(_T("Exception in GitStatus::GetAllStatus()\n"));\r
+                                                                       ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
                                                                }\r
                                                        }\r
-                                                       if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
-                                                               itemStates |= ITEMIS_INSVN;\r
+\r
+                                                       itemStates |= strpath.GetAdminDirMask();                \r
+                                                       \r
+                                                       if ((status == git_wc_status_unversioned)||(status == git_wc_status_ignored)||(status == git_wc_status_none))\r
+                                                               itemStates &= ~ITEMIS_INSVN;\r
                                                        if (status == git_wc_status_ignored)\r
                                                        {\r
                                                                itemStates |= ITEMIS_IGNORED;\r
@@ -437,6 +517,7 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
 //                                                                     }\r
 //                                                             }\r
                                                        }\r
+                                       \r
                                                        if (status == git_wc_status_normal)\r
                                                                itemStates |= ITEMIS_NORMAL;\r
                                                        if (status == git_wc_status_conflicted)\r
@@ -449,13 +530,13 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                        }\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
@@ -484,10 +565,13 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                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
@@ -504,16 +588,7 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
 //                                     }\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
@@ -523,20 +598,32 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                        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
+                               itemStatesFolder |= askedpath.GetAdminDirMask();                                                        \r
+                               \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
-               {\r
-                       itemStatesFolder |= ITEMIS_FOLDERINSVN;\r
-               }\r
+               //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+               itemStatesFolder |= askedpath.GetAdminDirMask();\r
+               \r
                if (status == git_wc_status_ignored)\r
                        itemStatesFolder |= ITEMIS_IGNORED;\r
                itemStatesFolder |= ITEMIS_FOLDER;\r
@@ -544,6 +631,7 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                        itemStates |= ITEMIS_ONLYONE;\r
                if (m_State != FileStateDropHandler)\r
                        itemStates |= itemStatesFolder;\r
+               \r
 \r
        }\r
        if (files_.size() == 2)\r
@@ -558,10 +646,11 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                        {\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
@@ -582,15 +671,16 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                        }\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
-                                       itemStates |= ITEMIS_FOLDERINSVN;\r
+                               //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+                               itemStates |= askedpath.GetAdminDirMask();\r
+                               \r
                                if (status == git_wc_status_ignored)\r
                                        itemStates |= ITEMIS_IGNORED;\r
                                itemStates |= ITEMIS_FOLDER;\r
@@ -598,6 +688,7 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                        itemStates |= ITEMIS_ADDED;\r
                                if (status == git_wc_status_deleted)\r
                                        itemStates |= ITEMIS_DELETED;\r
+\r
                        }\r
                }\r
        \r
@@ -608,7 +699,7 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
 \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
@@ -619,27 +710,88 @@ void CShellExt::InsertGitMenu(BOOL istop, HMENU menu, UINT pos, UINT_PTR id, UIN
                _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
@@ -756,7 +908,7 @@ bool CShellExt::WriteClipboardPathsToTempFile(stdstring& tempfile)
        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
@@ -810,7 +962,7 @@ stdstring CShellExt::WriteFileListToTempFile()
        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
@@ -1032,11 +1184,79 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
        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
@@ -1045,7 +1265,8 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
                        // 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
@@ -1116,18 +1337,14 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
                                        // 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
@@ -1139,7 +1356,10 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
                                                                                menuInfo[menuIndex].command,\r
                                                                                uFlags);\r
                                                if (!bIsTop)\r
+                                               {\r
                                                        bMenuEntryAdded = true;\r
+                                                       bMenuEmpty = false;\r
+                                               }\r
                                        }\r
                                }\r
                        }\r
@@ -1189,19 +1409,26 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
                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
@@ -1264,6 +1491,11 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                        switch (id_it->second)\r
                        {\r
                                //#region case\r
+                       case ShellMenuSync:\r
+                               svnCmd += _T("sync /path:\"");\r
+                               svnCmd += folder_;\r
+                               svnCmd += _T("\"");\r
+                               break;\r
                        case ShellMenuCheckout:\r
                                svnCmd += _T("checkout /path:\"");\r
                                svnCmd += folder_;\r
@@ -1276,13 +1508,31 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                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
+                                       svnCmd += _T("\"");\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
+                                       svnCmd += _T("\"");\r
+                               }\r
                                break;\r
                        case ShellMenuCommit:\r
                                tempfile = WriteFileListToTempFile();\r
@@ -1348,6 +1598,13 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                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
@@ -1406,7 +1663,12 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                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
@@ -1565,6 +1827,38 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                        svnCmd += folder_;\r
                                svnCmd += _T("\"");\r
                                break;\r
+                       case ShellMenuGitSVNRebase:\r
+                               svnCmd += _T("svnrebase /path:\"");\r
+                               if (files_.size() > 0)\r
+                                       svnCmd += files_.front();\r
+                               else\r
+                                       svnCmd += folder_;\r
+                               svnCmd += _T("\"");\r
+                               break;\r
+                       case ShellMenuGitSVNDCommit:\r
+                               svnCmd += _T("svndcommit /path:\"");\r
+                               if (files_.size() > 0)\r
+                                       svnCmd += files_.front();\r
+                               else\r
+                                       svnCmd += folder_;\r
+                               svnCmd += _T("\"");\r
+                               break;\r
+                       case ShellMenuGitSVNIgnore:\r
+                               svnCmd += _T("svnignore /path:\"");\r
+                               if (files_.size() > 0)\r
+                                       svnCmd += files_.front();\r
+                               else\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
@@ -1584,14 +1878,69 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                svnCmd += _T("\"");\r
                 }\r
                                break;\r
-                       case ShellMenuRepoBrowse:\r
-                               svnCmd += _T("repobrowser /path:\"");\r
+                       case ShellMenuRefBrowse:\r
+                               svnCmd += _T("refbrowse /path:\"");\r
+                               if (files_.size() > 0)\r
+                                       svnCmd += files_.front();\r
+                               else\r
+                                       svnCmd += folder_;\r
+                               svnCmd += _T("\"");\r
+                               break;\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 ShellMenuStashPop:\r
+                               svnCmd += _T("stashpop /path:\"");\r
+                               if (files_.size() > 0)\r
+                                       svnCmd += files_.front();\r
+                               else\r
+                                       svnCmd += folder_;\r
+                               svnCmd += _T("\"");\r
+                               break;\r
+\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
@@ -1612,7 +1961,7 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                {\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
@@ -1622,7 +1971,7 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                                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
@@ -1704,28 +2053,6 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                        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
@@ -1773,19 +2100,73 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                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
@@ -1917,7 +2298,7 @@ STDMETHODIMP CShellExt::HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam,
        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
@@ -2039,18 +2420,6 @@ LPCTSTR CShellExt::GetMenuTextFromResource(int id)
                        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
@@ -2101,7 +2470,7 @@ bool CShellExt::IsIllegalFolder(std::wstring folder, int * cslidarray)
        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
@@ -2221,13 +2590,27 @@ void CShellExt::InsertIgnoreSubmenus(UINT &idCmd, UINT idCmdFirst, HMENU hMenu,
                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