From: Joel Holdsworth <jholdsworth@nvidia.com>
To: git@vger.kernel.org
Cc: Joel Holdsworth <jholdsworth@nvidia.com>
Subject: [PATCH 3/6] git-p4: Removed support for Python 2
Date: Thu, 9 Dec 2021 20:10:26 +0000 [thread overview]
Message-ID: <20211209201029.136886-4-jholdsworth@nvidia.com> (raw)
In-Reply-To: <20211209201029.136886-1-jholdsworth@nvidia.com>
Signed-off-by: Joel Holdsworth <jholdsworth@nvidia.com>
---
git-p4.py | 89 +++++++++++++++++--------------------------------------
1 file changed, 28 insertions(+), 61 deletions(-)
diff --git a/git-p4.py b/git-p4.py
index 32f30e5f9a..b5d4fc1176 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
#
# git-p4.py -- A tool for bidirectional operation between a Perforce depot and git.
#
@@ -16,8 +16,8 @@
# pylint: disable=too-many-branches,too-many-nested-blocks
#
import sys
-if sys.version_info.major < 3 and sys.version_info.minor < 7:
- sys.stderr.write("git-p4: requires Python 2.7 or later.\n")
+if sys.version_info.major < 3 or (sys.version_info.major == 3 and sys.version_info.minor < 7):
+ sys.stderr.write("git-p4: requires Python 3.7 or later.\n")
sys.exit(1)
import os
import optparse
@@ -36,16 +36,6 @@
import errno
import glob
-# On python2.7 where raw_input() and input() are both availble,
-# we want raw_input's semantics, but aliased to input for python3
-# compatibility
-# support basestring in python3
-try:
- if raw_input and input:
- input = raw_input
-except:
- pass
-
verbose = False
# Only labels/tags matching this will be imported/exported
@@ -173,35 +163,16 @@ def prompt(prompt_text):
if response in choices:
return response
-# We need different encoding/decoding strategies for text data being passed
-# around in pipes depending on python version
-if bytes is not str:
- # For python3, always encode and decode as appropriate
- def decode_text_stream(s):
- return s.decode() if isinstance(s, bytes) else s
- def encode_text_stream(s):
- return s.encode() if isinstance(s, str) else s
-else:
- # For python2.7, pass read strings as-is, but also allow writing unicode
- def decode_text_stream(s):
- return s
- def encode_text_stream(s):
- return s.encode('utf_8') if isinstance(s, unicode) else s
+def decode_text_stream(s):
+ return s.decode() if isinstance(s, bytes) else s
+def encode_text_stream(s):
+ return s.encode() if isinstance(s, str) else s
def decode_path(path):
"""Decode a given string (bytes or otherwise) using configured path encoding options
"""
encoding = gitConfig('git-p4.pathEncoding') or 'utf_8'
- if bytes is not str:
- return path.decode(encoding, errors='replace') if isinstance(path, bytes) else path
- else:
- try:
- path.decode('ascii')
- except:
- path = path.decode(encoding, errors='replace')
- if verbose:
- print('Path with non-ASCII characters detected. Used {} to decode: {}'.format(encoding, path))
- return path
+ return path.decode(encoding, errors='replace') if isinstance(path, bytes) else path
def run_git_hook(cmd, param=[]):
"""Execute a hook if the hook exists."""
@@ -285,8 +256,8 @@ def write_pipe(c, stdin, *k, **kw):
def p4_write_pipe(c, stdin):
real_cmd = p4_build_cmd(c)
- if bytes is not str and isinstance(stdin, str):
- stdin = encode_text_stream(stdin)
+ if isinstance(stdin, str):
+ stdin = stdin.encode()
return write_pipe(real_cmd, stdin)
def read_pipe_full(c, *k, **kw):
@@ -745,21 +716,18 @@ def p4CmdList(cmd, stdin=None, stdin_mode='w+b', cb=None, skip_info=False,
result = []
try:
while True:
- entry = marshal.load(p4.stdout)
- if bytes is not str:
- # Decode unmarshalled dict to use str keys and values, except for:
- # - `data` which may contain arbitrary binary data
- # - `depotFile[0-9]*`, `path`, or `clientFile` which may contain non-UTF8 encoded text
- decoded_entry = {}
- for key, value in entry.items():
- key = key.decode()
- if isinstance(value, bytes) and not (key in ('data', 'path', 'clientFile') or key.startswith('depotFile')):
- value = value.decode()
- decoded_entry[key] = value
- # Parse out data if it's an error response
- if decoded_entry.get('code') == 'error' and 'data' in decoded_entry:
- decoded_entry['data'] = decoded_entry['data'].decode()
- entry = decoded_entry
+ # Decode unmarshalled dict to use str keys and values, except for:
+ # - `data` which may contain arbitrary binary data
+ # - `depotFile[0-9]*`, `path`, or `clientFile` which may contain non-UTF8 encoded text
+ entry = {}
+ for key, value in marshal.load(p4.stdout).items():
+ key = key.decode()
+ if isinstance(value, bytes) and not (key in ('data', 'path', 'clientFile') or key.startswith('depotFile')):
+ value = value.decode()
+ entry[key] = value
+ # Parse out data if it's an error response
+ if entry.get('code') == 'error' and 'data' in entry:
+ entry['data'] = entry['data'].decode()
if skip_info:
if 'code' in entry and entry['code'] == 'info':
continue
@@ -3822,14 +3790,13 @@ def openStreams(self):
self.gitStream = self.importProcess.stdin
self.gitError = self.importProcess.stderr
- if bytes is not str:
- # Wrap gitStream.write() so that it can be called using `str` arguments
- def make_encoded_write(write):
- def encoded_write(s):
- return write(s.encode() if isinstance(s, str) else s)
- return encoded_write
+ # Wrap gitStream.write() so that it can be called using `str` arguments
+ def make_encoded_write(write):
+ def encoded_write(s):
+ return write(s.encode() if isinstance(s, str) else s)
+ return encoded_write
- self.gitStream.write = make_encoded_write(self.gitStream.write)
+ self.gitStream.write = make_encoded_write(self.gitStream.write)
def closeStreams(self):
if self.gitStream is None:
--
2.33.0
next prev parent reply other threads:[~2021-12-09 20:10 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-09 20:10 [PATCH 0/6] Transition git-p4.py to support Python 3 only Joel Holdsworth
2021-12-09 20:10 ` [PATCH 1/6] git-p4: Always pass cmd arguments to subprocess as a python lists Joel Holdsworth
2021-12-09 22:42 ` Junio C Hamano
2021-12-09 20:10 ` [PATCH 2/6] git-p4: Don't print shell commands as " Joel Holdsworth
2021-12-09 20:10 ` Joel Holdsworth [this message]
2021-12-09 22:44 ` [PATCH 3/6] git-p4: Removed support for Python 2 Junio C Hamano
2021-12-09 23:07 ` rsbecker
2021-12-10 3:25 ` David Aguilar
2021-12-10 10:44 ` Joel Holdsworth
2021-12-09 20:10 ` [PATCH 4/6] git-p4: Decode byte strings before printing Joel Holdsworth
2021-12-09 22:47 ` Junio C Hamano
2021-12-10 8:40 ` Fabian Stelzer
2021-12-10 10:48 ` Joel Holdsworth
2021-12-10 10:41 ` Joel Holdsworth
2021-12-09 20:10 ` [PATCH 5/6] git-p4: Eliminate decode_stream and encode_stream Joel Holdsworth
2021-12-09 20:10 ` [PATCH 6/6] git-p4: Resolve RCS keywords in binary Joel Holdsworth
2021-12-10 7:57 ` Luke Diamand
2021-12-10 10:51 ` Joel Holdsworth
2021-12-10 0:48 ` [PATCH 0/6] Transition git-p4.py to support Python 3 only Ævar Arnfjörð Bjarmason
2021-12-10 10:37 ` Joel Holdsworth
2021-12-10 11:30 ` Ævar Arnfjörð Bjarmason
2021-12-10 21:34 ` Junio C Hamano
2021-12-10 21:53 ` rsbecker
2021-12-11 21:00 ` Elijah Newren
2021-12-12 8:55 ` Luke Diamand
2021-12-10 7:53 ` Luke Diamand
2021-12-10 10:54 ` Joel Holdsworth
2021-12-11 9:58 ` Luke Diamand
2021-12-13 13:47 ` Joel Holdsworth
2021-12-13 19:29 ` Junio C Hamano
2021-12-13 19:58 ` Joel Holdsworth
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=20211209201029.136886-4-jholdsworth@nvidia.com \
--to=jholdsworth@nvidia.com \
--cc=git@vger.kernel.org \
/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).