* new command "status" to display current status of an app * new batch mode (environment BATCH=1) which enables different exit codes for easier integration into scripts. steamcmd will exit with exit code = 4 if an app needs updating (status command) or an app has been updated (update command). --- steamcmd.old/main.cpp 2012-08-26 00:00:12.000000000 +0200 +++ steamcmd/main.cpp 2012-08-27 17:23:36.000000000 +0200 @@ -7,6 +7,7 @@ #include #include +#include #include "CCommandLine.h" @@ -21,6 +22,9 @@ #define strcasecmp _stricmp #endif +#define EXIT_GAME_UPDATED (1 << 2) +#define EXIT_UPDATE_RELEASED EXIT_GAME_UPDATED + IClientEngine* g_pClientEngine = NULL; IClientUser* g_pClientUser = NULL; IClientAppManager* g_pClientAppManager = NULL; @@ -63,6 +67,7 @@ void ProgressMsg(const char* cszFormat, ...); bool m_bWasProgressMsg; unsigned int m_uLastProgressMsgSize; + bool m_batch; CCommandLine commandLine; @@ -140,6 +145,10 @@ void CApplication::Exit(int iCode) { + /* convert to failure/success exit codes only in non-batch mode (-autoupdate requirement) */ + if (!m_batch && iCode != EXIT_FAILURE) + iCode = EXIT_SUCCESS; + if(m_bWaitingForCredentials && g_pClientUser->BLoggedOn()) { Msg("Waiting for credentials to cache.\n"); @@ -218,7 +227,7 @@ ShowAvailableApps(); this->Exit(EXIT_SUCCESS); } - else if(strcasecmp(cszCommand, "update") == 0) + else if(strcasecmp(cszCommand, "update") == 0 || strcasecmp(cszCommand, "status") == 0) { Msg("Requesting appinfo update.\n"); @@ -265,7 +274,7 @@ Msg("Up to date.\n", m_uInstallingAppId); m_uInstallingAppId = k_uAppIdInvalid; g_pClientAppManager->SetDownloadingEnabled(false); - this->Exit(EXIT_SUCCESS); + this->Exit(EXIT_GAME_UPDATED); } } } @@ -389,14 +398,20 @@ m_bWasProgressMsg = false; m_uInstallingAppId = k_uAppIdInvalid; m_uUninstallingAppId = k_uAppIdInvalid; + + char *batch = getenv("BATCH"); + m_batch = (batch != NULL && strcmp(batch, "1") == 0); } void CApplication::OnAppInfoUpdateComplete(AppInfoUpdateComplete_t* pParam) { - if(m_bWaitingForAppInfoUpdate && strcasecmp(commandLine.ParmValue("-command", ""), "update") == 0) - { - m_bWaitingForAppInfoUpdate = false; + if (!m_bWaitingForAppInfoUpdate) + return; + m_bWaitingForAppInfoUpdate = false; + const char* cszCommand = commandLine.ParmValue("-command"); + if(strcasecmp(cszCommand, "update") == 0) + { AppId_t uAppId = commandLine.ParmValue("-game", (int)k_uAppIdInvalid); bool bVerifyAll = commandLine.FindParm("-verify_all") != 0; @@ -406,6 +421,22 @@ else if(eResult == k_EUpdateResultAlreadyUpToDate) this->Exit(EXIT_SUCCESS); } + else if(strcasecmp(cszCommand, "status") == 0) + { + AppId_t uAppId = commandLine.ParmValue("-game", (int)k_uAppIdInvalid); + + if(g_pClientAppManager->GetAppInstallState(uAppId) & k_EAppStateUninstalled) + { + Error("This app (%u:%s) isn't installed\n", uAppId, GetAppName(uAppId)); + this->Exit(EXIT_FAILURE); + } + else + { + bool uptodate = g_pClientAppManager->BIsAppUpToDate(uAppId); + Msg("%u:%s %s\n", uAppId, GetAppName(uAppId), (uptodate) ? "is up to date" : "needs updating"); + this->Exit((uptodate) ? EXIT_SUCCESS : EXIT_UPDATE_RELEASED); + } + } } void CApplication::OnDisconnected(SteamServersDisconnected_t* pParam) @@ -728,6 +759,7 @@ " update: Install or update a game\n" " uninstall: Remove a game\n" " list: View available games and their status\n" + " status: View status of a game\n" "\n" "Parameters:\n" " -game - Game AppID to install / update / uninstall\n" @@ -797,13 +829,14 @@ return false; } - if(strcasecmp(cszCommand, "list") != 0 && strcasecmp(cszCommand, "update") != 0 && strcasecmp(cszCommand, "uninstall") != 0) + if(strcasecmp(cszCommand, "list") != 0 && strcasecmp(cszCommand, "update") != 0 && strcasecmp(cszCommand, "uninstall") != 0 + && strcasecmp(cszCommand, "status") != 0) { Error("Invalid command specified.\n"); return false; } - if(strcasecmp(cszCommand, "update") == 0 || strcasecmp(cszCommand, "uninstall") == 0) + if(strcasecmp(cszCommand, "update") == 0 || strcasecmp(cszCommand, "uninstall") == 0 || strcasecmp(cszCommand, "status") == 0) { if(commandLine.FindParm("-game") == 0) { @@ -829,6 +862,12 @@ return false; } + if (m_batch && commandLine.FindParm("-autoupdate") != 0) + { + Msg("Batch mode and -autoupdate is mutually exclusive. Disabling batch mode...\n"); + m_batch = false; + } + return true; }