/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to __init__.py

Get checkout of git repos working (though a bit crackful)

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
import stgit
25
25
import stgit.git as git
26
26
 
27
 
from bzrlib import config, graph, urlutils
 
27
from bzrlib import config, iterablefile, graph, osutils, urlutils
28
28
from bzrlib.decorators import *
29
29
import bzrlib.branch
30
30
import bzrlib.bzrdir
48
48
 
49
49
def gitrevid_from_bzr(revision_id):
50
50
    if revision_id is None:
51
 
        import pdb;pdb.set_trace()
52
51
        return None
53
52
    return revision_id[4:]
54
53
 
232
231
        for lines in self.git.ancestor_lines(git_revisions):
233
232
            yield self.parse_rev(lines)
234
233
 
 
234
    def is_shared(self):
 
235
        return True
 
236
 
235
237
    def get_revision_graph(self, revision_id=None):
236
238
        if revision_id is None:
237
239
            revisions = None
253
255
                                header=True)
254
256
        return self.parse_rev(raw)
255
257
 
 
258
    def has_revision(self, revision_id):
 
259
        try:
 
260
            self.get_revision(revision_id)
 
261
        except NoSuchRevision:
 
262
            return False
 
263
        else:
 
264
            return True
 
265
 
256
266
    def get_revisions(self, revisions):
257
267
        return [self.get_revision(r) for r in revisions]
258
268
 
276
286
                    committer = ' '.join(commit_fields[1:-3])
277
287
                timestamp = commit_fields[-2]
278
288
                timezone = commit_fields[-1]
 
289
            elif field.startswith('tree '):
 
290
                tree_id = field.split()[1]
279
291
            elif in_log:
280
292
                log.append(field[4:])
281
293
            elif field == '\n':
289
301
        result.timezone = timezone and int(timezone)
290
302
        result.timestamp = float(timestamp)
291
303
        result.committer = committer 
 
304
        result.properties['git-tree-id'] = tree_id
292
305
        return result
293
306
 
 
307
    def revision_tree(self, revision_id):
 
308
        return GitRevisionTree(self, revision_id)
 
309
 
 
310
    def get_inventory(self, revision_id):
 
311
        revision = self.get_revision(revision_id)
 
312
        inventory = GitInventory(revision_id)
 
313
        tree_id = revision.properties['git-tree-id']
 
314
        type_map = {'blob': 'file', 'tree': 'directory' }
 
315
        def get_inventory(tree_id, prefix):
 
316
            for perms, type, obj_id, name in self.git.get_inventory(tree_id):
 
317
                full_path = prefix + name
 
318
                if type == 'blob':
 
319
                    text_sha1 = obj_id
 
320
                else:
 
321
                    text_sha1 = None
 
322
                executable = (perms[-3] in ('1', '3', '5', '7'))
 
323
                entry = GitEntry(full_path, type_map[type], revision_id,
 
324
                                 text_sha1, executable)
 
325
                inventory.entries[full_path] = entry
 
326
                if type == 'tree':
 
327
                    get_inventory(obj_id, full_path+'/')
 
328
        get_inventory(tree_id, '')
 
329
        return inventory
 
330
 
 
331
 
 
332
class GitRevisionTree(object):
 
333
 
 
334
    def __init__(self, repository, revision_id):
 
335
        self.repository = repository
 
336
        self.revision_id = revision_id
 
337
        self.inventory = repository.get_inventory(revision_id)
 
338
 
 
339
    def get_file(self, file_id):
 
340
        obj_id = self.inventory[file_id].text_sha1
 
341
        lines = self.repository.git.cat_file('blob', obj_id)
 
342
        return iterablefile.IterableFile(lines)
 
343
 
 
344
    def is_executable(self, file_id):
 
345
        return self.inventory[file_id].executable
 
346
 
 
347
 
 
348
class GitInventory(object):
 
349
 
 
350
    def __init__(self, revision_id):
 
351
        self.entries = {}
 
352
        self.root = GitEntry('', 'directory', revision_id)
 
353
        self.entries[''] = self.root
 
354
 
 
355
    def __getitem__(self, key):
 
356
        return self.entries[key]
 
357
 
 
358
    def iter_entries(self):
 
359
        return iter(sorted(self.entries.items()))
 
360
 
 
361
    def iter_entries_by_dir(self):
 
362
        return self.iter_entries()
 
363
 
 
364
    def __len__(self):
 
365
        return len(self.entries)
 
366
 
 
367
 
 
368
class GitEntry(object):
 
369
 
 
370
    def __init__(self, path, kind, revision, text_sha1=None, executable=False,
 
371
                 text_size=None):
 
372
        self.path = path
 
373
        self.file_id = path
 
374
        self.kind = kind
 
375
        self.executable = executable
 
376
        self.name = osutils.basename(path)
 
377
        if path == '':
 
378
            self.parent_id = None
 
379
        else:
 
380
            self.parent_id = osutils.dirname(path)
 
381
        self.revision = revision
 
382
        self.symlink_target = None
 
383
        self.text_sha1 = text_sha1
 
384
        self.text_size = None
 
385
 
 
386
    def __repr__(self):
 
387
        return "GitEntry(%r, %r, %r, %r)" % (self.path, self.kind, 
 
388
                                             self.revision, self.parent_id)
 
389
 
 
390
 
294
391
class GitModel(object):
295
392
    """API that follows GIT model closely"""
296
393
 
307
404
    def git_line(self, command, args):
308
405
        return stgit.git._output_one_line(self.git_command(command, args))
309
406
 
 
407
    def cat_file(self, type, object_id, pretty=False):
 
408
        args = []
 
409
        if pretty:
 
410
            args.append('-p')
 
411
        else:
 
412
            args.append(type)
 
413
        args.append(object_id)
 
414
        return self.git_lines('cat-file', args)
 
415
 
310
416
    def rev_list(self, heads, max_count=None, header=False):
311
417
        args = []
312
418
        if max_count is not None:
335
441
            else:
336
442
                revision_lines.append(line.decode('latin-1'))
337
443
        assert revision_lines == ['']
 
444
 
 
445
    def get_inventory(self, tree_id):
 
446
        for line in self.cat_file('tree', tree_id, True):
 
447
            sections = line.split(' ', 2)
 
448
            obj_id, name = sections[2].split('\t', 1)
 
449
            name = name.rstrip('\n')
 
450
            if name.startswith('"'):
 
451
                name = name[1:-1].decode('string_escape').decode('utf-8')
 
452
            yield (sections[0], sections[1], obj_id, name)