@@ -109,31 +109,37 @@ exports.makeUncompressFn = StreamClass => {
109109 . on ( 'error' , reject )
110110 . on ( 'entry' , ( header , stream , next ) => {
111111 stream . on ( 'end' , next ) ;
112+ const destFilePath = path . join ( destDir , header . name ) ;
112113
113114 if ( header . type === 'file' ) {
114- const fullpath = path . join ( destDir , header . name ) ;
115- mkdirp ( path . dirname ( fullpath ) , err => {
115+ const dir = path . dirname ( destFilePath ) ;
116+ mkdirp ( dir , err => {
116117 if ( err ) return reject ( err ) ;
117118
118119 entryCount ++ ;
119- pump ( stream , fs . createWriteStream ( fullpath , { mode : opts . mode || header . mode } ) , err => {
120+ pump ( stream , fs . createWriteStream ( destFilePath , { mode : opts . mode || header . mode } ) , err => {
120121 if ( err ) return reject ( err ) ;
121122 successCount ++ ;
122123 done ( ) ;
123124 } ) ;
124125 } ) ;
125126 } else if ( header . type === 'symlink' ) {
126- // symlink
127- const src = path . join ( destDir , header . name ) ;
128- const target = path . resolve ( path . dirname ( src ) , header . linkname ) ;
127+ const dir = path . dirname ( destFilePath ) ;
128+ const target = path . resolve ( dir , header . linkname ) ;
129129 entryCount ++ ;
130- fs . symlink ( target , src , err => {
130+
131+ mkdirp ( dir , err => {
131132 if ( err ) return reject ( err ) ;
132- successCount ++ ;
133- stream . resume ( ) ;
133+
134+ const relativeTarget = path . relative ( dir , target ) ;
135+ fs . symlink ( relativeTarget , destFilePath , err => {
136+ if ( err ) return reject ( err ) ;
137+ successCount ++ ;
138+ stream . resume ( ) ;
139+ } ) ;
134140 } ) ;
135141 } else { // directory
136- mkdirp ( path . join ( destDir , header . name ) , err => {
142+ mkdirp ( destFilePath , err => {
137143 if ( err ) return reject ( err ) ;
138144 stream . resume ( ) ;
139145 } ) ;
@@ -175,7 +181,7 @@ function normalizePath(fileName) {
175181 return fileName ;
176182}
177183
178- exports . stripFileName = ( strip , fileName , type ) => {
184+ function stripFileName ( strip , fileName , type ) {
179185 // before
180186 // node/package.json
181187 // node/lib/index.js
@@ -219,3 +225,5 @@ exports.stripFileName = (strip, fileName, type) => {
219225 strip = Math . min ( strip , s . length - 1 ) ;
220226 return s . slice ( strip ) . join ( '/' ) || '/' ;
221227} ;
228+
229+ exports . stripFileName = stripFileName ;
0 commit comments