Show More
@@ -10,7 +10,7 b'' | |||||
10 | :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak. |
|
10 | :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak. | |
11 | """ |
|
11 | """ | |
12 |
|
12 | |||
13 |
VERSION = (0, |
|
13 | VERSION = (0, 5, 0, 'dev') | |
14 |
|
14 | |||
15 | __version__ = '.'.join((str(each) for each in VERSION[:4])) |
|
15 | __version__ = '.'.join((str(each) for each in VERSION[:4])) | |
16 |
|
16 |
@@ -29,7 +29,7 b' class GitChangeset(BaseChangeset):' | |||||
29 | self.repository = repository |
|
29 | self.repository = repository | |
30 |
|
30 | |||
31 | try: |
|
31 | try: | |
32 |
commit = self.repository._repo |
|
32 | commit = self.repository._repo[revision] | |
33 | if isinstance(commit, objects.Tag): |
|
33 | if isinstance(commit, objects.Tag): | |
34 | revision = commit.object[1] |
|
34 | revision = commit.object[1] | |
35 | commit = self.repository._repo.get_object(commit.object[1]) |
|
35 | commit = self.repository._repo.get_object(commit.object[1]) | |
@@ -39,7 +39,6 b' class GitChangeset(BaseChangeset):' | |||||
39 | self.id = self.raw_id |
|
39 | self.id = self.raw_id | |
40 | self.short_id = self.raw_id[:12] |
|
40 | self.short_id = self.raw_id[:12] | |
41 | self._commit = commit |
|
41 | self._commit = commit | |
42 |
|
||||
43 | self._tree_id = commit.tree |
|
42 | self._tree_id = commit.tree | |
44 | self._committer_property = 'committer' |
|
43 | self._committer_property = 'committer' | |
45 | self._author_property = 'author' |
|
44 | self._author_property = 'author' | |
@@ -47,12 +46,14 b' class GitChangeset(BaseChangeset):' | |||||
47 | self._date_tz_property = 'commit_timezone' |
|
46 | self._date_tz_property = 'commit_timezone' | |
48 | self.revision = repository.revisions.index(revision) |
|
47 | self.revision = repository.revisions.index(revision) | |
49 |
|
48 | |||
50 | self.message = safe_unicode(commit.message) |
|
|||
51 |
|
||||
52 | self.nodes = {} |
|
49 | self.nodes = {} | |
53 | self._paths = {} |
|
50 | self._paths = {} | |
54 |
|
51 | |||
55 | @LazyProperty |
|
52 | @LazyProperty | |
|
53 | def message(self): | |||
|
54 | return safe_unicode(self._commit.message) | |||
|
55 | ||||
|
56 | @LazyProperty | |||
56 | def committer(self): |
|
57 | def committer(self): | |
57 | return safe_unicode(getattr(self._commit, self._committer_property)) |
|
58 | return safe_unicode(getattr(self._commit, self._committer_property)) | |
58 |
|
59 |
@@ -43,6 +43,8 b' from .config import ConfigFile' | |||||
43 | from .inmemory import GitInMemoryChangeset |
|
43 | from .inmemory import GitInMemoryChangeset | |
44 | from .workdir import GitWorkdir |
|
44 | from .workdir import GitWorkdir | |
45 |
|
45 | |||
|
46 | SHA_PATTERN = re.compile(r'^[[0-9a-fA-F]{12}|[0-9a-fA-F]{40}]$') | |||
|
47 | ||||
46 | log = logging.getLogger(__name__) |
|
48 | log = logging.getLogger(__name__) | |
47 |
|
49 | |||
48 |
|
50 | |||
@@ -60,8 +62,10 b' class GitRepository(BaseRepository):' | |||||
60 | repo = self._get_repo(create, src_url, update_after_clone, bare) |
|
62 | repo = self._get_repo(create, src_url, update_after_clone, bare) | |
61 | self.bare = repo.bare |
|
63 | self.bare = repo.bare | |
62 |
|
64 | |||
63 | self._config_files = [ |
|
65 | @property | |
64 | bare and abspath(self.path, 'config') |
|
66 | def _config_files(self): | |
|
67 | return [ | |||
|
68 | self.bare and abspath(self.path, 'config') | |||
65 | or abspath(self.path, '.git', 'config'), |
|
69 | or abspath(self.path, '.git', 'config'), | |
66 | abspath(get_user_home(), '.gitconfig'), |
|
70 | abspath(get_user_home(), '.gitconfig'), | |
67 | ] |
|
71 | ] | |
@@ -242,17 +246,19 b' class GitRepository(BaseRepository):' | |||||
242 | For git backend we always return integer here. This way we ensure |
|
246 | For git backend we always return integer here. This way we ensure | |
243 | that changset's revision attribute would become integer. |
|
247 | that changset's revision attribute would become integer. | |
244 | """ |
|
248 | """ | |
245 | pattern = re.compile(r'^[[0-9a-fA-F]{12}|[0-9a-fA-F]{40}]$') |
|
249 | ||
246 | is_bstr = lambda o: isinstance(o, (str, unicode)) |
|
|||
247 | is_null = lambda o: len(o) == revision.count('0') |
|
250 | is_null = lambda o: len(o) == revision.count('0') | |
248 |
|
251 | |||
249 | if len(self.revisions) == 0: |
|
252 | try: | |
|
253 | self.revisions[0] | |||
|
254 | except (KeyError, IndexError): | |||
250 | raise EmptyRepositoryError("There are no changesets yet") |
|
255 | raise EmptyRepositoryError("There are no changesets yet") | |
251 |
|
256 | |||
252 | if revision in (None, '', 'tip', 'HEAD', 'head', -1): |
|
257 | if revision in (None, '', 'tip', 'HEAD', 'head', -1): | |
253 |
re |
|
258 | return self.revisions[-1] | |
254 |
|
259 | |||
255 | if ((is_bstr(revision) and revision.isdigit() and len(revision) < 12) |
|
260 | is_bstr = isinstance(revision, (str, unicode)) | |
|
261 | if ((is_bstr and revision.isdigit() and len(revision) < 12) | |||
256 | or isinstance(revision, int) or is_null(revision)): |
|
262 | or isinstance(revision, int) or is_null(revision)): | |
257 | try: |
|
263 | try: | |
258 | revision = self.revisions[int(revision)] |
|
264 | revision = self.revisions[int(revision)] | |
@@ -260,23 +266,23 b' class GitRepository(BaseRepository):' | |||||
260 | raise ChangesetDoesNotExistError("Revision %s does not exist " |
|
266 | raise ChangesetDoesNotExistError("Revision %s does not exist " | |
261 | "for this repository" % (revision)) |
|
267 | "for this repository" % (revision)) | |
262 |
|
268 | |||
263 |
elif is_bstr |
|
269 | elif is_bstr: | |
264 | # get by branch/tag name |
|
270 | # get by branch/tag name | |
265 | _ref_revision = self._parsed_refs.get(revision) |
|
271 | _ref_revision = self._parsed_refs.get(revision) | |
266 | _tags_shas = self.tags.values() |
|
|||
267 | if _ref_revision: # and _ref_revision[1] in ['H', 'RH', 'T']: |
|
272 | if _ref_revision: # and _ref_revision[1] in ['H', 'RH', 'T']: | |
268 | return _ref_revision[0] |
|
273 | return _ref_revision[0] | |
269 |
|
274 | |||
|
275 | _tags_shas = self.tags.values() | |||
270 | # maybe it's a tag ? we don't have them in self.revisions |
|
276 | # maybe it's a tag ? we don't have them in self.revisions | |
271 |
|
|
277 | if revision in _tags_shas: | |
272 | return _tags_shas[_tags_shas.index(revision)] |
|
278 | return _tags_shas[_tags_shas.index(revision)] | |
273 |
|
279 | |||
274 |
elif not |
|
280 | elif not SHA_PATTERN.match(revision) or revision not in self.revisions: | |
275 | raise ChangesetDoesNotExistError("Revision %s does not exist " |
|
281 | raise ChangesetDoesNotExistError("Revision %s does not exist " | |
276 | "for this repository" % (revision)) |
|
282 | "for this repository" % (revision)) | |
277 |
|
283 | |||
278 | # Ensure we return full id |
|
284 | # Ensure we return full id | |
279 |
if not |
|
285 | if not SHA_PATTERN.match(str(revision)): | |
280 | raise ChangesetDoesNotExistError("Given revision %s not recognized" |
|
286 | raise ChangesetDoesNotExistError("Given revision %s not recognized" | |
281 | % revision) |
|
287 | % revision) | |
282 | return revision |
|
288 | return revision |
@@ -492,10 +492,12 b' class MercurialRepository(BaseRepository' | |||||
492 | if branch_name: |
|
492 | if branch_name: | |
493 | filter_.append('branch("%s")' % (branch_name)) |
|
493 | filter_.append('branch("%s")' % (branch_name)) | |
494 |
|
494 | |||
495 | if start_date: |
|
495 | if start_date and not end_date: | |
496 | filter_.append('date(">%s")' % start_date) |
|
496 | filter_.append('date(">%s")' % start_date) | |
497 | if end_date: |
|
497 | if end_date and not start_date: | |
498 | filter_.append('date("<%s")' % end_date) |
|
498 | filter_.append('date("<%s")' % end_date) | |
|
499 | if start_date and end_date: | |||
|
500 | filter_.append('date(">%s") and date("<%s")' % (start_date, end_date)) | |||
499 | if filter_: |
|
501 | if filter_: | |
500 | revisions = scmutil.revrange(self._repo, filter_) |
|
502 | revisions = scmutil.revrange(self._repo, filter_) | |
501 | else: |
|
503 | else: |
@@ -208,6 +208,14 b' class ChangesetsTestCaseMixin(BackendTes' | |||||
208 | self.assertGreaterEqual(cs.date, start_date) |
|
208 | self.assertGreaterEqual(cs.date, start_date) | |
209 |
|
209 | |||
210 | def test_get_changesets_respects_end_date(self): |
|
210 | def test_get_changesets_respects_end_date(self): | |
|
211 | start_date = datetime.datetime(2010, 1, 1) | |||
|
212 | end_date = datetime.datetime(2010, 2, 1) | |||
|
213 | for cs in self.repo.get_changesets(start_date=start_date, | |||
|
214 | end_date=end_date): | |||
|
215 | self.assertGreaterEqual(cs.date, start_date) | |||
|
216 | self.assertLessEqual(cs.date, end_date) | |||
|
217 | ||||
|
218 | def test_get_changesets_respects_start_date_and_end_date(self): | |||
211 | end_date = datetime.datetime(2010, 2, 1) |
|
219 | end_date = datetime.datetime(2010, 2, 1) | |
212 | for cs in self.repo.get_changesets(end_date=end_date): |
|
220 | for cs in self.repo.get_changesets(end_date=end_date): | |
213 | self.assertLessEqual(cs.date, end_date) |
|
221 | self.assertLessEqual(cs.date, end_date) |
@@ -49,8 +49,10 b' class WorkdirTestCaseMixin(BackendTestMi' | |||||
49 | author=u'joe', |
|
49 | author=u'joe', | |
50 | branch='foobar', |
|
50 | branch='foobar', | |
51 | ) |
|
51 | ) | |
|
52 | self.assertEqual(self.repo.workdir.get_branch(), self.default_branch) | |||
52 |
|
53 | |||
53 | def test_get_changeset(self): |
|
54 | def test_get_changeset(self): | |
|
55 | old_head = self.repo.get_changeset() | |||
54 | self.imc.add(FileNode('docs/index.txt', |
|
56 | self.imc.add(FileNode('docs/index.txt', | |
55 | content='Documentation\n')) |
|
57 | content='Documentation\n')) | |
56 | head = self.imc.commit( |
|
58 | head = self.imc.commit( | |
@@ -58,8 +60,14 b' class WorkdirTestCaseMixin(BackendTestMi' | |||||
58 | author=u'joe', |
|
60 | author=u'joe', | |
59 | branch='foobar', |
|
61 | branch='foobar', | |
60 | ) |
|
62 | ) | |
|
63 | self.assertEqual(self.repo.workdir.get_branch(), self.default_branch) | |||
|
64 | self.repo.workdir.checkout_branch('foobar') | |||
61 | self.assertEqual(self.repo.workdir.get_changeset(), head) |
|
65 | self.assertEqual(self.repo.workdir.get_changeset(), head) | |
62 |
|
66 | |||
|
67 | # Make sure that old head is still there after update to defualt branch | |||
|
68 | self.repo.workdir.checkout_branch(self.default_branch) | |||
|
69 | self.assertEqual(self.repo.workdir.get_changeset(), old_head) | |||
|
70 | ||||
63 | def test_checkout_branch(self): |
|
71 | def test_checkout_branch(self): | |
64 | from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError |
|
72 | from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError | |
65 | # first, 'foobranch' does not exist. |
|
73 | # first, 'foobranch' does not exist. |
General Comments 0
You need to be logged in to leave comments.
Login now