~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revisionspec.py

  • Committer: Robert Collins
  • Date: 2005-10-11 04:32:38 UTC
  • mto: This revision was merged to the branch mainline in revision 1443.
  • Revision ID: robertc@robertcollins.net-20051011043238-104295a8eb7eba91
move config_dir into bzrlib.config

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2005 Canonical Ltd
2
 
#
 
2
 
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
#
 
7
 
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
#
 
12
 
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
18
import datetime
19
19
import re
20
 
import bisect
21
20
from bzrlib.errors import BzrError, NoSuchRevision, NoCommits
22
21
 
23
22
_marker = []
58
57
        # TODO: otherwise, it should depend on how I was built -
59
58
        # if it's in_history(branch), then check revision_history(),
60
59
        # if it's in_store(branch), do the check below
61
 
        return self.branch.repository.has_revision(self.rev_id)
 
60
        return self.rev_id in self.branch.revision_store
62
61
 
63
62
    def __len__(self):
64
63
        return 2
69
68
        raise IndexError(index)
70
69
 
71
70
    def get(self):
72
 
        return self.branch.repository.get_revision(self.rev_id)
 
71
        return self.branch.get_revision(self.rev_id)
73
72
 
74
73
    def __eq__(self, other):
75
74
        if type(other) not in (tuple, list, type(self)):
149
148
            raise NoSuchRevision(branch, str(self.spec))
150
149
 
151
150
    def in_history(self, branch):
152
 
        if branch:
153
 
            revs = branch.revision_history()
154
 
        else:
155
 
            revs = None
 
151
        revs = branch.revision_history()
156
152
        return self._match_on_and_check(branch, revs)
157
153
 
158
154
        # FIXME: in_history is somewhat broken,
170
166
        return '<%s %s%s>' % (self.__class__.__name__,
171
167
                              self.prefix or '',
172
168
                              self.spec)
173
 
    
174
 
    def needs_branch(self):
175
 
        """Whether this revision spec needs a branch.
176
169
 
177
 
        Set this to False the branch argument of _match_on is not used.
178
 
        """
179
 
        return True
180
170
 
181
171
# private API
182
172
 
199
189
 
200
190
    def _match_on(self, branch, revs):
201
191
        """Lookup a revision by revision number"""
202
 
        if self.spec.find(':') == -1:
203
 
            try:
204
 
                return RevisionInfo(branch, int(self.spec))
205
 
            except ValueError:
206
 
                return RevisionInfo(branch, None)
207
 
        else:
208
 
            from branch import Branch
209
 
            revname = self.spec[self.spec.find(':')+1:]
210
 
            other_branch = Branch.open_containing(revname)[0]
211
 
            try:
212
 
                revno = int(self.spec[:self.spec.find(':')])
213
 
            except ValueError:
214
 
                return RevisionInfo(other_branch, None)
215
 
            revid = other_branch.get_rev_id(revno)
216
 
            return RevisionInfo(other_branch, revno)
217
 
        
218
 
    def needs_branch(self):
219
 
        return self.spec.find(':') == -1
 
192
        try:
 
193
            return RevisionInfo(branch, int(self.spec))
 
194
        except ValueError:
 
195
            return RevisionInfo(branch, None)
220
196
 
221
197
SPEC_TYPES.append(RevisionSpec_revno)
222
198
 
228
204
        try:
229
205
            return RevisionInfo(branch, revs.index(self.spec) + 1, self.spec)
230
206
        except ValueError:
231
 
            return RevisionInfo(branch, None, self.spec)
 
207
            return RevisionInfo(branch, None)
232
208
 
233
209
SPEC_TYPES.append(RevisionSpec_revid)
234
210
 
272
248
SPEC_TYPES.append(RevisionSpec_tag)
273
249
 
274
250
 
275
 
class RevisionSpec_revs:
276
 
    def __init__(self, revs, branch):
277
 
        self.revs = revs
278
 
        self.branch = branch
279
 
    def __getitem__(self, index):
280
 
        r = self.branch.repository.get_revision(self.revs[index])
281
 
        # TODO: Handle timezone.
282
 
        return datetime.datetime.fromtimestamp(r.timestamp)
283
 
    def __len__(self):
284
 
        return len(self.revs)
285
 
 
286
 
 
287
251
class RevisionSpec_date(RevisionSpec):
288
252
    prefix = 'date:'
289
253
    _date_re = re.compile(
301
265
          at a specified time).
302
266
 
303
267
          So the proper way of saying 'give me all entries for today' is:
304
 
              -r date:yesterday..date:today
 
268
              -r date:today..date:tomorrow
305
269
        """
306
270
        today = datetime.datetime.fromordinal(datetime.date.today().toordinal())
307
271
        if self.spec.lower() == 'yesterday':
331
295
 
332
296
            dt = datetime.datetime(year=year, month=month, day=day,
333
297
                    hour=hour, minute=minute, second=second)
334
 
        branch.lock_read()
335
 
        try:
336
 
            rev = bisect.bisect(RevisionSpec_revs(revs, branch), dt)
337
 
        finally:
338
 
            branch.unlock()
339
 
        if rev == len(revs):
340
 
            return RevisionInfo(branch, None)
341
 
        else:
342
 
            return RevisionInfo(branch, rev + 1)
 
298
        first = dt
 
299
        for i in range(len(revs)):
 
300
            r = branch.get_revision(revs[i])
 
301
            # TODO: Handle timezone.
 
302
            dt = datetime.datetime.fromtimestamp(r.timestamp)
 
303
            if first <= dt:
 
304
                return RevisionInfo(branch, i+1)
 
305
        return RevisionInfo(branch, None)
343
306
 
344
307
SPEC_TYPES.append(RevisionSpec_date)
345
308
 
350
313
    def _match_on(self, branch, revs):
351
314
        from branch import Branch
352
315
        from revision import common_ancestor, MultipleRevisionSources
353
 
        other_branch = Branch.open_containing(self.spec)[0]
 
316
        other_branch = Branch.open_containing(self.spec)
354
317
        revision_a = branch.last_revision()
355
318
        revision_b = other_branch.last_revision()
356
319
        for r, b in ((revision_a, branch), (revision_b, other_branch)):
357
320
            if r is None:
358
321
                raise NoCommits(b)
359
 
        revision_source = MultipleRevisionSources(branch.repository,
360
 
                                                  other_branch.repository)
 
322
        revision_source = MultipleRevisionSources(branch, other_branch)
361
323
        rev_id = common_ancestor(revision_a, revision_b, revision_source)
362
324
        try:
363
325
            revno = branch.revision_id_to_revno(rev_id)
376
338
 
377
339
    def _match_on(self, branch, revs):
378
340
        from branch import Branch
379
 
        other_branch = Branch.open_containing(self.spec)[0]
 
341
        from fetch import greedy_fetch
 
342
        other_branch = Branch.open_containing(self.spec)
380
343
        revision_b = other_branch.last_revision()
381
344
        if revision_b is None:
382
345
            raise NoCommits(other_branch)
383
346
        # pull in the remote revisions so we can diff
384
 
        branch.fetch(other_branch, revision_b)
 
347
        greedy_fetch(branch, other_branch, revision=revision_b)
385
348
        try:
386
349
            revno = branch.revision_id_to_revno(revision_b)
387
350
        except NoSuchRevision: