Skip to content

Instantly share code, notes, and snippets.

@apuignav
Last active December 15, 2015 20:40
Show Gist options
  • Save apuignav/5319680 to your computer and use it in GitHub Desktop.
Save apuignav/5319680 to your computer and use it in GitHub Desktop.
LPHE ninja utilities
#!/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