From: larsxschneider@gmail.com
To: git@vger.kernel.org
Cc: luke@diamand.org, sunshine@sunshineco.com, tboegi@web.de,
Lars Schneider <larsxschneider@gmail.com>
Subject: [PATCH v4 2/2] git-p4: handle "Translation of file content failed"
Date: Mon, 21 Sep 2015 12:01:41 +0200 [thread overview]
Message-ID: <1442829701-2347-3-git-send-email-larsxschneider@gmail.com> (raw)
In-Reply-To: <1442829701-2347-1-git-send-email-larsxschneider@gmail.com>
From: Lars Schneider <larsxschneider@gmail.com>
A P4 repository can get into a state where it contains a file with
type UTF-16 that does not contain a valid UTF-16 BOM. If git-p4
attempts to retrieve the file then the process crashes with a
"Translation of file content failed" error.
More info here: http://answers.perforce.com/articles/KB/3117
Fix this by detecting this error and retrieving the file as binary
instead. The result in Git is the same.
Known issue: This works only if git-p4 is executed in verbose mode.
In normal mode no exceptions are thrown and git-p4 just exits.
Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
---
git-p4.py | 27 ++++++++++++++++-----------
t/t9825-git-p4-handle-utf16-without-bom.sh | 2 +-
2 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/git-p4.py b/git-p4.py
index 073f87b..5ae25a6 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -134,13 +134,11 @@ def read_pipe(c, ignore_error=False):
sys.stderr.write('Reading pipe: %s\n' % str(c))
expand = isinstance(c,basestring)
- p = subprocess.Popen(c, stdout=subprocess.PIPE, shell=expand)
- pipe = p.stdout
- val = pipe.read()
- if p.wait() and not ignore_error:
- die('Command failed: %s' % str(c))
-
- return val
+ p = subprocess.Popen(c, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=expand)
+ (out, err) = p.communicate()
+ if p.returncode != 0 and not ignore_error:
+ die('Command failed: %s\nError: %s' % (str(c), err))
+ return out
def p4_read_pipe(c, ignore_error=False):
real_cmd = p4_build_cmd(c)
@@ -2186,10 +2184,17 @@ class P4Sync(Command, P4UserMap):
# them back too. This is not needed to the cygwin windows version,
# just the native "NT" type.
#
- text = p4_read_pipe(['print', '-q', '-o', '-', "%s@%s" % (file['depotFile'], file['change']) ])
- if p4_version_string().find("/NT") >= 0:
- text = text.replace("\r\n", "\n")
- contents = [ text ]
+ try:
+ text = p4_read_pipe(['print', '-q', '-o', '-', '%s@%s' % (file['depotFile'], file['change'])])
+ except Exception as e:
+ if 'Translation of file content failed' in str(e):
+ type_base = 'binary'
+ else:
+ raise e
+ else:
+ if p4_version_string().find('/NT') >= 0:
+ text = text.replace('\r\n', '\n')
+ contents = [ text ]
if type_base == "apple":
# Apple filetype files will be streamed as a concatenation of
diff --git a/t/t9825-git-p4-handle-utf16-without-bom.sh b/t/t9825-git-p4-handle-utf16-without-bom.sh
index 65c3c4e..fd2edce 100755
--- a/t/t9825-git-p4-handle-utf16-without-bom.sh
+++ b/t/t9825-git-p4-handle-utf16-without-bom.sh
@@ -29,7 +29,7 @@ test_expect_success 'init depot with UTF-16 encoded file and artificially remove
)
'
-test_expect_failure 'clone depot with invalid UTF-16 file in verbose mode' '
+test_expect_success 'clone depot with invalid UTF-16 file in verbose mode' '
git p4 clone --dest="$git" --verbose //depot &&
test_when_finished cleanup_git &&
(
--
2.5.1
prev parent reply other threads:[~2015-09-21 10:02 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-21 10:01 [PATCH v4 0/2] git-p4: handle "Translation of file content failed" larsxschneider
2015-09-21 10:01 ` [PATCH v4 1/2] git-p4: add test case for "Translation of file content failed" error larsxschneider
2015-09-21 18:09 ` Junio C Hamano
2015-09-21 23:03 ` Lars Schneider
2015-09-21 23:54 ` Eric Sunshine
2015-09-22 1:10 ` Junio C Hamano
2015-09-22 10:09 ` Lars Schneider
2015-09-22 16:02 ` Junio C Hamano
2015-09-22 19:11 ` Michael Blume
2015-09-22 19:17 ` Junio C Hamano
2015-09-23 7:34 ` Lars Schneider
2015-09-22 10:12 ` Lars Schneider
2015-09-22 16:02 ` Junio C Hamano
2015-09-21 10:01 ` larsxschneider [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1442829701-2347-3-git-send-email-larsxschneider@gmail.com \
--to=larsxschneider@gmail.com \
--cc=git@vger.kernel.org \
--cc=luke@diamand.org \
--cc=sunshine@sunshineco.com \
--cc=tboegi@web.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).