Mercurial > hg > buttercup
annotate buttercup/source.py @ 30:6089d6ec745a
should now have a working flower; will test when i get internets again
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Tue, 31 May 2011 07:29:15 -0700 |
parents | 901755a65249 |
children | 7a11a25da2e8 |
rev | line source |
---|---|
30
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
1 """ |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
2 VCS sources for the flower project |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
3 """ |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
4 |
18
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
5 import os |
20
60ddc49acd5f
add partial checkout method to hg
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
6 try: |
60ddc49acd5f
add partial checkout method to hg
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
7 from subprocess import check_call as call |
30
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
8 except ImportError: |
20
60ddc49acd5f
add partial checkout method to hg
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
9 from subprocess import call |
18
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
10 |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
11 class Source(object): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
12 """abstract base class for VCS source""" |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
13 def __init__(self, uri, srcdir=None): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
14 self.uri = uri |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
15 self.srcdir = srcdir or os.getcwd() |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
16 |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
17 @classmethod |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
18 def directory_name(cls, uri): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
19 """return relative directory name from self.uri""" |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
20 return uri.rstrip('/').split('/')[-1] |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
21 |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
22 def directory(self): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
23 return os.path.join(self.srcdir, self.directory_name(self.uri)) |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
24 |
26 | 25 def update(self): |
26 raise NotImplementedError("`Source` is an abstract base class") | |
30
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
27 |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
28 def __call__(self): |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
29 """convenience wrapper to update""" |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
30 self.update() |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
31 |
26 | 32 |
18
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
33 class HgSource(Source): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
34 """mercurial source""" |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
35 |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
36 def update(self): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
37 """updates a checkout or does one if it does not exist""" |
20
60ddc49acd5f
add partial checkout method to hg
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
38 if os.path.exists(self.directory()): |
60ddc49acd5f
add partial checkout method to hg
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
39 assert os.path.exists(os.path.join(self.directory(), '.hg')) |
22 | 40 call(['hg', 'pull'], cwd=self.directory()) |
41 call(['hg', 'update'], cwd=self.directory()) | |
20
60ddc49acd5f
add partial checkout method to hg
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
42 else: |
21 | 43 if not os.path.exists(self.srcdir): |
44 os.makedirs(self.srcdir) | |
45 call(['hg', 'clone', self.uri], cwd=self.srcdir) | |
46 # TODO: add a more intelligent .hg/hgrc | |
47 | |
18
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
48 |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
49 class GitSource(Source): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
50 |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
51 @classmethod |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
52 def directory_name(cls, uri): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
53 ext = '.git' |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
54 if uri.endswith(uri): |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
55 uri = uri[:-len(ext)] |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
56 return Source.directory_name(uri) |
151862a0a711
begin restructuring to something more modular and extensible
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
57 |
22 | 58 def update(self): |
59 """updates a checkout or does one if it does not exist""" | |
60 if os.path.exists(self.directory()): | |
61 assert os.path.exists(os.path.join(self.directory(), '.git')) | |
62 call(['git', 'pull'], cwd=self.directory()) | |
63 else: | |
64 if not os.path.exists(self.srcdir): | |
65 os.makedirs(self.srcdir) | |
66 call(['git', 'clone', self.uri], cwd=self.srcdir) | |
67 # TODO: add a more intelligent .git/config | |
68 | |
23
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
69 |
25
a54543838686
add test for source demunging
Jeff Hammel <jhammel@mozilla.com>
parents:
23
diff
changeset
|
70 def sources(source_dict, **kwargs): |
30
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
71 """ |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
72 return source objects from a dict: |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
73 {'hg': ['http://k0s.org/hg/pyloader'], |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
74 'git': ['git://github.com/mozilla/toolbox.git']} |
6089d6ec745a
should now have a working flower; will test when i get internets again
Jeff Hammel <jhammel@mozilla.com>
parents:
27
diff
changeset
|
75 """ |
23
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
76 retval = [] |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
77 for repo_type, sources in source_dict.items(): |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
78 if repo_type == 'hg': |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
79 retval.extend([HgSource(source, **kwargs) |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
80 for source in sources]) |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
81 elif repo_type == 'git': |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
82 retval.extend([GitSource(source, **kwargs) |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
83 for source in sources]) |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
84 else: |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
85 raise AssertionError("Source type unknown: %s" % repo_type) |
425a3c73ac1d
add a convenience method for VCS sources
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
86 return retval |