Added support for renamed file detection in cmds.git_status()
[ugit.git] / py / models.py
blob88197fbf3bc3136b1e7cb7286b5e191194195332
1 import os
2 import re
3 import commands
4 from model import Model
6 def get_config(key):
7 return commands.getoutput('git config --get "%s"' % key)
9 class GitModel(Model):
10 def __init__ (self):
11 Model.__init__ (self, {
12 'commitmsg': '',
13 'staged': [],
14 'unstaged': [],
15 'untracked': [],
16 'name': get_config('user.name'),
17 'email': get_config('user.email'),
20 class GitRepoBrowserModel (Model):
21 def __init__ (self, branch=''):
22 Model.__init__ (self, {
23 'directory': '',
24 'branch': branch,
26 # These are parallel lists
27 'files': [],
28 'sha1s': [],
29 'types': [],
31 # All items below here are re-calculated in
32 # setup_items()
33 'directories': [],
34 'directory_entries': {},
36 # These are also parallel lists
37 'item_names': [],
38 'item_sha1s': [],
39 'item_types': [],
42 def setup_items (self):
43 '''This scans over self.(files, sha1s, types) to generate
44 directories, directory_entries, itmes, item_sha1s,
45 and item_types.'''
47 self.item_names = []
48 self.item_sha1s = []
49 self.item_types = []
50 self.directories = []
51 self.directory_entries = {}
53 if self.directory: self.directories.append ('..')
55 dir_entries = self.directory_entries
56 dir_regex = re.compile ('([^/]+)/')
57 dirs_seen = {}
58 subdirs_seen = {}
60 for idx, file in enumerate (self.files):
62 orig_file = str (file)
63 if not orig_file.startswith (self.directory): continue
64 file = file[ len (self.directory): ]
66 if file.count (os.sep):
67 # This is a directory...
68 match = dir_regex.match (file)
69 if not match: continue
71 dirent = match.group (1) + '/'
72 if dirent not in self.directory_entries:
73 self.directory_entries[dirent] = []
75 if dirent not in dirs_seen:
76 dirs_seen[dirent] = True
77 self.directories.append (dirent)
79 entry = file.replace (dirent, '')
80 entry_match = dir_regex.match (entry)
81 if entry_match:
82 subdir = entry_match.group (1) + '/'
83 if subdir in subdirs_seen: continue
84 subdirs_seen[subdir] = True
85 dir_entries[dirent].append (subdir)
86 else:
87 dir_entries[dirent].append (entry)
88 else:
89 self.item_names.append (file)
90 self.item_sha1s.append (self.sha1s[idx])
91 self.item_types.append (self.types[idx])