Skip to content
/ pyforce Public

Python wrapper for Perforce p4 command-line client

License

Notifications You must be signed in to change notification settings

tahv/pyforce

Repository files navigation

Pyforce

License - MIT PyPI - Python Version PyPI - Version Linter - Ruff Types - Mypy CI - Tests Documentation Status

Python wrapper for Perforce p4 command-line client.

Features

  • Python wrapper for the p4 command using marshal.
  • Built with Pydantic.
  • Fully typed.
  • Built for scripting.

Installation

python -m pip install pyforce-p4

Quickstart

import pyforce

connection = pyforce.Connection(host="localhost:1666", user="foo", client="my-client")

# Create a new file in our client
file = "/home/foo/my-client/bar.txt"
fp = open(file, "w")
fp.write("bar")
fp.close()

# Run 'p4 add', open our file for addition to the depot
_, infos = pyforce.add(connection, [file])
print(infos[0])
"""
ActionInfo(
    action='add', 
    client_file='/home/foo/my-client/bar.txt', 
    depot_file='//my-depot/my-stream/bar.txt', 
    file_type='text', 
    work_rev=1
)
"""

# Run 'p4 submit', submitting our local file
pyforce.p4(connection, ["submit", "-d", "Added bar.txt", file])

# Run 'p4 fstat', listing all files in depot
fstats = list(pyforce.fstat(connection, ["//..."]))
print(fstats[0])
"""
FStat(
    client_file='/home/foo/my-client/bar.txt', 
    depot_file='//my-depot/my-stream/bar.txt', 
    head=HeadInfo(
        action=<Action.ADD: 'add'>, 
        change=2, 
        revision=1, 
        file_type='text', 
        time=datetime.datetime(2024, 3, 29, 13, 56, 57, tzinfo=datetime.timezone.utc), 
        mod_time=datetime.datetime(2024, 3, 29, 13, 56, 11, tzinfo=datetime.timezone.utc)
    ), 
    have_rev=1, 
    is_mapped=True, 
    others_open=None
)
"""

Pyforce has functions for the most common p4 commands but can execute more complexe commands with pyforce.p4.

For example, pyforce doesn't have a function to create a new client workspace, here is how to create one using pyforce.p4.

import pyforce

connection = pyforce.Connection(port="localhost:1666", user="foo")

# Create client
command = ["client", "-o", "-S", "//my-depot/my-stream", "my-client"]
data = pyforce.p4(connection, command)[0]
data["Root"] = "/home/foo/my-client"
pyforce.p4(connection, ["client", "-i"], stdin=data)

# Get created client
client = pyforce.get_client(connection,  "my-client")
print(client)
"""
Client(
    name='my-client', 
    host='5bb1735f73fc', 
    owner='foo', 
    root=PosixPath('/home/foo/my-client'), 
    stream='//my-depot/my-stream', 
    type=<ClientType.STANDARD: 'writeable'>, 
    views=[View(left='//my-depot/my-stream/...', right='//my-client/...')]
)
"""

Documentation

See pyforce documentation for more details.

Contributing

For guidance on setting up a development environment and contributing to pyforce, see the Contributing section.