OSDN Git Service

Add Save Special Version to anther file
authorFrank Li <lznuaa@gmail.com>
Sun, 8 Mar 2009 03:46:39 +0000 (11:46 +0800)
committerFrank Li <lznuaa@gmail.com>
Mon, 9 Mar 2009 13:23:40 +0000 (21:23 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Git/GitStatusListCtrl.cpp
src/Git/GitStatusListCtrl.h
src/Git/TGitPath.cpp

index fdc8b62..8b7b30c 100644 (file)
@@ -3203,13 +3203,18 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-#if 0\r
+\r
                        case IDSVNLC_COPY:\r
                                CopySelectedEntriesToClipboard(0);\r
                                break;\r
                        case IDSVNLC_COPYEXT:\r
                                CopySelectedEntriesToClipboard((DWORD)-1);\r
                                break;\r
+\r
+                       case IDSVNLC_SAVEAS:\r
+                               FileSaveAs(filepath);\r
+                               break;\r
+#if 0\r
                        case IDSVNLC_PROPERTIES:\r
                                {\r
                                        CTSVNPathList targetList;\r
@@ -3246,17 +3251,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                }\r
                                break;\r
                \r
-                       case IDSVNLC_COMPARE:\r
-                               {\r
-                                       POSITION pos = GetFirstSelectedItemPosition();\r
-                                       while ( pos )\r
-                                       {\r
-                                               int index = GetNextSelectedItem(pos);\r
-                                               StartDiff(index);\r
-                                       }\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_COMPAREWC:\r
+               case IDSVNLC_COMPAREWC:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
                                        while ( pos )\r
@@ -3317,29 +3312,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-                       case IDSVNLC_OPEN:\r
-                               {\r
-                                       int ret = (int)ShellExecute(this->m_hWnd, NULL, filepath.GetWinPath(), NULL, NULL, SW_SHOW);\r
-                                       if (ret <= HINSTANCE_ERROR)\r
-                                       {\r
-                                               CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
-                                               cmd += filepath.GetWinPathString();\r
-                                               CAppUtils::LaunchApplication(cmd, NULL, false);\r
-                                       }\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_OPENWITH:\r
-                               {\r
-                                       CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
-                                       cmd += filepath.GetWinPathString() + _T(" ");\r
-                                       CAppUtils::LaunchApplication(cmd, NULL, false);\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_EXPLORE:\r
-                               {\r
-                                       ShellExecute(this->m_hWnd, _T("explore"), filepath.GetDirectory().GetWinPath(), NULL, NULL, SW_SHOW);\r
-                               }\r
-                               break;\r
+       \r
                        case IDSVNLC_REMOVE:\r
                                {\r
                                        SVN git;\r
@@ -3480,157 +3453,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-                       case IDSVNLC_IGNOREMASK:\r
-                               {\r
-                                       CString name = _T("*")+filepath.GetFileExtension();\r
-                                       CTSVNPathList ignorelist;\r
-                                       FillListOfSelectedItemPaths(ignorelist, true);\r
-                                       std::set<CTSVNPath> parentlist;\r
-                                       for (int i=0; i<ignorelist.GetCount(); ++i)\r
-                                       {\r
-                                               parentlist.insert(ignorelist[i].GetContainingDirectory());\r
-                                       }\r
-                                       std::set<CTSVNPath>::iterator it;\r
-                                       std::vector<CString> toremove;\r
-                                       SetRedraw(FALSE);\r
-                                       for (it = parentlist.begin(); it != parentlist.end(); ++it)\r
-                                       {\r
-                                               CTSVNPath parentFolder = (*it).GetDirectory();\r
-                                               SVNProperties props(parentFolder, SVNRev::REV_WC, false);\r
-                                               CStringA value;\r
-                                               for (int i=0; i<props.GetCount(); i++)\r
-                                               {\r
-                                                       CString propname(props.GetItemName(i).c_str());\r
-                                                       if (propname.CompareNoCase(_T("git:ignore"))==0)\r
-                                                       {\r
-                                                               stdstring stemp;\r
-                                                               // treat values as normal text even if they're not\r
-                                                               value = (char *)props.GetItemValue(i).c_str();\r
-                                                       }\r
-                                               }\r
-                                               if (value.IsEmpty())\r
-                                                       value = name;\r
-                                               else\r
-                                               {\r
-                                                       value = value.Trim("\n\r");\r
-                                                       value += "\n";\r
-                                                       value += name;\r
-                                                       value.Remove('\r');\r
-                                               }\r
-                                               if (!props.Add(_T("git:ignore"), (LPCSTR)value))\r
-                                               {\r
-                                                       CString temp;\r
-                                                       temp.Format(IDS_ERR_FAILEDIGNOREPROPERTY, (LPCTSTR)name);\r
-                                                       CMessageBox::Show(this->m_hWnd, temp, _T("TortoiseSVN"), MB_ICONERROR);\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       CTSVNPath basepath;\r
-                                                       int nListboxEntries = GetItemCount();\r
-                                                       for (int i=0; i<nListboxEntries; ++i)\r
-                                                       {\r
-                                                               FileEntry * entry = GetListEntry(i);\r
-                                                               ASSERT(entry != NULL);\r
-                                                               if (entry == NULL)\r
-                                                                       continue;\r
-                                                               if (basepath.IsEmpty())\r
-                                                                       basepath = entry->basepath;\r
-                                                               // since we ignored files with a mask (e.g. *.exe)\r
-                                                               // we have to find find all files in the same\r
-                                                               // folder (IsAncestorOf() returns TRUE for _all_ children,\r
-                                                               // not just the immediate ones) which match the\r
-                                                               // mask and remove them from the list too.\r
-                                                               if ((entry->status == git_wc_status_unversioned)&&(parentFolder.IsAncestorOf(entry->path)))\r
-                                                               {\r
-                                                                       CString f = entry->path.GetSVNPathString();\r
-                                                                       if (f.Mid(parentFolder.GetSVNPathString().GetLength()).Find('/')<=0)\r
-                                                                       {\r
-                                                                               if (CStringUtils::WildCardMatch(name, f))\r
-                                                                               {\r
-                                                                                       if (GetCheck(i))\r
-                                                                                               m_nSelected--;\r
-                                                                                       m_nTotal--;\r
-                                                                                       toremove.push_back(f);\r
-                                                                               }\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                                       if (!m_bIgnoreRemoveOnly)\r
-                                                       {\r
-                                                               SVNStatus status;\r
-                                                               git_wc_status2_t * s;\r
-                                                               CTSVNPath gitPath;\r
-                                                               s = status.GetFirstFileStatus(parentFolder, gitPath, false, git_depth_empty);\r
-                                                               if (s!=0)\r
-                                                               {\r
-                                                                       // first check if the folder isn't already present in the list\r
-                                                                       bool bFound = false;\r
-                                                                       for (int i=0; i<nListboxEntries; ++i)\r
-                                                                       {\r
-                                                                               FileEntry * entry = GetListEntry(i);\r
-                                                                               if (entry->path.IsEquivalentTo(gitPath))\r
-                                                                               {\r
-                                                                                       bFound = true;\r
-                                                                                       break;\r
-                                                                               }\r
-                                                                       }\r
-                                                                       if (!bFound)\r
-                                                                       {\r
-                                                                               FileEntry * entry = new FileEntry();\r
-                                                                               entry->path = gitPath;\r
-                                                                               entry->basepath = basepath;\r
-                                                                               entry->status = SVNStatus::GetMoreImportant(s->text_status, s->prop_status);\r
-                                                                               entry->textstatus = s->text_status;\r
-                                                                               entry->propstatus = s->prop_status;\r
-                                                                               entry->remotestatus = SVNStatus::GetMoreImportant(s->repos_text_status, s->repos_prop_status);\r
-                                                                               entry->remotetextstatus = s->repos_text_status;\r
-                                                                               entry->remotepropstatus = s->repos_prop_status;\r
-                                                                               entry->inunversionedfolder = false;\r
-                                                                               entry->checked = true;\r
-                                                                               entry->inexternal = false;\r
-                                                                               entry->direct = false;\r
-                                                                               entry->isfolder = true;\r
-                                                                               entry->last_commit_date = 0;\r
-                                                                               entry->last_commit_rev = 0;\r
-                                                                               entry->remoterev = 0;\r
-                                                                               if (s->entry)\r
-                                                                               {\r
-                                                                                       if (s->entry->url)\r
-                                                                                       {\r
-                                                                                               entry->url = CUnicodeUtils::GetUnicode(CPathUtils::PathUnescape(s->entry->url));\r
-                                                                                       }\r
-                                                                               }\r
-                                                                               if (s->entry && s->entry->present_props)\r
-                                                                               {\r
-                                                                                       entry->present_props = s->entry->present_props;\r
-                                                                               }\r
-                                                                               m_arStatusArray.push_back(entry);\r
-                                                                               m_arListArray.push_back(m_arStatusArray.size()-1);\r
-                                                                               AddEntry(entry, langID, GetItemCount());\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       for (std::vector<CString>::iterator it = toremove.begin(); it != toremove.end(); ++it)\r
-                                       {\r
-                                               int nListboxEntries = GetItemCount();\r
-                                               for (int i=0; i<nListboxEntries; ++i)\r
-                                               {\r
-                                                       if (GetListEntry(i)->path.GetSVNPathString().Compare(*it)==0)\r
-                                                       {\r
-                                                               RemoveListEntry(i);\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       SetRedraw(TRUE);\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_EDITCONFLICT:\r
-                               SVNDiff::StartConflictEditor(filepath);\r
-                               break;\r
-                       \r
+\r
+\r
                        case IDSVNLC_ADD:\r
                                {\r
                                        SVN git;\r
@@ -3696,55 +3520,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-                       case IDSVNLC_LOCK:\r
-                               {\r
-                                       CTSVNPathList itemsToLock;\r
-                                       FillListOfSelectedItemPaths(itemsToLock);\r
-                                       CInputDlg inpDlg;\r
-                                       inpDlg.m_sTitle.LoadString(IDS_MENU_LOCK);\r
-                                       CStringUtils::RemoveAccelerators(inpDlg.m_sTitle);\r
-                                       inpDlg.m_sHintText.LoadString(IDS_LOCK_MESSAGEHINT);\r
-                                       inpDlg.m_sCheckText.LoadString(IDS_LOCK_STEALCHECK);\r
-                                       ProjectProperties props;\r
-                                       props.ReadPropsPathList(itemsToLock);\r
-                                       props.nMinLogSize = 0;          // the lock message is optional, so no minimum!\r
-                                       inpDlg.m_pProjectProperties = &props;\r
-                                       if (inpDlg.DoModal()==IDOK)\r
-                                       {\r
-                                               CSVNProgressDlg progDlg;\r
-                                               progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Lock);\r
-                                               progDlg.SetOptions(inpDlg.m_iCheck ? ProgOptLockForce : ProgOptNone);\r
-                                               progDlg.SetPathList(itemsToLock);\r
-                                               progDlg.SetCommitMessage(inpDlg.m_sInputText);\r
-                                               progDlg.DoModal();\r
-                                               // refresh!\r
-                                               CWnd* pParent = GetParent();\r
-                                               if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
-                                               {\r
-                                                       pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_UNLOCKFORCE:\r
-                               bForce = true;\r
-                       case IDSVNLC_UNLOCK:\r
-                               {\r
-                                       CTSVNPathList itemsToUnlock;\r
-                                       FillListOfSelectedItemPaths(itemsToUnlock);\r
-                                       CSVNProgressDlg progDlg;\r
-                                       progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Unlock);\r
-                                       progDlg.SetOptions(bForce ? ProgOptLockForce : ProgOptNone);\r
-                                       progDlg.SetPathList(itemsToUnlock);\r
-                                       progDlg.DoModal();\r
-                                       // refresh!\r
-                                       CWnd* pParent = GetParent();\r
-                                       if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
-                                       {\r
-                                               pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
-                                       }\r
-                               }\r
-                               break;\r
+\r
                        case IDSVNLC_REPAIRMOVE:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
@@ -5721,3 +5497,43 @@ HRESULT STDMETHODCALLTYPE CSVNStatusListCtrlDropTarget::DragOver(DWORD grfKeySta
 }f\r
 \r
 #endif\r
+\r
+void CGitStatusListCtrl::FileSaveAs(CTGitPath *path)\r
+{\r
+       CString filename;\r
+       filename.Format(_T("%s-%s%s"),path->GetBaseFilename(),this->m_CurrentVersion.Left(6),path->GetFileExtension());\r
+       CFileDialog dlg(FALSE,NULL,\r
+                                       filename,               \r
+                                       OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r
+                                       NULL);\r
+       CString currentpath;\r
+       currentpath=g_Git.m_CurrentDir+_T("\\");\r
+       currentpath+=path->GetWinPathString();\r
+\r
+       dlg.m_ofn.lpstrInitialDir=currentpath.GetBuffer();\r
+\r
+       CString cmd,out;                \r
+       if(dlg.DoModal()==IDOK)\r
+       {\r
+               filename = dlg.GetFileName();\r
+               if(m_CurrentVersion == GIT_REV_ZERO)\r
+               {\r
+                       cmd.Format(_T("copy /Y \"%s\" \"%s\""),path->GetWinPath(),filename);\r
+                       if(g_Git.Run(cmd,&out,CP_ACP))\r
+                       {\r
+                               CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+                               return;\r
+                       }\r
+\r
+               }else\r
+               {\r
+                       cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),m_CurrentVersion,path->GetGitPathString());\r
+                       if(g_Git.RunLogFile(cmd,filename))\r
+                       {\r
+                               CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+\r
+}
\ No newline at end of file
index 0c023c5..dff4d6c 100644 (file)
@@ -873,6 +873,9 @@ private:
        afx_msg void OnHdnItemchanging(NMHDR *pNMHDR, LRESULT *pResult);\r
        afx_msg void OnDestroy();\r
 \r
+\r
+       void FileSaveAs(CTGitPath *path);\r
+\r
 private:\r
        bool *                                          m_pbCanceled;\r
        bool                                        m_bAscending;               ///< sort direction\r
index 7c7e43c..dbd0dc0 100644 (file)
@@ -550,7 +550,7 @@ CString CTGitPath::GetBaseFilename() const
        CString filename=GetFilename();\r
        dot = filename.ReverseFind(_T('.'));\r
        if(dot>0)\r
-               return filename.Left(dot-1);\r
+               return filename.Left(dot);\r
        else\r
                return filename;\r
 }\r