#!/usr/bin/env python # coding=utf-8 import os import sys import requests __author__ = 'Victor Häggqvist' __version__ = '0.3.0' def repo_url(kind: str, global_dir=False) -> str: if global_dir: return 'https://raw.githubusercontent.com/github/gitignore/master/Global/%s.gitignore' % kind else: return 'https://raw.githubusercontent.com/github/gitignore/master/%s.gitignore' % kind def get_ignore_file(kind: str, global_dir=False, path=False) -> str: """ Download the file """ if not path: url = repo_url(kind, global_dir) else: if kind[0] == '/': kind = kind[1:] url = 'https://raw.githubusercontent.com/github/gitignore/master/%s' % kind r = requests.get(url) if r.status_code != 200: return None return r.text def search_for_file(kind: str) -> str: """ Search for file in https://github.com/github/gitignore """ headers = { 'User-Agent': 'giti.py/'+__version__, 'Accept': 'application/vnd.github.v3+json' } r = requests.get('https://api.github.com/search/code?q=repo:github/gitignore %s' % kind, headers=headers) cont = r.json() # Check is any result match when ignoring case for i in range(0, len(cont['items'])): name = cont['items'][i]['name'].split('.')[0] if name.lower() == kind.lower(): print("Found match {}".format(name)) return cont['items'][i]['path'] if len(cont['items']) < 1: print("Search found nothing") return None print('One of these might be good:') for i in range(0, len(cont['items'])): name = cont['items'][i]['name'].split('.')[0] print('[%s] %s' % (i, name)) try: choice = input('Enter index [0]: ') if choice == "": choice = 0 else: choice = int(choice) except TypeError: return None except KeyboardInterrupt: print('\n') return None if -1 < choice < len(cont['items']): return cont['items'][choice]['path'] else: return None def save_file(file: str): """ Store content in file """ merge = 'y' replace = 'n' if os.path.isfile('.gitignore'): try: merge = input('Do you want to merge with existing .gitignore [Y/n]: ') merge = 'y' if merge == '' else 'n' except KeyError: merge = 'y' except KeyboardInterrupt: terminate_gracefully() if merge.lower() == "n": try: replace = input('Do you want to replace existing .gitignore [y/N]: ') except KeyError: replace = 'n' except KeyboardInterrupt: terminate_gracefully() if merge.lower() == 'y': with open('.gitignore', 'a') as f: f.write(file) print('.gitignore baked :)') elif replace.lower() == 'y': with open('.gitignore', 'w') as f: f.write(file) print('.gitignore replaced') else: print('Did nothing, your .gitignore lives like before') def giti(kind: str): kind = kind[0].upper() + kind[1:] print('Fetching .gitignore for %s' % kind) gifile = get_ignore_file(kind) if not gifile: print('Not found in master') gifile = get_ignore_file(kind, global_dir=True) if not gifile: print('Found no exact match, let\'s give searching a try...') filepath = search_for_file(kind) if not filepath: terminate_gracefully() gifile = get_ignore_file(filepath, path=True) if not gifile: terminate_gracefully() save_file(gifile) def terminate_gracefully(): print('Can\'t help any more, exiting') print('No changes made') exit(0) def show_help(): print('Usage: giti [language or stuff]') print('giti v%s' % __version__) def main(): if len(sys.argv) == 2: giti(sys.argv[1]) else: show_help() if __name__ == '__main__': main()