Source code for jasy.vcs.Repository
#
# Jasy - Web Tooling Framework
# Copyright 2010-2012 Zynga Inc.
#
import os
import jasy.core.Console as Console
import jasy.core.Util as Util
import jasy.vcs.Git as Git
import jasy.vcs.Svn as Svn
[docs]def isUrl(url):
"""
Figures out whether the given string is a valid Git repository URL
:param url: URL to the repository
:type url: string
"""
return Git.isUrl(url)
[docs]def getType(url):
"""
Returns repository type of the given URL
:param url: URL to the repository
:type url: string
"""
if Git.isUrl(url):
return "git"
else:
return None
[docs]def getTargetFolder(url, version=None):
"""
Returns the target folder name based on the URL and version using SHA1 checksums
:param url: URL to the repository
:type url: string
:param version: Version to use
:type url: string
"""
if Git.isUrl(url):
version = Git.expandVersion(version)
folder = url[url.rindex("/")+1:]
if folder.endswith(".git"):
folder = folder[:-4]
identifier = "%s@%s" % (url, version)
version = version[version.rindex("/")+1:]
hash = Util.generateChecksum(identifier)
return "%s-%s-%s" % (folder, version, hash)
[docs]def update(url, version=None, path=None, update=True):
"""
Clones the given repository URL (optionally with overriding/update features)
:param url: URL to the repository
:type url: string
:param version: Version to clone
:type url: string
:param version: Destination path
:type url: string
:param version: Eneable/disable update functionality
:type url: string
"""
revision = None
if Git.isUrl(url):
version = Git.expandVersion(version)
revision = Git.update(url, version, path, update)
return revision
[docs]def getRevision(path=None):
"""
Returns the current revision of the repository in the given path
"""
old = os.getcwd()
revision = None
if path is not None:
os.chdir(path)
while True:
if os.path.exists(".git"):
revision = Git.getBranch(path) + "-" + Git.getShortRevision(path)
break
elif os.path.exists(".svn"):
revision = Svn.getBranch(path) + "-" + Svn.getRevision(path)
break
cur = os.getcwd()
os.chdir(os.pardir)
if cur == os.getcwd():
break
os.chdir(old)
return revision
[docs]def clean(path=None):
"""
Cleans repository from untracked files.
:param url: Path to the local repository
:type url: string
"""
old = os.getcwd()
Console.info("Cleaning repository (clean)...")
Console.indent()
if path:
os.chdir(path)
if os.path.exists(".git"):
Git.cleanRepository()
os.chdir(old)
Console.outdent()
[docs]def distclean(path=None):
"""
Cleans repository from untracked and ignored files. This method
is pretty agressive in a way that it deletes all non repository managed
files e.g. external folder, uncommitted changes, unstaged files, etc.
:param url: Path to the local repository
:type url: string
"""
old = os.getcwd()
Console.info("Cleaning repository (distclean)...")
Console.indent()
if path:
os.chdir(path)
if os.path.exists(".git"):
Git.distcleanRepository()
os.chdir(old)
Console.outdent()