예제 #1
0
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 );
    }
  }
}
예제 #2
0
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();
}
예제 #3
0
//
// 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 );
		}
	}
}
예제 #4
0
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();
        }
    }
}
예제 #5
0
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 );
        }
    }
}