96 lines
2.3 KiB
Python
Executable File
96 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
#
|
||
# Magic project opener
|
||
# © 2012 Artem Sapegin (sapegin.me)
|
||
#
|
||
|
||
|
||
import os
|
||
import glob
|
||
import re
|
||
import sys
|
||
import argparse
|
||
import subprocess
|
||
import platform
|
||
|
||
WHAT_CHOICES = 'project', 'repo', 'wptheme'
|
||
IS_MAC = platform.system() == 'Darwin'
|
||
|
||
|
||
def main():
|
||
projects_dir, project_name, what, is_open = parse_arguments()
|
||
|
||
os.chdir(projects_dir)
|
||
|
||
project = find_project(project_name)
|
||
if not project:
|
||
sys.exit('No project found.')
|
||
|
||
func_name = 'find__%s' % what
|
||
if func_name not in globals():
|
||
sys.exit('Function not found.')
|
||
|
||
func = globals()[func_name]
|
||
folder = func(project)
|
||
|
||
open('%s/%s' % (projects_dir, folder), is_open)
|
||
|
||
|
||
def parse_arguments():
|
||
parser = argparse.ArgumentParser(description='Magic project opener.')
|
||
parser.add_argument('projects_dir', nargs=1, help='Base projects directiory.')
|
||
parser.add_argument('project_name', nargs=1, help='Fuzzy project name.')
|
||
parser.add_argument('-w', '--what', choices=WHAT_CHOICES, default=WHAT_CHOICES[0], help='Part of project to open.')
|
||
parser.add_argument('-o', '--open', action='store_true', help='Open in %s.' % ('Finder' if IS_MAC else 'Windows Explorer'))
|
||
args = parser.parse_args()
|
||
return args.projects_dir[0], args.project_name[0], args.what, args.open
|
||
|
||
|
||
def find_project(name):
|
||
pattern = '.*'.join(list(name))
|
||
folders = glob.glob('*/*/')
|
||
for folder in folders:
|
||
if re.search(pattern, folder, re.IGNORECASE):
|
||
return folder
|
||
return None
|
||
|
||
|
||
def find__project(project):
|
||
return project
|
||
|
||
|
||
def find__repo(project):
|
||
git = glob.glob(project + '/.git/')
|
||
if git:
|
||
return project
|
||
|
||
repos = glob.glob(project + '/*/.git/')
|
||
if not repos:
|
||
sys.exit('Git repo not found in this project.')
|
||
return os.path.dirname(os.path.dirname(repos[0]))
|
||
|
||
|
||
def find__wptheme(project):
|
||
themes = glob.glob(project + '/*/wp-content/themes/*/')
|
||
if not themes:
|
||
sys.exit('Wordpress installation not found in this project.')
|
||
return themes[0]
|
||
|
||
|
||
def open(path, is_open):
|
||
path = os.path.normpath(path)
|
||
if is_open:
|
||
subprocess.Popen(r'%s "%s"' % ('open' if IS_MAC else 'explorer', path))
|
||
else:
|
||
# Should be used via Bash alias like this:
|
||
# function proj {
|
||
# cd "$("C:\Cormorant\Dropbox\My Dropbox\Projects\opener.py" "C:\Cormorant\Dropbox\My Dropbox\Projects" $1 -w project $2)"
|
||
# }
|
||
print path
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|