summaryrefslogtreecommitdiff
path: root/scripts/builder/repository.py
blob: a47e249c1e0cef3f974a8c7b4328c3811315c742 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python
# -*- coding: UTF-8 -*-


def repositoryWithPath (path):
	try:
		from mercurial import ui, hg

		repo = hg.repository(ui.ui(), path)
		result = HgRepository(repo, path)
	except:
		try:
			from git import Repo

			repo = Repo(path)
			result = GitRepository(repo, path)
		except ImportError, exception:
			print "Failed to import git, please install http://gitorious.org/git-python"
			raise exception


	return result


#===================================================================


class Repository(object):

	def __init__ (self, repository, path):
		self.repository = repository
		self.path = path


	def revision (self):
		raise NotImplementedError()
	

	def areTherePendingChanges (self):
		raise NotImplementedError()


	def version (self):
		result = self.revision()
		if self.areTherePendingChanges():
			result = '>>> ' + result + ' <<<'

		# print "VERSION: " + result
		return result


#===================================================================


class GitRepository(Repository):
	#	http://gitorious.org/git-python

	def revision (self):
		try:
			return self.repository.head.commit.hexsha
		except:
			return self.repository.commits()[0].id


	def areTherePendingChanges (self):
		try:
			return self.repository.is_dirty()
		except TypeError, te:
			return self.repository.is_dirty



#===================================================================


class HgRepository(Repository):
	#	http://mercurial.selenic.com/wiki/MercurialApi

	def revision (self):
		return 'hg:' + str(self.repository['tip'])
	

	def areTherePendingChanges (self):
		# TODO: FIXME: repository.status() does not report 'unknown(?)' files. :(
		return not all(map(lambda fileList: len(fileList) == 0, self.repository.status()))


#===================================================================