git-off

git off handles large files in git repos
git clone https://noulin.net/git/git-off.git
Log | Files | Refs | README

index.js (2630B)


      1 var path = require('path');
      2 var fs = require('fs');
      3 var _0777 = parseInt('0777', 8);
      4 
      5 module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
      6 
      7 function mkdirP (p, opts, f, made) {
      8     if (typeof opts === 'function') {
      9         f = opts;
     10         opts = {};
     11     }
     12     else if (!opts || typeof opts !== 'object') {
     13         opts = { mode: opts };
     14     }
     15     
     16     var mode = opts.mode;
     17     var xfs = opts.fs || fs;
     18     
     19     if (mode === undefined) {
     20         mode = _0777 & (~process.umask());
     21     }
     22     if (!made) made = null;
     23     
     24     var cb = f || function () {};
     25     p = path.resolve(p);
     26     
     27     xfs.mkdir(p, mode, function (er) {
     28         if (!er) {
     29             made = made || p;
     30             return cb(null, made);
     31         }
     32         switch (er.code) {
     33             case 'ENOENT':
     34                 mkdirP(path.dirname(p), opts, function (er, made) {
     35                     if (er) cb(er, made);
     36                     else mkdirP(p, opts, cb, made);
     37                 });
     38                 break;
     39 
     40             // In the case of any other error, just see if there's a dir
     41             // there already.  If so, then hooray!  If not, then something
     42             // is borked.
     43             default:
     44                 xfs.stat(p, function (er2, stat) {
     45                     // if the stat fails, then that's super weird.
     46                     // let the original error be the failure reason.
     47                     if (er2 || !stat.isDirectory()) cb(er, made)
     48                     else cb(null, made);
     49                 });
     50                 break;
     51         }
     52     });
     53 }
     54 
     55 mkdirP.sync = function sync (p, opts, made) {
     56     if (!opts || typeof opts !== 'object') {
     57         opts = { mode: opts };
     58     }
     59     
     60     var mode = opts.mode;
     61     var xfs = opts.fs || fs;
     62     
     63     if (mode === undefined) {
     64         mode = _0777 & (~process.umask());
     65     }
     66     if (!made) made = null;
     67 
     68     p = path.resolve(p);
     69 
     70     try {
     71         xfs.mkdirSync(p, mode);
     72         made = made || p;
     73     }
     74     catch (err0) {
     75         switch (err0.code) {
     76             case 'ENOENT' :
     77                 made = sync(path.dirname(p), opts, made);
     78                 sync(p, opts, made);
     79                 break;
     80 
     81             // In the case of any other error, just see if there's a dir
     82             // there already.  If so, then hooray!  If not, then something
     83             // is borked.
     84             default:
     85                 var stat;
     86                 try {
     87                     stat = xfs.statSync(p);
     88                 }
     89                 catch (err1) {
     90                     throw err0;
     91                 }
     92                 if (!stat.isDirectory()) throw err0;
     93                 break;
     94         }
     95     }
     96 
     97     return made;
     98 };