Skip to content

Commit

Permalink
Merge branch 'pw/git-p4'
Browse files Browse the repository at this point in the history
Various "git p4" updates.

* pw/git-p4:
  git p4 doc: use two-line style for options with multiple spellings
  git p4 test: examine behavior with locked (+l) files
  git p4: fix an error message when "p4 where" fails
  git p4: handle files with wildcards when doing RCS scrubbing
  git p4 test: do not pollute /tmp
  git p4 test: run as user "author"
  git p4 test: is_cli_file_writeable succeeds
  git p4 test: explicitly check p4 wildcard delete
  git p4: work around p4 bug that causes empty symlinks
  git p4 test: ensure p4 symlink parsing works
  git p4 test: wildcards are supported
  • Loading branch information
Junio C Hamano committed Jan 27, 2014
2 parents 33d4669 + f84cb68 commit 523f0a2
Show file tree
Hide file tree
Showing 10 changed files with 342 additions and 44 deletions.
6 changes: 4 additions & 2 deletions Documentation/git-p4.txt
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,8 @@ All commands except clone accept these options.
--git-dir <dir>::
Set the 'GIT_DIR' environment variable. See linkgit:git[1].

--verbose, -v::
-v::
--verbose::
Provide more progress information.

Sync options
Expand Down Expand Up @@ -279,7 +280,8 @@ These options can be used to modify 'git p4 submit' behavior.
Export tags from Git as p4 labels. Tags found in Git are applied
to the perforce working directory.

--dry-run, -n::
-n::
--dry-run::
Show just what commits would be submitted to p4; do not change
state in Git or p4.

Expand Down
17 changes: 12 additions & 5 deletions git-p4.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,8 @@ def split_p4_type(p4type):
#
# return the raw p4 type of a file (text, text+ko, etc)
#
def p4_type(file):
results = p4CmdList(["fstat", "-T", "headType", file])
def p4_type(f):
results = p4CmdList(["fstat", "-T", "headType", wildcard_encode(f)])
return results[0]['headType']

#
Expand Down Expand Up @@ -1220,7 +1220,7 @@ def edit_template(self, template_file):
editor = os.environ.get("P4EDITOR")
else:
editor = read_pipe("git var GIT_EDITOR").strip()
system(editor + " " + template_file)
system([editor, template_file])

# If the file was not saved, prompt to see if this patch should
# be skipped. But skip this verification step if configured so.
Expand Down Expand Up @@ -1871,7 +1871,7 @@ def update_client_spec_path_cache(self, files):
# assume error is "... file(s) not in client view"
continue
if "clientFile" not in res:
die("No clientFile from 'p4 where %s'" % depot_path)
die("No clientFile in 'p4 where' output")
if "unmap" in res:
# it will list all of them, but only one not unmap-ped
continue
Expand Down Expand Up @@ -2075,7 +2075,14 @@ def streamOneP4File(self, file, contents):
# p4 print on a symlink sometimes contains "target\n";
# if it does, remove the newline
data = ''.join(contents)
if data[-1] == '\n':
if not data:
# Some version of p4 allowed creating a symlink that pointed
# to nothing. This causes p4 errors when checking out such
# a change, and errors here too. Work around it by ignoring
# the bad symlink; hopefully a future change fixes it.
print "\nIgnoring empty symlink in %s" % file['depotFile']
return
elif data[-1] == '\n':
contents = [data[:-1]]
else:
contents = [data]
Expand Down
23 changes: 21 additions & 2 deletions t/lib-git-p4.sh
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,22 @@ P4DPORT=$((10669 + ($testid - $git_p4_test_start)))

P4PORT=localhost:$P4DPORT
P4CLIENT=client
P4EDITOR=:
P4USER=author
P4EDITOR=true
unset P4CHARSET
export P4PORT P4CLIENT P4EDITOR P4CHARSET
export P4PORT P4CLIENT P4USER P4EDITOR P4CHARSET

db="$TRASH_DIRECTORY/db"
cli="$TRASH_DIRECTORY/cli"
git="$TRASH_DIRECTORY/git"
pidfile="$TRASH_DIRECTORY/p4d.pid"

# git p4 submit generates a temp file, which will
# not get cleaned up if the submission fails. Don't
# clutter up /tmp on the test machine.
TMPDIR="$TRASH_DIRECTORY"
export TMPDIR

start_p4d() {
mkdir -p "$db" "$cli" "$git" &&
rm -f "$pidfile" &&
Expand Down Expand Up @@ -96,12 +103,24 @@ start_p4d() {
return 1
fi

# build a p4 user so author@example.com has an entry
p4_add_user author

# build a client
client_view "//depot/... //client/..." &&

return 0
}

p4_add_user() {
name=$1 &&
p4 user -f -i <<-EOF
User: $name
Email: $name@example.com
FullName: Dr. $name
EOF
}

kill_p4d() {
pid=$(cat "$pidfile")
# it had better exist for the first kill
Expand Down
83 changes: 83 additions & 0 deletions t/t9802-git-p4-filetype.sh
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,89 @@ test_expect_success 'ignore apple' '
)
'

test_expect_success SYMLINKS 'create p4 symlink' '
cd "$cli" &&
ln -s symlink-target symlink &&
p4 add symlink &&
p4 submit -d "add symlink"
'

test_expect_success SYMLINKS 'ensure p4 symlink parsed correctly' '
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot@all &&
(
cd "$git" &&
test -L symlink &&
test $(readlink symlink) = symlink-target
)
'

test_expect_success SYMLINKS 'empty symlink target' '
(
# first create the file as a file
cd "$cli" &&
>empty-symlink &&
p4 add empty-symlink &&
p4 submit -d "add empty-symlink as a file"
) &&
(
# now change it to be a symlink to "target1"
cd "$cli" &&
p4 edit empty-symlink &&
p4 reopen -t symlink empty-symlink &&
rm empty-symlink &&
ln -s target1 empty-symlink &&
p4 add empty-symlink &&
p4 submit -d "make empty-symlink point to target1"
) &&
(
# Hack the p4 depot to make the symlink point to nothing;
# this should not happen in reality, but shows up
# in p4 repos in the wild.
#
# The sed expression changes this:
# @@
# text
# @target1
# @
# to this:
# @@
# text
# @@
#
cd "$db/depot" &&
sed "/@target1/{; s/target1/@/; n; d; }" \
empty-symlink,v >empty-symlink,v.tmp &&
mv empty-symlink,v.tmp empty-symlink,v
) &&
(
# Make sure symlink really is empty. Asking
# p4 to sync here will make it generate errors.
cd "$cli" &&
p4 print -q //depot/empty-symlink#2 >out &&
test ! -s out
) &&
test_when_finished cleanup_git &&
# make sure git p4 handles it without error
git p4 clone --dest="$git" //depot@all &&
# fix the symlink, make it point to "target2"
(
cd "$cli" &&
p4 open empty-symlink &&
rm empty-symlink &&
ln -s target2 empty-symlink &&
p4 submit -d "make empty-symlink point to target2"
) &&
cleanup_git &&
git p4 clone --dest="$git" //depot@all &&
(
cd "$git" &&
test $(readlink empty-symlink) = target2
)
'

test_expect_success 'kill p4d' '
kill_p4d
'
Expand Down
6 changes: 4 additions & 2 deletions t/t9805-git-p4-skip-submit-edit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ test_expect_success 'init depot' '
)
'

# this works because EDITOR is set to :
# this works because P4EDITOR is set to true
test_expect_success 'no config, unedited, say yes' '
git p4 clone --dest="$git" //depot &&
test_when_finished cleanup_git &&
Expand Down Expand Up @@ -90,7 +90,9 @@ test_expect_success 'no config, edited' '
cd "$git" &&
echo line >>file1 &&
git commit -a -m "change 5" &&
P4EDITOR="" EDITOR="\"$TRASH_DIRECTORY/ed.sh\"" git p4 submit &&
P4EDITOR="$TRASH_DIRECTORY/ed.sh" &&
export P4EDITOR &&
git p4 submit &&
p4 changes //depot/... >wc &&
test_line_count = 5 wc
)
Expand Down
2 changes: 1 addition & 1 deletion t/t9807-git-p4-submit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ test_expect_success 'init depot' '
)
'

test_expect_failure 'is_cli_file_writeable function' '
test_expect_success 'is_cli_file_writeable function' '
(
cd "$cli" &&
echo a >a &&
Expand Down
16 changes: 8 additions & 8 deletions t/t9809-git-p4-client-view.sh
Original file line number Diff line number Diff line change
Expand Up @@ -76,28 +76,28 @@ test_expect_success 'init depot' '
'

# double % for printf
test_expect_success 'unsupported view wildcard %%n' '
test_expect_success 'view wildcard %%n' '
client_view "//depot/%%%%1/sub/... //client/sub/%%%%1/..." &&
test_when_finished cleanup_git &&
test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
git p4 clone --use-client-spec --dest="$git" //depot
'

test_expect_success 'unsupported view wildcard *' '
test_expect_success 'view wildcard *' '
client_view "//depot/*/bar/... //client/*/bar/..." &&
test_when_finished cleanup_git &&
test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
git p4 clone --use-client-spec --dest="$git" //depot
'

test_expect_success 'wildcard ... only supported at end of spec 1' '
test_expect_success 'wildcard ... in the middle' '
client_view "//depot/.../file11 //client/.../file11" &&
test_when_finished cleanup_git &&
test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
git p4 clone --use-client-spec --dest="$git" //depot
'

test_expect_success 'wildcard ... only supported at end of spec 2' '
test_expect_success 'wildcard ... in the middle and at the end' '
client_view "//depot/.../a/... //client/.../a/..." &&
test_when_finished cleanup_git &&
test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
git p4 clone --use-client-spec --dest="$git" //depot
'

test_expect_success 'basic map' '
Expand Down
50 changes: 50 additions & 0 deletions t/t9812-git-p4-wildcards.sh
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,56 @@ test_expect_success 'wildcard files submit back to p4, delete' '
)
'

test_expect_success 'p4 deleted a wildcard file' '
(
cd "$cli" &&
echo "wild delete test" >wild@delete &&
p4 add -f wild@delete &&
p4 submit -d "add wild@delete"
) &&
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot &&
(
cd "$git" &&
test_path_is_file wild@delete
) &&
(
cd "$cli" &&
# must use its encoded name
p4 delete wild%40delete &&
p4 submit -d "delete wild@delete"
) &&
(
cd "$git" &&
git p4 sync &&
git merge --ff-only p4/master &&
test_path_is_missing wild@delete
)
'

test_expect_success 'wildcard files requiring keyword scrub' '
(
cd "$cli" &&
cat <<-\EOF >scrub@wild &&
$Id$
line2
EOF
p4 add -t text+k -f scrub@wild &&
p4 submit -d "scrub at wild"
) &&
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot &&
(
cd "$git" &&
git config git-p4.skipSubmitEdit true &&
git config git-p4.attemptRCSCleanup true &&
sed "s/^line2/line2 edit/" <scrub@wild >scrub@wild.tmp &&
mv -f scrub@wild.tmp scrub@wild &&
git commit -m "scrub at wild line2 edit" scrub@wild &&
git p4 submit
)
'

test_expect_success 'kill p4d' '
kill_p4d
'
Expand Down
Loading

0 comments on commit 523f0a2

Please sign in to comment.