void SubmitCommand::OutputStat( StrDict* dict ) { if ( m_Changeset == NULL ) { return; } StrPtr* submittedChange = dict->GetVar( g_SubmittedChangeTag ); if ( submittedChange ) { m_Changeset->m_Id = submittedChange->Atoi(); } uint32_t numFiles = 0; StrPtr* openFiles = dict->GetVar( g_OpenFilesTag ); if ( openFiles ) { numFiles = openFiles->Atoi(); } for( uint32_t i = 0; i < numFiles; ++i ) { RCS::FilePtr file = new RCS::File(); StrPtr* depotFile = dict->GetVar( g_DepotFileTag, i ); if ( depotFile ) { bool converted = Helium::ConvertString( depotFile->Text(), file->m_DepotPath ); HELIUM_ASSERT( converted ); } StrPtr* revision = dict->GetVar( g_RevisionTag ); if ( revision ) { file->m_LocalRevision = revision->Atoi(); } StrPtr* action = dict->GetVar( g_ActionTag ); if ( action ) { tstring actionString; bool converted = Helium::ConvertString( action->Text(), actionString ); HELIUM_ASSERT( converted ); file->m_Operation = GetOperationEnum( actionString ); } } }
void P4ClientAPI::RunCmd( const char *cmd, ClientUser *ui, int argc, char * const *argv ) { // #if P4APIVER_ID >= 513026 // ClientApi::SetProg() was introduced in 2004.2 client.SetProg( &prog ); // #endif // #if P4APIVER_ID >= 513282 // ClientApi::SetVersion() was introduced in 2005.2 if( version.Length() ) client.SetVersion( &version ); // #endif if( IsTag() ) client.SetVar( "tag" ); if( IsStreamsMode() && apiLevel >= 70 ) client.SetVar( "enableStreams" ); // If maxresults or maxscanrows is set, enforce them now if( maxResults ) client.SetVar( "maxResults", maxResults ); if( maxScanRows ) client.SetVar( "maxScanRows", maxScanRows ); if( maxLockTime ) client.SetVar( "maxLockTime", maxLockTime ); // client.SetBreak( &cb ); client.SetArgv( argc, argv ); client.Run( cmd, ui ); // Have to request server2 protocol *after* a command has been run. I // don't know why, but that's the way it is. if ( ! IsCmdRun() ) { StrPtr *pv = client.GetProtocol( "server2" ); if ( pv ) server2 = pv->Atoi(); pv = client.GetProtocol( P4Tag::v_nocase ); if ( pv ) SetCaseFold(); pv = client.GetProtocol( P4Tag::v_unicode ); if ( pv && pv->Atoi() ) SetUnicode(); } SetCmdRun(); }
// // RunCmd is a private function to work around an obscure protocol // bug in 2000.[12] servers. Running a "p4 -Ztag client -o" messes up the // protocol so if they're running this command then we disconnect and // reconnect to refresh it. For efficiency, we only do this if the // server2 protocol is either 9 or 10 as other versions aren't affected. // void P4ClientApi::RunCmd( const char *cmd, ClientUser *ui, int argc, char * const *argv, int table ) { client.SetProg( &prog ); if( version.Length() ) client.SetVersion( &version ); if( mode & M_TAGGED ) client.SetVar( "tag" ); // If maxresults or maxscanrows is set, enforce them now if( maxResults ) client.SetVar( "maxResults", maxResults ); if( maxScanRows ) client.SetVar( "maxScanRows", maxScanRows ); if( maxLockTime ) client.SetVar( "maxLockTime", maxLockTime ); client.SetBreak( &cb ); client.SetArgv( argc, argv ); client.Run( cmd, ui ); // Have to request server2 protocol *after* a command has been run. I // don't know why, but that's the way it is. if ( ! server2 ) { StrPtr *pv = client.GetProtocol( "server2" ); if ( pv ) server2 = pv->Atoi(); } if ( IS_TAGGED(mode) && StrRef( cmd ) == "client" && server2 >= 9 && server2 <= 10 ) { if ( argc && ( StrRef( argv[ 0 ] ) == "-o" ) ) { if ( P4LUADEBUG_COMMANDS ) printf( "Resetting client to avoid 2000.[12] protocol bug\n" ); Error e; client.Final( &e ); client.Init( &e ); // Pass any errors down to the UI, so they'll get picked up. if ( e.Test() ) ui->HandleError( &e ); } } }
void FStatCommand::OutputStat( StrDict *dict ) { HELIUM_ASSERT_MSG( m_File, ("No file info object to store file information to") ); if ( m_File->m_FileData & RCS::FileData::State ) { // file necessarily exists in the depot to have gotten here m_File->m_State |= RCS::FileStates::ExistsInDepot; } if ( m_File->m_FileData & RCS::FileData::DepotPath ) { bool converted = Helium::ConvertString( dict->GetVar( g_DepotFileTag )->Text(), m_File->m_DepotPath ); HELIUM_ASSERT( converted ); } if ( m_File->m_FileData & RCS::FileData::LocalPath ) { if ( dict->GetVar( g_ClientFileTag ) ) { bool converted = Helium::ConvertString( dict->GetVar( g_ClientFileTag )->Text(), m_File->m_LocalPath ); HELIUM_ASSERT( converted ); } } if ( m_File->m_FileData & RCS::FileData::Username ) { StrPtr* username = dict->GetVar( g_ActionOwnerTag ); if ( username ) { bool converted = Helium::ConvertString( username->Text(), m_File->m_Username ); HELIUM_ASSERT( converted ); } } if ( m_File->m_FileData & RCS::FileData::ChangesetId ) { StrPtr* changelist = dict->GetVar( g_ChangeTag ); if ( changelist ) { m_File->m_ChangesetId = changelist->Atoi(); if ( m_File->m_ChangesetId == 0 ) { m_File->m_ChangesetId = RCS::DefaultChangesetId; } } } if ( m_File->m_FileData & RCS::FileData::Operation ) { StrPtr* action = dict->GetVar( g_ActionTag ); if ( action ) { tstring actionString; bool converted = Helium::ConvertString( action->Text(), actionString ); HELIUM_ASSERT( converted ); m_File->m_Operation = GetOperationEnum( actionString ); if ( m_File->m_FileData & RCS::FileData::State ) { m_File->m_State |= RCS::FileStates::CheckedOutByMe; if ( m_File->m_Operation == RCS::Operations::Delete ) { m_File->m_State |= RCS::FileStates::LocalDeleted; } } } } if ( m_File->m_FileData & RCS::FileData::Actions && m_File->m_ActionData ) { StrPtr* otherOpen = dict->GetVar( g_OtherOpenTag ); if ( otherOpen ) { if ( m_File->m_FileData & RCS::FileData::State ) { m_File->m_State |= RCS::FileStates::CheckedOut; } int totalOpens = otherOpen->Atoi(); m_File->m_Actions.reserve( totalOpens ); for ( int i = 0; i < totalOpens; ++i ) { RCS::ActionPtr action = new RCS::Action( m_File->m_ActionData ); if ( action->m_ActionData & RCS::ActionData::Username || action->m_ActionData & RCS::ActionData::Client ) { StrPtr* userInfo = dict->GetVar( g_OtherOpenTag, i ); if ( userInfo != NULL ) { tstring otherUserInfo; bool converted = Helium::ConvertString( userInfo->Text(), otherUserInfo ); HELIUM_ASSERT( converted ); size_t atLocation = otherUserInfo.find( TXT( "@" ) ); if ( action->m_ActionData & RCS::ActionData::Username ) { action->m_Username = otherUserInfo.substr( 0, atLocation ); } if ( action->m_ActionData & RCS::ActionData::Client ) { action->m_Client = otherUserInfo.substr( atLocation + 1 ); } } } if ( action->m_ActionData & RCS::ActionData::ChangesetId ) { StrPtr* changeInfo = dict->GetVar( g_OtherChangeTag, i ); if ( changeInfo ) { action->m_ChangesetId = changeInfo->Atoi(); if ( action->m_ChangesetId == 0 ) { action->m_ChangesetId = RCS::DefaultChangesetId; } } } if ( action->m_ActionData & RCS::ActionData::Operation ) { StrPtr* actionInfo = dict->GetVar( g_OtherActionTag, i ); if ( actionInfo ) { tstring actionString; bool converted = Helium::ConvertString( actionInfo->Text(), actionString ); HELIUM_ASSERT( converted ); action->m_Operation = GetOperationEnum( actionString ); } } m_File->m_Actions.push_back( action ); } } } if ( m_File->m_Operation == RCS::Operations::Add ) { tstring fileType; bool converted = Helium::ConvertString( dict->GetVar( g_TypeTag )->Text(), fileType ); HELIUM_ASSERT( converted ); if ( m_File->m_FileData & RCS::FileData::FileType ) { m_File->m_FileType = GetFileType( fileType ); } if ( m_File->m_FileData & RCS::FileData::Flags ) { SetFlags( fileType, m_File ); } return; // out of info at this point } if ( m_File->m_FileData & RCS::FileData::LocalRevision ) { StrPtr* haveRev = dict->GetVar( g_HaveRevTag ); if ( haveRev ) { m_File->m_LocalRevision = haveRev->Atoi(); } } // If a file is deleted at head, it does not have a digest or size if ( m_File->m_FileData & RCS::FileData::Digest || m_File->m_FileData & RCS::FileData::Size ) { StrPtr* headAction = dict->GetVar( g_HeadActionTag ); if ( headAction ) { tstring actionString; bool converted = Helium::ConvertString( headAction->Text(), actionString ); HELIUM_ASSERT( converted ); if ( GetOperationEnum( actionString ) == RCS::Operations::Delete ) { if ( m_File->m_FileData & RCS::FileData::State ) { m_File->m_State |= RCS::FileStates::HeadDeleted; } } else { if ( m_File->m_FileData & RCS::FileData::Digest ) { StrPtr* digest = dict->GetVar( g_DigestTag ); if ( digest ) { bool converted = Helium::ConvertString( digest->Text(), m_File->m_Digest ); HELIUM_ASSERT( converted ); } } if ( m_File->m_FileData & RCS::FileData::Digest ) { StrPtr* size = dict->GetVar( g_FileSizeTag ); if ( size ) { m_File->m_Size = (u64) size->Atoi64(); } } } } } if ( m_File->m_FileData & RCS::FileData::FileType || m_File->m_FileData & RCS::FileData::Flags ) { StrPtr* headType = dict->GetVar( g_HeadTypeTag ); if ( headType ) { tstring fileType; bool converted = Helium::ConvertString( headType->Text(), fileType ); HELIUM_ASSERT( converted ); if ( m_File->m_FileData & RCS::FileData::FileType) { m_File->m_FileType = GetFileType( fileType ); } if ( m_File->m_FileData & RCS::FileData::Flags ) { SetFlags( fileType, m_File ); } } } if ( m_File->m_FileData & RCS::FileData::HeadModTime ) { StrPtr* headModTime = dict->GetVar( g_HeadModTimeTag ); if ( headModTime ) { m_File->m_HeadModTime = headModTime->Atoi(); } } if ( m_File->m_FileData & RCS::FileData::HeadRevision ) { StrPtr* headRevTag = dict->GetVar( g_HeadRevTag ); if ( headRevTag ) { m_File->m_HeadRevision = headRevTag->Atoi(); } } if ( m_File->m_FileData & RCS::FileData::HeadTime ) { StrPtr* headTimeTag = dict->GetVar( g_HeadTimeTag ); if ( headTimeTag ) { m_File->m_HeadTime = headTimeTag->Atoi(); } } }
void FileLogCommand::OutputStat( StrDict *dict ) { StrPtr* latestRevision = dict->GetVar( g_RevisionTag, 0 ); if ( latestRevision ) { u32 numRevisions = latestRevision->Atoi(); for( u32 i = 0; i < numRevisions; ++i ) { RCS::Revision* revision = new RCS::Revision(); revision->m_Revision = dict->GetVar( g_RevisionTag, i )->Atoi(); revision->m_ChangesetId = dict->GetVar( g_ChangeTag, i )->Atoi(); tstring actionString; bool converted = Helium::ConvertString( dict->GetVar( g_ActionTag, i )->Text(), actionString ); HELIUM_ASSERT( converted ); revision->m_Operation = GetOperationEnum( actionString ); tstring fileType; converted = Helium::ConvertString( dict->GetVar( g_TypeTag, i )->Text(), fileType ); HELIUM_ASSERT( converted ); revision->m_FileType = GetFileType( fileType ); revision->m_Time = (time_t) dict->GetVar( g_TimeTag, i )->Atoi(); converted = Helium::ConvertString( dict->GetVar( g_UserTag, i )->Text(), revision->m_Username ); HELIUM_ASSERT( converted ); converted = Helium::ConvertString( dict->GetVar( g_ClientTag, i )->Text(), revision->m_Client ); HELIUM_ASSERT( converted ); // This should not happen, but it has happened before when "move/delete" was added // to Perforce's vocabulary without our knowledge. HELIUM_ASSERT( revision->m_Operation != RCS::Operations::Unknown ); if ( revision->m_Operation != RCS::Operations::Delete && revision->m_Operation != RCS::Operations::Unknown ) { revision->m_Size = dict->GetVar( g_FileSizeTag, i )->Atoi64(); converted = Helium::ConvertString( dict->GetVar( g_DigestTag, i )->Text(), revision->m_Digest ); HELIUM_ASSERT( converted ); } converted = Helium::ConvertString( dict->GetVar( g_DescriptionTag, i )->Text(), revision->m_Description ); HELIUM_ASSERT( converted ); for ( u32 target = 0; target < PERFORCE_MAX_DICT_ENTRIES; ++target ) { StrPtr* how = dict->GetVar( g_HowTag, i, target ); if ( !how ) { break; } // Integration Actions // http://www.perforce.com/perforce/doc.current/manuals/cmdref/integrated.html if ( ( std::string( how->Text() ) == "branch into" ) || ( std::string( how->Text() ) == "add into" ) ) { RCS::File* targetInfo = new RCS::File(); converted = Helium::ConvertString( dict->GetVar( g_FileTag, i, target )->Text(), targetInfo->m_DepotPath ); HELIUM_ASSERT( converted ); revision->m_IntegrationTargets.push_back( targetInfo ); } else if ( ( std::string( how->Text() ) == "branch from" ) ) { RCS::File* targetInfo = new RCS::File(); converted = Helium::ConvertString( dict->GetVar( g_FileTag, i, target )->Text(), targetInfo->m_DepotPath ); HELIUM_ASSERT( converted ); revision->m_IntegrationOrigins.push_back( targetInfo ); } } m_File->m_Revisions.push_back( revision ); } } }