From 8fe07fa4cef52c194e27b1ae764e2647c3f674f2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Karl=20Hasselstr=C3=B6m?= Date: Tue, 3 Jun 2008 02:27:48 +0200 Subject: [PATCH] Handle refresh of changed files with non-ASCII names MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Without -z, git diff-files was quoting them for us. Signed-off-by: Karl Hasselström --- stgit/git.py | 43 ++++++++++++++++++++++-------------------- t/t3200-non-ascii-filenames.sh | 2 +- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/stgit/git.py b/stgit/git.py index 8c637d5..8e6bdf4 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -191,6 +191,19 @@ def ls_files(files, tree = 'HEAD', full_name = True): raise GitException, \ 'Some of the given paths are either missing or not known to GIT' +def parse_git_ls(output): + t = None + for line in output.split('\0'): + if not line: + # There's a zero byte at the end of the output, which + # gives us an empty string as the last "line". + continue + if t == None: + mode_a, mode_b, sha1_a, sha1_b, t = line.split(' ') + else: + yield (t, line) + t = None + def tree_status(files = None, tree_id = 'HEAD', unknown = False, noexclude = True, verbose = False, diff_flags = []): """Get the status of all changed files, or of a selected set of @@ -242,21 +255,12 @@ def tree_status(files = None, tree_id = 'HEAD', unknown = False, args = diff_flags + [tree_id] if files_left: args += ['--'] + files_left - t = None - for line in GRun('diff-index', '-z', *args).raw_output().split('\0'): - if not line: - # There's a zero byte at the end of the output, which - # gives us an empty string as the last "line". - continue - if t == None: - mode_a, mode_b, sha1_a, sha1_b, t = line.split(' ') - else: - # the condition is needed in case files is emtpy and - # diff-index lists those already reported - if not line in reported_files: - cache_files.append((t, line)) - reported_files.add(line) - t = None + for t, fn in parse_git_ls(GRun('diff-index', '-z', *args).raw_output()): + # the condition is needed in case files is emtpy and + # diff-index lists those already reported + if not fn in reported_files: + cache_files.append((t, fn)) + reported_files.add(fn) files_left = [f for f in files if f not in reported_files] # files in the index but changed on (or removed from) disk. Only @@ -267,13 +271,12 @@ def tree_status(files = None, tree_id = 'HEAD', unknown = False, args = list(diff_flags) if files_left: args += ['--'] + files_left - for line in GRun('diff-files', *args).output_lines(): - fs = tuple(line.rstrip().split(' ',4)[-1].split('\t',1)) + for t, fn in parse_git_ls(GRun('diff-files', '-z', *args).raw_output()): # the condition is needed in case files is empty and # diff-files lists those already reported - if fs[1] not in reported_files: - cache_files.append(fs) - reported_files.add(fs[1]) + if not fn in reported_files: + cache_files.append((t, fn)) + reported_files.add(fn) if verbose: out.done() diff --git a/t/t3200-non-ascii-filenames.sh b/t/t3200-non-ascii-filenames.sh index 3146b8d..1aa78ed 100755 --- a/t/t3200-non-ascii-filenames.sh +++ b/t/t3200-non-ascii-filenames.sh @@ -40,7 +40,7 @@ test_expect_success 'Setup' ' cat > expected.txt < output.txt && diff -u expected.txt output.txt ' -- 2.11.0