From: Karl Hasselström Date: Tue, 3 Jun 2008 00:43:24 +0000 (+0200) Subject: Merge branch 'stable' into stable-master-merge X-Git-Tag: v0.15-rc1~217^2~2 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/stgit/commitdiff_plain/9b4a6e70a1390d653201e48e12d09005b3fba6c8?hp=3f19450c426970b78b19c522a82df1a962da5761 Merge branch 'stable' into stable-master-merge --- diff --git a/stgit/git.py b/stgit/git.py index 570003c..0955be7 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -190,6 +190,19 @@ def ls_files(files, tree = 'HEAD', full_name = True): 'Some of the given paths are either missing or not known to GIT' return list(fileset) +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 @@ -239,13 +252,12 @@ def tree_status(files = None, tree_id = 'HEAD', unknown = False, args = diff_flags + [tree_id] if files_left: args += ['--'] + files_left - for line in GRun('diff-index', *args).output_lines(): - fs = tuple(line.rstrip().split(' ',4)[-1].split('\t',1)) + 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 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) 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 @@ -256,13 +268,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 new file mode 100755 index 0000000..1aa78ed --- /dev/null +++ b/t/t3200-non-ascii-filenames.sh @@ -0,0 +1,59 @@ +#!/bin/sh +test_description='Handle files with non-ASCII characters in their names' + +. ./test-lib.sh + +# Ignore our own output files. +cat > .git/info/exclude < skärgÃ¥rdsö.txt && + git add skärgÃ¥rdsö.txt && + git commit -m "Create island" && + stg init && + echo foo > unrelated.txt && + git add unrelated.txt && + stg new p0 -m "Unrelated file" && + stg refresh && + stg pop && + rm skärgÃ¥rdsö.txt && + git commit -a -m "Remove island" && + git tag upstream && + git reset --hard HEAD^ && + stg push +' + +test_expect_success 'Rebase onto changed non-ASCII file' ' + stg rebase upstream +' + +test_expect_success 'Setup' ' + stg delete p0 && + git reset --hard HEAD^ && + echo "-- ett liv mitt ute i vattnet" >> skärgÃ¥rdsö.txt && + stg new p1 -m "Describe island" +' + +cat > expected.txt < output.txt && + diff -u expected.txt output.txt +' + +test_expect_success 'Refresh changes to non-ASCII file' ' + stg refresh +' + +cat > expected.txt < output.txt && + diff -u expected.txt output.txt +' + +test_done