OSDN Git Service

Fixed issue #151: need "stash pop" function and clear HasAdminDir HasGitSVN HashSubmo...
authorFrank Li <lznuaa@gmail.com>
Fri, 28 Aug 2009 15:21:13 +0000 (23:21 +0800)
committerFrank Li <lznuaa@gmail.com>
Fri, 28 Aug 2009 15:50:06 +0000 (23:50 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
13 files changed:
src/Git/Git.vcproj
src/Git/TGitPath.cpp
src/Git/TGitPath.h
src/TortoiseProc/AppUtils.cpp
src/TortoiseProc/AppUtils.h
src/TortoiseProc/Commands/Command.cpp
src/TortoiseProc/Commands/StashCommand.cpp
src/TortoiseProc/Commands/StashCommand.h
src/TortoiseShell/ContextMenu.cpp
src/TortoiseShell/Globals.h
src/TortoiseShell/ShellExt.h
src/TortoiseShell/resource.h
src/TortoiseShell/resourceshell.rc

index d50aa4e..5d039e7 100644 (file)
@@ -46,7 +46,7 @@
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
                                PreprocessorDefinitions="WIN32;_DEBUG;_LIB"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
                                PreprocessorDefinitions="WIN64;_DEBUG;_LIB"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
                                PreprocessorDefinitions="WIN32;NDEBUG;_LIB"\r
                                RuntimeLibrary="2"\r
                                EnableFunctionLevelLinking="true"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
                                PreprocessorDefinitions="WIN64;NDEBUG;_LIB"\r
                                RuntimeLibrary="2"\r
                                EnableFunctionLevelLinking="true"\r
index 9b92cc6..fb0b508 100644 (file)
@@ -23,6 +23,8 @@
 #include "PathUtils.h"\r
 #include <regex>\r
 #include "git.h"\r
+#include "Globals.h"\r
+\r
 #if defined(_MFC_VER)\r
 //#include "MessageBox.h"\r
 //#include "AppUtils.h"\r
@@ -765,6 +767,51 @@ bool CTGitPath::HasSubmodules() const
        return !g_GitAdminDir.GetSuperProjectRoot(GetWinPathString()).IsEmpty();\r
 }\r
 \r
+int CTGitPath::GetAdminDirMask() const\r
+{\r
+       int status = 0;\r
+       CString topdir,path;\r
+       if(!g_GitAdminDir.HasAdminDir(GetWinPathString(),&topdir))\r
+       {\r
+               return status;\r
+       }\r
+\r
+       status |= ITEMIS_INSVN|ITEMIS_FOLDERINSVN;\r
+\r
+       path=topdir;\r
+       path+=_T("\\");\r
+       path+=g_GitAdminDir.GetAdminDirName();\r
+       path+=_T("\\refs\\stash");\r
+       if( PathFileExists(path) )\r
+               status |= ITEMIS_STASH;\r
+       \r
+       path=topdir;\r
+       path+=_T("\\");\r
+       path+=g_GitAdminDir.GetAdminDirName();\r
+       path+=_T("\\svn");\r
+       if( PathFileExists(path) )\r
+               status |= ITEMIS_GITSVN;\r
+\r
+       path=topdir;\r
+       path+=_T("\\.gitmodules");\r
+       if( PathFileExists(path) )\r
+               status |= ITEMIS_SUBMODULE;\r
+\r
+       return status;\r
+}\r
+\r
+bool CTGitPath::HasStashDir() const\r
+{\r
+       CString topdir;\r
+       if(!g_GitAdminDir.HasAdminDir(GetWinPathString(),&topdir))\r
+       {\r
+               return false;\r
+       }\r
+       topdir+=_T("\\");\r
+       topdir+=g_GitAdminDir.GetAdminDirName();\r
+       topdir+=_T("\\refs\stash");\r
+       return PathFileExists(topdir);\r
+}\r
 bool CTGitPath::HasGitSVNDir() const\r
 {\r
        CString topdir;\r
index 6235338..07528fc 100644 (file)
@@ -219,6 +219,9 @@ public:
        bool HasAdminDir(CString *ProjectTopDir) const;\r
        bool HasSubmodules() const;\r
        bool HasGitSVNDir() const;\r
+       bool HasStashDir() const;\r
+\r
+       int  GetAdminDirMask() const;\r
        \r
        /**\r
         * Checks if the path point to or below a Subversion admin directory (.Git).\r
index 1061693..9936016 100644 (file)
@@ -78,6 +78,30 @@ int   CAppUtils::StashApply(CString ref)
        }\r
        return -1;\r
 }\r
+\r
+int     CAppUtils::StashPop()\r
+{\r
+       CString cmd,out;\r
+       cmd=_T("git.exe stash pop ");\r
+               \r
+       if(g_Git.Run(cmd,&out,CP_ACP))\r
+       {\r
+               CMessageBox::Show(NULL,CString(_T("<ct=0x0000FF>Stash POP Fail!!!</ct>\n"))+out,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+\r
+       }else\r
+       {\r
+               if(CMessageBox::Show(NULL,CString(_T("<ct=0xff0000>Stash POP Success</ct>\nDo you want to show change?"))\r
+                       ,_T("TortoiseGit"),MB_YESNO|MB_ICONINFORMATION) == IDYES)\r
+               {\r
+                       CChangedDlg dlg;\r
+                       dlg.m_pathList.AddPath(CTGitPath());\r
+                       dlg.DoModal();                  \r
+               }\r
+               return 0;\r
+       }\r
+       return -1;\r
+}\r
+\r
 bool CAppUtils::GetMimeType(const CTGitPath& file, CString& mimetype)\r
 {\r
 #if 0\r
index dea827e..baadd40 100644 (file)
@@ -183,7 +183,8 @@ public:
        static CString ToRelativeTimeString(CTime time);\r
 \r
        static CString GetMergeTempFile(CString str,CTGitPath &merge);\r
-       static int         StashApply(CString ref);\r
+       static int      StashApply(CString ref);\r
+       static int      StashPop();\r
 \r
     static bool IsSSHPutty();\r
 \r
index 28f9abc..17ce1ae 100644 (file)
@@ -175,6 +175,7 @@ typedef enum
        cmdUrlDiff,     \r
        cmdStashSave,   \r
        cmdStashApply,\r
+       cmdStashPop,\r
        cmdStashList,\r
        cmdSubAdd,              \r
        cmdSubUpdate,\r
@@ -253,6 +254,7 @@ static const struct CommandInfo
        {       cmdUrlDiff,                     _T("urldiff")                   },\r
        {       cmdStashSave,           _T("stashsave")                 },\r
        {       cmdStashApply,          _T("stashapply")                },\r
+       {       cmdStashPop,            _T("stashpop")                  },\r
        {       cmdStashList,           _T("stashlist")                 },\r
        {       cmdSubAdd,                      _T("subadd")                    },\r
        {       cmdSubUpdate,           _T("subupdate")                 },\r
@@ -359,6 +361,8 @@ Command * CommandServer::GetCommand(const CString& sCmd)
                return new StashSaveCommand;\r
        case cmdStashApply:\r
                return new StashApplyCommand;\r
+       case cmdStashPop:\r
+               return new StashPopCommand;\r
        case cmdSubAdd:\r
                return new SubmoduleAddCommand;\r
        case cmdSubUpdate:\r
index 15029bc..97a40b7 100644 (file)
@@ -46,6 +46,7 @@ bool StashSaveCommand::Execute()
        return bRet;\r
 }\r
 \r
+\r
 bool StashApplyCommand::Execute()\r
 {\r
        if(CAppUtils::StashApply(_T("")))\r
@@ -53,3 +54,11 @@ bool StashApplyCommand::Execute()
        return true;\r
        \r
 }\r
+\r
+bool StashPopCommand::Execute()\r
+{\r
+       if(CAppUtils::StashPop())\r
+               return false;\r
+       return true;\r
+       \r
+}\r
index 02dec58..9e7a5b2 100644 (file)
@@ -37,4 +37,12 @@ public:
        virtual bool                    Execute();\r
 };\r
 \r
+class StashPopCommand : public Command\r
+{\r
+public:\r
+       /**\r
+        * Executes the command.\r
+        */\r
+       virtual bool                    Execute();\r
+};\r
 \r
index 880f022..3ce2c55 100644 (file)
@@ -101,7 +101,9 @@ CShellExt::MenuInfo CShellExt::menuInfo[] =
        { 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
+       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
@@ -384,19 +386,11 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
 \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 (askedpath.HasGitSVNDir())\r
-                                                               itemStates |= ITEMIS_GITSVN;\r
-                                                       if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
-                                                               itemStates |= ITEMIS_INSVN;\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
@@ -497,23 +491,10 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                                }\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
+                                                       itemStates |= strpath.GetAdminDirMask();                \r
                                                        \r
-                                                       if (strpath.HasGitSVNDir())\r
-                                                               itemStates |= ITEMIS_GITSVN;            \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_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
@@ -616,10 +597,8 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                }\r
                                \r
                                //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
-                               if (askedpath.HasGitSVNDir())\r
-                                       itemStatesFolder |= ITEMIS_GITSVN;                                                      \r
-                               if (askedpath.HasAdminDir())\r
-                                       itemStatesFolder |= ITEMIS_INSVN;\r
+                               itemStatesFolder |= askedpath.GetAdminDirMask();                                                        \r
+                               \r
                                if (status == git_wc_status_normal)\r
                                        itemStatesFolder |= ITEMIS_NORMAL;\r
                                if (status == git_wc_status_conflicted)\r
@@ -640,18 +619,8 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                        status = fetchedstatus;\r
                }\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 (askedpath.HasGitSVNDir())\r
-               {\r
-                       itemStatesFolder |= ITEMIS_GITSVN;\r
-               }\r
+               itemStatesFolder |= askedpath.GetAdminDirMask();\r
+               \r
                if (status == git_wc_status_ignored)\r
                        itemStatesFolder |= ITEMIS_IGNORED;\r
                itemStatesFolder |= ITEMIS_FOLDER;\r
@@ -707,10 +676,8 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                        status = fetchedstatus;\r
                                }\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 (askedpath.HasGitSVNDir())\r
-                                       itemStates |= ITEMIS_GITSVN;\r
+                               itemStates |= askedpath.GetAdminDirMask();\r
+                               \r
                                if (status == git_wc_status_ignored)\r
                                        itemStates |= ITEMIS_IGNORED;\r
                                itemStates |= ITEMIS_FOLDER;\r
@@ -1933,6 +1900,16 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                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
index 5f92404..08ca6d8 100644 (file)
@@ -67,6 +67,7 @@
 #define MENUSTASHLIST          0x0000400000000000\r
 #define MENUSUBADD                     0x0000800000000000\r
 #define MENUSUBSYNC                    0x0001000000000000\r
+#define MENUSTASHPOP           0x0002000000000000\r
 \r
 #define MENUSETTINGS           0x2000000000000000\r
 #define MENUHELP                       0x4000000000000000\r
@@ -94,7 +95,6 @@ enum FileState
        FileStateInvalid\r
 };\r
 \r
-\r
 #define ITEMIS_ONLYONE                         0x00000001\r
 #define ITEMIS_EXTENDED                                0x00000002\r
 #define ITEMIS_INSVN                           0x00000004\r
@@ -115,4 +115,4 @@ enum FileState
 #define ITEMIS_TWO                                     0x00020000\r
 #define ITEMIS_SUBMODULE                       0x00040000\r
 #define ITEMIS_GITSVN                          0x00080000\r
-\r
+#define ITEMIS_STASH                           0x00100000\r
index 5d4fbee..0d0b29f 100644 (file)
@@ -161,6 +161,7 @@ protected:
                ShellMenuStashSave,\r
                ShellMenuStashApply,\r
                ShellMenuStashList,\r
+               ShellMenuStashPop,\r
                ShellMenuSubAdd,\r
                ShellMenuSubSync,\r
                ShellMenuSendMail,\r
index a68f044..3355da1 100644 (file)
 #define IDS_MENUSVNDCOMMIT_DESC         338\r
 #define IDS_MENUSYNC                    339\r
 #define IDS_MENUDESCSYNC                340\r
+#define IDS_MENUSTASHPOP                341\r
 #define IDC_REVISION                    1001\r
 #define IDC_LOCKED                      1002\r
 #define IDC_REPOURL                     1003\r
index 72dedc3..f500f50 100644 (file)
@@ -435,6 +435,7 @@ BEGIN
     IDS_MENUSVNDCOMMIT_DESC "Git SVN DCommit"\r
     IDS_MENUSYNC            "Sync..."\r
     IDS_MENUDESCSYNC        "Sync remote Remote Repostory, include pull, push,email patch and so on"\r
+    IDS_MENUSTASHPOP        "Stash Pop"\r
 END\r
 \r
 #endif    // English (U.S.) resources\r