Skip to content

Instantly share code, notes, and snippets.

@mrdrozdov
Created February 22, 2020 23:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrdrozdov/aa7c22fd01c479e9b585beb14dc962e6 to your computer and use it in GitHub Desktop.
Save mrdrozdov/aa7c22fd01c479e9b585beb14dc962e6 to your computer and use it in GitHub Desktop.
git-tmp.py
#!/usr/bin/env python
import json
import os
import shutil
import subprocess
import sys
import tempfile
# env
GT_HOME = os.environ.get('GT_HOME', os.path.expanduser('~/.git-tmp'))
GT_CONFIG = os.path.join(GT_HOME, 'config.json')
GT_STATE = os.path.join(GT_HOME, 'state.json')
# defaults
default_config = {}
default_state = {}
# config
def init_config():
if not os.path.exists(GT_HOME):
print('Creating git-tmp home at: {}'.format(GT_HOME))
os.makedirs(GT_HOME)
if not os.path.exists(GT_CONFIG):
print('Creating git-tmp config at: {}'.format(GT_CONFIG))
with open(GT_CONFIG, 'w') as f:
f.write(json.dumps(default_config, sort_keys=True, indent=4))
def read_config():
with open(GT_CONFIG) as f:
return json.loads(f.read())
init_config()
cfg = read_config()
# check if git controlled
if os.system('git rev-parse') != 0:
print('Not a git directory. Cancelling.')
sys.exit()
# create tmp dir
def read_state():
if not os.path.exists(GT_STATE):
with open(GT_STATE, 'w') as f:
f.write(json.dumps(default_state))
with open(GT_STATE) as f:
return json.loads(f.read())
def write_state(state):
with open(GT_STATE, 'w') as f:
f.write(json.dumps(state))
def update_gt_state(projname, temp_dir):
state = read_state()
print('Found previous projects:')
temp_dir_lst = state.get('temp_dir_lst', [])
if len(temp_dir_lst) == 0:
print('None found!')
else:
for prev_projname, prev_temp_dir in temp_dir_lst:
print('{} {} exists={}'.format(prev_projname, prev_temp_dir, os.path.exists(prev_temp_dir)))
print('')
state.setdefault('temp_dir_lst', []).append([projname, temp_dir])
write_state(state)
res = subprocess.run(['git', 'rev-parse', '--git-dir'], stdout=subprocess.PIPE)
gitdir = os.path.abspath(res.stdout.decode('utf-8').strip())
print('Found git directory: {}'.format(gitdir))
projdir = os.path.dirname(gitdir)
projname = os.path.basename(projdir)
temp_dir = tempfile.mkdtemp()
update_gt_state(projname, temp_dir)
print('Current tmp directory: {}'.format(temp_dir))
# copy directory
new_projdir = os.path.join(temp_dir, projname)
print('Copying project directory from: {}'.format(projdir))
shutil.copytree(projdir, new_projdir, symlinks=False, ignore=None)
print('To use the temporary project directory:\n\n\tcd {}'.format(new_projdir))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment