Problema de control de versiones
omegaUp utiliza Git para el control de versiones de problemas, lo que permite realizar un seguimiento completo del historial, actualizaciones atómicas y fijación de versiones para concursos.
Descripción general
Cada problema es un repositorio Git que contiene:
- Declaraciones de problemas (varios idiomas)
- Casos de prueba (entradas y salidas esperadas)
- Validadores personalizados (opcional)
- Archivos de problemas interactivos (opcional)
- Ajustes de configuración
Beneficios del control de versiones
Para quienes plantean problemas
- Seguimiento del historial: vea todos los cambios a lo largo del tiempo
- Revertir: volver a cualquier versión anterior
- Modo borrador: prueba los cambios antes de publicarlos.
- Colaboración: múltiples editores con seguimiento de cambios
Para organizadores de concursos
- Fijación de versión: problema de bloqueo en una versión específica
- Consistencia: Misma versión durante todo el concurso
- Independencia: las actualizaciones de problemas no afectan la ejecución de concursos
Sucursales
Estructura de sucursales
refs/
├── heads/
│ ├── master # Published version
│ ├── private # Draft version
│ └── published # Alias for master
└── tags/
├── v1
├── v2
└── contest-2024
Propósitos de la sucursal
| Sucursal | Propósito | Visibilidad |
|---|---|---|
master |
Versión publicada en vivo | Público (si el problema es público) |
private |
Trabajo en progreso | Solo administradores de problemas |
published |
Alias para maestro | Igual que maestro |
Flujo de trabajo
Creando un problema
sequenceDiagram
participant U as User
participant F as Frontend
participant G as GitServer
U->>F: Upload problem ZIP
F->>F: Validate contents
F->>G: Create repository
G->>G: Initialize repo
G->>G: Create initial commit
G->>G: Set master branch
G-->>F: Success
F-->>U: Problem created
Actualizando un problema
sequenceDiagram
participant U as User
participant F as Frontend
participant G as GitServer
U->>F: Upload changes
F->>G: Push to private branch
G-->>F: Commit hash
Note over U,G: Problem visible in draft mode
U->>F: Review changes
F-->>U: Show diff
U->>F: Publish changes
F->>G: Merge private → master
G-->>F: New master hash
F-->>U: Published!
Revertir cambios
sequenceDiagram
participant U as User
participant F as Frontend
participant G as GitServer
U->>F: View history
F->>G: Get commit log
G-->>F: List of commits
F-->>U: Display history
U->>F: Revert to v2
F->>G: Reset master to v2
G-->>F: Done
F-->>U: Reverted
Fijación de versión
En concursos
Al agregar un problema a un concurso:
{
"problem_alias": "sum-two",
"commit": "abc123def456", // Optional: pin to specific version
"points": 100
}
commit, se utiliza el master actual al inicio del concurso.
Durante el concurso
flowchart TD
Submit[Submission] --> Check{Version pinned?}
Check -->|Yes| Pinned[Use pinned commit]
Check -->|No| Current[Use current master]
Pinned --> Grade[Grade submission]
Current --> Grade
Después del concurso
El problema se puede actualizar sin afectar:
- Marcadores del concurso
- Presentaciones históricas
- Integridad del concurso
Historial de confirmaciones
Historial de visualización
Acceso vía API o UI:
GET /api/problem/versions/?problem_alias=sum-two
{
"versions": [
{
"commit": "abc123",
"message": "Fixed test case 5",
"author": "admin",
"timestamp": 1704067200
},
{
"commit": "def456",
"message": "Added edge cases",
"author": "admin",
"timestamp": 1703980800
}
]
}
Confirmar mensajes
Mensajes automáticos para operaciones comunes:
| Operación | Formato de mensaje |
|---|---|
| Crear | "Compromiso inicial" |
| Declaración de actualización | "Declaración actualizada para {lang}" |
| Agregar casos de prueba | "Se agregaron casos de prueba {n}" |
| Cambiar límites | "Límites actualizados: tiempo={t}s, memoria={m}MB" |
Estructura del directorio
Contenido del problema
problem/
├── statements/
│ ├── es.markdown # Spanish statement
│ ├── en.markdown # English statement
│ └── images/
│ └── diagram.png
├── cases/
│ ├── easy.1.in
│ ├── easy.1.out
│ ├── easy.2.in
│ ├── easy.2.out
│ ├── hard.1.in
│ └── hard.1.out
├── solutions/
│ └── solution.cpp
├── validators/
│ └── validator.cpp # Optional
├── interactive/
│ ├── Main.idl # Optional
│ └── Main.cpp
├── settings.json
└── testplan # Optional
configuración.json
{
"Limits": {
"TimeLimit": "1s",
"MemoryLimit": "256MiB",
"OverallWallTimeLimit": "30s",
"OutputLimit": "10240KiB"
},
"Validator": {
"Name": "token-numeric",
"Tolerance": 1e-6
},
"Cases": [
{
"Name": "easy",
"Cases": ["easy.1", "easy.2"],
"Weight": 30
},
{
"Name": "hard",
"Cases": ["hard.1"],
"Weight": 70
}
]
}
Detalles del formato de archivo
Rebaja de declaración
# Problem Title
## Description
Problem description here...
## Input
Input format description...
## Output
Output format description...
## Constraints
- $1 \leq n \leq 10^6$
## Examples
### Input
### Output
## Notes
Additional notes...
Casos de prueba
| Ampliación | Propósito |
|---|---|
.in |
Archivo de entrada |
.out |
Producción esperada |
Convención de nomenclatura:
{group}.{number}.in
{group}.{number}.out
Operaciones API
Obtener la versión actual
GET /api/problem/details/?problem_alias=sum-two
current_version.
Versiones de lista
GET /api/problem/versions/?problem_alias=sum-two
Problema de actualización
POST /api/problem/update/
problem_alias=sum-two
message="Fixed edge case"
contents=<zip file>
update_published=none|non-problemset|all
Publicar borrador
POST /api/problem/updateProblemLevel/
problem_alias=sum-two
update_published=all
Mejores prácticas
Gestión de versiones
- Utilice mensajes significativos: describa qué cambió
- Prueba antes de publicar: utiliza una rama privada
- Fijar concursos: fije siempre los concursos críticos
- Archivar versiones antiguas: etiquetar lanzamientos importantes
Colaboración
- Ediciones coordinadas: un editor a la vez
- Revisar cambios: verifique la diferencia antes de publicar
- Decisiones de documentos: utilice mensajes de confirmación
Preparación del concurso
- Congelar temprano: Fijar las versiones mucho antes del concurso
- Versión fijada de prueba: Verificar con envíos de prueba
- No actualizar durante el concurso: podría causar problemas
Documentación relacionada
- Arquitectura GitServer - Detalles técnicos
- API de problemas - Referencia de API
- Creando problemas - Guía de creación de problemas