Browse Source

完善SVNProc相关类;

Jeff 5 năm trước cách đây
mục cha
commit
ef76136350
3 tập tin đã thay đổi với 345 bổ sung30 xóa
  1. 4 0
      SATHelper/SATHelper/Global.h
  2. 272 23
      SATHelper/SATHelper/SVNProc.cpp
  3. 69 7
      SATHelper/SATHelper/SVNProc.h

+ 4 - 0
SATHelper/SATHelper/Global.h

@@ -29,6 +29,10 @@ namespace Global
 		bool enableTW;
 		std::string strMIInitBat;
 		std::string strSCBCInitBat;
+		// script¡¢tester¡¢resource±£´æÄ¿Â¼;
+		std::string svnScriptSavePath;
+		std::string svnTesterSavePath;
+		std::string svnResourceSavePath;
 
 		// test wizard
 		int twPort;

+ 272 - 23
SATHelper/SATHelper/SVNProc.cpp

@@ -1,38 +1,126 @@
 #include "StdAfx.h"
 #include "SVNProc.h"
 #include <afxinet.h>
+#include "CharEncoding.h"
 
-CSVNProc::CSVNProc(void)
+IMPLEMENT_SERIAL(CSVNProc, CObject, 0)
+
+CSVNProc::CSVNProc(void) :CObject()
 {
+	m_bNeedUpdate = FALSE;
+	m_strSVNAddress = _T("");
+	m_strSVNSavePath = _T("");
+	m_dwSVNVersion = 0;
+	m_svnpath = PATH_RES;
 }
 
 CSVNProc::~CSVNProc(void)
 {
 }
 
-void CSVNProc::SVNProcess(std::string strSVNAddress, std::string strSavePath, DWORD dwSVNVersion, SVNTYPE type)
+CSVNProc& CSVNProc::operator=(CSVNProc& obj)
+{
+	// TODO: 在此处插入 return 语句
+	m_bNeedUpdate = obj.m_bNeedUpdate;
+	m_strSVNAddress = obj.m_strSVNAddress;
+	m_strSVNSavePath = obj.m_strSVNSavePath;
+	m_dwSVNVersion = obj.m_dwSVNVersion;
+
+	return *this;
+}
+
+void CSVNProc::Serialize(CArchive& ar)
 {
+	CObject::Serialize(ar);
+	// 读写判断
+	if(ar.IsStoring())
+	{// 保存;
+		ar << m_bNeedUpdate;
+		ar << m_strSVNAddress;
+		ar << m_strSVNSavePath;
+		ar << m_dwSVNVersion;
+	}
+	else
+	{// 加载;
+		ar >> m_bNeedUpdate;
+		ar >> m_strSVNAddress;
+		ar >> m_strSVNSavePath;
+		ar >> m_dwSVNVersion;
+	}
+}
 
+void CSVNProc::SVNProcess(std::string strSVNAddress, std::string strSavePath, DWORD dwSVNVersion, SVNTYPE type)
+{
 	TCHAR szCommand[MAX_PATH] = { 0 };
 	if ( type == SVN_EXPORT ) {
 		// 先删除要导出的路径;
 		_stprintf_s(szCommand, _T("/c rd /s /q %s"), strSavePath.c_str());
 		ShellExecute(NULL, _T("open"), _T("cmd"), szCommand, NULL, SW_HIDE);
 		// 再执行导出;
-		_stprintf_s(szCommand, _T("/c svn export -r %d %s %s &pause"), dwSVNVersion, strSVNAddress.c_str(), strSavePath.c_str());
+		//_stprintf_s(szCommand, _T("/c svn export -r %d %s %s > data.jg &pause"), dwSVNVersion, strSVNAddress.c_str(), strSavePath.c_str());
+		_stprintf_s(szCommand, _T("/c svn export -r %d %s %s > %d"), dwSVNVersion, strSVNAddress.c_str(), strSavePath.c_str(), m_svnpath);
 	}
 	else if ( type == SVN_CHECKOUT ) {
 		// 先删除要导出的路径;
 		_stprintf_s(szCommand, _T("/c rd /s /q %s"), strSavePath.c_str());
 		ShellExecute(NULL, _T("open"), _T("cmd"), szCommand, NULL, SW_HIDE);
 		// 再执行导出;
-		_stprintf_s(szCommand, _T("/c svn checkout -r %d %s %s &pause"), dwSVNVersion, strSVNAddress.c_str(), strSavePath.c_str());
+		//_stprintf_s(szCommand, _T("/c svn checkout -r %d %s %s > data.jg &pause"), dwSVNVersion, strSVNAddress.c_str(), strSavePath.c_str());
+		_stprintf_s(szCommand, _T("/c svn checkout -r %d %s %s > %d"), dwSVNVersion, strSVNAddress.c_str(), strSavePath.c_str(), m_svnpath);
 	}
 	else if ( type == SVN_ROLLBACK ) {
-		_stprintf_s(szCommand, _T("/c svn update -r %d %s &pause"), dwSVNVersion, strSavePath.c_str());
+		//_stprintf_s(szCommand, _T("/c svn update -r %d %s > data.jg &pause"), dwSVNVersion, strSavePath.c_str());
+		_stprintf_s(szCommand, _T("/c svn update -r %d %s > %d"), dwSVNVersion, strSavePath.c_str(), m_svnpath);
+	}
+
+	SHELLEXECUTEINFO sei;
+	memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
+	sei.cbSize = sizeof(SHELLEXECUTEINFO);
+	sei.hwnd = NULL;
+	sei.lpVerb = _T("open");
+	sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
+	sei.lpFile = "cmd";
+	sei.lpParameters = szCommand;
+	sei.lpDirectory = NULL;
+	sei.nShow = SW_HIDE;
+	sei.hInstApp = NULL;
+
+	if (!ShellExecuteEx(&sei)) {
+		return;
+	}
+
+	if (sei.hProcess != NULL) {
+		WaitForSingleObject(sei.hProcess, INFINITE);
+		if (sei.hProcess)
+			CloseHandle(sei.hProcess);
+	}
+	
+	// 结束后进入文本结果识别;
+	CString str;
+	CStdioFile file;
+	_stprintf_s(szCommand, _T("%d"), m_svnpath);
+	if (file.Open(szCommand, CFile::modeRead)) {
+		// 文件大小;
+		ULONGLONG ulSize = file.SeekToEnd();
+		file.SeekToBegin();
+		if ( ulSize > 60)
+			file.Seek(ulSize - 60, CFile::begin);
+		while (file.GetPosition() != ulSize) {
+			file.ReadString(str);
+		}
+
+		// 关闭文件;
+		file.Close();
 	}
 
-	ShellExecute(NULL, _T("open"), _T("cmd"), szCommand, NULL, SW_SHOW);
+	// 目前只针对更新指定版本;
+	TCHAR szCommand2[MAX_PATH] = { 0 };
+	_stprintf_s(szCommand, _T("At revision %ld."), dwSVNVersion);
+	_stprintf_s(szCommand, _T("Updated to revision %ld."), dwSVNVersion);
+	if (!str.IsEmpty() && (str.CompareNoCase(szCommand) == 0 || str.CompareNoCase(szCommand2) == 0)) {
+		// 表示更新成功;
+		m_bNeedUpdate = FALSE;
+	}
 }
 
 void CSVNProc::Export(std::string strSVNAddress, std::string strSavePath, DWORD dwSVNVersion)
@@ -50,7 +138,78 @@ void CSVNProc::Rollback(std::string strSVNAddress, std::string strSavePath, DWOR
 	SVNProcess(strSVNAddress, strSavePath, dwSVNVersion, SVN_ROLLBACK);
 }
 
-BOOL CSVNProc::CheckNewVersion(std::string url, std::string strContent)
+BOOL CSVNMgr::ParseJson(std::string json)
+{
+	cJSON* pRoot = cJSON_Parse(json.c_str());
+	if (pRoot) {
+		cJSON* pMsg = cJSON_GetObjectItem(pRoot, "responseMsg");
+		if (pMsg) {
+			std::string data;
+			std::string code = cJSON_GetObjectItem(pMsg, "code") ? cJSON_GetObjectItem(pMsg, "code")->valuestring : "";
+			std::string msg = cJSON_GetObjectItem(pMsg, "message") ? cJSON_GetObjectItem(pMsg, "message")->valuestring : "";
+
+			if (code == "00") {
+				cJSON* pObj = cJSON_GetObjectItem(pMsg, "data");
+				if (pObj != NULL) {
+					int nSise = cJSON_GetArraySize(pObj);
+					for (int i = 0; i < nSise; i++) {
+						cJSON* pInfo = cJSON_GetArrayItem(pObj, i);
+						if (pInfo) {
+							std::string type = cJSON_GetObjectItem(pInfo, "type") ? cJSON_GetObjectItem(pInfo, "type")->valuestring : "";
+							std::string path = cJSON_GetObjectItem(pInfo, "svnPath") ? cJSON_GetObjectItem(pInfo, "svnPath")->valuestring : "";
+							std::string version = cJSON_GetObjectItem(pInfo, "svnVersion") ? cJSON_GetObjectItem(pInfo, "svnVersion")->valuestring : "";
+
+							CSVNProc* pSVN = NULL;
+							// 查找该地址是否存在;
+							if ((pSVN = IsSVNExist(path)) != NULL) {
+								UpdatedSVN(pSVN, _tstol(version.c_str()));
+							}
+							else
+							{
+								pSVN = new CSVNProc();
+								pSVN->m_bNeedUpdate = TRUE;
+								pSVN->m_strSVNAddress = path.c_str();
+								pSVN->m_dwSVNVersion = _tstol(version.c_str());
+								if (type == "SatTest") {
+									pSVN->m_svnpath = PATH_TESTER;
+									pSVN->m_strSVNSavePath = _T("D:\\SAT\\Tester");
+								}
+								else if (type == "SatScript") {
+									pSVN->m_svnpath = PATH_SCRIPT;
+									pSVN->m_strSVNSavePath = _T("D:\\SAT\\Script");
+								}
+								else if (type == "SatResource") {
+									pSVN->m_svnpath = PATH_RES;
+									pSVN->m_strSVNSavePath = _T("D:\\SAT\\resource");
+								}
+								else {
+									delete pSVN;
+									pSVN = NULL;
+								}
+																
+								// 加入数组;
+								if ( pSVN )
+									m_arySVN.Add(pSVN);
+							}
+						}
+					}
+				}
+
+				// 释放内存;
+				cJSON_Delete(pRoot);
+				// 返回结果;
+				return TRUE;
+			}
+		}
+
+		// 错误产生,可输出msg方便查询;
+		cJSON_Delete(pRoot);
+	}
+
+	return FALSE;
+}
+
+BOOL CSVNMgr::HttpRequest(std::string url, std::string strContent, std::string& data)
 {
 	// 分解地址;
 	DWORD dwServiceType;
@@ -63,45 +222,53 @@ BOOL CSVNProc::CheckNewVersion(std::string url, std::string strContent)
 	}
 
 	// 设置超时
-	CInternetSession session;
+	CInternetSession session(_T("HTTP Session"));;
 	session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 2000);
 	session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 3);
 	session.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 10000);
 	session.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 20000);
-	// http://10.201.40.65:8580/btc_execute_se/ajaxInteractiveManage!getSvnVersion.action
-	
+
 	// 打开HTTP连接
 	CHttpConnection* pHttpConnection = session.GetHttpConnection(strServer, dwServiceType == AFX_INET_SERVICE_HTTP ? INTERNET_FLAG_KEEP_CONNECTION : INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_SECURE, nPort);
 	if (NULL == pHttpConnection) {
 		return FALSE;
 	}
-	
+
 	// 开启一个HTTP请求
 	url.append("!" + strContent);
-	CHttpFile* pHttpFile = pHttpConnection->OpenRequest(_T("POST"), url.c_str(), NULL, 1, NULL, NULL, dwServiceType == AFX_INET_SERVICE_HTTP ? INTERNET_FLAG_KEEP_CONNECTION : INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_SECURE);
+	url = CharEncoding::EnCode_UTF8URL(url.c_str());
+	CHttpFile* pHttpFile = pHttpConnection->OpenRequest(_T("POST"), strObject, NULL, 1, NULL, NULL, dwServiceType == AFX_INET_SERVICE_HTTP ? INTERNET_FLAG_KEEP_CONNECTION : INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_SECURE);
 	if (NULL == pHttpFile) {
 		return FALSE;
 	}
-	
+
 	// 设置HTTP请求包头
 	std::string output;
-	pHttpFile->AddRequestHeaders(_T("User-Agent: MYPRODUCT/1.0.0 (Windows)"));
-	pHttpFile->AddRequestHeaders(_T("Content-Type: application/octet-stream"));
-	pHttpFile->AddRequestHeaders(_T("Charset: UTF-8"));
-	
+	TCHAR szHeaders[MAX_PATH] = { 0 };
+	pHttpFile->AddRequestHeaders(_T("User-Agent: PostmanRuntime/7.24.1"));
+	pHttpFile->AddRequestHeaders(_T("Accept: */*"));
+	pHttpFile->AddRequestHeaders(_T("Accept-Encoding: gzip, deflate, br"));
+	pHttpFile->AddRequestHeaders(_T("Connection: keep-alive"));
+	pHttpFile->AddRequestHeaders(_T("Content-Type: application/json;charset=utf-8"));
+	pHttpFile->AddRequestHeaders(_T("Cache-Control: no-cache"));
+	pHttpFile->AddRequestHeaders(_T("Accept-Language: zh-cn"));
+	_stprintf_s(szHeaders, _T("Host:%s"), strServer.GetString());
+	pHttpFile->AddRequestHeaders(szHeaders);
+	pHttpFile->AddRequestHeaders(_T("Content-Length:0"));
+
 	// 发送数据
-	BOOL bResult = pHttpFile->SendRequest(NULL, 0, (LPVOID)strContent.data(), (DWORD)strContent.length());
+	BOOL bResult = pHttpFile->SendRequest(NULL, 0, NULL, 0);
 	if (!bResult) {
 		return FALSE;
 	}
-	
+
 	// 查询状态
 	DWORD dwHttpCode = 0;
 	bResult = pHttpFile->QueryInfoStatusCode(dwHttpCode);
 	if (!bResult) {
 		return FALSE;
 	}
-	
+
 	// 出错的原因
 	char szBuffer[4096] = { 0 };
 	DWORD dwBufferSize;
@@ -109,10 +276,9 @@ BOOL CSVNProc::CheckNewVersion(std::string url, std::string strContent)
 		BOOL bResult = pHttpFile->QueryInfo(HTTP_QUERY_STATUS_TEXT, szBuffer, &dwBufferSize);
 		return FALSE;
 	}
-	
+
 	// 接收响应
-	std::string data;
-	DWORD dwReadBytes;	
+	DWORD dwReadBytes;
 	while ((dwReadBytes = pHttpFile->Read((void*)szBuffer, 4096)) > 0) {
 		data.append(szBuffer, dwReadBytes);
 		memset(szBuffer, 0, 4096 * sizeof(char));
@@ -133,5 +299,88 @@ BOOL CSVNProc::CheckNewVersion(std::string url, std::string strContent)
 
 	session.Close();
 
+	data = CharEncoding::DeCode_URLUTF8(data.c_str());
 	TRACE1(_T("请求结果:%s"), data.c_str());
+
+	return TRUE;
 }
+
+CSVNProc* CSVNMgr::IsSVNExist(std::string strSVNAddress)
+{
+	CSVNProc* pSVN = NULL;
+	int nSize = m_arySVN.GetSize();
+	for ( int i = 0; i < nSize; i++ ) {
+		pSVN = m_arySVN.GetAt(i);
+		if (pSVN) {
+			if (pSVN->m_strSVNAddress.CompareNoCase(strSVNAddress.c_str()) == 0)
+				return pSVN;
+		}
+ 	}
+
+	return NULL;
+}
+
+void CSVNMgr::UpdatedSVN(CSVNProc* pSVN, DWORD dwVersion)
+{
+	if (pSVN->m_dwSVNVersion != dwVersion) {
+		pSVN->m_dwSVNVersion = dwVersion;
+		pSVN->m_bNeedUpdate = TRUE;
+		//pSVN->Rollback(pSVN->m_strSVNAddress.GetString(), pSVN->m_strSVNSavePath.GetString(), pSVN->m_dwSVNVersion);
+	}
+	else
+	{
+		pSVN->m_bNeedUpdate = FALSE;
+	}
+}
+
+BOOL CSVNMgr::HasNewVersion()
+{
+	CSVNProc* pSVN = NULL;
+	int nSize = m_arySVN.GetSize();
+	for (int i = 0; i < nSize; i++) {
+		pSVN = m_arySVN.GetAt(i);
+		if (pSVN) {
+			if (pSVN->m_bNeedUpdate)
+				return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+void CSVNMgr::Load(LPCTSTR lpFileName)
+{
+	CFile file;
+	if (!file.Open(lpFileName, CFile::modeRead)) {
+		CArchive ar(&file, CArchive::load);
+		m_arySVN.Serialize(ar);
+		ar.Close();
+		file.Close();
+	}
+}
+
+void CSVNMgr::Store(LPCTSTR lpFileName)
+{
+	CFile file;
+	if (!file.Open(lpFileName, CFile::modeWrite | CFile::modeCreate)) {
+		CArchive ar(&file, CArchive::store);
+		m_arySVN.Serialize(ar);
+		ar.Flush();
+		ar.Close();
+		file.Flush();
+		file.Close();
+	}
+}
+
+BOOL CSVNMgr::CheckNewVersion(std::string url, std::string strContent)
+{
+	std::string data;
+	if (!HttpRequest(url, strContent, data))
+		return FALSE;
+
+	// 将结果转换为结构体;
+	ParseJson(data);
+
+	return HasNewVersion();
+}
+

+ 69 - 7
SATHelper/SATHelper/SVNProc.h

@@ -3,19 +3,36 @@
 
 #pragma once
 
-enum SVNTYPE{
-	SVN_EXPORT,
-	SVN_CHECKOUT,
-	SVN_ROLLBACK
+enum SVNTYPE {
+	SVN_EXPORT,			// 导出;
+	SVN_CHECKOUT,		// 检出;
+	SVN_ROLLBACK		// 回退(up to);
 };
 
-class CSVNProc
+enum SVNPATH {
+	PATH_RES,			// 资源路径;
+	PATH_SCRIPT,		// 脚本路径;
+	PATH_TESTER			// tester路径;
+};
+
+typedef struct SVNINFO {
+	SVNPATH	path;
+	std::string strVersion;
+	std::string strSVNAddress;
+	bool bUpdate;
+	std::string strSavePath;
+}SVNInfo, *pSVNInfo;
+
+class CSVNProc:public CObject
 {
 public:
 	CSVNProc(void);
 	~CSVNProc(void);
 
-private:
+	CSVNProc& operator=(CSVNProc& obj);
+protected:
+	DECLARE_SERIAL(CSVNProc);
+	void Serialize(CArchive& ar);
 	void SVNProcess(std::string strSVNAddress, std::string strSavePath, DWORD dwSVNVersion, SVNTYPE type);
 
 public:
@@ -27,8 +44,53 @@ public:
 	void Rollback(std::string strSVNAddress, std::string strSavePath, DWORD dwSVNVersion);
 
 	// 检测版本:有新版本返回TRUE;
-	BOOL CheckNewVersion(std::string url = "http://10.201.40.65:8580/btc_execute_se/ajaxInteractiveManage", std::string strContent = "getSvnVersion.action");
+	BOOL CheckNewVersion(
+		std::string url = "http://192.168.1.103:8580/btc_execute_se/ajaxInteractiveManage!getSvnVersion.action", 
+		std::string strContent = "");
+
+public:
+	SVNPATH m_svnpath;
+	// 是否需要更新;
+	BOOL m_bNeedUpdate;
+	// SVN地址;
+	CString m_strSVNAddress;
+	// SVN保存目录:
+	CString m_strSVNSavePath;
+	// SVN版本号;
+	DWORD	m_dwSVNVersion;
 };
 
+typedef CTypedPtrArray<CObArray, CSVNProc*> CSVNArray;
+
+class CSVNMgr
+{
+	CSVNMgr() {};
+	CSVNArray m_arySVN;
+public:
+	static CSVNMgr* GetInstance()
+	{
+		static CSVNMgr* pInstance = NULL;
+		if (pInstance == NULL) {
+			pInstance = new CSVNMgr();
+		}
+
+		return pInstance;
+	}
+
+	~CSVNMgr() {};
+
+private:
+	BOOL ParseJson(std::string json);
+	BOOL HttpRequest(std::string url, std::string strContent, std::string& data);
+
+	CSVNProc *IsSVNExist(std::string strSVNAddress);
+	void UpdatedSVN(CSVNProc *pSVN, DWORD dwVersion);
+	BOOL HasNewVersion();
+public:
+	void Load(LPCTSTR lpFileName =_T("svn.data"));
+	void Store(LPCTSTR lpFileName = _T("svn.data"));
+	// 检测版本:有新版本返回TRUE;
+	BOOL CheckNewVersion(std::string url, std::string strContent);
+};
 
 #endif // __SVN_PROC__