ClientProgress - progress indicators for P4 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
Number of items CPU_ITEMS 6
Number of directories CPU_DIRS 7

Additional progress types or progress units might be added in future releases of P4 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

Introduced

Meaning

SendFile

CPT_SENDFILE

1

2012.2

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

2012.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 P4 Server.

Files

CPT_FILES

3

2012.2

Miscellaneous file events. This replaces CPT_FILESTRANS (still defined for backwards compatibility) but uses the same type value (3) because not all file events involve transfers.

Computation

CPT_COMPUTATION

4

2012.2

Computation performed server-side.

Items

 

CPT_ITEMS

 

5

 

2015.1

Revisions, integrations, and other items that are not files.

Dirs CPT_DIRS 6 2015.1 Directories transmitted.
DeleteFile CPT_DELFILE 7 2015.1 Files deleted.

Additional progress types or progress units might be added in future releases of P4 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.

Delete File

Description Type Units Total

The local path to the file being deleted.
This progress notification is to indicate that a file delete happened.
This might happen during a sync, and would be included in the total files to sync, so is useful for tracking sync progress.
Introduced in the 2025.1 P4API, but backwards compatible with older servers.

DeleteFile(7)

Files(2)

Always 1

ReconcileAdd

Description Type Units Total

Reconcile Add.
This progress notification increments as each directory of files is scanned for new files.
Introduced in the 2025.1 P4API, and requires a 2025.1 or higher server.

Dirs(6)

Dirs(7)

Unspecified(0)

ReconcileEdit

Description Type Units Total

Reconcile Edit.
This progress notification increments for each file being checked for modification or delete.
Updates are rate limited at 500ms.
Introduced in the 2025.1 P4API, and requires a 2025.1 or higher server.

Files(3)

Files(2)

Number of files to check.

ReconcileMatchDigest

Description Type Units Total

Matching digest.
This progress notification increments for each file matched.
Updates are rate limited at 500ms.
Introduced in the 2025.1 P4API, and requires a 2025.1 or higher server.

Files(3)

Files(2)

Number of deleted files to attempt to match to an add by exact digest.

ReconcileMatchContent

Description Type Units Total

Matching content.
This progress notification increments for each file diffed.
Updates are rate limited at 500ms.
Introduced in the 2025.1 P4API, and requires a 2025.1 or higher server.

Files(3)

Files(2)

Number of deleted files to diff against added files

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)

Files(2)

Prior to 2025.1, was Unspecified(0).

Number of files to be transferred.

DVCS - Check revisions

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 revisions

Prior to 2025.1, was check files

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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)

Files(2)

Prior to 2025.1, was 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)

Files(2)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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)

Files(2)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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

Items(5)

Prior to 2025.1, was FilesTransfering(3)

Items(6)

Prior to 2025.1, was 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)

Files(2)

Prior to 2025.1, was Unspecified(0)

Not applicable.