Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
comparing with ../sumatra_hg
searching for changes
changeset: 75:9b5eb05b435b
user: Michele Mattioni <mattioni@ebi.ac.uk>
date: Mon Mar 29 11:14:21 2010 +0100
summary: Initial work to support git repositories.
diff -r 5ff03559f848 -r 9b5eb05b435b src/versioncontrol/_git.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/versioncontrol/_git.py Mon Mar 29 11:14:21 2010 +0100
@@ -0,0 +1,113 @@
+"""
+Defines the Sumatra version control interface for Git.
+Based (heavily) on the Mercurial class
+
+Classes
+-------
+
+GitWorkingCopy
+GitRepository
+
+Functions
+---------
+
+may_have_working_copy() - determine whether a .git subdirectory exists at a given
+ path
+get_working_copy() - return a GitWorkingCopy object for a given path
+get_repository() - return a GitRepository object for a given URL.
+"""
+
+#from mercurial import hg, ui, patch
+
+import git
+import os
+import binascii
+
+from base import Repository, WorkingCopy
+
+
+def may_have_working_copy(path=None):
+ path = path or os.getcwd()
+ if git.cmd.is_git_dir(path):
+ #return os.path.exists(os.path.join(path, ".git"))
+ return path
+
+def get_working_copy(path=None):
+ return GitWorkingCopy(path)
+
+def get_repository(url):
+ return GitRepository(url)
+
+
+class GitWorkingCopy(WorkingCopy):
+
+ def __init__(self, path=None):
+ self.path = path or os.getcwd()
+ self.repository = GitRepository(self.path)
+ self.repository.working_copy = self
+
+ def current_version(self):# TODO Check
+ if hasattr(self.repository._repository, 'workingctx'): # handle different versions of Mercurial
+ ctx = self.repository._repository.workingctx().parents()[0]
+ else:
+ ctx = self.repository._repository.parents()[0]
+ return binascii.hexlify(ctx.node()[:6])
+
+ def use_version(self, version):
+ assert not self.has_changed()
+ hg.clean(self.repository._repository, version)
+
+ def use_latest_version(self):
+ # any changes to the working copy are retained/merged in
+ hg.update(self.repository._repository, 'tip')
+
+ def status(self):
+ modified, added, removed, deleted, unknown, ignored, clean = self.repository._repository.status() #unknown=True)
+ return {'modified': modified, 'removed': removed,
+ 'deleted': deleted, 'unknown': unknown}
+
+ def has_changed(self):
+ status = self.status()
+ changed = False
+ for st in 'modified', 'removed', 'deleted':
+ if status[st]:
+ changed = True
+ break
+ return changed
+
+ def diff(self):
+ """Difference between working copy and repository."""
+ opts = patch.mdiff.diffopts(nodates=True)
+ diff = patch.diff(self.repository._repository, opts=opts)
+ return "".join(diff)
+
+class GitRepository(Repository):
+
+ def __init__(self, url):
+ Repository.__init__(self, url)
+ self._repository = git.Repo(url)
+ self.working_copy = None
+
+ def checkout(self, path="."):
+ """Clone a repository."""
+ path = os.path.abspath(path)
+ if self.url == path:
+ # update
+ hg.update(self._repository, None)
+
+ else:
+ # can't clone into an existing directory, so we create
+ # an empty repository and then do a pull and update
+ local_repos = hg.repository(self._ui, path, create=True)
+ local_repos.pull(self._repository)
+ hg.update(local_repos, None)
+ self.working_copy = MercurialWorkingCopy()
+
+ def __getstate__(self):
+ """For pickling"""
+ return {'url': self.url, 'wc': self.working_copy}
+
+ def __setstate__(self, state):
+ """For unpickling"""
+ self.__init__(state['url'])
+ self.working_copy = state['wc']
changeset: 76:069d943fb2b4
user: Michele Mattioni <mattioni@ebi.ac.uk>
date: Mon Mar 29 17:08:36 2010 +0100
summary: Implemented some fo the methods for git. Some methods were not clear, added a TODO comment with relative questions
diff -r 9b5eb05b435b -r 069d943fb2b4 src/versioncontrol/_git.py
--- a/src/versioncontrol/_git.py Mon Mar 29 11:14:21 2010 +0100
+++ b/src/versioncontrol/_git.py Mon Mar 29 17:08:36 2010 +0100
@@ -17,20 +17,16 @@
get_repository() - return a GitRepository object for a given URL.
"""
-#from mercurial import hg, ui, patch
-
import git
import os
-import binascii
from base import Repository, WorkingCopy
def may_have_working_copy(path=None):
path = path or os.getcwd()
- if git.cmd.is_git_dir(path):
- #return os.path.exists(os.path.join(path, ".git"))
- return path
+ if git.cmd.is_git_dir(path, ".git"):
+ return os.path.exists(os.path.join(path, ".git"))
def get_working_copy(path=None):
return GitWorkingCopy(path)
@@ -46,40 +42,37 @@
self.repository = GitRepository(self.path)
self.repository.working_copy = self
- def current_version(self):# TODO Check
- if hasattr(self.repository._repository, 'workingctx'): # handle different versions of Mercurial
- ctx = self.repository._repository.workingctx().parents()[0]
- else:
- ctx = self.repository._repository.parents()[0]
- return binascii.hexlify(ctx.node()[:6])
+ def current_version(self):
+ head = self.repository._repository.commits()[0]
+ return head.id
def use_version(self, version):
- assert not self.has_changed()
- hg.clean(self.repository._repository, version)
+ pass
+ # TODO:
+ # What exactly should happen here?
def use_latest_version(self):
- # any changes to the working copy are retained/merged in
- hg.update(self.repository._repository, 'tip')
-
+ pass
+ # TODO:
+ # Shall we use the last version available from the repo?
+
def status(self):
- modified, added, removed, deleted, unknown, ignored, clean = self.repository._repository.status() #unknown=True)
- return {'modified': modified, 'removed': removed,
- 'deleted': deleted, 'unknown': unknown}
+ # We don't need to use this.
+ pass
def has_changed(self):
- status = self.status()
changed = False
- for st in 'modified', 'removed', 'deleted':
- if status[st]:
- changed = True
- break
+ if self.repository._repository.is_dirty():
+ changed = True
return changed
def diff(self):
"""Difference between working copy and repository."""
- opts = patch.mdiff.diffopts(nodates=True)
- diff = patch.diff(self.repository._repository, opts=opts)
- return "".join(diff)
+# opts = patch.mdiff.diffopts(nodates=True)
+# diff = patch.diff(self.repository._repository, opts=opts)
+# return "".join(diff)
+ pass
+ # TODO: This can be done, need to check a bit more.
class GitRepository(Repository):
@@ -90,18 +83,23 @@
def checkout(self, path="."):
"""Clone a repository."""
- path = os.path.abspath(path)
- if self.url == path:
- # update
- hg.update(self._repository, None)
-
- else:
- # can't clone into an existing directory, so we create
- # an empty repository and then do a pull and update
- local_repos = hg.repository(self._ui, path, create=True)
- local_repos.pull(self._repository)
- hg.update(local_repos, None)
- self.working_copy = MercurialWorkingCopy()
+
+ pass
+ # TODO: We need to checkout the last commit?
+ # Or we need to clone the last commit somewhere (light branch?)
+
+# path = os.path.abspath(path)
+# if self.url == path:
+# # update
+# hg.update(self._repository, None)
+#
+# else:
+# # can't clone into an existing directory, so we create
+# # an empty repository and then do a pull and update
+# local_repos = hg.repository(self._ui, path, create=True)
+# local_repos.pull(self._repository)
+# hg.update(local_repos, None)
+# self.working_copy = MercurialWorkingCopy()
def __getstate__(self):
"""For pickling"""
changeset: 77:2e06e43917db
user: Michele Mattioni <mattioni@ebi.ac.uk>
date: Mon Mar 29 17:49:45 2010 +0100
summary: Fixed the dir checking in the path, added git to the supported vcs in the init
diff -r 069d943fb2b4 -r 2e06e43917db src/versioncontrol/__init__.py
--- a/src/versioncontrol/__init__.py Mon Mar 29 17:08:36 2010 +0100
+++ b/src/versioncontrol/__init__.py Mon Mar 29 17:49:45 2010 +0100
@@ -11,7 +11,7 @@
base - defines the base WorkingCopy and Repository classes
_mercurial - defines MercurialWorkingCopy and MercurialRepository classes
_subversion - defines SubversionWorkingCopy and SubversionRepository classes
-
+_git - defines GitWorkingCopy and GitRepository classes
Exceptions
----------
@@ -38,7 +38,7 @@
vcs_list = []
-for vcs in ['mercurial', 'subversion']:
+for vcs in ['mercurial', 'subversion', 'git']:
try:
__import__('sumatra.versioncontrol._%s' % vcs)
vcs_list.append(sys.modules['sumatra.versioncontrol._%s' % vcs])
diff -r 069d943fb2b4 -r 2e06e43917db src/versioncontrol/_git.py
--- a/src/versioncontrol/_git.py Mon Mar 29 17:08:36 2010 +0100
+++ b/src/versioncontrol/_git.py Mon Mar 29 17:49:45 2010 +0100
@@ -25,7 +25,7 @@
def may_have_working_copy(path=None):
path = path or os.getcwd()
- if git.cmd.is_git_dir(path, ".git"):
+ if git.cmd.is_git_dir(os.path.join(path, ".git")):
return os.path.exists(os.path.join(path, ".git"))
def get_working_copy(path=None):
changeset: 92:719a23068010
parent: 77:2e06e43917db
user: Michele Mattioni <mattioni@ebi.ac.uk>
date: Thu Apr 01 10:54:38 2010 +0100
summary: Fixed the diff method for git
diff -r 2e06e43917db -r 719a23068010 src/versioncontrol/_git.py
--- a/src/versioncontrol/_git.py Mon Mar 29 17:49:45 2010 +0100
+++ b/src/versioncontrol/_git.py Thu Apr 01 10:54:38 2010 +0100
@@ -68,11 +68,8 @@
def diff(self):
"""Difference between working copy and repository."""
-# opts = patch.mdiff.diffopts(nodates=True)
-# diff = patch.diff(self.repository._repository, opts=opts)
-# return "".join(diff)
- pass
- # TODO: This can be done, need to check a bit more.
+ return self.repository._repository.commit_diff('HEAD')
+
class GitRepository(Repository):
changeset: 97:12681cd09a30
user: Michele Mattioni <mattioni@ebi.ac.uk>
date: Tue Apr 06 13:15:17 2010 +0100
summary: Implemented the checkout methos. Remote cloning of the repo still on the TODO.
diff -r 3a9067f68eb9 -r 12681cd09a30 src/versioncontrol/_git.py
--- a/src/versioncontrol/_git.py Fri Apr 02 14:04:12 2010 +0200
+++ b/src/versioncontrol/_git.py Tue Apr 06 13:15:17 2010 +0100
@@ -50,16 +50,14 @@
return head.id
def use_version(self, version):
- pass
- # TODO:
- # this command should move the tree to some older
- # revision (if I have understood git terminology correctly)
- # this is perhaps equivalent to the git checkout command?
+ if not git.cmd.is_dirty():
+ g = git.Git(self.path)
+ g.checkout(version)
def use_latest_version(self):
- pass
- # TODO:
- # use the last version available from the repo
+ if not git.cmd.is_dirty():
+ g = git.Git(self.path)
+ g.checkout('HEAD')
def status(self):
# We don't need to use this.
@@ -104,4 +102,4 @@
def __setstate__(self, state):
"""For unpickling"""
self.__init__(state['url'])
- self.working_copy = state['wc']
+ self.working_copy = state['wc']
\ No newline at end of file
changeset: 98:ea5697ab2c86
tag: tip
user: Michele Mattioni <mattioni@ebi.ac.uk>
date: Tue Apr 06 16:48:07 2010 +0100
summary: Implemented the checkout method and ran for the first time with a git repo. It seems to work.
diff -r 12681cd09a30 -r ea5697ab2c86 src/versioncontrol/_git.py
--- a/src/versioncontrol/_git.py Tue Apr 06 13:15:17 2010 +0100
+++ b/src/versioncontrol/_git.py Tue Apr 06 16:48:07 2010 +0100
@@ -55,7 +55,7 @@
g.checkout(version)
def use_latest_version(self):
- if not git.cmd.is_dirty():
+ if not self.repository._repository.is_dirty:
g = git.Git(self.path)
g.checkout('HEAD')
@@ -68,7 +68,7 @@
def diff(self):
"""Difference between working copy and repository."""
- return self.repository._repository.commit_diff('HEAD')
+ return self._repository.commit_diff('HEAD')
class GitRepository(Repository):
@@ -76,11 +76,12 @@
def __init__(self, url):
Repository.__init__(self, url)
self.working_copy = None
+ self.checkout(url)
def checkout(self, path="."):
"""Clone a repository."""
path = os.path.abspath(path)
- g = git.Git()
+ g = git.Git(path)
if self.url == path:
# already have a repository in the working directory
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.