git-p4: support excluding paths on sync

The clone subcommand has long had support for excluding
subdirectories, but sync has not. This is a nuisance,
since as soon as you do a sync, any changed files that
were initially excluded start showing up.

Move the "exclude" command-line option into the parent
class; the actual behavior was already present there so
it simply had to be exposed.

Signed-off-by: Luke Diamand <luke@diamand.org>
Reviewed-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Luke Diamand 2015-01-17 20:56:38 +00:00 committed by Junio C Hamano
parent fdf96a20ac
commit 51334bb094
3 changed files with 84 additions and 13 deletions

View File

@ -241,6 +241,9 @@ Git repository:
Use a client spec to find the list of interesting files in p4.
See the "CLIENT SPEC" section below.
-/ <path>::
Exclude selected depot paths when cloning or syncing.
Clone options
~~~~~~~~~~~~~
These options can be used in an initial 'clone', along with the 'sync'
@ -254,9 +257,6 @@ options described above.
--bare::
Perform a bare clone. See linkgit:git-clone[1].
-/ <path>::
Exclude selected depot paths when cloning.
Submit options
~~~~~~~~~~~~~~
These options can be used to modify 'git p4 submit' behavior.

View File

@ -1915,7 +1915,10 @@ class P4Sync(Command, P4UserMap):
optparse.make_option("--keep-path", dest="keepRepoPath", action='store_true',
help="Keep entire BRANCH/DIR/SUBDIR prefix during import"),
optparse.make_option("--use-client-spec", dest="useClientSpec", action='store_true',
help="Only sync files that are included in the Perforce Client Spec")
help="Only sync files that are included in the Perforce Client Spec"),
optparse.make_option("-/", dest="cloneExclude",
action="append", type="string",
help="exclude depot path"),
]
self.description = """Imports from Perforce into a git repository.\n
example:
@ -1950,6 +1953,12 @@ class P4Sync(Command, P4UserMap):
if gitConfig("git-p4.syncFromOrigin") == "false":
self.syncWithOrigin = False
# This is required for the "append" cloneExclude action
def ensure_value(self, attr, value):
if not hasattr(self, attr) or getattr(self, attr) is None:
setattr(self, attr, value)
return getattr(self, attr)
# Force a checkpoint in fast-import and wait for it to finish
def checkpoint(self):
self.gitStream.write("checkpoint\n\n")
@ -3101,9 +3110,6 @@ class P4Clone(P4Sync):
optparse.make_option("--destination", dest="cloneDestination",
action='store', default=None,
help="where to leave result of the clone"),
optparse.make_option("-/", dest="cloneExclude",
action="append", type="string",
help="exclude depot path"),
optparse.make_option("--bare", dest="cloneBare",
action="store_true", default=False),
]
@ -3111,12 +3117,6 @@ class P4Clone(P4Sync):
self.needsGit = False
self.cloneBare = False
# This is required for the "append" cloneExclude action
def ensure_value(self, attr, value):
if not hasattr(self, attr) or getattr(self, attr) is None:
setattr(self, attr, value)
return getattr(self, attr)
def defaultDestination(self, args):
## TODO: use common prefix of args?
depotPath = args[0]

71
t/t9817-git-p4-exclude.sh Executable file
View File

@ -0,0 +1,71 @@
#!/bin/sh
test_description='git p4 tests for excluded paths during clone and sync'
. ./lib-git-p4.sh
test_expect_success 'start p4d' '
start_p4d
'
# Create a repo with the structure:
#
# //depot/wanted/foo
# //depot/discard/foo
#
# Check that we can exclude a subdirectory with both
# clone and sync operations.
test_expect_success 'create exclude repo' '
(
cd "$cli" &&
mkdir -p wanted discard &&
echo wanted >wanted/foo &&
echo discard >discard/foo &&
p4 add wanted/foo discard/foo &&
p4 submit -d "initial revision"
)
'
test_expect_success 'check the repo was created correctly' '
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot/...@all &&
(
cd "$git" &&
test_path_is_file wanted/foo &&
test_path_is_file discard/foo
)
'
test_expect_success 'clone, excluding part of repo' '
test_when_finished cleanup_git &&
git p4 clone -//depot/discard/... --dest="$git" //depot/...@all &&
(
cd "$git" &&
test_path_is_file wanted/foo &&
test_path_is_missing discard/foo
)
'
test_expect_success 'clone, then sync with exclude' '
test_when_finished cleanup_git &&
git p4 clone -//depot/discard/... --dest="$git" //depot/...@all &&
(
cd "$cli" &&
p4 edit wanted/foo discard/foo &&
date >>wanted/foo &&
date >>discard/foo &&
p4 submit -d "updating" &&
cd "$git" &&
git p4 sync -//depot/discard/... &&
test_path_is_file wanted/foo &&
test_path_is_missing discard/foo
)
'
test_expect_success 'kill p4d' '
kill_p4d
'
test_done