Initial commit
[yaffs-website] / node_modules / tar / test / pack-no-proprietary.js
1 // This is exactly like test/pack.js, except that it's excluding
2 // any proprietary headers.
3 //
4 // This loses some information about the filesystem, but creates
5 // tarballs that are supported by more versions of tar, especially
6 // old non-spec-compliant copies of gnutar.
7
8 // the symlink file is excluded from git, because it makes
9 // windows freak the hell out.
10 var fs = require("fs")
11   , path = require("path")
12   , symlink = path.resolve(__dirname, "fixtures/symlink")
13 try { fs.unlinkSync(symlink) } catch (e) {}
14 fs.symlinkSync("./hardlink-1", symlink)
15 process.on("exit", function () {
16   fs.unlinkSync(symlink)
17 })
18
19 var tap = require("tap")
20   , tar = require("../tar.js")
21   , pkg = require("../package.json")
22   , Pack = tar.Pack
23   , fstream = require("fstream")
24   , Reader = fstream.Reader
25   , Writer = fstream.Writer
26   , input = path.resolve(__dirname, "fixtures/")
27   , target = path.resolve(__dirname, "tmp/pack.tar")
28   , uid = process.getuid ? process.getuid() : 0
29   , gid = process.getgid ? process.getgid() : 0
30
31   , entries =
32
33     // the global header and root fixtures/ dir are going to get
34     // a different date each time, so omit that bit.
35     // Also, dev/ino values differ across machines, so that's not
36     // included.
37     [ [ 'entry',
38       { path: 'fixtures/',
39         mode: 493,
40         uid: uid,
41         gid: gid,
42         size: 0,
43         type: '5',
44         linkpath: '',
45         ustar: 'ustar\u0000',
46         ustarver: '00',
47         uname: '',
48         gname: '',
49         devmaj: 0,
50         devmin: 0,
51         fill: '' } ]
52
53     , [ 'extendedHeader',
54       { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
55         mode: 420,
56         uid: uid,
57         gid: gid,
58         type: 'x',
59         linkpath: '',
60         ustar: 'ustar\u0000',
61         ustarver: '00',
62         uname: '',
63         gname: '',
64         devmaj: 0,
65         devmin: 0,
66         fill: '' },
67       { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
68         uid: uid,
69         gid: gid,
70         size: 200 } ]
71
72     , [ 'entry',
73       { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
74         mode: 420,
75         uid: uid,
76         gid: gid,
77         size: 200,
78         type: '0',
79         linkpath: '',
80         ustar: 'ustar\u0000',
81         ustarver: '00',
82         uname: '',
83         gname: '',
84         devmaj: 0,
85         devmin: 0,
86         fill: '' } ]
87
88     , [ 'entry',
89       { path: 'fixtures/a.txt',
90         mode: 420,
91         uid: uid,
92         gid: gid,
93         size: 257,
94         type: '0',
95         linkpath: '',
96         ustar: 'ustar\u0000',
97         ustarver: '00',
98         uname: '',
99         gname: '',
100         devmaj: 0,
101         devmin: 0,
102         fill: '' } ]
103
104     , [ 'entry',
105       { path: 'fixtures/b.txt',
106         mode: 420,
107         uid: uid,
108         gid: gid,
109         size: 512,
110         type: '0',
111         linkpath: '',
112         ustar: 'ustar\u0000',
113         ustarver: '00',
114         uname: '',
115         gname: '',
116         devmaj: 0,
117         devmin: 0,
118         fill: '' } ]
119
120     , [ 'entry',
121       { path: 'fixtures/c.txt',
122         mode: 420,
123         uid: uid,
124         gid: gid,
125         size: 513,
126         type: '0',
127         linkpath: '',
128         ustar: 'ustar\u0000',
129         ustarver: '00',
130         uname: '',
131         gname: '',
132         devmaj: 0,
133         devmin: 0,
134         fill: '' } ]
135
136     , [ 'entry',
137       { path: 'fixtures/cc.txt',
138         mode: 420,
139         uid: uid,
140         gid: gid,
141         size: 513,
142         type: '0',
143         linkpath: '',
144         ustar: 'ustar\u0000',
145         ustarver: '00',
146         uname: '',
147         gname: '',
148         devmaj: 0,
149         devmin: 0,
150         fill: '' } ]
151
152     , [ 'entry',
153       { path: 'fixtures/dir/',
154         mode: 488,
155         uid: uid,
156         gid: gid,
157         size: 0,
158         type: '5',
159         linkpath: '',
160         ustar: 'ustar\u0000',
161         ustarver: '00',
162         uname: '',
163         gname: '',
164         devmaj: 0,
165         devmin: 0,
166         fill: '' } ]
167
168     , [ 'entry',
169       { path: 'fixtures/dir/sub/',
170         mode: 488,
171         uid: uid,
172         gid: gid,
173         size: 0,
174         type: '5',
175         linkpath: '',
176         ustar: 'ustar\u0000',
177         ustarver: '00',
178         uname: '',
179         gname: '',
180         devmaj: 0,
181         devmin: 0,
182         fill: '' } ]
183
184     , [ 'entry',
185       { path: 'fixtures/foo.js',
186         mode: 420,
187         uid: uid,
188         gid: gid,
189         size: 4,
190         type: '0',
191         linkpath: '',
192         ustar: 'ustar\u0000',
193         ustarver: '00',
194         uname: '',
195         gname: '',
196         devmaj: 0,
197         devmin: 0,
198         fill: '' } ]
199
200     , [ 'entry',
201       { path: 'fixtures/hardlink-1',
202         mode: 420,
203         uid: uid,
204         gid: gid,
205         size: 200,
206         type: '0',
207         linkpath: '',
208         ustar: 'ustar\u0000',
209         ustarver: '00',
210         uname: '',
211         gname: '',
212         devmaj: 0,
213         devmin: 0,
214         fill: '' } ]
215
216     , [ 'entry',
217       { path: 'fixtures/hardlink-2',
218         mode: 420,
219         uid: uid,
220         gid: gid,
221         size: 0,
222         type: '1',
223         linkpath: 'fixtures/hardlink-1',
224         ustar: 'ustar\u0000',
225         ustarver: '00',
226         uname: '',
227         gname: '',
228         devmaj: 0,
229         devmin: 0,
230         fill: '' } ]
231
232     , [ 'entry',
233       { path: 'fixtures/omega.txt',
234         mode: 420,
235         uid: uid,
236         gid: gid,
237         size: 2,
238         type: '0',
239         linkpath: '',
240         ustar: 'ustar\u0000',
241         ustarver: '00',
242         uname: '',
243         gname: '',
244         devmaj: 0,
245         devmin: 0,
246         fill: '' } ]
247
248     , [ 'entry',
249       { path: 'fixtures/packtest/',
250         mode: 493,
251         uid: uid,
252         gid: gid,
253         size: 0,
254         type: '5',
255         linkpath: '',
256         ustar: 'ustar\u0000',
257         ustarver: '00',
258         uname: '',
259         gname: '',
260         devmaj: 0,
261         devmin: 0,
262         fill: '' } ]
263
264     , [ 'entry',
265       { path: 'fixtures/packtest/omega.txt',
266         mode: 420,
267         uid: uid,
268         gid: gid,
269         size: 2,
270         type: '0',
271         linkpath: '',
272         ustar: 'ustar\u0000',
273         ustarver: '00',
274         uname: '',
275         gname: '',
276         devmaj: 0,
277         devmin: 0,
278         fill: '' } ]
279
280     , [ 'entry',
281       { path: 'fixtures/packtest/star.4.html',
282         mode: 420,
283         uid: uid,
284         gid: gid,
285         size: 54081,
286         type: '0',
287         linkpath: '',
288         ustar: 'ustar\u0000',
289         ustarver: '00',
290         uname: '',
291         gname: '',
292         devmaj: 0,
293         devmin: 0,
294         fill: '' } ]
295
296     , [ 'extendedHeader',
297       { path: 'PaxHeader/fixtures/packtest/Ω.txt',
298         mode: 420,
299         uid: uid,
300         gid: gid,
301         type: 'x',
302         linkpath: '',
303         ustar: 'ustar\u0000',
304         ustarver: '00',
305         uname: '',
306         gname: '',
307         devmaj: 0,
308         devmin: 0,
309         fill: '' },
310       { path: 'fixtures/packtest/Ω.txt',
311         uid: uid,
312         gid: gid,
313         size: 2 } ]
314
315     , [ 'entry',
316       { path: 'fixtures/packtest/Ω.txt',
317         mode: 420,
318         uid: uid,
319         gid: gid,
320         size: 2,
321         type: '0',
322         linkpath: '',
323         ustar: 'ustar\u0000',
324         ustarver: '00',
325         uname: '',
326         gname: '',
327         devmaj: 0,
328         devmin: 0,
329         fill: '' } ]
330
331     , [ 'entry',
332       { path: 'fixtures/r/',
333         mode: 493,
334         uid: uid,
335         gid: gid,
336         size: 0,
337         type: '5',
338         linkpath: '',
339         ustar: 'ustar\u0000',
340         ustarver: '00',
341         uname: '',
342         gname: '',
343         devmaj: 0,
344         devmin: 0,
345         fill: '' } ]
346
347     , [ 'entry',
348       { path: 'fixtures/r/e/',
349         mode: 493,
350         uid: uid,
351         gid: gid,
352         size: 0,
353         type: '5',
354         linkpath: '',
355         ustar: 'ustar\u0000',
356         ustarver: '00',
357         uname: '',
358         gname: '',
359         devmaj: 0,
360         devmin: 0,
361         fill: '' } ]
362
363     , [ 'entry',
364       { path: 'fixtures/r/e/a/',
365         mode: 493,
366         uid: uid,
367         gid: gid,
368         size: 0,
369         type: '5',
370         linkpath: '',
371         ustar: 'ustar\u0000',
372         ustarver: '00',
373         uname: '',
374         gname: '',
375         devmaj: 0,
376         devmin: 0,
377         fill: '' } ]
378
379     , [ 'entry',
380       { path: 'fixtures/r/e/a/l/',
381         mode: 493,
382         uid: uid,
383         gid: gid,
384         size: 0,
385         type: '5',
386         linkpath: '',
387         ustar: 'ustar\u0000',
388         ustarver: '00',
389         uname: '',
390         gname: '',
391         devmaj: 0,
392         devmin: 0,
393         fill: '' } ]
394
395     , [ 'entry',
396       { path: 'fixtures/r/e/a/l/l/',
397         mode: 493,
398         uid: uid,
399         gid: gid,
400         size: 0,
401         type: '5',
402         linkpath: '',
403         ustar: 'ustar\u0000',
404         ustarver: '00',
405         uname: '',
406         gname: '',
407         devmaj: 0,
408         devmin: 0,
409         fill: '' } ]
410
411     , [ 'entry',
412       { path: 'fixtures/r/e/a/l/l/y/',
413         mode: 493,
414         uid: uid,
415         gid: gid,
416         size: 0,
417         type: '5',
418         linkpath: '',
419         ustar: 'ustar\u0000',
420         ustarver: '00',
421         uname: '',
422         gname: '',
423         devmaj: 0,
424         devmin: 0,
425         fill: '' } ]
426
427     , [ 'entry',
428       { path: 'fixtures/r/e/a/l/l/y/-/',
429         mode: 493,
430         uid: uid,
431         gid: gid,
432         size: 0,
433         type: '5',
434         linkpath: '',
435         ustar: 'ustar\u0000',
436         ustarver: '00',
437         uname: '',
438         gname: '',
439         devmaj: 0,
440         devmin: 0,
441         fill: '' } ]
442
443     , [ 'entry',
444       { path: 'fixtures/r/e/a/l/l/y/-/d/',
445         mode: 493,
446         uid: uid,
447         gid: gid,
448         size: 0,
449         type: '5',
450         linkpath: '',
451         ustar: 'ustar\u0000',
452         ustarver: '00',
453         uname: '',
454         gname: '',
455         devmaj: 0,
456         devmin: 0,
457         fill: '' } ]
458
459     , [ 'entry',
460       { path: 'fixtures/r/e/a/l/l/y/-/d/e/',
461         mode: 493,
462         uid: uid,
463         gid: gid,
464         size: 0,
465         type: '5',
466         linkpath: '',
467         ustar: 'ustar\u0000',
468         ustarver: '00',
469         uname: '',
470         gname: '',
471         devmaj: 0,
472         devmin: 0,
473         fill: '' } ]
474
475     , [ 'entry',
476       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/',
477         mode: 493,
478         uid: uid,
479         gid: gid,
480         size: 0,
481         type: '5',
482         linkpath: '',
483         ustar: 'ustar\u0000',
484         ustarver: '00',
485         uname: '',
486         gname: '',
487         devmaj: 0,
488         devmin: 0,
489         fill: '' } ]
490
491     , [ 'entry',
492       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/',
493         mode: 493,
494         uid: uid,
495         gid: gid,
496         size: 0,
497         type: '5',
498         linkpath: '',
499         ustar: 'ustar\u0000',
500         ustarver: '00',
501         uname: '',
502         gname: '',
503         devmaj: 0,
504         devmin: 0,
505         fill: '' } ]
506
507     , [ 'entry',
508       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/',
509         mode: 493,
510         uid: uid,
511         gid: gid,
512         size: 0,
513         type: '5',
514         linkpath: '',
515         ustar: 'ustar\u0000',
516         ustarver: '00',
517         uname: '',
518         gname: '',
519         devmaj: 0,
520         devmin: 0,
521         fill: '' } ]
522
523     , [ 'entry',
524       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/',
525         mode: 493,
526         uid: uid,
527         gid: gid,
528         size: 0,
529         type: '5',
530         linkpath: '',
531         ustar: 'ustar\u0000',
532         ustarver: '00',
533         uname: '',
534         gname: '',
535         devmaj: 0,
536         devmin: 0,
537         fill: '' } ]
538
539     , [ 'entry',
540       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/',
541         mode: 493,
542         uid: uid,
543         gid: gid,
544         size: 0,
545         type: '5',
546         linkpath: '',
547         ustar: 'ustar\u0000',
548         ustarver: '00',
549         uname: '',
550         gname: '',
551         devmaj: 0,
552         devmin: 0,
553         fill: '' } ]
554
555     , [ 'entry',
556       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/',
557         mode: 493,
558         uid: uid,
559         gid: gid,
560         size: 0,
561         type: '5',
562         linkpath: '',
563         ustar: 'ustar\u0000',
564         ustarver: '00',
565         uname: '',
566         gname: '',
567         devmaj: 0,
568         devmin: 0,
569         fill: '' } ]
570
571     , [ 'entry',
572       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/',
573         mode: 493,
574         uid: uid,
575         gid: gid,
576         size: 0,
577         type: '5',
578         linkpath: '',
579         ustar: 'ustar\u0000',
580         ustarver: '00',
581         uname: '',
582         gname: '',
583         devmaj: 0,
584         devmin: 0,
585         fill: '' } ]
586
587     , [ 'entry',
588       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/',
589         mode: 493,
590         uid: uid,
591         gid: gid,
592         size: 0,
593         type: '5',
594         linkpath: '',
595         ustar: 'ustar\u0000',
596         ustarver: '00',
597         uname: '',
598         gname: '',
599         devmaj: 0,
600         devmin: 0,
601         fill: '' } ]
602
603     , [ 'entry',
604       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/',
605         mode: 493,
606         uid: uid,
607         gid: gid,
608         size: 0,
609         type: '5',
610         linkpath: '',
611         ustar: 'ustar\u0000',
612         ustarver: '00',
613         uname: '',
614         gname: '',
615         devmaj: 0,
616         devmin: 0,
617         fill: '' } ]
618
619     , [ 'entry',
620       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/',
621         mode: 493,
622         uid: uid,
623         gid: gid,
624         size: 0,
625         type: '5',
626         linkpath: '',
627         ustar: 'ustar\u0000',
628         ustarver: '00',
629         uname: '',
630         gname: '',
631         devmaj: 0,
632         devmin: 0,
633         fill: '' } ]
634
635     , [ 'entry',
636       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/',
637         mode: 493,
638         uid: uid,
639         gid: gid,
640         size: 0,
641         type: '5',
642         linkpath: '',
643         ustar: 'ustar\u0000',
644         ustarver: '00',
645         uname: '',
646         gname: '',
647         devmaj: 0,
648         devmin: 0,
649         fill: '' } ]
650
651     , [ 'entry',
652       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/',
653         mode: 493,
654         uid: uid,
655         gid: gid,
656         size: 0,
657         type: '5',
658         linkpath: '',
659         ustar: 'ustar\u0000',
660         ustarver: '00',
661         uname: '',
662         gname: '',
663         devmaj: 0,
664         devmin: 0,
665         fill: '' } ]
666
667     , [ 'entry',
668       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/',
669         mode: 493,
670         uid: uid,
671         gid: gid,
672         size: 0,
673         type: '5',
674         linkpath: '',
675         ustar: 'ustar\u0000',
676         ustarver: '00',
677         uname: '',
678         gname: '',
679         devmaj: 0,
680         devmin: 0,
681         fill: '' } ]
682
683     , [ 'entry',
684       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/',
685         mode: 493,
686         uid: uid,
687         gid: gid,
688         size: 0,
689         type: '5',
690         linkpath: '',
691         ustar: 'ustar\u0000',
692         ustarver: '00',
693         uname: '',
694         gname: '',
695         devmaj: 0,
696         devmin: 0,
697         fill: '' } ]
698
699     , [ 'entry',
700       { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
701         mode: 420,
702         uid: uid,
703         gid: gid,
704         size: 100,
705         type: '0',
706         linkpath: '',
707         ustar: 'ustar\u0000',
708         ustarver: '00',
709         uname: '',
710         gname: '',
711         devmaj: 0,
712         devmin: 0,
713         fill: '' } ]
714
715     , [ 'entry',
716       { path: 'fixtures/symlink',
717         uid: uid,
718         gid: gid,
719         size: 0,
720         type: '2',
721         linkpath: 'hardlink-1',
722         ustar: 'ustar\u0000',
723         ustarver: '00',
724         uname: '',
725         gname: '',
726         devmaj: 0,
727         devmin: 0,
728         fill: '' } ]
729
730     , [ 'extendedHeader',
731       { path: 'PaxHeader/fixtures/Ω.txt',
732         mode: 420,
733         uid: uid,
734         gid: gid,
735         type: 'x',
736         linkpath: '',
737         ustar: 'ustar\u0000',
738         ustarver: '00',
739         uname: '',
740         gname: '',
741         devmaj: 0,
742         devmin: 0,
743         fill: '' },
744       { path: "fixtures/Ω.txt"
745       , uid: uid
746       , gid: gid
747       , size: 2 } ]
748
749     , [ 'entry',
750       { path: 'fixtures/Ω.txt',
751         mode: 420,
752         uid: uid,
753         gid: gid,
754         size: 2,
755         type: '0',
756         linkpath: '',
757         ustar: 'ustar\u0000',
758         ustarver: '00',
759         uname: '',
760         gname: '',
761         devmaj: 0,
762         devmin: 0,
763         fill: '' } ]
764     ]
765
766
767 // first, make sure that the hardlinks are actually hardlinks, or this
768 // won't work.  Git has a way of replacing them with a copy.
769 var hard1 = path.resolve(__dirname, "fixtures/hardlink-1")
770   , hard2 = path.resolve(__dirname, "fixtures/hardlink-2")
771   , fs = require("fs")
772
773 try { fs.unlinkSync(hard2) } catch (e) {}
774 fs.linkSync(hard1, hard2)
775
776 tap.test("with global header", { timeout: 10000 }, function (t) {
777   runTest(t, true)
778 })
779
780 tap.test("without global header", { timeout: 10000 }, function (t) {
781   runTest(t, false)
782 })
783
784 function alphasort (a, b) {
785   return a === b ? 0
786        : a.toLowerCase() > b.toLowerCase() ? 1
787        : a.toLowerCase() < b.toLowerCase() ? -1
788        : a > b ? 1
789        : -1
790 }
791
792
793 function runTest (t, doGH) {
794   var reader = Reader({ path: input
795                       , filter: function () {
796                           return !this.path.match(/\.(tar|hex)$/)
797                         }
798                       , sort: alphasort
799                       })
800
801   var props = doGH ? pkg : {}
802   props.noProprietary = true
803   var pack = Pack(props)
804   var writer = Writer(target)
805
806   // global header should be skipped regardless, since it has no content.
807   var entry = 0
808
809   t.ok(reader, "reader ok")
810   t.ok(pack, "pack ok")
811   t.ok(writer, "writer ok")
812
813   pack.pipe(writer)
814
815   var parse = tar.Parse()
816   t.ok(parse, "parser should be ok")
817
818   pack.on("data", function (c) {
819     // console.error("PACK DATA")
820     if (c.length !== 512) {
821       // this one is too noisy, only assert if it'll be relevant
822       t.equal(c.length, 512, "parser should emit data in 512byte blocks")
823     }
824     parse.write(c)
825   })
826
827   pack.on("end", function () {
828     // console.error("PACK END")
829     t.pass("parser ends")
830     parse.end()
831   })
832
833   pack.on("error", function (er) {
834     t.fail("pack error", er)
835   })
836
837   parse.on("error", function (er) {
838     t.fail("parse error", er)
839   })
840
841   writer.on("error", function (er) {
842     t.fail("writer error", er)
843   })
844
845   reader.on("error", function (er) {
846     t.fail("reader error", er)
847   })
848
849   parse.on("*", function (ev, e) {
850     var wanted = entries[entry++]
851     if (!wanted) {
852       t.fail("unexpected event: "+ev)
853       return
854     }
855     t.equal(ev, wanted[0], "event type should be "+wanted[0])
856
857     if (ev !== wanted[0] || e.path !== wanted[1].path) {
858       console.error("wanted", wanted)
859       console.error([ev, e.props])
860       e.on("end", function () {
861         console.error(e.fields)
862         throw "break"
863       })
864     }
865
866     t.has(e.props, wanted[1], "properties "+wanted[1].path)
867     if (wanted[2]) {
868       e.on("end", function () {
869         if (!e.fields) {
870           t.ok(e.fields, "should get fields")
871         } else {
872           t.has(e.fields, wanted[2], "should get expected fields")
873         }
874       })
875     }
876   })
877
878   reader.pipe(pack)
879
880   writer.on("close", function () {
881     t.equal(entry, entries.length, "should get all expected entries")
882     t.pass("it finished")
883     t.end()
884   })
885
886 }