Mercurial > hg > fetch
comparison fetch.py @ 26:d495b610046a
more stubbing; tests work again
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 14 Nov 2011 21:25:56 -0800 |
parents | e628ce3ae49f |
children | 423b67ff4512 |
comparison
equal
deleted
inserted
replaced
25:e628ce3ae49f | 26:d495b610046a |
---|---|
30 if '#' in url: | 30 if '#' in url: |
31 url, self.subpath = url.rsplit('#') | 31 url, self.subpath = url.rsplit('#') |
32 if self.subpath: | 32 if self.subpath: |
33 self.subpath = self.subpath.split('/') | 33 self.subpath = self.subpath.split('/') |
34 self.url = url | 34 self.url = url |
35 self.clobber = clobber | 35 self._clobber = clobber |
36 | 36 |
37 def __call__(self, dest): | 37 def __call__(self, dest): |
38 raise NotImplementedError("Should be called by implementing class") | 38 raise NotImplementedError("Should be called by implementing class") |
39 | |
40 def clobber(self, dest): | |
41 """clobbers if self._clobber is set""" | |
42 if self._clobber and os.path.exists(dest): | |
43 if os.path.isfile(dest): | |
44 os.remove(dest) | |
45 else: | |
46 shutil.rmtree(dest) | |
39 | 47 |
40 @classmethod | 48 @classmethod |
41 def doc(cls): | 49 def doc(cls): |
42 """return docstring for the instance""" | 50 """return docstring for the instance""" |
43 retval = getattr(cls, '__doc__', '').strip() | 51 retval = getattr(cls, '__doc__', '').strip() |
49 import urllib2 | 57 import urllib2 |
50 from StringIO import StringIO | 58 from StringIO import StringIO |
51 | 59 |
52 class FileFetcher(Fetcher): | 60 class FileFetcher(Fetcher): |
53 """fetch a single file""" | 61 """fetch a single file""" |
54 # Note: subpath for files is ignored | 62 # Note: subpath and clobber for single files are ignored |
55 | 63 |
56 type = 'file' | 64 type = 'file' |
57 | 65 |
58 @classmethod | 66 @classmethod |
59 def download(cls, url): | 67 def download(cls, url): |
73 """fetch and extract a tarball""" | 81 """fetch and extract a tarball""" |
74 | 82 |
75 type = 'tar' | 83 type = 'tar' |
76 | 84 |
77 def __call__(self, dest): | 85 def __call__(self, dest): |
86 if self.clobber: | |
87 shutil.rmtree(dest) | |
78 if os.path.exists(dest): | 88 if os.path.exists(dest): |
79 assert os.path.isdir(dest) | 89 assert os.path.isdir(dest), "Destination must be a directory" |
80 else: | 90 else: |
81 os.mkdirs(dest) | 91 os.mkdirs(dest) |
82 if self.subpath: | 92 if self.subpath: |
83 raise NotImplementedError("should extract only a subpath of a tarball but I haven't finished it yet") | 93 raise NotImplementedError("should extract only a subpath of a tarball but I haven't finished it yet") |
84 buffer = StringIO() | 94 buffer = StringIO() |
114 | 124 |
115 def __call__(self, dest): | 125 def __call__(self, dest): |
116 | 126 |
117 if self.subpath or self.export: | 127 if self.subpath or self.export: |
118 # can only export with a subpath | 128 # can only export with a subpath |
129 self.export(dest, subpath=self.subpath) | |
130 return | |
119 | 131 |
120 | |
121 if os.path.exists(dest): | 132 if os.path.exists(dest): |
122 assert os.path.isdir(dest) | 133 assert os.path.isdir(dest) |
134 self.clone(dest) | |
123 | 135 |
124 def export(self, dest): | 136 def export(self, dest): |
125 """ | 137 """ |
126 export a clone of the directory | 138 export a clone of the directory |
127 """ | 139 """ |
140 dest = os.path.abspath(dest) | |
128 tmpdir = tempfile.mkdtmp() | 141 tmpdir = tempfile.mkdtmp() |
129 self.clone(tmpdir) | 142 self.clone(tmpdir) |
130 | 143 path = tmpdir |
144 if self.subpath: | |
145 path = os.path.join([tmpdir] + self.subpath) | |
146 assert os.path.exists(path), "subpath %s of %s not found" % (os.path.sep.join(self.subpath), self.url) | |
147 self.clobber(dest) | |
148 if os.path.isdir(path): | |
149 if os.path.exists(dest): | |
150 assert os.path.isdir(dest), "source is a directory; destination is a file" | |
151 else: | |
152 os.makedirs(dest) | |
153 else: | |
154 if os.path.exists(dest): | |
155 assert os.path.isfile(dest), "" | |
156 else: | |
157 directory, filename = os.path.split(dest) | |
131 shutil.rmtree(tmpdir) | 158 shutil.rmtree(tmpdir) |
132 | 159 |
133 def clone(self, dest): | 160 def clone(self, dest): |
134 """ | 161 """ |
135 clones into a directory | 162 clones into a directory |
136 """ | 163 """ |
137 raise NotImplementedError("Abstract base class") | 164 raise NotImplementedError("Abstract base class") |
138 | 165 |
166 def update(self, dest): | |
167 """ | |
168 updates a checkout | |
169 """ | |
170 raise NotImplementedError("Abstract base class") | |
171 | |
139 | 172 |
140 if which('hg'): | 173 if which('hg'): |
141 | 174 |
142 class HgFetcher(VCSFetcher): | 175 class HgFetcher(VCSFetcher): |
143 """checkout a mercurial repository""" | 176 """checkout a mercurial repository""" |