# Perforce

Sistema de control de versiones comercial, propietario y centralizado desarrollado por Perforce Software, Inc.

## Arquitectura

Funciona en modo cliente/servidor. El servidor gestiona una base de datos central que contiene uno o más repositorios (depots) con versiones de los ficheros. Los clientes importan los ficheros del repositorio a su taller de trabajo (workspace) para trabajar en ellos, y posteriormente los devuelven modificados agrupados en listas de cambio. La conexión se realiza mediante TCP usando protocolos propietarios de RPC y streaming.
Es posible configurar un conjunto de servidores en cluster, establecer un par de servidores trabajando en modo máster/réplica, y bien configurar un broker que establezca reglas direccionamiento al servidor adecuado para los clientes.
Para aquellos sitios remotos donde el ancho de banda es una limitación, el proxy de Perforce media entre los clientes y el servidor y almacena las revisiones de ficheros frecuentemente transmitidas. De este modo se reduce la demanda de ancho de banda en servidor y la red.
La funcionalidad Sandbox introducida en el cliente 2012.1 permite un acercamento al funcionamiento en modo distribuido (DRCS).

### Servidor

    Base de datos
Perforce cuenta con una base de datos propietaria, pre-configurada y pre-instalada que almacena los metadatos de los ficheros almacenados en el repositorio (estado, historia de las ramificaciones y reencuentros, listas de cambios, descripciones de cambios, usuarios, grupos, etiquetas...). En la base de datos se almacena solo el hash (MD5) del fichero, el cual se almacena en el repositorio, de modo que se puede comprobar su integridad. Las tablas de la base de datos se almacenan en formato binario. Los puntos de control (checkpoints) y logs se almacenan en formato texto, los cuales pueden ser comprimidos y descargados. De esta manera es posible recuperar una base de datos que se haya corrompido por fallo hardware u otra calamidad. Los administradores pueden preparar la recuperación de desastres programando logs y configurando la periodicidad de los puntos de control.
    Repositorio
Los distintos ficheros y sus versiones son almacenados en una estructura de directorios denominada repositorio. Las revisiones de los ficheros de texto se almacenan como deltas RCS, mientras que los binarios se almacenan íntegramente. Los ficheros de texto se codifican bien en ASCII o Unicode, dependiendo de la configuración del servidor. Los ficheros en el repositorio no están cifrados. Las revisiones que son ramificación o copia de otras revisiones se mantienen como copia virtual dentro del repositorio. Se guardan todas las revisiones por defecto, aunque se puede limitar el número de versiones que guarda el repositorio. Versiones obsoletas de los ficheros pueden ser purgadas por el administrador. Se ha de hacer copia de seguridad de los ficheros del repositorio.

### Clientes

Los clientes de Perforce se agrupan en cuatro categorías:
* comandos
* entorno gráfico
* web
* plugins.
La interfaz básica para introducir comandos se denomina P4. Puede utilizarse en la ventana de comandos de cualquier sistema operativo o script. Produce siempre salida en modo texto, que puede incluir etiquetas, o bien scripts Python o Ruby. Están disponibles también APIs nativos en C++ y Java, así como Lua, Perl Python, PHP, Objective-C y Ruby, todas ellas implementadas sobre el API C++. Mediante comandos se puede ejecutar toda la funcionalidad del cliente, que se puede usar con la sintaxis de nombres de fichero nativa del sistema operativo o bien con la sintaxis neutra de Perforce. Hay disponibles dos interfaces gráficas, la genérica basada en Qt y llamada P4V, y la de Windows P4WIN. Ambas soportan la mayoría de operaciones administrativas. P4Admin -como P4V- está basada en Gt y se puede portar entre plataformas. P4V y P4Admin pueden extenderse con scripts escritos en JavaScript y HTML. P4Web proporciona interfaz Web, y funciona tanto como un cliente perforce como un servidor HTTP independiente. P4Web puede ejecutarse como un servidor Web compartido para dar acceso a los ficheros del repositorio y a los metadatos. Puede ejecutarse en una máquina cliente, de modo que permite el acceso al Perforce con un navegador. Los plug-ins son programas transparentes al usuario que integran la funcionalidad del cliente Perforce con aplicaciones de terceros. Está disponibles también para integración con entornos y herramientas de desarrollo, con sistemas de revisión de código, de trazado de defectos, con comandos de compilación (make, gmake...), con herramientas de automatización de oficina y con clientes SQL y FTP.

### Control distribuido de revisiones

Perforce tiene varios mecanismos para conseguir un control distribuido de versiones; estos mecanismos pueden ser utilizados independientemente o combinados.
El primero consiste en un servidor proxy que hace caché de las versiones frecuentemente leídas, para reducir el tiempo de acceso de usuarios remotos. Este mecanismo de acomoda a desarrollo en organizaciones cerradas en las que un repositorio controlado centralmente y una base de datos de acceso universal son deseables.
El segundo mecanismo -los llamados repositorios remotos- permite a los usuarios conectados a un servidor acceder a las versiones de ficheros guardadas en otros. Con los repositorios remotos, cada organización controla su propio servidor y hace visible parte de él -o la totalidad- a otros servidores. Este mecanismo puede ser usado por organizaciones de desarrollo dispersas, donde se desea una aproximación peer-to-peer.
El nuevo modo de funcionamiento Sandbox (versión del cliente visual 2012.1) permite también utilizar cada cliente como un nodo autónomo y funcionar sin conexión permanente con el servidor. Se intenta con esta extensión de la arquitectura aunar las ventajas de los SCM centralizados con las de los distribuidos.

## Características

* El servidor mantiene la historia completa de los metadatos y de los ficheros
* En servidor mantiene la historia completa de la historia de revisiones de ficheros ramificados, renombrados, movidos, copiados y borrados
* El cliente realiza la fusión de ficheros a tres bandas (three-way text file merging), realiza seguimiento de fusiones y previene las refusiones mediante detección de ancestro común
* El cliente hace presentaciones gráficas de diferencias, fusiones y herramientas de reconciliación
* Se presenta una visión gráfica de históricos y ramificaciones
* La interfaz administrativa funciona de modo gráfico
* Soporte para control distribuido de versiones
* Listas de cambio: los ficheros modificados pueden agruparse y manejarse como unidades lógicas
* Modificaciones atómicas: al servidor hace que las listas de cambio se actualicen de manera indivisible
* Aparcamiento: se puede almacenar temporalmente el trabajo en curso para cambiar de tarea
* Soporte para ficheros ASCII, Unicode, binario, enlaces simbólicos, específicos de Mac y UTF-16
* Soporta internacionalización y localización
* Expansión de palabras clave estilo RCS
* Compresión de ficheros para transmisión y almacenamiento
* Un servidor Unix o Windows soporta clientes en cualquier sistema operativo
* Disparadores de eventos en el servidor
* SDK para integración con sistemas externos
* Envío de alertas de cambios mediante RSS o correo electrónico
* Replicación de ficheros y metadatos
* Gestor para implementación de políticas locales, restricción de comandos o redirección a servidores alternativos
* Paso de ficheros a histórico para liberar espacio en disco

## Modelo de concurrencia

Perforce ofrece un modelo mixto de concurrencia en cuanto a injerto (merge) y bloqueo de versiones. En sistemas similares, los usuarios tampoco han de bloquear los ficheros para trabajar con ellos, pero se les requiere que resuelvan problemas de concurrencia con ficheros confirmados por otros antes de confirmar sus propios cambios. Opcionalmente pueden bloquear ficheros para evitar dichos problemas de concurrencia. El modelo de Perforce es ligeramente diferente y los usuarios no necesitan informar al sistema acerca de los ficheros que pretenden cambiar, incluso sin bloquearlos. Al notificar intenciones de cambio se ponen los ficheros en una lista de cambios (changelist) pendientes que se envía al servidor. Esto permite a otros usuarios trabajar sobre los mismos ficheros, de modo que los usuarios otros están trabajando en paralelo pueden coordinarse antes de realizar cambios difíciles de injertar (merge). Perforce favorece este requisito de notificación avanzada dando permiso de solo lectura a los ficheros del taller local (workspace) tras extraerlos del repositorio. Los usuarios pueden saltarse este requisito -voluntariamente o por necesidad (p.e. cuando trabajan sin conexión)- ignorando los permisos y modificando los ficheros a su antojo. Es responsabilidad del usuario, en ese caso, recurrir a Perforce para reconcilar este trabajo realizado en desconexión, poniéndolos en una lista de cambios pendientes de modo que puedan ser cometidos (submited). (Es también responsabilidad de los usuarios dejar los ficheros en estado de escritura tras su modificación. Un fichero de solo lectura que no figure en una lista de cambios pendientes es considerado por Perforce como candidato a ser repuesto).

## Ramificaciones e injertos

Los ficheros se identifican unívocamente por su nombre completo (e.g. //repositorio/principal/src/index.cpp). Cualquier versión de fichero no borrado puede ser ramificado. Perforce usa ramificación inter-fichero, por la que se crea un nuevo fichero con nuevo nombre. Por ejemplo mi/index.php puede ramificarse en tu/index.php, y cada uno puede evolucionar independientemente. Las ramas del repositorio se nombran habitualmente con el nombre del conjunto de ficheros ramificados. Por ejemplo los ficheros en //repositorio/principal pueden ser ramificados en del directorio //repositorio/version1.0, con lo que obtendremos dos ramas que pueden evolucionar independientemente, y que eventualmente pueden injertarse. En Perforce la operación que injerta los cambios de una rama en otra se denomina integración. La integración propaga los cambios entre un conjunto de ficheros donantes y otro correspondiente de receptores; existe la opción de definir ramificaciones opcionales, que pueden asignar correspondencias donante-receptor específicas. Por defecto, la integración propaga todos los cambios pendientes en los donantes, pero también pueden limitarse a listas de cambio, fechas, etiquetas, nombres de fichero o patrón de nombre de fichero escogidos. El sistema registra todas las integraciones, las usa para seleccionar ancestros comunes para injertos, y no hace por defecto integraciones redundantes. El injerto (merging) es sólo uno de los tres posibles modos de integración. Los otros se denominan desestimación (ignoring) y promoción (promoting). Injerto es usado para mantener actualizado un conjunto de ficheros con otro. Por ejemplo, una ramificación de desarrollo puede mantenerse actualizada con la principal mediante repetidos injertos. La desestimación ignora los cambios en un conjunto de ficheros de cara a futuras integraciones con otro. Se suele utilizar cuando una ramificación de desarrollo se quiere mantener actualizada, y sin embargo diferente, con la principal. La promoción se utiliza típicamente para promocionar al contenido de una ramificación de desarrollo con la principal. La ramificación también soporta ficheros renombrados (o movidos). El comando move ramifica los ficheros originales a nuevos y borra el original. Un fichero ramificado no se diferencia de un fichero añadido; los ficheros ramificados se consideran iguales a su original, no descendientes. El sistema hace el seguimiento del origen de los ficheros, y hace referencia a ellos cuando se muestra la historia de ficheros que han sido renombrados.

## Streams

En la versión 2011.1 Perforce introdujo una agrupación de ficheros en paquetes o grupos correspondientes a una versión. El modelo streams permite crear una nueva rama -y posteriormente injertar cada uno de los ficheros que la componen- en una sola operación, sufriendo cada uno de los ficheros afectados el mismo proceso de ramificaciones e injertos descrito más arriba.
La funcionalidad de streams ofrece una innovadora manera de gestionar el desarrollo concurrente, las dependencias y otras actividades comunes en ramificación y publicación de versiones. Los streams proporcionan a los proyectos un marco en el que se establecen flujos de trabajo basados en las mejores prácticas observadas en años de desarrollo. Los streams son lo suficientemente flexibles para acomodar muchos modelos de ramificación en desarrollo, incluyendo el de línea principal y promociones adecuado a desarrollo de sitios Web.
La migración de un proyecto ya existente a streams requiere alguna planificación. Aunque la mecánica de mover los datos a un depósito con streams es directa, otros puntos han de ser considerados, como el impacto en usuarios y herramientas. El cambio a streams ofrece un productivo flujo de trabajo y resuelve tradicionales cuellos de botella.

## Funcionamiento sin conexión

A partir del cliente visual versión 2012.1 podemos trabajar sin conexión con el servidor (siempre que la versión de este sea al menos la 2010.2). Podemos hacer que nuestro cliente P4V se convierta el un satélite del servidor y realizar las mismas funciones que hacemos cuando hay conexión con el servidor pero contra la copia de datos locales, reconciliándose los datos cuando se establezca la conexión, que puede hacerse con una periodicidad programable. Esta funcionalidad es denominada Sandbox.

## Control de acceso y seguridad

El servidor Perforce almacena el contenido de cada fichero en un repositorio maestro al que, cuando se instala adecuadamente, no tienen acceso los usuarios. El acceso de los usuarios a los ficheros se controla por uno o más superusuarios Perforce. Se les puede otorgar un amplio rango de derechos de acceso. Se puede establecer protección a nivel de directorio, usuario y dirección IP. El servidor puede auditar el acceso de usuarios para cumplimiento de normativa legal (LOPD, SOX, FDA, normativa ISO, Aseguramiento de la calidad...).
La autenticación de los usuarios es controlada por el administrador del sistema Perforce. Este puede configurar la fortaleza de la clave, de igual modo se puede configurar acceso mediante tickets. Los triggers (programas o scripts de usuario que se disparan según eventos predefinidos) pueden asociarse a casi todos los comandos Perforce, y pueden ser empleados para conexión a un sistema externo de autenticación (LDAP, SSO...), para bloquear o permitir determinados comandos, o para restringir o normalizar las modificaciones de ficheros. Los triggers se ejecutan en el servidor y no tienen acceso a las máquinas cliente.
Perforce, como casi todos los sistemas de control de versiones, no cifra el contenido de los ficheros ni en el servidor ni en las máquinas cliente, ni tampoco cifra su transmisión. Es posible utilizar un protocolo de túnel -p.e. VPN o SSH- para asegurar las transferencias. Para asegurar globalmente en contenido de Perforce es necesario implementar adecuadamente la protección de los ficheros, la autenticación y el uso de túneles cifrados para la comunicación con el servidor.
El cliente Perforce confía plenamente en el servidor. Esto significa que el servidor tiene control total la cuenta del usuario del cliente, incluyendo la lectura y escritura de todos los ficheros del usuario. En entornos en los que el servidor Perforce esté gestionado por un tercero, puede suponer una cierta amenaza a la seguridad y privacidad del cliente.

## Disponibilidad

Están disponibles descargas de evaluación del servidor Perforce, del cliente y de los plugins en el website de Perforce. Típicamente se lanzan dos versiones nuevas de programas servidor y cliente al año, como ejecutables. Están disponibles para Microsoft Windows, Mac OS X, Linux, Solaris, FreeBSD, y otros sistemas operativos.
Está disponible la integración con los siguientes IDE:
* Eclipse
* WebSphere
* ColdFusion
* Dreamweaver
* CodeWright
* IAR Embedded Workbench
* Visual Studio
* Primalscript
* Zeus
* Komodo
* articy:draft
* BBEdit
* JBuilder
* Embarcadero Delphi
* Delphi
* IntelliJ IDE
* LabVIEW
* PythonWorks
* SlickEdit
El uso del servidor Perforce es gratuito con tal de no superar estos límites:
* Veinte usuarios.
* Veinte espacios de trabajo.
* Número ilimitado de ficheros.
o
* Número ilimiatado de usuarios.
* Mil ficheros.
Si se supera alguno de estas limitaciones debe adquirirse una licencia; las licencias se pueden adquirir a perpetuidad o mediante suscripción. Se suministran licencias gratuitas para desarrollo de software libre, proyectos escolares o académicos y para períodos de evaluación. El uso de los clientes o de los plugins es ilimitado, así como la consulta de la documentación técnica.
La representación en España y Portugal la lleva ds data systems (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última)..

## Base instalada

A fecha de enero de 2012, Perforce cuenta con más de 400000 usuarios en 5500 organizaciones
Los sectores en los que Perforce tiene una especial implantación son:
* Software imbuido
El diseño de hardware, firmware, y soluciones software desafía a los diseñadores a alcanzar nuevos límites de innovación. También les empuja la obligación de lanzar al mercado productos de calidad y puntualmente.
* Banca y finanzas
Las empresas del mundo de la banca, los brokers y la industria de seguros deben reducir costes continuamente, consolidar sus sistemas de información y perseguir un aumento de su margen. Perforce ayuda a más de 100 compañías financieras a desarrollar aplicaciones seguras y de funcionalidad asegurada.
* Desarrollo de juegos
En el mundo del videojuego -ya sea para consola, inalámbricos, para PC y juegos de rol online (MMORPG)- Perforce tiene una gran implantación. Cuentan con él empresas de la talla de:
... y hasta 150 compañías
* Salud/tecnología médica
El desarrollo de software para dispositivos médicos, biotecnología, farmacia y salud tiene unos muy altos requisitos: los equipos son amplios están distribuidos geográficamente, y a la vez el ritmo de desarrollo es frenético y requiere seguir unas estrictas normas diligentemente. Cuando hay vidas en juego y presión del mercado, el pulso no puede fallar.

## Commons

Con Commons perforce extiende el enfoque del control de versiones del código fuente e imágenes a un espectro de fichero binarios mucho más amplio. En ellos se incluyen ficheros word, ficheros powerpoint y pdf.
Commons permite a usuarios no técnicos compartir y versionar su trabajo por medio de una sencilla interfaz web. Esta herramienta permite a los usuarios rápidamente colaborar entre ellos, versionar su trabajo, comprar diferentes versiones, dejar comentarios para terceros y hacer seguimientos de aquello que consideran importante.
La versión más reciente del producto se denomina 2012.4