Skip to content

Commit f1d1f5c

Browse files
authored
Add mirroring support for Perforce repositories (#3185)
1 parent 116a1b3 commit f1d1f5c

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#
2+
# CDDL HEADER START
3+
#
4+
# The contents of this file are subject to the terms of the
5+
# Common Development and Distribution License (the "License").
6+
# You may not use this file except in compliance with the License.
7+
#
8+
# See LICENSE.txt included in this distribution for the specific
9+
# language governing permissions and limitations under the License.
10+
#
11+
# When distributing Covered Code, include this CDDL HEADER in each
12+
# file and include the License file at LICENSE.txt.
13+
# If applicable, add the following below this CDDL HEADER, with the
14+
# fields enclosed by brackets "[]" replaced with your own identifying
15+
# information: Portions Copyright [yyyy] [name of copyright owner]
16+
#
17+
# CDDL HEADER END
18+
#
19+
20+
#
21+
# Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
22+
#
23+
# Portions Copyright 2020 Robert Williams
24+
25+
from ..utils.command import Command
26+
from .repository import Repository, RepositoryException
27+
from shutil import which
28+
29+
30+
class PerforceRepository(Repository):
31+
def __init__(self, logger, path, project, command, env, hooks, timeout):
32+
33+
super().__init__(logger, path, project, command, env, hooks, timeout)
34+
35+
if command:
36+
self.command = command
37+
else:
38+
self.command = which("p4")
39+
40+
if not self.command:
41+
raise RepositoryException("Cannot get perforce command")
42+
43+
def reposync(self):
44+
perforce_command = [self.command, "sync"]
45+
cmd = self.getCommand(perforce_command, work_dir=self.path,
46+
env_vars=self.env, logger=self.logger)
47+
cmd.execute()
48+
self.logger.info("output of {}:".format(perforce_command))
49+
self.logger.info(cmd.getoutputstr())
50+
if cmd.getretcode() != 0 or cmd.getstate() != Command.FINISHED:
51+
cmd.log_error("failed to perform sync")
52+
return 1
53+
return 0

opengrok-tools/src/main/python/opengrok_tools/scm/repofactory.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
#
2121
# Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
2222
#
23+
# Portions Copyright 2020 Robert Williams
2324

2425
import logging
2526

2627
from .cvs import CVSRepository
2728
from .git import GitRepository
2829
from .mercurial import MercurialRepository
30+
from .perforce import PerforceRepository
2931
from .repo import RepoRepository
3032
from .svn import SubversionRepository
3133
from .teamware import TeamwareRepository
@@ -74,6 +76,10 @@ def get_repository(path, repo_type, project,
7476
return GitRepository(logger, path, project,
7577
commands.get("git"),
7678
env, hooks, timeout)
79+
elif repo_lower == "perforce":
80+
return PerforceRepository(logger, path, project,
81+
commands.get("perforce"),
82+
env, hooks, timeout)
7783
elif repo_lower == "repo":
7884
return RepoRepository(logger, path, project,
7985
commands.get("repo"),

0 commit comments

Comments
 (0)