From: Lars Schneider <redacted>
diff to v1:
* add a test case
* use Popen "communication" function instead of "wait"
Thanks to Junio for feedback!
Known issue: My fix works only if git-p4 is executed in verbose mode.
In normal mode no exceptions are thrown and git-p4 just exits.
Lars Schneider (2):
git-p4: add test case for "Translation of file content failed" error
git-p4: handle "Translation of file content failed"
git-p4.py | 27 ++++++++++-------
t/t9824-git-p4-handle-utf16-without-bom.sh | 47 ++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 11 deletions(-)
create mode 100755 t/t9824-git-p4-handle-utf16-without-bom.sh
--
2.5.1
From: Lars Schneider <redacted>
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.
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 <redacted>
---
git-p4.py | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
@@ -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'])])-ifp4_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'])])+exceptExceptionase:+if'Translation of file content failed'instr(e):+type_base='binary'+else:+raisee+else:+ifp4_version_string().find('/NT')>=0:+text=text.replace('\r\n','\n')+contents=[text]iftype_base=="apple":# Apple filetype files will be streamed as a concatenation of
From: Lars Schneider <redacted>
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.
Signed-off-by: Lars Schneider <redacted>
---
t/t9824-git-p4-handle-utf16-without-bom.sh | 47 ++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100755 t/t9824-git-p4-handle-utf16-without-bom.sh
@@ -0,0 +1,47 @@+#!/bin/sh++test_description='git p4 handle UTF-16 without BOM'++../lib-git-p4.sh++UTF16="\\x97\\x0\\x97\\x0"++test_expect_success'start p4d''+start_p4d+'++test_expect_success'init depot with UTF-16 encoded file and artificially remove BOM''+(+cd"$cli"&&+echo"file1 -text">.gitattributes&&+perl-e"printf \"$UTF16\"">file1&&+p4add-tutf16file1&&++p4add.gitattributes&&+p4submit-d"file1"+)&&++(+cd"db"&&+p4d-jc&&+# P4D automatically adds a BOM. Remove it here to make the file invalid.+perl-i-ne"print unless eof"depot/file1,v&&+perl-e"printf \"@$UTF16@\"">>depot/file1,v&&+p4d-jrFcheckpoint.1+)+'++test_expect_success'clone depot with invalid UTF-16 file''+gitp4clone--dest="$git"--verbose//depot&&+(+cd"$git"&&+perl-e"printf \"$UTF16\"">expect&&+test_cmp_binexpectfile1+)+'++test_expect_success'kill p4d''+kill_p4d+'++test_done
On 09/14/2015 06:55 PM, larsxschneider@gmail.com wrote:
quoted hunk
From: Lars Schneider <redacted>
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.
Signed-off-by: Lars Schneider <redacted>
---
t/t9824-git-p4-handle-utf16-without-bom.sh | 47 ++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100755 t/t9824-git-p4-handle-utf16-without-bom.sh
@@ -0,0 +1,47 @@+#!/bin/sh++test_description='git p4 handle UTF-16 without BOM'++../lib-git-p4.sh++UTF16="\\x97\\x0\\x97\\x0"++test_expect_success'start p4d''+start_p4d+'++test_expect_success'init depot with UTF-16 encoded file and artificially remove BOM''+(+cd"$cli"&&+echo"file1 -text">.gitattributes&&
Please no space between '>' and the filename,
(this is our coding standard, and the same further down)
+ perl -e "printf \"$UTF16\"" >file1 &&
Ehh, do we need perl here ?
This will invoke a process-fork, which costs time and cpu load.
The following works for me:
printf '\227\000\227\000' >file1
From: Luke Diamand <hidden> Date: 2016-06-15 23:06:33
On 14/09/15 17:55, larsxschneider@gmail.com wrote:
From: Lars Schneider <redacted>
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
Sorry - what's a BOM? I'm assuming it's not a Bill of Materials?
Do we know the mechanism by which we end up in this state?
attempts to retrieve the file then the process crashes with a
"Translation of file content failed" error.
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.
Does that mean that the error will only be detected in verbose mode?
That doesn't seem right!
@@ -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'])])-ifp4_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'])])+exceptExceptionase:
Would it be better to specify which kind of Exception you are catching?
Looks like you could get OSError, ValueError and CalledProcessError;
it's the last of these you want (I think).
+ 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 ]
The indentation on this bit doesn't look right to me.
if type_base == "apple":
# Apple filetype files will be streamed as a concatenation of
From: Lars Schneider <hidden> Date: 2016-06-15 23:06:33
On 15 Sep 2015, at 06:40, Torsten Bögershausen [off-list ref] wrote:
On 09/14/2015 06:55 PM, larsxschneider@gmail.com wrote:
quoted
From: Lars Schneider <redacted>
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.
Signed-off-by: Lars Schneider <redacted>
---
t/t9824-git-p4-handle-utf16-without-bom.sh | 47 ++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100755 t/t9824-git-p4-handle-utf16-without-bom.sh
@@ -0,0 +1,47 @@+#!/bin/sh++test_description='git p4 handle UTF-16 without BOM'++../lib-git-p4.sh++UTF16="\\x97\\x0\\x97\\x0"++test_expect_success'start p4d''+start_p4d+'++test_expect_success'init depot with UTF-16 encoded file and artificially remove BOM''+(+cd"$cli"&&+echo"file1 -text">.gitattributes&&
Please no space between '>' and the filename,
(this is our coding standard, and the same further down)
Correct! Sorry, I still need to get used to this style. Thanks for the reminder!
quoted
+ perl -e "printf \"$UTF16\"" >file1 &&
Ehh, do we need perl here ?
This will invoke a process-fork, which costs time and cpu load.
The following works for me:
printf '\227\000\227\000' >file1
I agree this is better.
Both issues will be fixed v3.
Thanks!
From: Lars Schneider <hidden> Date: 2016-06-15 23:06:33
On 15 Sep 2015, at 08:43, Luke Diamand [off-list ref] wrote:
On 14/09/15 17:55, larsxschneider@gmail.com wrote:
quoted
From: Lars Schneider <redacted>
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
Sorry - what's a BOM? I'm assuming it's not a Bill of Materials?
BOM stands for Byte Order Mark. The UTF-16 BOM is a two byte sequence at the beginning of a UTF-16 file. It is not part of the actual content. It is only used to define the encoding of the remaining file. FEFF stands for UTF-16 big-endian encoding and FFFE for little-endian encoding.
More info here: http://www.unicode.org/faq/utf_bom.html#bom1
Do we know the mechanism by which we end up in this state?
attempts to retrieve the file then the process crashes with a
"Translation of file content failed" error.
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.
Does that mean that the error will only be detected in verbose mode? That doesn't seem right!
@@ -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'])])-ifp4_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'])])+exceptExceptionase:
Would it be better to specify which kind of Exception you are catching? Looks like you could get OSError, ValueError and CalledProcessError; it's the last of these you want (I think).
I guess what we have is not ideal but probably good enough.
quoted
quoted
+ try:
+ text = p4_read_pipe(['print', '-q', '-o', '-', '%s@%s' % (file['depotFile'], file['change'])])
+ except Exception as e:
Would it be better to specify which kind of Exception you are catching? Looks like you could get OSError, ValueError and CalledProcessError; it's the last of these you want (I think).
In general, what is the appropriate way to reference code in this email list? Are GitHub links OK?
I'm not an expert, but it feels possibly a bit ephemeral - if someone is
digging through email archives in a future where that github project has
been moved elsewhere, the links will all be dead.
Luke
I guess what we have is not ideal but probably good enough.
ok. thanks!
I will add another test case without “—verbose" to document that there is work to do :-)
quoted
quoted
quoted
+ try:
+ text = p4_read_pipe(['print', '-q', '-o', '-', '%s@%s' % (file['depotFile'], file['change'])])
+ except Exception as e:
Would it be better to specify which kind of Exception you are catching? Looks like you could get OSError, ValueError and CalledProcessError; it's the last of these you want (I think).
In general, what is the appropriate way to reference code in this email list? Are GitHub links OK?
I'm not an expert, but it feels possibly a bit ephemeral - if someone is digging through email archives in a future where that github project has been moved elsewhere, the links will all be dead.
Right. However, you could disassemble the URL and use the commit hash, the filename and the line number. They are not ephemeral because they are part of the repo.
Thanks,
Lars