Changeset 13908


Ignore:
Timestamp:
May 6, 2014, 6:09:24 PM (10 years ago)
Author:
Jun Omae
Message:

TracPygit2Plugin: avoid NoSuchNode exceptions for submodule'd entry in GitNode.__init__ (refs #11732)

Location:
tracpygit2plugin/trunk/tracext/pygit2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • tracpygit2plugin/trunk/tracext/pygit2/git_fs.py

    r13872 r13908  
    6969           'GitRepository', 'GitChangeset', 'GitNode']
    7070
     71GIT_DELTA_ADDED = 'A'
     72GIT_DELTA_DELETED = 'D'
     73GIT_DELTA_MODIFIED = 'M'
     74GIT_DELTA_RENAMED = 'R'
     75GIT_DELTA_COPIED = 'C'
     76SUBMODULE_FILEMODE = 0160000
    7177
    7278if pygit2:
    73     GIT_DELTA_ADDED = 'A'
    74     GIT_DELTA_DELETED = 'D'
    75     GIT_DELTA_MODIFIED = 'M'
    76     GIT_DELTA_RENAMED = 'R'
    77     GIT_DELTA_COPIED = 'C'
    7879    _DELTA_STATUS_MAP = {
    7980        GIT_DELTA_ADDED:    Changeset.ADD,
     
    8384        GIT_DELTA_COPIED:   Changeset.COPY,
    8485    }
     86    if hasattr(pygit2.TreeEntry, 'filemode'):
     87        _get_filemode = lambda tree_entry: tree_entry.filemode
     88    else:
     89        _get_filemode = lambda tree_entry: tree_entry.attributes
    8590else:
    8691    _DELTA_STATUS_MAP = {}
     92    _get_filemode = None
    8793
    8894
     
    945951
    946952        tree_entry = None
     953        filemode = None
     954        tree = None
     955        blob = None
    947956        if commit:
    948957            normrev = commit.hex
     
    952961                if tree_entry is None:
    953962                    raise NoSuchNode(path, rev)
    954                 git_object = repos.git_repos.get(tree_entry.oid)
    955             if git_object.type == GIT_OBJ_TREE:
     963                filemode = _get_filemode(tree_entry)
     964                if filemode == SUBMODULE_FILEMODE:
     965                    git_object = None
     966                else:
     967                    git_object = repos.git_repos.get(tree_entry.oid)
     968            if git_object is None:
     969                if filemode == SUBMODULE_FILEMODE:
     970                    kind = Node.DIRECTORY
     971                else:
     972                    kind = None
     973            elif git_object.type == GIT_OBJ_TREE:
    956974                kind = Node.DIRECTORY
    957975                tree = git_object
    958                 blob = None
    959976            elif git_object.type == GIT_OBJ_BLOB:
    960977                kind = Node.FILE
    961                 tree = None
    962978                blob = git_object
    963             else:
     979            if kind is None:
    964980                raise NoSuchNode(path, rev)
    965981        else:
     
    968984            normrev = None
    969985            kind = Node.DIRECTORY
    970             git_object = None
    971             tree = None
    972             blob = None
    973986
    974987        self.commit = commit
     
    976989        self.tree = tree
    977990        self.blob = blob
     991        self.filemode = filemode
    978992        self.created_path = path  # XXX how to use?
    979993        self._created_commit = created_commit
     
    10291043    def get_properties(self):
    10301044        props = {}
    1031         if self.tree_entry:
    1032             mode = getattr(self.tree_entry, 'filemode', None)
    1033             if mode is None:
    1034                 mode = self.tree_entry.attributes  # 0.17.3
    1035             props['mode'] = '%06o' % mode
     1045        if self.filemode is not None:
     1046            props['mode'] = '%06o' % self.filemode
    10361047        return props
    10371048
     
    10471058
    10481059    def get_entries(self):
    1049         if self.commit is None or not self.isdir:
     1060        if self.commit is None or self.tree is None or not self.isdir:
    10501061            return
    10511062
  • tracpygit2plugin/trunk/tracext/pygit2/tests/git_fs.py

    r13906 r13908  
    3131REPOS_NAME = 'test.git'
    3232REPOS_URL = 'http://example.org/git/test.git'
    33 HEAD_REV = u'0ee9cfd6538b7b994b94a45ed173d9d45272b0c5'
     33HEAD_REV = u'5fa8e424840c6c4dd331343550d870e6faafadf5'
    3434
    3535dumpfile_path = os.path.join(os.path.dirname(__file__), 'gitrepos.dump')
     
    232232    def test_get_quickjump_entries(self):
    233233        entries = self.repos.get_quickjump_entries(None)
    234         self.assertEquals(('branches', u'develöp', '/',
    235                            '0ee9cfd6538b7b994b94a45ed173d9d45272b0c5'),
     234        self.assertEquals(('branches', u'develöp', '/', HEAD_REV),
    236235                          entries.next())
    237         self.assertEquals(('branches', u'master', '/',
    238                            '0ee9cfd6538b7b994b94a45ed173d9d45272b0c5'),
     236        self.assertEquals(('branches', u'master', '/', HEAD_REV),
    239237                          entries.next())
    240         self.assertEquals(('branches', u'stâble', '/',
    241                            '0ee9cfd6538b7b994b94a45ed173d9d45272b0c5'),
     238        self.assertEquals(('branches', u'stâble', '/', HEAD_REV),
    242239                          entries.next())
    243240        self.assertEquals(('tags', u'ver0.1', '/',
     
    343340        self.assertEquals(
    344341            [(u'develöp', True), ('master', True), (u'stâble', True)],
    345             self.repos.get_changeset('0ee9cfd').get_branches())
     342            self.repos.get_changeset(HEAD_REV[:7]).get_branches())
    346343
    347344    def test_changeset_get_tags(self):
     
    488485        self.assertRaises(StopIteration, history.next)
    489486
     487    def test_get_node_submodule(self):
     488        node = self.repos.get_node('/')
     489        entries = dict((node.path, node) for node in node.get_entries())
     490        self.assertTrue(u'submod' in entries)
     491
     492        node = entries.get(u'submod')
     493        self.assertNotEquals(None, node)
     494        self.assertEquals(HEAD_REV, node.rev)
     495        self.assertTrue(node.isdir)
     496        self.assertFalse(node.isfile)
     497        self.assertEquals({'mode': '160000'}, node.get_properties())
     498        self.assertEquals([], list(node.get_entries()))
     499
     500        node = self.repos.get_node('/submod')
     501        self.assertNotEquals(None, node)
     502        self.assertTrue(node.isdir)
     503        self.assertFalse(node.isfile)
     504        self.assertEquals({'mode': '160000'}, node.get_properties())
     505        self.assertEquals([], list(node.get_entries()))
     506
    490507    # TODO: GitNode.get_annotations(self):
    491508
  • tracpygit2plugin/trunk/tracext/pygit2/tests/gitrepos.dump

    r13879 r13908  
    4848blob
    4949mark :7
    50 data 12
    51 ! root file
     50data 48
     51add dir2/simple.txt and dir2/simple-another.txt
    5252
    5353blob
    5454mark :8
    55 data 48
    56 add dir2/simple.txt and dir2/simple-another.txt
     55data 12
     56! root file
    5757
    5858commit refs/heads/develöp
     
    6464from :6
    6565D dir/tété.txt
    66 M 100644 :8 dir2/simple-another.txt
    67 M 100644 :8 dir2/simple.txt
     66M 100644 :7 dir2/simple-another.txt
     67M 100644 :7 dir2/simple.txt
    6868M 100644 :2 root-sample.txt
    69 M 100644 :7 root-tété.txt
     69M 100644 :8 root-tété.txt
    7070M 100644 :5 āāā-file.txt
    7171D āāā/file.txt
    7272
     73blob
     74mark :10
     75data 57
     76[submodule "submod"]
     77    path = submod
     78    url = /tmp/gitrepos
     79
     80commit refs/heads/develöp
     81mark :11
     82author Joé <joe@example.com> 1399392953 +0900
     83committer Joé <joe@example.com> 1399392953 +0900
     84data 24
     85added submodule'd entry
     86from :9
     87M 100644 :10 .gitmodules
     88M 160000 0ee9cfd6538b7b994b94a45ed173d9d45272b0c5 submod
     89
    7390reset refs/heads/master
    74 from :9
     91from :11
    7592
    7693reset refs/tags/vér0.1
     
    7895
    7996reset refs/heads/stâble
    80 from :9
     97from :11
    8198
    8299reset refs/heads/master
    83 from :9
     100from :11
    84101
Note: See TracChangeset for help on using the changeset viewer.