npm has problems with Turkish uppercase i (İ)

(Serhan Apaydın) #1

What I Wanted to Do

I cloned an existing repo into a directory with a name that contains the letter İ (Uppercase i, a Turkish-specific letter.) and executed npm install with reasonable expectations.

What Happened Instead

I’ve seen lots of warn tar ENOENT: no such file or directory, open 'SOME PATH' errors.

Reproduction Steps

  1. Create a directory named İ somewhere.
  2. Run npm install through2 inside that directory.

Details

Quick facts about Turkish letters (I think this might be related):

upper('i') == 'İ'
upper('ı') == 'I'

npm-debug.log

0 info it worked if it ends with ok
1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
1 verbose cli   'C:\\Users\\Serhan\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js',
1 verbose cli   'i' ]
2 info using npm@6.9.0
3 info using node@v10.15.1
4 verbose npm-session 0fe5ab85684bae46
5 silly install runPreinstallTopLevelLifecycles
6 silly preinstall foo@1.0.0
7 info lifecycle foo@1.0.0~preinstall: foo@1.0.0
8 silly install loadCurrentTree
9 silly install readLocalPackageData
10 timing stage:loadCurrentTree Completed in 12ms
11 silly install loadIdealTree
12 silly install cloneCurrentTreeToIdealTree
13 timing stage:loadIdealTree:cloneCurrentTree Completed in 0ms
14 silly install loadShrinkwrap
15 timing stage:loadIdealTree:loadShrinkwrap Completed in 1ms
16 silly install loadAllDepsIntoIdealTree
17 http fetch GET 200 https://registry.npmjs.org/through2 23ms (from cache)
18 silly pacote range manifest for through2@^2.0.3 fetched in 41ms
19 http fetch GET 200 https://registry.npmjs.org/xtend 9ms (from cache)
20 silly pacote range manifest for xtend@~4.0.1 fetched in 11ms
21 http fetch GET 200 https://registry.npmjs.org/readable-stream 13ms (from cache)
22 silly pacote range manifest for readable-stream@~2.3.6 fetched in 16ms
23 http fetch GET 200 https://registry.npmjs.org/core-util-is 53ms (from cache)
24 http fetch GET 200 https://registry.npmjs.org/isarray 52ms (from cache)
25 http fetch GET 200 https://registry.npmjs.org/process-nextick-args 53ms (from cache)
26 http fetch GET 200 https://registry.npmjs.org/safe-buffer 53ms (from cache)
27 http fetch GET 200 https://registry.npmjs.org/string_decoder 53ms (from cache)
28 http fetch GET 200 https://registry.npmjs.org/util-deprecate 54ms (from cache)
29 silly pacote range manifest for core-util-is@~1.0.0 fetched in 57ms
30 silly pacote range manifest for isarray@~1.0.0 fetched in 57ms
31 silly pacote range manifest for process-nextick-args@~2.0.0 fetched in 57ms
32 silly pacote range manifest for safe-buffer@~5.1.1 fetched in 57ms
33 silly pacote range manifest for string_decoder@~1.1.1 fetched in 57ms
34 silly pacote range manifest for util-deprecate@~1.0.1 fetched in 57ms
35 silly pacote range manifest for safe-buffer@~5.1.0 fetched in 1ms
36 http fetch GET 304 https://registry.npmjs.org/inherits 209ms (from cache)
37 silly pacote range manifest for inherits@~2.0.3 fetched in 211ms
38 silly pacote range manifest for through2@^2.0.3 fetched in 2ms
39 silly resolveWithNewModule through2@2.0.5 checking installable status
40 silly pacote range manifest for readable-stream@~2.3.6 fetched in 2ms
41 silly resolveWithNewModule readable-stream@2.3.6 checking installable status
42 silly pacote range manifest for xtend@~4.0.1 fetched in 2ms
43 silly resolveWithNewModule xtend@4.0.1 checking installable status
44 silly pacote range manifest for isarray@~1.0.0 fetched in 3ms
45 silly resolveWithNewModule isarray@1.0.0 checking installable status
46 silly pacote range manifest for inherits@~2.0.3 fetched in 4ms
47 silly resolveWithNewModule inherits@2.0.3 checking installable status
48 silly pacote range manifest for process-nextick-args@~2.0.0 fetched in 4ms
49 silly resolveWithNewModule process-nextick-args@2.0.0 checking installable status
50 silly pacote range manifest for core-util-is@~1.0.0 fetched in 5ms
51 silly resolveWithNewModule core-util-is@1.0.2 checking installable status
52 silly pacote range manifest for safe-buffer@~5.1.1 fetched in 5ms
53 silly resolveWithNewModule safe-buffer@5.1.2 checking installable status
54 silly pacote range manifest for string_decoder@~1.1.1 fetched in 6ms
55 silly resolveWithNewModule string_decoder@1.1.1 checking installable status
56 silly pacote range manifest for util-deprecate@~1.0.1 fetched in 6ms
57 silly resolveWithNewModule util-deprecate@1.0.2 checking installable status
58 timing stage:loadIdealTree:loadAllDepsIntoIdealTree Completed in 299ms
59 timing stage:loadIdealTree Completed in 304ms
60 silly currentTree foo@1.0.0
61 silly idealTree foo@1.0.0
61 silly idealTree +-- core-util-is@1.0.2
61 silly idealTree +-- inherits@2.0.3
61 silly idealTree +-- isarray@1.0.0
61 silly idealTree +-- process-nextick-args@2.0.0
61 silly idealTree +-- readable-stream@2.3.6
61 silly idealTree +-- safe-buffer@5.1.2
61 silly idealTree +-- string_decoder@1.1.1
61 silly idealTree +-- through2@2.0.5
61 silly idealTree +-- util-deprecate@1.0.2
61 silly idealTree `-- xtend@4.0.1
62 silly install generateActionsToTake
63 timing stage:generateActionsToTake Completed in 5ms
64 silly diffTrees action count 10
65 silly diffTrees add core-util-is@1.0.2
66 silly diffTrees add inherits@2.0.3
67 silly diffTrees add isarray@1.0.0
68 silly diffTrees add process-nextick-args@2.0.0
69 silly diffTrees add safe-buffer@5.1.2
70 silly diffTrees add string_decoder@1.1.1
71 silly diffTrees add util-deprecate@1.0.2
72 silly diffTrees add readable-stream@2.3.6
73 silly diffTrees add xtend@4.0.1
74 silly diffTrees add through2@2.0.5
75 silly decomposeActions action count 80
76 silly decomposeActions fetch core-util-is@1.0.2
77 silly decomposeActions extract core-util-is@1.0.2
78 silly decomposeActions preinstall core-util-is@1.0.2
79 silly decomposeActions build core-util-is@1.0.2
80 silly decomposeActions install core-util-is@1.0.2
81 silly decomposeActions postinstall core-util-is@1.0.2
82 silly decomposeActions finalize core-util-is@1.0.2
83 silly decomposeActions refresh-package-json core-util-is@1.0.2
84 silly decomposeActions fetch inherits@2.0.3
85 silly decomposeActions extract inherits@2.0.3
86 silly decomposeActions preinstall inherits@2.0.3
87 silly decomposeActions build inherits@2.0.3
88 silly decomposeActions install inherits@2.0.3
89 silly decomposeActions postinstall inherits@2.0.3
90 silly decomposeActions finalize inherits@2.0.3
91 silly decomposeActions refresh-package-json inherits@2.0.3
92 silly decomposeActions fetch isarray@1.0.0
93 silly decomposeActions extract isarray@1.0.0
94 silly decomposeActions preinstall isarray@1.0.0
95 silly decomposeActions build isarray@1.0.0
96 silly decomposeActions install isarray@1.0.0
97 silly decomposeActions postinstall isarray@1.0.0
98 silly decomposeActions finalize isarray@1.0.0
99 silly decomposeActions refresh-package-json isarray@1.0.0
100 silly decomposeActions fetch process-nextick-args@2.0.0
101 silly decomposeActions extract process-nextick-args@2.0.0
102 silly decomposeActions preinstall process-nextick-args@2.0.0
103 silly decomposeActions build process-nextick-args@2.0.0
104 silly decomposeActions install process-nextick-args@2.0.0
105 silly decomposeActions postinstall process-nextick-args@2.0.0
106 silly decomposeActions finalize process-nextick-args@2.0.0
107 silly decomposeActions refresh-package-json process-nextick-args@2.0.0
108 silly decomposeActions fetch safe-buffer@5.1.2
109 silly decomposeActions extract safe-buffer@5.1.2
110 silly decomposeActions preinstall safe-buffer@5.1.2
111 silly decomposeActions build safe-buffer@5.1.2
112 silly decomposeActions install safe-buffer@5.1.2
113 silly decomposeActions postinstall safe-buffer@5.1.2
114 silly decomposeActions finalize safe-buffer@5.1.2
115 silly decomposeActions refresh-package-json safe-buffer@5.1.2
116 silly decomposeActions fetch string_decoder@1.1.1
117 silly decomposeActions extract string_decoder@1.1.1
118 silly decomposeActions preinstall string_decoder@1.1.1
119 silly decomposeActions build string_decoder@1.1.1
120 silly decomposeActions install string_decoder@1.1.1
121 silly decomposeActions postinstall string_decoder@1.1.1
122 silly decomposeActions finalize string_decoder@1.1.1
123 silly decomposeActions refresh-package-json string_decoder@1.1.1
124 silly decomposeActions fetch util-deprecate@1.0.2
125 silly decomposeActions extract util-deprecate@1.0.2
126 silly decomposeActions preinstall util-deprecate@1.0.2
127 silly decomposeActions build util-deprecate@1.0.2
128 silly decomposeActions install util-deprecate@1.0.2
129 silly decomposeActions postinstall util-deprecate@1.0.2
130 silly decomposeActions finalize util-deprecate@1.0.2
131 silly decomposeActions refresh-package-json util-deprecate@1.0.2
132 silly decomposeActions fetch readable-stream@2.3.6
133 silly decomposeActions extract readable-stream@2.3.6
134 silly decomposeActions preinstall readable-stream@2.3.6
135 silly decomposeActions build readable-stream@2.3.6
136 silly decomposeActions install readable-stream@2.3.6
137 silly decomposeActions postinstall readable-stream@2.3.6
138 silly decomposeActions finalize readable-stream@2.3.6
139 silly decomposeActions refresh-package-json readable-stream@2.3.6
140 silly decomposeActions fetch xtend@4.0.1
141 silly decomposeActions extract xtend@4.0.1
142 silly decomposeActions preinstall xtend@4.0.1
143 silly decomposeActions build xtend@4.0.1
144 silly decomposeActions install xtend@4.0.1
145 silly decomposeActions postinstall xtend@4.0.1
146 silly decomposeActions finalize xtend@4.0.1
147 silly decomposeActions refresh-package-json xtend@4.0.1
148 silly decomposeActions fetch through2@2.0.5
149 silly decomposeActions extract through2@2.0.5
150 silly decomposeActions preinstall through2@2.0.5
151 silly decomposeActions build through2@2.0.5
152 silly decomposeActions install through2@2.0.5
153 silly decomposeActions postinstall through2@2.0.5
154 silly decomposeActions finalize through2@2.0.5
155 silly decomposeActions refresh-package-json through2@2.0.5
156 silly install executeActions
157 silly doSerial global-install 80
158 verbose correctMkdir C:\Users\Serhan\AppData\Roaming\npm-cache\_locks correctMkdir not in flight; initializing
159 verbose lock using C:\Users\Serhan\AppData\Roaming\npm-cache\_locks\staging-a2ab305ca7bb67eb.lock for C:\Users\Serhan\Desktop\İ\node_modules\.staging
160 silly doParallel extract 10
161 silly extract core-util-is@1.0.2
162 silly extract inherits@2.0.3
163 silly extract isarray@1.0.0
164 silly extract process-nextick-args@2.0.0
165 silly extract safe-buffer@5.1.2
166 silly extract string_decoder@1.1.1
167 silly extract util-deprecate@1.0.2
168 silly extract readable-stream@2.3.6
169 silly extract xtend@4.0.1
170 silly extract through2@2.0.5
171 silly tarball trying core-util-is@~1.0.0 by hash: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
172 silly tarball trying inherits@~2.0.3 by hash: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
173 silly tarball trying isarray@~1.0.0 by hash: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
174 silly tarball trying process-nextick-args@~2.0.0 by hash: sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
175 silly tarball trying safe-buffer@~5.1.1 by hash: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
176 silly tarball trying string_decoder@~1.1.1 by hash: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
177 silly tarball trying util-deprecate@~1.0.1 by hash: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
178 silly tarball trying readable-stream@~2.3.6 by hash: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
179 silly tarball trying xtend@~4.0.1 by hash: sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
180 silly tarball trying through2@^2.0.3 by hash: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
181 silly extract process-nextick-args@~2.0.0 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\process-nextick-args-c12cae2b (87ms)
182 silly extract through2@^2.0.3 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\through2-7cd68c93 (86ms)
183 warn tar ENOENT: no such file or directory, open 'C:\Users\Serhan\Desktop\İ\node_modules\.staging\string_decoder-ea5ed4c9\lib\string_decoder.js'
184 silly extract string_decoder@~1.1.1 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\string_decoder-ea5ed4c9 (91ms)
185 silly extract inherits@~2.0.3 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\inherits-5da2a76e (92ms)
186 silly extract util-deprecate@~1.0.1 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\util-deprecate-e8bd1419 (91ms)
187 warn tar ENOENT: no such file or directory, open 'C:\Users\Serhan\Desktop\İ\node_modules\.staging\core-util-is-d83115db\lib\util.js'
188 silly extract core-util-is@~1.0.0 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\core-util-is-d83115db (97ms)
189 silly extract safe-buffer@~5.1.1 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\safe-buffer-58323c93 (95ms)
190 silly extract isarray@~1.0.0 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\isarray-710cb7ce (96ms)
191 silly extract xtend@~4.0.1 extracted to C:\Users\Serhan\Desktop\İ\node_modules\.staging\xtend-756a5012 (95ms)
192 warn tar ENOENT: no such file or directory, open 'C:\Users\Serhan\Desktop\İ\node_modules\.staging\readable-stream-644f81fc\doc\wg-meetings\2015-01-30.md'
193 warn tar ENOENT: no such file or directory, open 'C:\Users\Serhan\Desktop\İ\node_modules\.staging\readable-stream-644f81fc\lib\_stream_duplex.js'
194 warn tar ENOENT: no such file or directory, open 'C:\Users\Serhan\Desktop\İ\node_modules\.staging\readable-stream-644f81fc\lib\_stream_passthrough.js'
195 warn tar ENOENT: no such file or directory, open 'C:\Users\Serhan\Desktop\İ\node_modules\.staging\readable-stream-644f81fc\lib\_stream_readable.js'
196 timing audit submit Completed in 950ms
197 http fetch POST 200 https://registry.npmjs.org/-/npm/v1/security/audits/quick 950ms
198 timing audit body Completed in 0ms
199 timing npm Completed in 1914ms
200 error cb() never called!
201 error This is an error with npm itself. Please report this error at:
202 error <https://npm.community>

Platform Info

$ npm --versions
{ npm: '6.9.0',
  ares: '1.15.0',
  cldr: '33.1',
  http_parser: '2.8.0',
  icu: '62.1',
  modules: '64',
  napi: '3',
  nghttp2: '1.34.0',
  node: '10.15.1',
  openssl: '1.1.0j',
  tz: '2018e',
  unicode: '11.0',
  uv: '1.23.2',
  v8: '6.8.275.32-node.12',
  zlib: '1.2.11' }
$ node -p process.platform
win32
(Lars Willighagen) #2

I can’t reproduce the error on Linux with just the through2 package. However, Windows paths can be pretty weird so that could be a problem (I can’t test on Windows though). Also, I’ve seen those errors in reports without Turkish characters too, but never with a single package.

(Serhan Apaydın) #3

Finally found the reason here: https://github.com/npm/node-tar/issues/209

The package tar (node-tar?) doesn’t like the İ character. The workaround proposed is to use the option preservePaths: true.

(Serhan Apaydın) #4

Also related: https://github.com/nodejs/node/issues/27534

Update: This is possibly the root of the problem.

1 Like