Last active
December 15, 2015 20:40
-
-
Save apuignav/5319680 to your computer and use it in GitHub Desktop.
LPHE ninja utilities
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# @file lphe-ja.py | |
# @author Albert Puig (albert.puig@epfl.ch) | |
# @date 05.04.2013 | |
import os | |
import sys | |
import re | |
from sh import git, svn | |
import getpass | |
# Work functions | |
gitoliteDir = '/Users/albert/Arxiu/Fisica/LHCb/Projectes/LPHE-git/gitolite-admin/conf/' | |
def addProjectToGitolite(name, users): | |
users = users.replace(',', ' ') # Just in case | |
# Configure text to append to conf | |
textToAppend = """repo {0} | |
RW+ = {1} | |
""".format(name, users) | |
# Build regex for matching the repo | |
regex = re.compile("repo\s+{0}\s+".format(name)) | |
# Change dir | |
os.chdir(gitoliteDir) | |
# Check that repo doesn't exist | |
with open("gitolite.conf", "r") as fileToCheck: | |
for line in fileToCheck: | |
if regex.search(line): | |
raise ValueError("Repo {0} already exists!".format(name)) | |
with open("gitolite.conf", "a") as myfile: | |
myfile.write(textToAppend) | |
git.pull() | |
git.commit('-a', '-m"Added {0} repository"'.format(name)) | |
git.push() | |
def cloneProject(name, folder): | |
folder = os.path.expanduser(os.path.expandvars(folder)) | |
# Take care of previously existing folders | |
dest = name.split('/') | |
destFolder = str(folder) | |
for dirName in name.split('/'): | |
newName = os.path.join(destFolder, dirName) | |
if os.path.exists(newName): | |
destFolder = newName | |
dest.pop(0) | |
else: | |
break | |
os.chdir(destFolder) | |
dest = '/'.join(dest) | |
# Check if the repo exists | |
if os.path.exists(os.path.join(folder, name)): | |
raise OSError("Repo {0} already exists!".format(os.path.join(folder, name))) | |
# Clone! | |
git.clone('gitolite@lphelc1a.epfl.ch:{0}'.format(name), dest) | |
def initializeNote(folder): | |
class InteractWithSVN(object): | |
def __init__(self): | |
self.aggregated = "" | |
def svnInteract(self, char, stdin): | |
sys.stdout.write(char.encode('utf-8')) | |
self.aggregated += char.encode('utf-8') | |
if self.aggregated.endswith("password: "): | |
stdin.put(getpass.getpass("")+"\n") | |
if not os.path.exists(folder): | |
raise OSError("Folder {0} does not exist".format(folder)) | |
print "Going to", folder | |
os.chdir(folder) | |
# SVN business | |
svnInteract = InteractWithSVN() | |
# open stdout in unbuffered mode | |
sys.stdout = os.fdopen(sys.stdout.fileno(), "wb", 0) | |
p = svn.export("svn+ssh://svn.cern.ch/reps/lhcbdocs/Templates/LHCb-latex-template/drafts", _out=svnInteract.svnInteract, _out_bufsize=0, _tty_in=True) | |
p.wait() | |
p = svn.export("svn+ssh://svn.cern.ch/reps/lhcbdocs/Templates/LHCb-latex-template/latest", _out=svnInteract.svnInteract, _out_bufsize=0, _tty_in=True) | |
p.wait() | |
# Now let's git | |
git.add("drafts", "latest") | |
git.commit('-m"Base skeleton for note {0}"'.format(os.path.basename(folder))) | |
git.push() | |
# Parser functions | |
def parse_newRepo(args): | |
return addProjectToGitolite(args.name, args.users) | |
def parse_cloneRepo(args): | |
return cloneProject(args.name, args.folder) | |
def parse_initNote(args): | |
folder = args.folder | |
if 'name' in args and args.name: | |
folder = os.path.join(folder, args.name) | |
return initializeNote(folder) | |
def parse_newNote(args): | |
parse_newRepo(args) | |
parse_cloneRepo(args) | |
parse_initNote(args) | |
if __name__ == '__main__': | |
import argparse | |
parser = argparse.ArgumentParser(add_help=True) | |
# Create subparsers | |
subparsers = parser.add_subparsers(help="subcommand help") | |
# New repository | |
parser_newRepo = subparsers.add_parser("newRepo", help="New repository help") | |
parser_newRepo.add_argument('-u', '--users', default="@all", action="store", type=str, help="User/group with RW+ permissions") | |
parser_newRepo.add_argument('name', action="store", type=str, help="Name of the repository") | |
parser_newRepo.set_defaults(func=parse_newRepo) | |
# Clone repository | |
parser_cloneRepo = subparsers.add_parser("cloneRepo", help="Clone repository help") | |
parser_cloneRepo.add_argument('-f', '--folder', default=os.getcwd(), action="store", type=str, help="Folder to clone to") | |
parser_cloneRepo.add_argument('name', action="store", default="/Users/albert/Arxiu/Fisica/LHCb/Projectes", type=str, help="Name of the repository") | |
parser_cloneRepo.set_defaults(func=parse_cloneRepo) | |
# Init note | |
parser_initNote = subparsers.add_parser("initNote", help="Init note help") | |
parser_initNote.add_argument('folder', action="store", default=os.getcwd(), type=str, help="Folder to initialize the note to") | |
parser_initNote.set_defaults(func=parse_initNote) | |
# New note | |
parser_newNote = subparsers.add_parser("newNote", help="New note help") | |
parser_newNote.add_argument('-u', '--users', default="@all", action="store", type=str, help="User/group with RW+ permissions") | |
parser_newNote.add_argument('-f', '--folder', default=os.getcwd(), action="store", type=str, help="Folder to clone to") | |
parser_newNote.add_argument('name', action="store", type=str, help="Name of the repository") | |
parser_newNote.set_defaults(func=parse_newNote) | |
# Parse! | |
args = parser.parse_args() | |
args.func(args) | |
# EOF |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment