Make things look nicer on MacOS
[ugit.git] / py / models.py
blob06c9d00aa8f9e1177906d154061bd60f685c235d
1 import os
2 import re
3 import commands
4 import cmds
5 from model import Model
7 class GitModel(Model):
8 def __init__ (self):
9 Model.__init__ (self, {
10 'commitmsg': '',
11 'staged': [],
12 'unstaged': [],
13 'untracked': [],
14 'name': cmds.git_config('user.name'),
15 'email': cmds.git_config('user.email'),
18 def add_signoff (self):
19 '''Adds a standard Signed-off by: tag to the end
20 of the current commit message.'''
22 msg = self.get_commitmsg()
23 signoff = ('Signed-off by: %s <%s>'
24 % (self.get_name(), self.get_email()))
26 if signoff not in msg:
27 self.set_commitmsg (msg + '\n\n' + signoff)
29 def set_latest_commitmsg (self):
30 '''Queries git for the latest commit message and sets it in
31 self.commitmsg.'''
32 commit_msg = []
33 commit_lines = cmds.git_show ('HEAD').split ('\n')
34 for idx, msg in enumerate (commit_lines):
35 if idx < 4: continue
36 msg = msg.lstrip()
37 if msg.startswith ('diff --git'):
38 commit_msg.pop()
39 break
40 commit_msg.append (msg)
41 self.set_commitmsg ('\n'.join (commit_msg).rstrip())
43 class GitRepoBrowserModel (Model):
44 def __init__ (self, branch=''):
45 Model.__init__ (self, {
46 'directory': '',
47 'branch': branch,
49 # These are parallel lists
50 'files': [],
51 'sha1s': [],
52 'types': [],
54 # All items below here are re-calculated in
55 # setup_items()
56 'directories': [],
57 'directory_entries': {},
59 # These are also parallel lists
60 'item_names': [],
61 'item_sha1s': [],
62 'item_types': [],
64 self.reset()
66 def reset (self):
67 # Collect data for the model
68 tree_info = cmds.git_ls_tree (self.get_branch())
70 types = map ( lambda (x): x[1], tree_info )
71 sha1s = map ( lambda (x): x[2], tree_info )
72 files = map ( lambda (x): x[3], tree_info )
74 self.add_types (*types)
75 self.add_files (*files)
76 self.add_sha1s (*sha1s)
78 self.reset_items()
80 def reset_items (self):
81 '''This scans over self.(files, sha1s, types) to generate
82 directories, directory_entries, itmes, item_sha1s,
83 and item_types.'''
85 self.item_names = []
86 self.item_sha1s = []
87 self.item_types = []
88 self.directories = []
89 self.directory_entries = {}
91 if self.directory: self.directories.append ('..')
93 dir_entries = self.directory_entries
94 dir_regex = re.compile ('([^/]+)/')
95 dirs_seen = {}
96 subdirs_seen = {}
98 for idx, file in enumerate (self.files):
100 orig_file = str (file)
101 if not orig_file.startswith (self.directory): continue
102 file = file[ len (self.directory): ]
104 if file.count ('/'):
105 # This is a directory...
106 match = dir_regex.match (file)
107 if not match: continue
109 dirent = match.group (1) + '/'
110 if dirent not in self.directory_entries:
111 self.directory_entries[dirent] = []
113 if dirent not in dirs_seen:
114 dirs_seen[dirent] = True
115 self.directories.append (dirent)
117 entry = file.replace (dirent, '')
118 entry_match = dir_regex.match (entry)
119 if entry_match:
120 subdir = entry_match.group (1) + '/'
121 if subdir in subdirs_seen: continue
122 subdirs_seen[subdir] = True
123 dir_entries[dirent].append (subdir)
124 else:
125 dir_entries[dirent].append (entry)
126 else:
127 self.item_names.append (file)
128 self.item_sha1s.append (self.sha1s[idx])
129 self.item_types.append (self.types[idx])
131 class GitCreateBranchModel (Model):
132 def __init__ (self):
133 Model.__init__ (self, {
134 'branch': '',
135 'revision': '',
136 'local_branches': [],
137 'remote_branches': [],
138 'tags': [],
140 self.reset()
142 def reset (self):
143 remote_branches = cmds.git_branch (remote=True)
144 local_branches = cmds.git_branch (remote=False)
145 tags = cmds.git_tag()
147 self.set_branch ('')
148 self.set_revision ('')
149 self.set_local_branches (local_branches)
150 self.set_remote_branches (remote_branches)
151 self.set_tags (tags)