Skip to content

Commit

Permalink
Merge branch 'ls/p4-keep-empty-commits' into maint
Browse files Browse the repository at this point in the history
"git p4" used to import Perforce CLs that touch only paths outside
the client spec as empty commits.  It has been corrected to ignore
them instead, with a new configuration git-p4.keepEmptyCommits as a
backward compatibility knob.

* ls/p4-keep-empty-commits:
  git-p4: add option to keep empty commits
  • Loading branch information
Junio C Hamano committed Dec 15, 2015
2 parents 3b65c24 + 4ae048e commit f97f2e5
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 17 deletions.
4 changes: 4 additions & 0 deletions Documentation/git-p4.txt
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,10 @@ git-p4.useClientSpec::
option '--use-client-spec'. See the "CLIENT SPEC" section above.
This variable is a boolean, not the name of a p4 client.

git-p4.keepEmptyCommits::
A changelist that contains only excluded files will be imported
as an empty commit if this boolean option is set to true.

Submit variables
~~~~~~~~~~~~~~~~
git-p4.detectRenames::
Expand Down
44 changes: 27 additions & 17 deletions git-p4.py
Original file line number Diff line number Diff line change
Expand Up @@ -2307,12 +2307,6 @@ def streamP4Files(self, files):
filesToDelete = []

for f in files:
# if using a client spec, only add the files that have
# a path in the client
if self.clientSpecDirs:
if self.clientSpecDirs.map_in_client(f['path']) == "":
continue

filesForCommit.append(f)
if f['action'] in self.delete_actions:
filesToDelete.append(f)
Expand Down Expand Up @@ -2383,25 +2377,41 @@ def streamTag(self, gitStream, labelName, labelDetails, commit, epoch):
gitStream.write(description)
gitStream.write("\n")

def inClientSpec(self, path):
if not self.clientSpecDirs:
return True
inClientSpec = self.clientSpecDirs.map_in_client(path)
if not inClientSpec and self.verbose:
print('Ignoring file outside of client spec: {0}'.format(path))
return inClientSpec

def hasBranchPrefix(self, path):
if not self.branchPrefixes:
return True
hasPrefix = [p for p in self.branchPrefixes
if p4PathStartsWith(path, p)]
if hasPrefix and self.verbose:
print('Ignoring file outside of prefix: {0}'.format(path))
return hasPrefix

def commit(self, details, files, branch, parent = ""):
epoch = details["time"]
author = details["user"]

if self.verbose:
print "commit into %s" % branch

# start with reading files; if that fails, we should not
# create a commit.
new_files = []
for f in files:
if [p for p in self.branchPrefixes if p4PathStartsWith(f['path'], p)]:
new_files.append (f)
else:
sys.stderr.write("Ignoring file outside of prefix: %s\n" % f['path'])
print('commit into {0}'.format(branch))

if self.clientSpecDirs:
self.clientSpecDirs.update_client_spec_path_cache(files)

files = [f for f in files
if self.inClientSpec(f['path']) and self.hasBranchPrefix(f['path'])]

if not files and not gitConfigBool('git-p4.keepEmptyCommits'):
print('Ignoring revision {0} as it would produce an empty commit.'
.format(details['change']))
return

self.gitStream.write("commit %s\n" % branch)
self.gitStream.write("mark :%s\n" % details["change"])
self.committedChanges.add(int(details["change"]))
Expand All @@ -2425,7 +2435,7 @@ def commit(self, details, files, branch, parent = ""):
print "parent %s" % parent
self.gitStream.write("from %s\n" % parent)

self.streamP4Files(new_files)
self.streamP4Files(files)
self.gitStream.write("\n")

change = int(details["change"])
Expand Down
134 changes: 134 additions & 0 deletions t/t9826-git-p4-keep-empty-commits.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
#!/bin/sh

test_description='Clone repositories and keep empty commits'

. ./lib-git-p4.sh

test_expect_success 'start p4d' '
start_p4d
'

test_expect_success 'Create a repo' '
client_view "//depot/... //client/..." &&
(
cd "$cli" &&
mkdir -p subdir &&
>subdir/file1.txt &&
p4 add subdir/file1.txt &&
p4 submit -d "Add file 1" &&
>file2.txt &&
p4 add file2.txt &&
p4 submit -d "Add file 2" &&
>subdir/file3.txt &&
p4 add subdir/file3.txt &&
p4 submit -d "Add file 3" &&
>file4.txt &&
p4 add file4.txt &&
p4 submit -d "Add file 4" &&
p4 delete subdir/file3.txt &&
p4 submit -d "Remove file 3" &&
p4 delete file4.txt &&
p4 submit -d "Remove file 4"
)
'

test_expect_success 'Clone repo root path with all history' '
client_view "//depot/... //client/..." &&
test_when_finished cleanup_git &&
(
cd "$git" &&
git init . &&
git p4 clone --use-client-spec --destination="$git" //depot@all &&
cat >expect <<-\EOF &&
Remove file 4
[git-p4: depot-paths = "//depot/": change = 6]
Remove file 3
[git-p4: depot-paths = "//depot/": change = 5]
Add file 4
[git-p4: depot-paths = "//depot/": change = 4]
Add file 3
[git-p4: depot-paths = "//depot/": change = 3]
Add file 2
[git-p4: depot-paths = "//depot/": change = 2]
Add file 1
[git-p4: depot-paths = "//depot/": change = 1]
EOF
git log --format=%B >actual &&
test_cmp expect actual
)
'

test_expect_success 'Clone repo subdir with all history but keep empty commits' '
client_view "//depot/subdir/... //client/subdir/..." &&
test_when_finished cleanup_git &&
(
cd "$git" &&
git init . &&
git config git-p4.keepEmptyCommits true &&
git p4 clone --use-client-spec --destination="$git" //depot@all &&
cat >expect <<-\EOF &&
Remove file 4
[git-p4: depot-paths = "//depot/": change = 6]
Remove file 3
[git-p4: depot-paths = "//depot/": change = 5]
Add file 4
[git-p4: depot-paths = "//depot/": change = 4]
Add file 3
[git-p4: depot-paths = "//depot/": change = 3]
Add file 2
[git-p4: depot-paths = "//depot/": change = 2]
Add file 1
[git-p4: depot-paths = "//depot/": change = 1]
EOF
git log --format=%B >actual &&
test_cmp expect actual
)
'

test_expect_success 'Clone repo subdir with all history' '
client_view "//depot/subdir/... //client/subdir/..." &&
test_when_finished cleanup_git &&
(
cd "$git" &&
git init . &&
git p4 clone --use-client-spec --destination="$git" --verbose //depot@all &&
cat >expect <<-\EOF &&
Remove file 3
[git-p4: depot-paths = "//depot/": change = 5]
Add file 3
[git-p4: depot-paths = "//depot/": change = 3]
Add file 1
[git-p4: depot-paths = "//depot/": change = 1]
EOF
git log --format=%B >actual &&
test_cmp expect actual
)
'

test_expect_success 'kill p4d' '
kill_p4d
'

test_done

0 comments on commit f97f2e5

Please sign in to comment.