ClientProgress - progress indicators for Helix Core Server commands

The ClientProgress class introduced in 2012.2 provides a means to report on the progress of running commands. You can customize this behavior by subclassing ClientUser and ClientProgress.

The methods of your ClientProgress object will be called during the life of a server command. Usually, Description() is called first with a description and a units from the server. The units of measure apply to the Total() and Update() methods.

Total() is called if a there is a known upper bound to the number of units. Update() is called from time to time as progress is made. If your Update() implementation returns non-zero, the API assumes the user has also attempted to cancel the operation.

Done() is called last, with the fail argument being non-zero in case of failure. When the command is complete, the API destroys the object by calling the destructor.

Default implementations are used in the p4 command-line client, and report on the progress of p4 -I submit and p4 -I sync -q.

Handling progress notifications

The ClientProgress class contains a collection of progress notification callback methods. If you want your application to handle progress notifications, subclass the ClientProgress class and in ClientUser, implement ClientUser::CreateProgress() and ClientUser::ProgressIndicator(). Notifications of parallel sync, submit, shelve, and unshelve are supported through ClientUser::CanParallelProgress().

In ClientProgress, implement ClientProgress::Description(), ClientProgress::Total(), ClientProgress::Update(), and ClientProgress::Done()

Copy
class ClientProgress {
public:
    virtual ~ClientProgress() {};
    virtual void    Description( const StrPtr *desc, int units ) = 0;
    virtual void    Total( long ) = 0;
    virtual int    Update( long ) = 0;
    virtual void    Done( int fail ) = 0;
};

The two forms of the CreateProgress method are ClientUser::CreateProgress( int ) or ClientUser::CreateProgress( int, P4INT64 ). The CreateProgress method will have had the progress type (see Progress types), which it could pass into the ClientProgress subclass's constructor. Alternatively, the CreateProgress method might have used the progress type to choose the subclass of ClientProgress.

ClientProgress::~ClientProgress()

Once returned from ClientUser::CreateProgress the ClientUser object will be owned by the client and will be deleted after the call to ClientProgress::Done( int ), where the integer is 1 to indicate failure: ClientProgress::Done( int fail ). Deleting the client-owned ClientProgress object will result in access to initialized memory.

ClientProgress::Description( const StrPtr *desc, int units ) will be called with a textual description of the progress. If this is a file transfer, this will typically be a depot file path. The units parameter exposes which unit of work will be received by ClientProgress::Total( long ) and ClientProgress::Update( long ).

ClientProgress::Total( long ) will be called with the total number of units this ClientProgress should expect. This is typical for cases where there is a known target value, which can be presented as a progress bar.

ClientProgress::Update( long ) will be called each time there is an update to the progress. If ClientProgress::Total( long ) was not called, ClientProgress::Update( long ) should be used to show to show that work is still happening, such as a spinner.

ClientProgress::Done( int fail ) will be called once the context for the progress has completed. If fail is set to non-zero, there was an error and the operation was unsuccessful.

Progress Units

Progress Unit Type Defined in clientprog.h Value
Unspecified CPU_UNSPECIFIED 0
Percentage Complete CPU_PERCENT 1
Number of files CPU_FILES 2
KB (1024 bytes) CPU_KBYTES 3
MB (1024*1024 bytes) CPU_MBYTES 4
Number of deltas CPU_DELTAS 5

Additional progress types or progress units might be added in future releases of Helix Core Server. These types and units can be passed into CreateProgress() regardless of the P4API version. Your implementation can either handle unknown types and units generically or ignore them.

Progress types

The API calls this method with the appropriate ProgressType as defined in clientprog.h. The following ProgressTypes can be reported:

Type Defined in clientprog.h Value Meaning

SendFile

CPT_SENDFILE

1

Files sent to the server. This represents the source path, that is, the local path to the file being sent. The progress unit type is KB (3) or Deltas (5), depending on transfer mechanism. See Notes in ClientProgress::Description( const StrPtr *, int ). The total for ClientProgress::Total( long ) is the total bytes or deltas to send.

ReceiveFile

CPT_RECVFILE

2

Files received from server. This represents the destination path, that is, the local path to the file being received. The progress unit type is KB (3). The total for ClientProgress::Total( long ) is the total bytes to receive. This progress notification depends on the client receiving the filesize from the server, which is a feature that requires a 2020.2 or later Helix Core Server.

FilesTransferring

CPT_FILESTRANS

3

Files transmitted.

Computation

CPT_COMPUTATION

4

Computation performed server-side.

Additional progress types or progress units might be added in future releases of Helix Core Server. These types and units can be passed into CreateProgress() regardless of the P4API version. Your implementation can either handle unknown types and units generically or ignore them.

Progress sources

Client side

Send File

Description Type Units Total

The local path to the file being sent from the client.

SendFile(1)

KB(3) or Deltas(5) depending on transfer mechanism.

Total bytes or deltas to send.

Receive File

Description Type Units Total

The local path to the file being received by the client.

ReceiveFile(2)

KB(3)

Total bytes or deltas to receive.

Server side

Resource Pressure Pause

Notification is sent if the resource pressure system has paused the connection. The update value will reflect how many times the connection has been considered for resumption. Re-evaluation occurs every 100 to 200 milliseconds. Update notifications are rate limited to 1 every 500 milliseconds.

Description Type Units Total

command paused

Computation(4)

Unspecified(0)

Number of times the connection has been considered for resumption.

Sync

An indication of the number of files transferred versus the total files to be transferred for a non-parallel p4 sync with the -q option.

To give both files-in-sync progress and per-file progress:

  1. Run the sync in tagged mode. The first result contains the total files and bytes to be transferred.

  2. Count the per-file progress instances.

The first call to clientStat includes the total file count and an estimate of the total bytes to transfer. After that, each call to ClientUser::CreateProgress( int, P4INT64 ) signifies a file being received. The progress of the file can be displayed. When the ClientProgress::Done() callback is called, the number of files transferred can be incremented to show the progress per file of the sync. This also works for parallel sync if ClientUser::CanParallelProgress() is made to return 1.

Description Type Units Total

sync

FilesTransfering(3)

Unspecified(0)

Number of files to be transferred.

DVCS - Check files

An indication of how many file revisions have been checked as part of a DVCS push/fetch and how many more need to be processed.

Description Type Units Total

check files

FilesTransfering(3)

Unspecified(0)

Revision record count.

DVCS - Check integrations

An indication of how many file revisions have been checked as part of a DVCS push/fetch and how many more need to be processed.

Description Type Units Total

check integrations

FilesTransfering(3)

Unspecified(0)

Revision record count.

DVCS - Commit revisions

An indication of how many file revisions have been written to the database as part of a DVCS push/fetch and how many more need to be written.

Description Type Units Total

commit revisions

FilesTransfering(3)

Unspecified(0)

Revision record count.

DVCS - Commit integrations

An indication of how many file integratio ns have been written to the database as part of a DVCS push/fetch and how many more need to be written.

Description Type Units Total

commit integrations

FilesTransfering(3)

Unspecified(0)

Integration record count.

DVCS - Fetch load revisions

An indication of how many file revisions have been read from the database as part of a DVCS fetch.

Description Type Units Total

fetch load revisions

FilesTransfering(3)

Unspecified(0)

Not applicable.

DVCS - Fetch load integrations

An indication of how many file integrations have been read from the database as part of a DVCS fetch.

Description Type Units Total

fetch load integrations

FilesTransfering(3)

Unspecified(0)

Not applicable.

DVCS - Push load revisions

An indication of how many file revisions have been read from the database as part of a DVCS push.

Description Type Units Total

push load revisions

FilesTransfering(3)

Unspecified(0)

Not applicable.

DVCS - Push load integrations

An indication of how many file integrations have been read from the database as part of a DVCS fetch.

Description Type Units Total

push load integrations

FilesTransfering(3)

Unspecified(0)

Not applicable.

DVCS - Fetch archives

An indication of how many archives have been transferred as part of a DVCS fetch and how many are left to transfer.

Description Type Units Total

fetch archives

FilesTransfering(3)

Unspecified(0)

The number of archives to transfer.

DVCS - Push archives

An indication of how many archives have been transferred as part of a DVCS fetch and how many are left to transfer.

Description Type Units Total

push archive

FilesTransfering(3)

Unspecified(0)

The number of archives to transfer.

Unzip - Check revisions

An indication of how many file revisions have been checked as part of a p4 unzip operation and how many more need to be processed.

Description Type Units Total

unzip check revisions

FilesTransfering(3)

Unspecified(0)

Revision record count.

Unzip - Check integrations

An indication of how many file integrations have been checked as part of a p4 unzip operation and how many more need to be processed.

Description Type Units Total

unzip check integrations

FilesTransfering(3)

Unspecified(0)

Integration record count.

Unzip - Commit revisions

An indication of how many file revisions have been written to the database as part of a p4 unzip operation and how many more need to be written.

Description Type Units Total

unzip commit revisions

FilesTransfering(3)

Unspecified(0)

Revision record count.

Unzip - Commit integrations

An indication of how many file integrations have been written to the database as part of a p4 unzip operation and how many more need to be written.

Description Type Units Total

unzip commit integrations

FilesTransfering(3)

Unspecified(0)

Revision record count.

Unzip - Unzip archives

An indication of how many archives have been unzipped as part of a p4 unzip operation.

Description Type Units Total

unzip archives

FilesTransfering(3)

Unspecified(0)

Not applicable.

Zip - Zip revisions

An indication of how many file revisions have been read from the database as part of a p4 zip operation.

Description Type Units Total

zip revisions

FilesTransfering(3)

Unspecified(0)

Revision record count.

Zip - Zip integrations

An indication of how many file integrations have been read from the database as part of a p4 zip operation.

Description Type Units Total

zip integrations

FilesTransfering(3)

Unspecified(0)

Not applicable.

Zip - Zip archives

An indication of how many archives have been added to the zip as part of a p4 zip operation.

Description Type Units Total

zip archives

FilesTransfering(3)

Unspecified(0)

Not applicable.