* [PATCHv4 0/5] git-p4: small fixes to branches and labels
@ 2012-01-19 9:52 Luke Diamand
2012-01-19 9:52 ` [PATCHv4 1/5] git-p4: handle p4 branches and labels containing shell chars Luke Diamand
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Luke Diamand @ 2012-01-19 9:52 UTC (permalink / raw)
To: git; +Cc: Pete Wyckoff, Vitor Antunes, Luke Diamand
This is the fourth version of some small fixes to git-p4 branch and
label handling, incorporating a fix from Pete Wyckoff and an
additional failing test.
This change does not fix the other problems with git-p4 labels:
- two p4 labels on the same changelist will fall over
- labels must match exactly the list of files imported
- you can't import a label without a p4 commit
Luke Diamand (5):
git-p4: handle p4 branches and labels containing shell chars
git-p4: cope with labels with empty descriptions
git-p4: importing labels should cope with missing owner
git-p4: add test for p4 labels
git-p4: label import fails with multiple labels at the same
changelist
contrib/fast-import/git-p4 | 79 ++++++++++++++-----------
t/t9803-git-p4-shell-metachars.sh | 48 ++++++++++++++++
t/t9804-git-p4-label.sh | 113 +++++++++++++++++++++++++++++++++++++
3 files changed, 205 insertions(+), 35 deletions(-)
create mode 100755 t/t9804-git-p4-label.sh
--
1.7.8.rc1.209.geac91.dirty
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCHv4 1/5] git-p4: handle p4 branches and labels containing shell chars
2012-01-19 9:52 [PATCHv4 0/5] git-p4: small fixes to branches and labels Luke Diamand
@ 2012-01-19 9:52 ` Luke Diamand
2012-01-19 9:52 ` [PATCHv4 2/5] git-p4: cope with labels with empty descriptions Luke Diamand
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Luke Diamand @ 2012-01-19 9:52 UTC (permalink / raw)
To: git; +Cc: Pete Wyckoff, Vitor Antunes, Luke Diamand
Don't use shell expansion when detecting branches, as it will
fail if the branch name contains a shell metachar. Similarly
for labels.
Add additional test for branches with shell metachars.
Signed-off-by: Luke Diamand <luke@diamand.org>
---
contrib/fast-import/git-p4 | 8 +++---
t/t9803-git-p4-shell-metachars.sh | 48 +++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index 5aacea8..163e95a 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -799,7 +799,7 @@ class P4Submit(Command, P4UserMap):
def canChangeChangelists(self):
# check to see if we have p4 admin or super-user permissions, either of
# which are required to modify changelists.
- results = p4CmdList("protects %s" % self.depotPath)
+ results = p4CmdList(["protects", self.depotPath])
for r in results:
if r.has_key('perm'):
if r['perm'] == 'admin':
@@ -1769,7 +1769,7 @@ class P4Sync(Command, P4UserMap):
def getLabels(self):
self.labels = {}
- l = p4CmdList("labels %s..." % ' '.join (self.depotPaths))
+ l = p4CmdList(["labels"] + ["%s..." % p for p in self.depotPaths])
if len(l) > 0 and not self.silent:
print "Finding files belonging to labels in %s" % `self.depotPaths`
@@ -1811,7 +1811,7 @@ class P4Sync(Command, P4UserMap):
command = "branches"
for info in p4CmdList(command):
- details = p4Cmd("branch -o %s" % info["branch"])
+ details = p4Cmd(["branch", "-o", info["branch"]])
viewIdx = 0
while details.has_key("View%s" % viewIdx):
paths = details["View%s" % viewIdx].split(" ")
@@ -1949,7 +1949,7 @@ class P4Sync(Command, P4UserMap):
sourceRef = self.gitRefForBranch(sourceBranch)
#print "source " + sourceBranch
- branchParentChange = int(p4Cmd("changes -m 1 %s...@1,%s" % (sourceDepotPath, firstChange))["change"])
+ branchParentChange = int(p4Cmd(["changes", "-m", "1", "%s...@1,%s" % (sourceDepotPath, firstChange)])["change"])
#print "branch parent: %s" % branchParentChange
gitParent = self.gitCommitByP4Change(sourceRef, branchParentChange)
if len(gitParent) > 0:
diff --git a/t/t9803-git-p4-shell-metachars.sh b/t/t9803-git-p4-shell-metachars.sh
index db04375..db67020 100755
--- a/t/t9803-git-p4-shell-metachars.sh
+++ b/t/t9803-git-p4-shell-metachars.sh
@@ -57,6 +57,54 @@ test_expect_success 'deleting with shell metachars' '
)
'
+# Create a branch with a shell metachar in its name
+#
+# 1. //depot/main
+# 2. //depot/branch$3
+
+test_expect_success 'branch with shell char' '
+ test_when_finished cleanup_git &&
+ test_create_repo "$git" &&
+ (
+ cd "$cli" &&
+
+ mkdir -p main &&
+
+ echo f1 >main/f1 &&
+ p4 add main/f1 &&
+ p4 submit -d "main/f1" &&
+
+ p4 integrate //depot/main/... //depot/branch\$3/... &&
+ p4 submit -d "integrate main to branch\$3" &&
+
+ echo f1 >branch\$3/shell_char_branch_file &&
+ p4 add branch\$3/shell_char_branch_file &&
+ p4 submit -d "branch\$3/shell_char_branch_file" &&
+
+ p4 branch -i <<-EOF &&
+ Branch: branch\$3
+ View: //depot/main/... //depot/branch\$3/...
+ EOF
+
+ p4 edit main/f1 &&
+ echo "a change" >> main/f1 &&
+ p4 submit -d "a change" main/f1 &&
+
+ p4 integrate -b branch\$3 &&
+ p4 resolve -am branch\$3/... &&
+ p4 submit -d "integrate main to branch\$3" &&
+
+ cd "$git" &&
+
+ git config git-p4.branchList main:branch\$3 &&
+ "$GITP4" clone --dest=. --detect-branches //depot@all &&
+ git log --all --graph --decorate --stat &&
+ git reset --hard p4/depot/branch\$3 &&
+ test -f shell_char_branch_file &&
+ test -f f1
+ )
+'
+
test_expect_success 'kill p4d' '
kill_p4d
'
--
1.7.8.rc1.209.geac91.dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCHv4 2/5] git-p4: cope with labels with empty descriptions
2012-01-19 9:52 [PATCHv4 0/5] git-p4: small fixes to branches and labels Luke Diamand
2012-01-19 9:52 ` [PATCHv4 1/5] git-p4: handle p4 branches and labels containing shell chars Luke Diamand
@ 2012-01-19 9:52 ` Luke Diamand
2012-01-19 9:52 ` [PATCHv4 3/5] git-p4: importing labels should cope with missing owner Luke Diamand
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Luke Diamand @ 2012-01-19 9:52 UTC (permalink / raw)
To: git; +Cc: Pete Wyckoff, Vitor Antunes, Luke Diamand
Use an explicit length for the data in a label, rather
than EOT, so that labels with empty descriptions are
passed through correctly.
Signed-off-by: Luke Diamand <luke@diamand.org>
---
contrib/fast-import/git-p4 | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index 163e95a..5b59bc8 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -1752,9 +1752,11 @@ class P4Sync(Command, P4UserMap):
else:
tagger = "%s <a@b> %s %s" % (owner, epoch, self.tz)
self.gitStream.write("tagger %s\n" % tagger)
- self.gitStream.write("data <<EOT\n")
- self.gitStream.write(labelDetails["Description"])
- self.gitStream.write("EOT\n\n")
+
+ description = labelDetails["Description"]
+ self.gitStream.write("data %d\n" % len(description))
+ self.gitStream.write(description)
+ self.gitStream.write("\n")
else:
if not self.silent:
--
1.7.8.rc1.209.geac91.dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCHv4 3/5] git-p4: importing labels should cope with missing owner
2012-01-19 9:52 [PATCHv4 0/5] git-p4: small fixes to branches and labels Luke Diamand
2012-01-19 9:52 ` [PATCHv4 1/5] git-p4: handle p4 branches and labels containing shell chars Luke Diamand
2012-01-19 9:52 ` [PATCHv4 2/5] git-p4: cope with labels with empty descriptions Luke Diamand
@ 2012-01-19 9:52 ` Luke Diamand
2012-01-19 9:52 ` [PATCHv4 4/5] git-p4: add test for p4 labels Luke Diamand
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Luke Diamand @ 2012-01-19 9:52 UTC (permalink / raw)
To: git; +Cc: Pete Wyckoff, Vitor Antunes, Luke Diamand
In p4, the Owner field is optional. If it is missing,
construct something sensible rather than crashing.
Signed-off-by: Luke Diamand <luke@diamand.org>
---
contrib/fast-import/git-p4 | 63 ++++++++++++++++++++++++-------------------
1 files changed, 35 insertions(+), 28 deletions(-)
diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index 5b59bc8..58551b9 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -563,6 +563,26 @@ class Command:
class P4UserMap:
def __init__(self):
self.userMapFromPerforceServer = False
+ self.myP4UserId = None
+
+ def p4UserId(self):
+ if self.myP4UserId:
+ return self.myP4UserId
+
+ results = p4CmdList("user -o")
+ for r in results:
+ if r.has_key('User'):
+ self.myP4UserId = r['User']
+ return r['User']
+ die("Could not find your p4 user id")
+
+ def p4UserIsMe(self, p4User):
+ # return True if the given p4 user is actually me
+ me = self.p4UserId()
+ if not p4User or p4User != me:
+ return False
+ else:
+ return True
def getUserCacheFilename(self):
home = os.environ.get("HOME", os.environ.get("USERPROFILE"))
@@ -700,7 +720,6 @@ class P4Submit(Command, P4UserMap):
self.verbose = False
self.preserveUser = gitConfig("git-p4.preserveUser").lower() == "true"
self.isWindows = (platform.system() == "Windows")
- self.myP4UserId = None
def check(self):
if len(p4CmdList("opened ...")) > 0:
@@ -808,25 +827,6 @@ class P4Submit(Command, P4UserMap):
return 1
return 0
- def p4UserId(self):
- if self.myP4UserId:
- return self.myP4UserId
-
- results = p4CmdList("user -o")
- for r in results:
- if r.has_key('User'):
- self.myP4UserId = r['User']
- return r['User']
- die("Could not find your p4 user id")
-
- def p4UserIsMe(self, p4User):
- # return True if the given p4 user is actually me
- me = self.p4UserId()
- if not p4User or p4User != me:
- return False
- else:
- return True
-
def prepareSubmitTemplate(self):
# remove lines in the Files section that show changes to files outside the depot path we're committing into
template = ""
@@ -1675,6 +1675,12 @@ class P4Sync(Command, P4UserMap):
if self.stream_file.has_key('depotFile'):
self.streamOneP4File(self.stream_file, self.stream_contents)
+ def make_email(self, userid):
+ if userid in self.users:
+ return self.users[userid]
+ else:
+ return "%s <a@b>" % userid
+
def commit(self, details, files, branch, branchPrefixes, parent = ""):
epoch = details["time"]
author = details["user"]
@@ -1698,10 +1704,7 @@ class P4Sync(Command, P4UserMap):
committer = ""
if author not in self.users:
self.getUserMapFromPerforceServer()
- if author in self.users:
- committer = "%s %s %s" % (self.users[author], epoch, self.tz)
- else:
- committer = "%s <a@b> %s %s" % (author, epoch, self.tz)
+ committer = "%s %s %s" % (self.make_email(author), epoch, self.tz)
self.gitStream.write("committer %s\n" % committer)
@@ -1746,11 +1749,15 @@ class P4Sync(Command, P4UserMap):
self.gitStream.write("from %s\n" % branch)
owner = labelDetails["Owner"]
- tagger = ""
- if author in self.users:
- tagger = "%s %s %s" % (self.users[owner], epoch, self.tz)
+
+ # Try to use the owner of the p4 label, or failing that,
+ # the current p4 user id.
+ if owner:
+ email = self.make_email(owner)
else:
- tagger = "%s <a@b> %s %s" % (owner, epoch, self.tz)
+ email = self.make_email(self.p4UserId())
+ tagger = "%s %s %s" % (email, epoch, self.tz)
+
self.gitStream.write("tagger %s\n" % tagger)
description = labelDetails["Description"]
--
1.7.8.rc1.209.geac91.dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCHv4 4/5] git-p4: add test for p4 labels
2012-01-19 9:52 [PATCHv4 0/5] git-p4: small fixes to branches and labels Luke Diamand
` (2 preceding siblings ...)
2012-01-19 9:52 ` [PATCHv4 3/5] git-p4: importing labels should cope with missing owner Luke Diamand
@ 2012-01-19 9:52 ` Luke Diamand
2012-01-19 9:52 ` [PATCHv4 5/5] git-p4: label import fails with multiple labels at the same changelist Luke Diamand
2012-01-19 15:19 ` [PATCHv4 0/5] git-p4: small fixes to branches and labels Pete Wyckoff
5 siblings, 0 replies; 7+ messages in thread
From: Luke Diamand @ 2012-01-19 9:52 UTC (permalink / raw)
To: git; +Cc: Pete Wyckoff, Vitor Antunes, Luke Diamand
Add basic test of p4 label import. Checks label import and
import with shell metachars; labels with different length
descriptions.
Signed-off-by: Luke Diamand <luke@diamand.org>
---
t/t9804-git-p4-label.sh | 72 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 72 insertions(+), 0 deletions(-)
create mode 100755 t/t9804-git-p4-label.sh
diff --git a/t/t9804-git-p4-label.sh b/t/t9804-git-p4-label.sh
new file mode 100755
index 0000000..5fa2bcf
--- /dev/null
+++ b/t/t9804-git-p4-label.sh
@@ -0,0 +1,72 @@
+test_description='git-p4 p4 label tests'
+
+. ./lib-git-p4.sh
+
+test_expect_success 'start p4d' '
+ start_p4d
+'
+
+# Basic p4 label tests.
+#
+# Note: can't have more than one label per commit - others
+# are silently discarded.
+#
+test_expect_success 'basic p4 labels' '
+ test_when_finished cleanup_git &&
+ (
+ cd "$cli" &&
+ mkdir -p main &&
+
+ echo f1 >main/f1 &&
+ p4 add main/f1 &&
+ p4 submit -d "main/f1" &&
+
+ echo f2 >main/f2 &&
+ p4 add main/f2 &&
+ p4 submit -d "main/f2" &&
+
+ echo f3 >main/file_with_\$metachar &&
+ p4 add main/file_with_\$metachar &&
+ p4 submit -d "file with metachar" &&
+
+ p4 tag -l tag_f1_only main/f1 &&
+ p4 tag -l tag_with\$_shell_char main/... &&
+
+ echo f4 >main/f4 &&
+ p4 add main/f4 &&
+ p4 submit -d "main/f4" &&
+
+ p4 label -i <<-EOF &&
+ Label: long_label
+ Description:
+ A Label first line
+ A Label second line
+ View: //depot/...
+ EOF
+
+ p4 tag -l long_label ... &&
+
+ p4 labels ... &&
+
+ "$GITP4" clone --dest="$git" --detect-labels //depot@all &&
+ cd "$git" &&
+
+ git tag &&
+ git tag >taglist &&
+ test_line_count = 3 taglist &&
+
+ cd main &&
+ git checkout tag_tag_f1_only &&
+ ! test -f f2 &&
+ git checkout tag_tag_with\$_shell_char &&
+ test -f f1 && test -f f2 && test -f file_with_\$metachar &&
+
+ git show tag_long_label | grep -q "A Label second line"
+ )
+'
+
+test_expect_success 'kill p4d' '
+ kill_p4d
+'
+
+test_done
--
1.7.8.rc1.209.geac91.dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCHv4 5/5] git-p4: label import fails with multiple labels at the same changelist
2012-01-19 9:52 [PATCHv4 0/5] git-p4: small fixes to branches and labels Luke Diamand
` (3 preceding siblings ...)
2012-01-19 9:52 ` [PATCHv4 4/5] git-p4: add test for p4 labels Luke Diamand
@ 2012-01-19 9:52 ` Luke Diamand
2012-01-19 15:19 ` [PATCHv4 0/5] git-p4: small fixes to branches and labels Pete Wyckoff
5 siblings, 0 replies; 7+ messages in thread
From: Luke Diamand @ 2012-01-19 9:52 UTC (permalink / raw)
To: git; +Cc: Pete Wyckoff, Vitor Antunes, Luke Diamand
git-p4 has an array of changelists with one label per changelist.
But you can have multiple labels on a single changelist and so this
code fails.
Add a test case demonstrating the problem.
Signed-off-by: Luke Diamand <luke@diamand.org>
---
t/t9804-git-p4-label.sh | 41 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 41 insertions(+), 0 deletions(-)
diff --git a/t/t9804-git-p4-label.sh b/t/t9804-git-p4-label.sh
index 5fa2bcf..80d01ea 100755
--- a/t/t9804-git-p4-label.sh
+++ b/t/t9804-git-p4-label.sh
@@ -65,6 +65,47 @@ test_expect_success 'basic p4 labels' '
)
'
+# Test some label corner cases:
+#
+# - two tags on the same file; both should be available
+# - a tag that is only on one file; this kind of tag
+# cannot be imported (at least not easily).
+
+test_expect_failure 'two labels on the same changelist' '
+ test_when_finished cleanup_git &&
+ (
+ cd "$cli" &&
+ mkdir -p main &&
+
+ p4 edit main/f1 main/f2 &&
+ echo "hello world" >main/f1 &&
+ echo "not in the tag" >main/f2 &&
+ p4 submit -d "main/f[12]: testing two labels" &&
+
+ p4 tag -l tag_f1_1 main/... &&
+ p4 tag -l tag_f1_2 main/... &&
+
+ p4 labels ... &&
+
+ "$GITP4" clone --dest="$git" --detect-labels //depot@all &&
+ cd "$git" &&
+
+ git tag | grep tag_f1 &&
+ git tag | grep -q tag_f1_1 &&
+ git tag | grep -q tag_f1_2 &&
+
+ cd main &&
+
+ git checkout tag_tag_f1_1 &&
+ ls &&
+ test -f f1 &&
+
+ git checkout tag_tag_f1_2 &&
+ ls &&
+ test -f f1
+ )
+'
+
test_expect_success 'kill p4d' '
kill_p4d
'
--
1.7.8.rc1.209.geac91.dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCHv4 0/5] git-p4: small fixes to branches and labels
2012-01-19 9:52 [PATCHv4 0/5] git-p4: small fixes to branches and labels Luke Diamand
` (4 preceding siblings ...)
2012-01-19 9:52 ` [PATCHv4 5/5] git-p4: label import fails with multiple labels at the same changelist Luke Diamand
@ 2012-01-19 15:19 ` Pete Wyckoff
5 siblings, 0 replies; 7+ messages in thread
From: Pete Wyckoff @ 2012-01-19 15:19 UTC (permalink / raw)
To: Luke Diamand; +Cc: git, Vitor Antunes
luke@diamand.org wrote on Thu, 19 Jan 2012 09:52 +0000:
> This is the fourth version of some small fixes to git-p4 branch and
> label handling, incorporating a fix from Pete Wyckoff and an
> additional failing test.
>
> This change does not fix the other problems with git-p4 labels:
>
> - two p4 labels on the same changelist will fall over
> - labels must match exactly the list of files imported
> - you can't import a label without a p4 commit
This all looks great to me. Thanks for adding that failing test,
and fixing the pre-existing bug in invoking p4 labels.
-- Pete
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-01-19 15:19 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-19 9:52 [PATCHv4 0/5] git-p4: small fixes to branches and labels Luke Diamand
2012-01-19 9:52 ` [PATCHv4 1/5] git-p4: handle p4 branches and labels containing shell chars Luke Diamand
2012-01-19 9:52 ` [PATCHv4 2/5] git-p4: cope with labels with empty descriptions Luke Diamand
2012-01-19 9:52 ` [PATCHv4 3/5] git-p4: importing labels should cope with missing owner Luke Diamand
2012-01-19 9:52 ` [PATCHv4 4/5] git-p4: add test for p4 labels Luke Diamand
2012-01-19 9:52 ` [PATCHv4 5/5] git-p4: label import fails with multiple labels at the same changelist Luke Diamand
2012-01-19 15:19 ` [PATCHv4 0/5] git-p4: small fixes to branches and labels Pete Wyckoff
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.