11#!/usr/bin/env node
22'use strict' 
33
4- var  os  =  require ( 'os' ) 
5- var  fs  =  require ( 'fs' ) 
6- var  path  =  require ( 'path' ) 
74var  queue  =  require ( 'queue-async' ) ( 1 ) 
8- var  exec  =  require ( 'child_process' ) . exec 
9- var  debug  =  require ( 'debug' ) ( 'git-status' ) 
105var  columnify  =  require ( 'columnify' ) 
11- var  afterAll  =  require ( 'after-all-results' ) 
12- var  filter  =  require ( 'patterns' ) ( [ / ^ \. / ,  / \/ \. / ] ) 
136var  pkg  =  require ( './package' ) 
7+ var  scan  =  require ( './lib/scan' ) 
8+ var  git  =  require ( './lib/git' ) 
149
1510var  argv  =  require ( 'minimist' ) ( process . argv . slice ( 2 ) ) 
1611var  dirs  =  argv . _ . length  ? argv . _  : [ process . cwd ( ) ] 
1712
1813if  ( argv . version  ||  argv . v )  return  version ( ) 
1914if  ( argv . help  ||  argv . h )  return  help ( ) 
2015
16+ dirs 
17+  . map ( function  ( dir )  { 
18+  return  {  cwd : dir ,  repos : scan ( dir )  } 
19+  } ) 
20+  . forEach ( function  ( result )  { 
21+  result . repos . forEach ( function  ( repo )  { 
22+  queue . defer ( git . check ,  result . cwd ,  repo ) 
23+  } ) 
24+  } ) 
25+ 
26+ queue . awaitAll ( function  ( err ,  results )  { 
27+  if  ( err )  throw  err 
28+  outputResults ( results ) 
29+ } ) 
30+ 
2131function  version  ( )  { 
2232 console . log ( pkg . version ) 
2333 process . exit ( ) 
@@ -38,21 +48,7 @@ function help () {
3848 process . exit ( ) 
3949} 
4050
41- var  isDir  =  function  ( path )  { 
42-  try  { 
43-  return  fs . statSync ( path ) . isDirectory ( ) 
44-  }  catch  ( e )  { 
45-  return  false 
46-  } 
47- } 
48- 
49- var  joinWith  =  function  ( a )  { 
50-  return  function  ( b )  { 
51-  return  path . join ( a ,  b ) 
52-  } 
53- } 
54- 
55- var  outputResults  =  function  ( results )  { 
51+ function  outputResults  ( results )  { 
5652 results  =  results . filter ( function  ( result )  { 
5753 return  result . branch  !==  'master'  || 
5854 result . ahead  ||  Number . isNaN ( result . ahead )  || 
@@ -69,78 +65,3 @@ var outputResults = function (results) {
6965
7066 console . log ( results ) 
7167} 
72- 
73- var  status  =  function  ( cwd ,  cb )  { 
74-  exec ( 'git status -s' ,  {  cwd : cwd  } ,  function  ( err ,  stdout ,  stderr )  { 
75-  if  ( err )  return  cb ( err ) 
76-  var  status  =  {  dirty : 0 ,  untracked : 0  } 
77-  stdout . trim ( ) . split ( os . EOL ) . forEach ( function  ( file )  { 
78-  if  ( file . substr ( 0 ,  2 )  ===  '??' )  status . untracked ++ 
79-  else  status . dirty ++ 
80-  } ) 
81-  cb ( null ,  status ) 
82-  } ) 
83- } 
84- 
85- var  branch  =  function  ( cwd ,  cb )  { 
86-  exec ( 'cat .git/HEAD' ,  {  cwd : cwd  } ,  function  ( err ,  stdout ,  stderr )  { 
87-  if  ( err )  return  cb ( err ) 
88-  stdout  =  stdout . trim ( ) 
89-  var  branch  =  stdout . indexOf ( 'ref:' )  ===  0  ? stdout . substr ( 16 )  : stdout 
90-  cb ( null ,  branch ) 
91-  } ) 
92- } 
93- 
94- var  ahead  =  function  ( cwd ,  cb )  { 
95-  exec ( 'git rev-list HEAD --not --remotes' ,  {  cwd : cwd  } ,  function  ( err ,  stdout ,  stderr )  { 
96-  if  ( err )  return  cb ( null ,  NaN )  // depending on the state of the git repo, the command might return non-0 exit code 
97-  stdout  =  stdout . trim ( ) 
98-  cb ( null ,  ! stdout  ? 0  : parseInt ( stdout . split ( os . EOL ) . length ,  10 ) ) 
99-  } ) 
100- } 
101- 
102- var  processGitDir  =  function  ( cwd ,  dir ,  cb )  { 
103-  debug ( 'processing git project' ,  dir ) 
104- 
105-  var  next  =  afterAll ( function  ( err ,  results )  { 
106-  if  ( err )  return  cb ( err ) 
107- 
108-  var  branch  =  results [ 0 ] 
109-  var  ahead  =  results [ 1 ] 
110-  var  status  =  results [ 2 ] 
111- 
112-  cb ( null ,  { 
113-  dir : path . relative ( cwd ,  dir ) , 
114-  branch : branch , 
115-  ahead : ahead , 
116-  dirty : status . dirty , 
117-  untracked : status . untracked 
118-  } ) 
119-  } ) 
120- 
121-  branch ( dir ,  next ( ) ) 
122-  ahead ( dir ,  next ( ) ) 
123-  status ( dir ,  next ( ) ) 
124- } 
125- 
126- var  processDir  =  function  ( cwd ,  dir )  { 
127-  if  ( ! dir )  dir  =  cwd 
128-  dir  =  path . resolve ( dir ) 
129- 
130-  if  ( filter . match ( dir ) )  return  debug ( 'skipping filtered directory' ,  dir ) 
131-  else  debug ( 'searching directory' ,  dir ) 
132- 
133-  var  content  =  fs . readdirSync ( dir ) 
134- 
135-  if  ( ~ content . indexOf ( '.git' ) )  queue . defer ( processGitDir ,  cwd ,  dir ) 
136-  else  content . map ( joinWith ( dir ) ) . filter ( isDir ) . forEach ( processDir . bind ( null ,  cwd ) ) 
137- } 
138- 
139- dirs . forEach ( function  ( dir )  { 
140-  processDir ( dir ) 
141- } ) 
142- 
143- queue . awaitAll ( function  ( err ,  results )  { 
144-  if  ( err )  throw  err 
145-  outputResults ( results ) 
146- } ) 
0 commit comments