Mercurial > hg
annotate mercurial/crecord.py @ 25511:c2a4dfe2a336
formatter: move most of template option helper to formatter
We want to share this function between formatter and cmdutils. It
doesn't belong in templater because it imports knowledge of ui layers
that shouldn't be there. We'd prefer cmdutil to layer on the formatter
rather than vice-versa. Since the formatter is the handler for -T
options for all non-log commands, let's move the helper there. We
leave the bits specific to the old --style option behind.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 10 Jun 2015 14:29:13 -0500 |
parents | 6fabde6ef445 |
children | 838fa1932ff8 |
rev | line source |
---|---|
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1 # stuff related specifically to patch manipulation / parsing |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
2 # |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
3 # Copyright 2008 Mark Edgington <edgimar@gmail.com> |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
4 # |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
7 # |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
8 # This code is based on the Mark Edgington's crecord extension. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
9 # (Itself based on Bryan O'Sullivan's record extension.) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
10 |
24313
ed535f2c15c3
crecord: fix some import style
Matt Mackall <mpm@selenic.com>
parents:
24310
diff
changeset
|
11 from i18n import _ |
ed535f2c15c3
crecord: fix some import style
Matt Mackall <mpm@selenic.com>
parents:
24310
diff
changeset
|
12 import patch as patchmod |
ed535f2c15c3
crecord: fix some import style
Matt Mackall <mpm@selenic.com>
parents:
24310
diff
changeset
|
13 import util, encoding |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
14 |
24423
01b39e821d00
crecord: conditionalize the imports that are not available on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
24351
diff
changeset
|
15 import os, re, sys, struct, signal, tempfile, locale, cStringIO |
24314
348492ba632a
crecord: more import style
Matt Mackall <mpm@selenic.com>
parents:
24313
diff
changeset
|
16 |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
17 # This is required for ncurses to display non-ASCII characters in default user |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
18 # locale encoding correctly. --immerrr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
19 locale.setlocale(locale.LC_ALL, '') |
24317
f559cae7892f
crecord: fiddle with vertical whitespace
Matt Mackall <mpm@selenic.com>
parents:
24316
diff
changeset
|
20 |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
21 # os.name is one of: 'posix', 'nt', 'dos', 'os2', 'mac', or 'ce' |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
22 if os.name == 'posix': |
24909
d71492ca2fdd
crecord: fix mixed imports warning
Matt Harbison <matt_harbison@yahoo.com>
parents:
24840
diff
changeset
|
23 import curses |
d71492ca2fdd
crecord: fix mixed imports warning
Matt Harbison <matt_harbison@yahoo.com>
parents:
24840
diff
changeset
|
24 import fcntl, termios |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
25 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
26 # I have no idea if wcurses works with crecord... |
24423
01b39e821d00
crecord: conditionalize the imports that are not available on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
24351
diff
changeset
|
27 try: |
01b39e821d00
crecord: conditionalize the imports that are not available on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
24351
diff
changeset
|
28 import wcurses as curses |
01b39e821d00
crecord: conditionalize the imports that are not available on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
24351
diff
changeset
|
29 except ImportError: |
01b39e821d00
crecord: conditionalize the imports that are not available on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
24351
diff
changeset
|
30 # wcurses is not shipped on Windows by default |
01b39e821d00
crecord: conditionalize the imports that are not available on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
24351
diff
changeset
|
31 pass |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
32 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
33 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
34 curses |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
35 except NameError: |
24425
3a4122bb9488
crecord: don't abort on Windows when curses isn't available
Matt Harbison <matt_harbison@yahoo.com>
parents:
24423
diff
changeset
|
36 if os.name != 'nt': # Temporary hack to get running on Windows again |
3a4122bb9488
crecord: don't abort on Windows when curses isn't available
Matt Harbison <matt_harbison@yahoo.com>
parents:
24423
diff
changeset
|
37 raise util.Abort( |
3a4122bb9488
crecord: don't abort on Windows when curses isn't available
Matt Harbison <matt_harbison@yahoo.com>
parents:
24423
diff
changeset
|
38 _('the python curses/wcurses module is not available/installed')) |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
39 |
24316
d61aa383e2e5
crecord: fix underbar style for orig_stdout
Matt Mackall <mpm@selenic.com>
parents:
24315
diff
changeset
|
40 _origstdout = sys.__stdout__ # used by gethw() |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
41 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
42 class patchnode(object): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
43 """abstract class for patch graph nodes |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
44 (i.e. patchroot, header, hunk, hunkline) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
45 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
46 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
47 def firstchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
48 raise NotImplementedError("method must be implemented by subclass") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
49 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
50 def lastchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
51 raise NotImplementedError("method must be implemented by subclass") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
52 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
53 def allchildren(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
54 "Return a list of all of the direct children of this node" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
55 raise NotImplementedError("method must be implemented by subclass") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
56 def nextsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
57 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
58 Return the closest next item of the same type where there are no items |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
59 of different types between the current item and this closest item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
60 If no such item exists, return None. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
61 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
62 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
63 raise NotImplementedError("method must be implemented by subclass") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
64 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
65 def prevsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
66 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
67 Return the closest previous item of the same type where there are no |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
68 items of different types between the current item and this closest item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
69 If no such item exists, return None. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
70 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
71 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
72 raise NotImplementedError("method must be implemented by subclass") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
73 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
74 def parentitem(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
75 raise NotImplementedError("method must be implemented by subclass") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
76 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
77 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
78 def nextitem(self, constrainlevel=True, skipfolded=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
79 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
80 If constrainLevel == True, return the closest next item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
81 of the same type where there are no items of different types between |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
82 the current item and this closest item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
83 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
84 If constrainLevel == False, then try to return the next item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
85 closest to this item, regardless of item's type (header, hunk, or |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
86 HunkLine). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
87 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
88 If skipFolded == True, and the current item is folded, then the child |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
89 items that are hidden due to folding will be skipped when determining |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
90 the next item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
91 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
92 If it is not possible to get the next item, return None. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
93 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
94 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
95 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
96 itemfolded = self.folded |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
97 except AttributeError: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
98 itemfolded = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
99 if constrainlevel: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
100 return self.nextsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
101 elif skipfolded and itemfolded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
102 nextitem = self.nextsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
103 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
104 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
105 nextitem = self.parentitem().nextsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
106 except AttributeError: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
107 nextitem = None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
108 return nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
109 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
110 # try child |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
111 item = self.firstchild() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
112 if item is not None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
113 return item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
114 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
115 # else try next sibling |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
116 item = self.nextsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
117 if item is not None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
118 return item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
119 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
120 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
121 # else try parent's next sibling |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
122 item = self.parentitem().nextsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
123 if item is not None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
124 return item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
125 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
126 # else return grandparent's next sibling (or None) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
127 return self.parentitem().parentitem().nextsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
128 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
129 except AttributeError: # parent and/or grandparent was None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
130 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
131 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
132 def previtem(self, constrainlevel=True, skipfolded=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
133 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
134 If constrainLevel == True, return the closest previous item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
135 of the same type where there are no items of different types between |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
136 the current item and this closest item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
137 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
138 If constrainLevel == False, then try to return the previous item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
139 closest to this item, regardless of item's type (header, hunk, or |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
140 HunkLine). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
141 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
142 If skipFolded == True, and the current item is folded, then the items |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
143 that are hidden due to folding will be skipped when determining the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
144 next item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
145 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
146 If it is not possible to get the previous item, return None. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
147 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
148 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
149 if constrainlevel: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
150 return self.prevsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
151 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
152 # try previous sibling's last child's last child, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
153 # else try previous sibling's last child, else try previous sibling |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
154 prevsibling = self.prevsibling() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
155 if prevsibling is not None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
156 prevsiblinglastchild = prevsibling.lastchild() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
157 if ((prevsiblinglastchild is not None) and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
158 not prevsibling.folded): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
159 prevsiblinglclc = prevsiblinglastchild.lastchild() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
160 if ((prevsiblinglclc is not None) and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
161 not prevsiblinglastchild.folded): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
162 return prevsiblinglclc |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
163 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
164 return prevsiblinglastchild |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
165 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
166 return prevsibling |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
167 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
168 # try parent (or None) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
169 return self.parentitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
170 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
171 class patch(patchnode, list): # todo: rename patchroot |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
172 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
173 list of header objects representing the patch. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
174 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
175 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
176 def __init__(self, headerlist): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
177 self.extend(headerlist) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
178 # add parent patch object reference to each header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
179 for header in self: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
180 header.patch = self |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
181 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
182 class uiheader(patchnode): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
183 """patch header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
184 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
185 xxx shoudn't we move this to mercurial/patch.py ? |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
186 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
187 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
188 def __init__(self, header): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
189 self.nonuiheader = header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
190 # flag to indicate whether to apply this chunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
191 self.applied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
192 # flag which only affects the status display indicating if a node's |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
193 # children are partially applied (i.e. some applied, some not). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
194 self.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
195 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
196 # flag to indicate whether to display as folded/unfolded to user |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
197 self.folded = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
198 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
199 # list of all headers in patch |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
200 self.patch = None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
201 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
202 # flag is False if this header was ever unfolded from initial state |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
203 self.neverunfolded = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
204 self.hunks = [uihunk(h, self) for h in self.hunks] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
205 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
206 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
207 def prettystr(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
208 x = cStringIO.StringIO() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
209 self.pretty(x) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
210 return x.getvalue() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
211 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
212 def nextsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
213 numheadersinpatch = len(self.patch) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
214 indexofthisheader = self.patch.index(self) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
215 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
216 if indexofthisheader < numheadersinpatch - 1: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
217 nextheader = self.patch[indexofthisheader + 1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
218 return nextheader |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
219 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
220 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
221 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
222 def prevsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
223 indexofthisheader = self.patch.index(self) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
224 if indexofthisheader > 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
225 previousheader = self.patch[indexofthisheader - 1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
226 return previousheader |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
227 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
228 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
229 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
230 def parentitem(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
231 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
232 there is no 'real' parent item of a header that can be selected, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
233 so return None. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
234 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
235 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
236 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
237 def firstchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
238 "return the first child of this item, if one exists. otherwise None." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
239 if len(self.hunks) > 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
240 return self.hunks[0] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
241 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
242 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
243 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
244 def lastchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
245 "return the last child of this item, if one exists. otherwise None." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
246 if len(self.hunks) > 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
247 return self.hunks[-1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
248 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
249 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
250 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
251 def allchildren(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
252 "return a list of all of the direct children of this node" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
253 return self.hunks |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
254 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
255 def __getattr__(self, name): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
256 return getattr(self.nonuiheader, name) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
257 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
258 class uihunkline(patchnode): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
259 "represents a changed line in a hunk" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
260 def __init__(self, linetext, hunk): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
261 self.linetext = linetext |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
262 self.applied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
263 # the parent hunk to which this line belongs |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
264 self.hunk = hunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
265 # folding lines currently is not used/needed, but this flag is needed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
266 # in the previtem method. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
267 self.folded = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
268 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
269 def prettystr(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
270 return self.linetext |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
271 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
272 def nextsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
273 numlinesinhunk = len(self.hunk.changedlines) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
274 indexofthisline = self.hunk.changedlines.index(self) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
275 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
276 if (indexofthisline < numlinesinhunk - 1): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
277 nextline = self.hunk.changedlines[indexofthisline + 1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
278 return nextline |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
279 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
280 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
281 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
282 def prevsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
283 indexofthisline = self.hunk.changedlines.index(self) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
284 if indexofthisline > 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
285 previousline = self.hunk.changedlines[indexofthisline - 1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
286 return previousline |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
287 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
288 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
289 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
290 def parentitem(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
291 "return the parent to the current item" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
292 return self.hunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
293 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
294 def firstchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
295 "return the first child of this item, if one exists. otherwise None." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
296 # hunk-lines don't have children |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
297 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
298 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
299 def lastchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
300 "return the last child of this item, if one exists. otherwise None." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
301 # hunk-lines don't have children |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
302 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
303 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
304 class uihunk(patchnode): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
305 """ui patch hunk, wraps a hunk and keep track of ui behavior """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
306 maxcontext = 3 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
307 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
308 def __init__(self, hunk, header): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
309 self._hunk = hunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
310 self.changedlines = [uihunkline(line, self) for line in hunk.hunk] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
311 self.header = header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
312 # used at end for detecting how many removed lines were un-applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
313 self.originalremoved = self.removed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
314 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
315 # flag to indicate whether to display as folded/unfolded to user |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
316 self.folded = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
317 # flag to indicate whether to apply this chunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
318 self.applied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
319 # flag which only affects the status display indicating if a node's |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
320 # children are partially applied (i.e. some applied, some not). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
321 self.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
322 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
323 def nextsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
324 numhunksinheader = len(self.header.hunks) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
325 indexofthishunk = self.header.hunks.index(self) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
326 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
327 if (indexofthishunk < numhunksinheader - 1): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
328 nexthunk = self.header.hunks[indexofthishunk + 1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
329 return nexthunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
330 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
331 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
332 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
333 def prevsibling(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
334 indexofthishunk = self.header.hunks.index(self) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
335 if indexofthishunk > 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
336 previoushunk = self.header.hunks[indexofthishunk - 1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
337 return previoushunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
338 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
339 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
340 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
341 def parentitem(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
342 "return the parent to the current item" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
343 return self.header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
344 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
345 def firstchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
346 "return the first child of this item, if one exists. otherwise None." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
347 if len(self.changedlines) > 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
348 return self.changedlines[0] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
349 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
350 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
351 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
352 def lastchild(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
353 "return the last child of this item, if one exists. otherwise None." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
354 if len(self.changedlines) > 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
355 return self.changedlines[-1] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
356 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
357 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
358 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
359 def allchildren(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
360 "return a list of all of the direct children of this node" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
361 return self.changedlines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
362 def countchanges(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
363 """changedlines -> (n+,n-)""" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
364 add = len([l for l in self.changedlines if l.applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
365 and l.prettystr()[0] == '+']) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
366 rem = len([l for l in self.changedlines if l.applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
367 and l.prettystr()[0] == '-']) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
368 return add, rem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
369 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
370 def getfromtoline(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
371 # calculate the number of removed lines converted to context lines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
372 removedconvertedtocontext = self.originalremoved - self.removed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
373 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
374 contextlen = (len(self.before) + len(self.after) + |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
375 removedconvertedtocontext) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
376 if self.after and self.after[-1] == '\\ no newline at end of file\n': |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
377 contextlen -= 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
378 fromlen = contextlen + self.removed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
379 tolen = contextlen + self.added |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
380 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
381 # diffutils manual, section "2.2.2.2 detailed description of unified |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
382 # format": "an empty hunk is considered to end at the line that |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
383 # precedes the hunk." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
384 # |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
385 # so, if either of hunks is empty, decrease its line start. --immerrr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
386 # but only do this if fromline > 0, to avoid having, e.g fromline=-1. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
387 fromline, toline = self.fromline, self.toline |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
388 if fromline != 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
389 if fromlen == 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
390 fromline -= 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
391 if tolen == 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
392 toline -= 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
393 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
394 fromtoline = '@@ -%d,%d +%d,%d @@%s\n' % ( |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
395 fromline, fromlen, toline, tolen, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
396 self.proc and (' ' + self.proc)) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
397 return fromtoline |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
398 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
399 def write(self, fp): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
400 # updated self.added/removed, which are used by getfromtoline() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
401 self.added, self.removed = self.countchanges() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
402 fp.write(self.getfromtoline()) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
403 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
404 hunklinelist = [] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
405 # add the following to the list: (1) all applied lines, and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
406 # (2) all unapplied removal lines (convert these to context lines) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
407 for changedline in self.changedlines: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
408 changedlinestr = changedline.prettystr() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
409 if changedline.applied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
410 hunklinelist.append(changedlinestr) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
411 elif changedlinestr[0] == "-": |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
412 hunklinelist.append(" " + changedlinestr[1:]) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
413 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
414 fp.write(''.join(self.before + hunklinelist + self.after)) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
415 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
416 pretty = write |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
417 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
418 def prettystr(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
419 x = cStringIO.StringIO() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
420 self.pretty(x) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
421 return x.getvalue() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
422 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
423 def __getattr__(self, name): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
424 return getattr(self._hunk, name) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
425 def __repr__(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
426 return '<hunk %r@%d>' % (self.filename(), self.fromline) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
427 |
25310
c1f5ef76d1c2
record: add an operation arguments to customize recording ui
Laurent Charignon <lcharignon@fb.com>
parents:
24909
diff
changeset
|
428 def filterpatch(ui, chunks, chunkselector, operation=None): |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
429 """interactively filter patch chunks into applied-only chunks""" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
430 |
25359
724421cb4745
record: add default value for operation argument
Laurent Charignon <lcharignon@fb.com>
parents:
25310
diff
changeset
|
431 if operation is None: |
724421cb4745
record: add default value for operation argument
Laurent Charignon <lcharignon@fb.com>
parents:
25310
diff
changeset
|
432 operation = _('confirm') |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
433 chunks = list(chunks) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
434 # convert chunks list into structure suitable for displaying/modifying |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
435 # with curses. create a list of headers only. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
436 headers = [c for c in chunks if isinstance(c, patchmod.header)] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
437 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
438 # if there are no changed files |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
439 if len(headers) == 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
440 return [] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
441 uiheaders = [uiheader(h) for h in headers] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
442 # let user choose headers/hunks/lines, and mark their applied flags |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
443 # accordingly |
24342
be3ab98f11e0
record: change arguments of curses recording function
Laurent Charignon <lcharignon@fb.com>
parents:
24318
diff
changeset
|
444 chunkselector(ui, uiheaders) |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
445 appliedhunklist = [] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
446 for hdr in uiheaders: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
447 if (hdr.applied and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
448 (hdr.special() or len([h for h in hdr.hunks if h.applied]) > 0)): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
449 appliedhunklist.append(hdr) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
450 fixoffset = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
451 for hnk in hdr.hunks: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
452 if hnk.applied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
453 appliedhunklist.append(hnk) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
454 # adjust the 'to'-line offset of the hunk to be correct |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
455 # after de-activating some of the other hunks for this file |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
456 if fixoffset: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
457 #hnk = copy.copy(hnk) # necessary?? |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
458 hnk.toline += fixoffset |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
459 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
460 fixoffset += hnk.removed - hnk.added |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
461 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
462 return appliedhunklist |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
463 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
464 def gethw(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
465 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
466 magically get the current height and width of the window (without initscr) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
467 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
468 this is a rip-off of a rip-off - taken from the bpython code. it is |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
469 useful / necessary because otherwise curses.initscr() must be called, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
470 which can leave the terminal in a nasty state after exiting. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
471 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
472 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
473 h, w = struct.unpack( |
24316
d61aa383e2e5
crecord: fix underbar style for orig_stdout
Matt Mackall <mpm@selenic.com>
parents:
24315
diff
changeset
|
474 "hhhh", fcntl.ioctl(_origstdout, termios.TIOCGWINSZ, "\000"*8))[0:2] |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
475 return h, w |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
476 |
24342
be3ab98f11e0
record: change arguments of curses recording function
Laurent Charignon <lcharignon@fb.com>
parents:
24318
diff
changeset
|
477 def chunkselector(ui, headerlist): |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
478 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
479 curses interface to get selection of chunks, and mark the applied flags |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
480 of the chosen chunks. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
481 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
482 """ |
24779
23727465ff72
record: add message when starting record's curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24492
diff
changeset
|
483 ui.write(_('starting interactive selection\n')) |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
484 chunkselector = curseschunkselector(headerlist, ui) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
485 curses.wrapper(chunkselector.main) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
486 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
487 def testdecorator(testfn, f): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
488 def u(*args, **kwargs): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
489 return f(testfn, *args, **kwargs) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
490 return u |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
491 |
24342
be3ab98f11e0
record: change arguments of curses recording function
Laurent Charignon <lcharignon@fb.com>
parents:
24318
diff
changeset
|
492 def testchunkselector(testfn, ui, headerlist): |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
493 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
494 test interface to get selection of chunks, and mark the applied flags |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
495 of the chosen chunks. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
496 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
497 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
498 chunkselector = curseschunkselector(headerlist, ui) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
499 if testfn and os.path.exists(testfn): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
500 testf = open(testfn) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
501 testcommands = map(lambda x: x.rstrip('\n'), testf.readlines()) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
502 testf.close() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
503 while True: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
504 if chunkselector.handlekeypressed(testcommands.pop(0), test=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
505 break |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
506 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
507 class curseschunkselector(object): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
508 def __init__(self, headerlist, ui): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
509 # put the headers into a patch object |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
510 self.headerlist = patch(headerlist) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
511 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
512 self.ui = ui |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
513 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
514 # list of all chunks |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
515 self.chunklist = [] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
516 for h in headerlist: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
517 self.chunklist.append(h) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
518 self.chunklist.extend(h.hunks) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
519 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
520 # dictionary mapping (fgcolor, bgcolor) pairs to the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
521 # corresponding curses color-pair value. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
522 self.colorpairs = {} |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
523 # maps custom nicknames of color-pairs to curses color-pair values |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
524 self.colorpairnames = {} |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
525 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
526 # the currently selected header, hunk, or hunk-line |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
527 self.currentselecteditem = self.headerlist[0] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
528 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
529 # updated when printing out patch-display -- the 'lines' here are the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
530 # line positions *in the pad*, not on the screen. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
531 self.selecteditemstartline = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
532 self.selecteditemendline = None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
533 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
534 # define indentation levels |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
535 self.headerindentnumchars = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
536 self.hunkindentnumchars = 3 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
537 self.hunklineindentnumchars = 6 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
538 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
539 # the first line of the pad to print to the screen |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
540 self.firstlineofpadtoprint = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
541 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
542 # keeps track of the number of lines in the pad |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
543 self.numpadlines = None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
544 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
545 self.numstatuslines = 2 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
546 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
547 # keep a running count of the number of lines printed to the pad |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
548 # (used for determining when the selected item begins/ends) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
549 self.linesprintedtopadsofar = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
550 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
551 # the first line of the pad which is visible on the screen |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
552 self.firstlineofpadtoprint = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
553 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
554 # stores optional text for a commit comment provided by the user |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
555 self.commenttext = "" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
556 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
557 # if the last 'toggle all' command caused all changes to be applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
558 self.waslasttoggleallapplied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
559 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
560 def uparrowevent(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
561 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
562 try to select the previous item to the current item that has the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
563 most-indented level. for example, if a hunk is selected, try to select |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
564 the last hunkline of the hunk prior to the selected hunk. or, if |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
565 the first hunkline of a hunk is currently selected, then select the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
566 hunk itself. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
567 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
568 if the currently selected item is already at the top of the screen, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
569 scroll the screen down to show the new-selected item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
570 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
571 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
572 currentitem = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
573 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
574 nextitem = currentitem.previtem(constrainlevel=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
575 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
576 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
577 # if no parent item (i.e. currentitem is the first header), then |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
578 # no change... |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
579 nextitem = currentitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
580 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
581 self.currentselecteditem = nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
582 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
583 def uparrowshiftevent(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
584 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
585 select (if possible) the previous item on the same level as the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
586 currently selected item. otherwise, select (if possible) the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
587 parent-item of the currently selected item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
588 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
589 if the currently selected item is already at the top of the screen, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
590 scroll the screen down to show the new-selected item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
591 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
592 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
593 currentitem = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
594 nextitem = currentitem.previtem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
595 # if there's no previous item on this level, try choosing the parent |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
596 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
597 nextitem = currentitem.parentitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
598 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
599 # if no parent item (i.e. currentitem is the first header), then |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
600 # no change... |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
601 nextitem = currentitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
602 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
603 self.currentselecteditem = nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
604 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
605 def downarrowevent(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
606 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
607 try to select the next item to the current item that has the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
608 most-indented level. for example, if a hunk is selected, select |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
609 the first hunkline of the selected hunk. or, if the last hunkline of |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
610 a hunk is currently selected, then select the next hunk, if one exists, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
611 or if not, the next header if one exists. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
612 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
613 if the currently selected item is already at the bottom of the screen, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
614 scroll the screen up to show the new-selected item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
615 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
616 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
617 #self.startprintline += 1 #debug |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
618 currentitem = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
619 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
620 nextitem = currentitem.nextitem(constrainlevel=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
621 # if there's no next item, keep the selection as-is |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
622 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
623 nextitem = currentitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
624 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
625 self.currentselecteditem = nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
626 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
627 def downarrowshiftevent(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
628 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
629 if the cursor is already at the bottom chunk, scroll the screen up and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
630 move the cursor-position to the subsequent chunk. otherwise, only move |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
631 the cursor position down one chunk. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
632 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
633 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
634 # todo: update docstring |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
635 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
636 currentitem = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
637 nextitem = currentitem.nextitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
638 # if there's no previous item on this level, try choosing the parent's |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
639 # nextitem. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
640 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
641 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
642 nextitem = currentitem.parentitem().nextitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
643 except AttributeError: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
644 # parentitem returned None, so nextitem() can't be called |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
645 nextitem = None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
646 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
647 # if no next item on parent-level, then no change... |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
648 nextitem = currentitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
649 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
650 self.currentselecteditem = nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
651 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
652 def rightarrowevent(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
653 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
654 select (if possible) the first of this item's child-items. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
655 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
656 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
657 currentitem = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
658 nextitem = currentitem.firstchild() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
659 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
660 # turn off folding if we want to show a child-item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
661 if currentitem.folded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
662 self.togglefolded(currentitem) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
663 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
664 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
665 # if no next item on parent-level, then no change... |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
666 nextitem = currentitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
667 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
668 self.currentselecteditem = nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
669 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
670 def leftarrowevent(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
671 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
672 if the current item can be folded (i.e. it is an unfolded header or |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
673 hunk), then fold it. otherwise try select (if possible) the parent |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
674 of this item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
675 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
676 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
677 currentitem = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
678 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
679 # try to fold the item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
680 if not isinstance(currentitem, uihunkline): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
681 if not currentitem.folded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
682 self.togglefolded(item=currentitem) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
683 return |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
684 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
685 # if it can't be folded, try to select the parent item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
686 nextitem = currentitem.parentitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
687 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
688 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
689 # if no item on parent-level, then no change... |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
690 nextitem = currentitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
691 if not nextitem.folded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
692 self.togglefolded(item=nextitem) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
693 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
694 self.currentselecteditem = nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
695 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
696 def leftarrowshiftevent(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
697 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
698 select the header of the current item (or fold current item if the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
699 current item is already a header). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
700 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
701 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
702 currentitem = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
703 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
704 if isinstance(currentitem, uiheader): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
705 if not currentitem.folded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
706 self.togglefolded(item=currentitem) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
707 return |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
708 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
709 # select the parent item recursively until we're at a header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
710 while True: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
711 nextitem = currentitem.parentitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
712 if nextitem is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
713 break |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
714 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
715 currentitem = nextitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
716 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
717 self.currentselecteditem = currentitem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
718 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
719 def updatescroll(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
720 "scroll the screen to fully show the currently-selected" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
721 selstart = self.selecteditemstartline |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
722 selend = self.selecteditemendline |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
723 #selnumlines = selend - selstart |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
724 padstart = self.firstlineofpadtoprint |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
725 padend = padstart + self.yscreensize - self.numstatuslines - 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
726 # 'buffered' pad start/end values which scroll with a certain |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
727 # top/bottom context margin |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
728 padstartbuffered = padstart + 3 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
729 padendbuffered = padend - 3 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
730 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
731 if selend > padendbuffered: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
732 self.scrolllines(selend - padendbuffered) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
733 elif selstart < padstartbuffered: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
734 # negative values scroll in pgup direction |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
735 self.scrolllines(selstart - padstartbuffered) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
736 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
737 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
738 def scrolllines(self, numlines): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
739 "scroll the screen up (down) by numlines when numlines >0 (<0)." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
740 self.firstlineofpadtoprint += numlines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
741 if self.firstlineofpadtoprint < 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
742 self.firstlineofpadtoprint = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
743 if self.firstlineofpadtoprint > self.numpadlines - 1: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
744 self.firstlineofpadtoprint = self.numpadlines - 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
745 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
746 def toggleapply(self, item=None): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
747 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
748 toggle the applied flag of the specified item. if no item is specified, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
749 toggle the flag of the currently selected item. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
750 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
751 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
752 if item is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
753 item = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
754 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
755 item.applied = not item.applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
756 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
757 if isinstance(item, uiheader): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
758 item.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
759 if item.applied: |
24492
efa094701a05
record_curses: fix ui bug for newly added file
Laurent Charignon <lcharignon@fb.com>
parents:
24425
diff
changeset
|
760 # apply all its hunks |
efa094701a05
record_curses: fix ui bug for newly added file
Laurent Charignon <lcharignon@fb.com>
parents:
24425
diff
changeset
|
761 for hnk in item.hunks: |
efa094701a05
record_curses: fix ui bug for newly added file
Laurent Charignon <lcharignon@fb.com>
parents:
24425
diff
changeset
|
762 hnk.applied = True |
efa094701a05
record_curses: fix ui bug for newly added file
Laurent Charignon <lcharignon@fb.com>
parents:
24425
diff
changeset
|
763 # apply all their hunklines |
efa094701a05
record_curses: fix ui bug for newly added file
Laurent Charignon <lcharignon@fb.com>
parents:
24425
diff
changeset
|
764 for hunkline in hnk.changedlines: |
efa094701a05
record_curses: fix ui bug for newly added file
Laurent Charignon <lcharignon@fb.com>
parents:
24425
diff
changeset
|
765 hunkline.applied = True |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
766 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
767 # un-apply all its hunks |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
768 for hnk in item.hunks: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
769 hnk.applied = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
770 hnk.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
771 # un-apply all their hunklines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
772 for hunkline in hnk.changedlines: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
773 hunkline.applied = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
774 elif isinstance(item, uihunk): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
775 item.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
776 # apply all it's hunklines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
777 for hunkline in item.changedlines: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
778 hunkline.applied = item.applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
779 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
780 siblingappliedstatus = [hnk.applied for hnk in item.header.hunks] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
781 allsiblingsapplied = not (False in siblingappliedstatus) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
782 nosiblingsapplied = not (True in siblingappliedstatus) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
783 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
784 siblingspartialstatus = [hnk.partial for hnk in item.header.hunks] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
785 somesiblingspartial = (True in siblingspartialstatus) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
786 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
787 #cases where applied or partial should be removed from header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
788 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
789 # if no 'sibling' hunks are applied (including this hunk) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
790 if nosiblingsapplied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
791 if not item.header.special(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
792 item.header.applied = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
793 item.header.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
794 else: # some/all parent siblings are applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
795 item.header.applied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
796 item.header.partial = (somesiblingspartial or |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
797 not allsiblingsapplied) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
798 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
799 elif isinstance(item, uihunkline): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
800 siblingappliedstatus = [ln.applied for ln in item.hunk.changedlines] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
801 allsiblingsapplied = not (False in siblingappliedstatus) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
802 nosiblingsapplied = not (True in siblingappliedstatus) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
803 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
804 # if no 'sibling' lines are applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
805 if nosiblingsapplied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
806 item.hunk.applied = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
807 item.hunk.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
808 elif allsiblingsapplied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
809 item.hunk.applied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
810 item.hunk.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
811 else: # some siblings applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
812 item.hunk.applied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
813 item.hunk.partial = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
814 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
815 parentsiblingsapplied = [hnk.applied for hnk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
816 in item.hunk.header.hunks] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
817 noparentsiblingsapplied = not (True in parentsiblingsapplied) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
818 allparentsiblingsapplied = not (False in parentsiblingsapplied) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
819 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
820 parentsiblingspartial = [hnk.partial for hnk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
821 in item.hunk.header.hunks] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
822 someparentsiblingspartial = (True in parentsiblingspartial) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
823 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
824 # if all parent hunks are not applied, un-apply header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
825 if noparentsiblingsapplied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
826 if not item.hunk.header.special(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
827 item.hunk.header.applied = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
828 item.hunk.header.partial = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
829 # set the applied and partial status of the header if needed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
830 else: # some/all parent siblings are applied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
831 item.hunk.header.applied = True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
832 item.hunk.header.partial = (someparentsiblingspartial or |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
833 not allparentsiblingsapplied) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
834 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
835 def toggleall(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
836 "toggle the applied flag of all items." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
837 if self.waslasttoggleallapplied: # then unapply them this time |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
838 for item in self.headerlist: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
839 if item.applied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
840 self.toggleapply(item) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
841 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
842 for item in self.headerlist: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
843 if not item.applied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
844 self.toggleapply(item) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
845 self.waslasttoggleallapplied = not self.waslasttoggleallapplied |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
846 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
847 def togglefolded(self, item=None, foldparent=False): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
848 "toggle folded flag of specified item (defaults to currently selected)" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
849 if item is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
850 item = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
851 if foldparent or (isinstance(item, uiheader) and item.neverunfolded): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
852 if not isinstance(item, uiheader): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
853 # we need to select the parent item in this case |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
854 self.currentselecteditem = item = item.parentitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
855 elif item.neverunfolded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
856 item.neverunfolded = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
857 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
858 # also fold any foldable children of the parent/current item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
859 if isinstance(item, uiheader): # the original or 'new' item |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
860 for child in item.allchildren(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
861 child.folded = not item.folded |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
862 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
863 if isinstance(item, (uiheader, uihunk)): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
864 item.folded = not item.folded |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
865 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
866 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
867 def alignstring(self, instr, window): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
868 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
869 add whitespace to the end of a string in order to make it fill |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
870 the screen in the x direction. the current cursor position is |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
871 taken into account when making this calculation. the string can span |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
872 multiple lines. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
873 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
874 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
875 y, xstart = window.getyx() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
876 width = self.xscreensize |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
877 # turn tabs into spaces |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
878 instr = instr.expandtabs(4) |
24351
cdc4f3af2497
crecord: use colwidth instead of ucolwidth
Matt Mackall <mpm@selenic.com>
parents:
24342
diff
changeset
|
879 strwidth = encoding.colwidth(instr) |
24315
7d5f935bd705
crecord: use encoding.ucolwidth
Matt Mackall <mpm@selenic.com>
parents:
24314
diff
changeset
|
880 numspaces = (width - ((strwidth + xstart) % width) - 1) |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
881 return instr + " " * numspaces + "\n" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
882 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
883 def printstring(self, window, text, fgcolor=None, bgcolor=None, pair=None, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
884 pairname=None, attrlist=None, towin=True, align=True, showwhtspc=False): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
885 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
886 print the string, text, with the specified colors and attributes, to |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
887 the specified curses window object. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
888 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
889 the foreground and background colors are of the form |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
890 curses.color_xxxx, where xxxx is one of: [black, blue, cyan, green, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
891 magenta, red, white, yellow]. if pairname is provided, a color |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
892 pair will be looked up in the self.colorpairnames dictionary. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
893 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
894 attrlist is a list containing text attributes in the form of |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
895 curses.a_xxxx, where xxxx can be: [bold, dim, normal, standout, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
896 underline]. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
897 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
898 if align == True, whitespace is added to the printed string such that |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
899 the string stretches to the right border of the window. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
900 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
901 if showwhtspc == True, trailing whitespace of a string is highlighted. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
902 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
903 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
904 # preprocess the text, converting tabs to spaces |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
905 text = text.expandtabs(4) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
906 # strip \n, and convert control characters to ^[char] representation |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
907 text = re.sub(r'[\x00-\x08\x0a-\x1f]', |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
908 lambda m:'^' + chr(ord(m.group()) + 64), text.strip('\n')) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
909 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
910 if pair is not None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
911 colorpair = pair |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
912 elif pairname is not None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
913 colorpair = self.colorpairnames[pairname] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
914 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
915 if fgcolor is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
916 fgcolor = -1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
917 if bgcolor is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
918 bgcolor = -1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
919 if (fgcolor, bgcolor) in self.colorpairs: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
920 colorpair = self.colorpairs[(fgcolor, bgcolor)] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
921 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
922 colorpair = self.getcolorpair(fgcolor, bgcolor) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
923 # add attributes if possible |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
924 if attrlist is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
925 attrlist = [] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
926 if colorpair < 256: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
927 # then it is safe to apply all attributes |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
928 for textattr in attrlist: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
929 colorpair |= textattr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
930 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
931 # just apply a select few (safe?) attributes |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
932 for textattr in (curses.A_UNDERLINE, curses.A_BOLD): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
933 if textattr in attrlist: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
934 colorpair |= textattr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
935 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
936 y, xstart = self.chunkpad.getyx() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
937 t = "" # variable for counting lines printed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
938 # if requested, show trailing whitespace |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
939 if showwhtspc: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
940 origlen = len(text) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
941 text = text.rstrip(' \n') # tabs have already been expanded |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
942 strippedlen = len(text) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
943 numtrailingspaces = origlen - strippedlen |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
944 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
945 if towin: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
946 window.addstr(text, colorpair) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
947 t += text |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
948 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
949 if showwhtspc: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
950 wscolorpair = colorpair | curses.A_REVERSE |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
951 if towin: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
952 for i in range(numtrailingspaces): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
953 window.addch(curses.ACS_CKBOARD, wscolorpair) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
954 t += " " * numtrailingspaces |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
955 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
956 if align: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
957 if towin: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
958 extrawhitespace = self.alignstring("", window) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
959 window.addstr(extrawhitespace, colorpair) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
960 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
961 # need to use t, since the x position hasn't incremented |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
962 extrawhitespace = self.alignstring(t, window) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
963 t += extrawhitespace |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
964 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
965 # is reset to 0 at the beginning of printitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
966 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
967 linesprinted = (xstart + len(t)) / self.xscreensize |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
968 self.linesprintedtopadsofar += linesprinted |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
969 return t |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
970 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
971 def updatescreen(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
972 self.statuswin.erase() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
973 self.chunkpad.erase() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
974 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
975 printstring = self.printstring |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
976 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
977 # print out the status lines at the top |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
978 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
979 printstring(self.statuswin, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
980 "SELECT CHUNKS: (j/k/up/dn/pgup/pgdn) move cursor; " |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
981 "(space/A) toggle hunk/all; (e)dit hunk;", |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
982 pairname="legend") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
983 printstring(self.statuswin, |
24840
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
984 " (f)old/unfold; (c)onfirm applied; (q)uit; (?) help " |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
985 "| [X]=hunk applied **=folded", |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
986 pairname="legend") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
987 except curses.error: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
988 pass |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
989 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
990 # print out the patch in the remaining part of the window |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
991 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
992 self.printitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
993 self.updatescroll() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
994 self.chunkpad.refresh(self.firstlineofpadtoprint, 0, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
995 self.numstatuslines, 0, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
996 self.yscreensize + 1 - self.numstatuslines, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
997 self.xscreensize) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
998 except curses.error: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
999 pass |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1000 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1001 # refresh([pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol]) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1002 self.statuswin.refresh() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1003 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1004 def getstatusprefixstring(self, item): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1005 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1006 create a string to prefix a line with which indicates whether 'item' |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1007 is applied and/or folded. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1008 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1009 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1010 # create checkbox string |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1011 if item.applied: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1012 if not isinstance(item, uihunkline) and item.partial: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1013 checkbox = "[~]" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1014 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1015 checkbox = "[x]" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1016 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1017 checkbox = "[ ]" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1018 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1019 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1020 if item.folded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1021 checkbox += "**" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1022 if isinstance(item, uiheader): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1023 # one of "m", "a", or "d" (modified, added, deleted) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1024 filestatus = item.changetype |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1025 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1026 checkbox += filestatus + " " |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1027 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1028 checkbox += " " |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1029 if isinstance(item, uiheader): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1030 # add two more spaces for headers |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1031 checkbox += " " |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1032 except AttributeError: # not foldable |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1033 checkbox += " " |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1034 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1035 return checkbox |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1036 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1037 def printheader(self, header, selected=False, towin=True, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1038 ignorefolding=False): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1039 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1040 print the header to the pad. if countlines is True, don't print |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1041 anything, but just count the number of lines which would be printed. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1042 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1043 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1044 outstr = "" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1045 text = header.prettystr() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1046 chunkindex = self.chunklist.index(header) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1047 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1048 if chunkindex != 0 and not header.folded: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1049 # add separating line before headers |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1050 outstr += self.printstring(self.chunkpad, '_' * self.xscreensize, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1051 towin=towin, align=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1052 # select color-pair based on if the header is selected |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1053 colorpair = self.getcolorpair(name=selected and "selected" or "normal", |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1054 attrlist=[curses.A_BOLD]) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1055 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1056 # print out each line of the chunk, expanding it to screen width |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1057 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1058 # number of characters to indent lines on this level by |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1059 indentnumchars = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1060 checkbox = self.getstatusprefixstring(header) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1061 if not header.folded or ignorefolding: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1062 textlist = text.split("\n") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1063 linestr = checkbox + textlist[0] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1064 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1065 linestr = checkbox + header.filename() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1066 outstr += self.printstring(self.chunkpad, linestr, pair=colorpair, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1067 towin=towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1068 if not header.folded or ignorefolding: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1069 if len(textlist) > 1: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1070 for line in textlist[1:]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1071 linestr = " "*(indentnumchars + len(checkbox)) + line |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1072 outstr += self.printstring(self.chunkpad, linestr, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1073 pair=colorpair, towin=towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1074 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1075 return outstr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1076 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1077 def printhunklinesbefore(self, hunk, selected=False, towin=True, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1078 ignorefolding=False): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1079 "includes start/end line indicator" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1080 outstr = "" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1081 # where hunk is in list of siblings |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1082 hunkindex = hunk.header.hunks.index(hunk) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1083 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1084 if hunkindex != 0: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1085 # add separating line before headers |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1086 outstr += self.printstring(self.chunkpad, ' '*self.xscreensize, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1087 towin=towin, align=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1088 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1089 colorpair = self.getcolorpair(name=selected and "selected" or "normal", |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1090 attrlist=[curses.A_BOLD]) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1091 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1092 # print out from-to line with checkbox |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1093 checkbox = self.getstatusprefixstring(hunk) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1094 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1095 lineprefix = " "*self.hunkindentnumchars + checkbox |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1096 frtoline = " " + hunk.getfromtoline().strip("\n") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1097 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1098 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1099 outstr += self.printstring(self.chunkpad, lineprefix, towin=towin, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1100 align=False) # add uncolored checkbox/indent |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1101 outstr += self.printstring(self.chunkpad, frtoline, pair=colorpair, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1102 towin=towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1103 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1104 if hunk.folded and not ignorefolding: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1105 # skip remainder of output |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1106 return outstr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1107 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1108 # print out lines of the chunk preceeding changed-lines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1109 for line in hunk.before: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1110 linestr = " "*(self.hunklineindentnumchars + len(checkbox)) + line |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1111 outstr += self.printstring(self.chunkpad, linestr, towin=towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1112 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1113 return outstr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1114 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1115 def printhunklinesafter(self, hunk, towin=True, ignorefolding=False): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1116 outstr = "" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1117 if hunk.folded and not ignorefolding: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1118 return outstr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1119 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1120 # a bit superfluous, but to avoid hard-coding indent amount |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1121 checkbox = self.getstatusprefixstring(hunk) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1122 for line in hunk.after: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1123 linestr = " "*(self.hunklineindentnumchars + len(checkbox)) + line |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1124 outstr += self.printstring(self.chunkpad, linestr, towin=towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1125 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1126 return outstr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1127 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1128 def printhunkchangedline(self, hunkline, selected=False, towin=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1129 outstr = "" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1130 checkbox = self.getstatusprefixstring(hunkline) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1131 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1132 linestr = hunkline.prettystr().strip("\n") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1133 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1134 # select color-pair based on whether line is an addition/removal |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1135 if selected: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1136 colorpair = self.getcolorpair(name="selected") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1137 elif linestr.startswith("+"): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1138 colorpair = self.getcolorpair(name="addition") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1139 elif linestr.startswith("-"): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1140 colorpair = self.getcolorpair(name="deletion") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1141 elif linestr.startswith("\\"): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1142 colorpair = self.getcolorpair(name="normal") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1143 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1144 lineprefix = " "*self.hunklineindentnumchars + checkbox |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1145 outstr += self.printstring(self.chunkpad, lineprefix, towin=towin, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1146 align=False) # add uncolored checkbox/indent |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1147 outstr += self.printstring(self.chunkpad, linestr, pair=colorpair, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1148 towin=towin, showwhtspc=True) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1149 return outstr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1150 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1151 def printitem(self, item=None, ignorefolding=False, recursechildren=True, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1152 towin=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1153 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1154 use __printitem() to print the the specified item.applied. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1155 if item is not specified, then print the entire patch. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1156 (hiding folded elements, etc. -- see __printitem() docstring) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1157 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1158 if item is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1159 item = self.headerlist |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1160 if recursechildren: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1161 self.linesprintedtopadsofar = 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1162 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1163 outstr = [] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1164 self.__printitem(item, ignorefolding, recursechildren, outstr, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1165 towin=towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1166 return ''.join(outstr) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1167 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1168 def outofdisplayedarea(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1169 y, _ = self.chunkpad.getyx() # cursor location |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1170 # * 2 here works but an optimization would be the max number of |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1171 # consecutive non selectable lines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1172 # i.e the max number of context line for any hunk in the patch |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1173 miny = min(0, self.firstlineofpadtoprint - self.yscreensize) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1174 maxy = self.firstlineofpadtoprint + self.yscreensize * 2 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1175 return y < miny or y > maxy |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1176 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1177 def handleselection(self, item, recursechildren): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1178 selected = (item is self.currentselecteditem) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1179 if selected and recursechildren: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1180 # assumes line numbering starting from line 0 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1181 self.selecteditemstartline = self.linesprintedtopadsofar |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1182 selecteditemlines = self.getnumlinesdisplayed(item, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1183 recursechildren=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1184 self.selecteditemendline = (self.selecteditemstartline + |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1185 selecteditemlines - 1) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1186 return selected |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1187 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1188 def __printitem(self, item, ignorefolding, recursechildren, outstr, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1189 towin=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1190 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1191 recursive method for printing out patch/header/hunk/hunk-line data to |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1192 screen. also returns a string with all of the content of the displayed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1193 patch (not including coloring, etc.). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1194 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1195 if ignorefolding is True, then folded items are printed out. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1196 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1197 if recursechildren is False, then only print the item without its |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1198 child items. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1199 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1200 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1201 if towin and self.outofdisplayedarea(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1202 return |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1203 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1204 selected = self.handleselection(item, recursechildren) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1205 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1206 # patch object is a list of headers |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1207 if isinstance(item, patch): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1208 if recursechildren: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1209 for hdr in item: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1210 self.__printitem(hdr, ignorefolding, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1211 recursechildren, outstr, towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1212 # todo: eliminate all isinstance() calls |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1213 if isinstance(item, uiheader): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1214 outstr.append(self.printheader(item, selected, towin=towin, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1215 ignorefolding=ignorefolding)) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1216 if recursechildren: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1217 for hnk in item.hunks: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1218 self.__printitem(hnk, ignorefolding, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1219 recursechildren, outstr, towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1220 elif (isinstance(item, uihunk) and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1221 ((not item.header.folded) or ignorefolding)): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1222 # print the hunk data which comes before the changed-lines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1223 outstr.append(self.printhunklinesbefore(item, selected, towin=towin, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1224 ignorefolding=ignorefolding)) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1225 if recursechildren: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1226 for l in item.changedlines: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1227 self.__printitem(l, ignorefolding, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1228 recursechildren, outstr, towin) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1229 outstr.append(self.printhunklinesafter(item, towin=towin, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1230 ignorefolding=ignorefolding)) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1231 elif (isinstance(item, uihunkline) and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1232 ((not item.hunk.folded) or ignorefolding)): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1233 outstr.append(self.printhunkchangedline(item, selected, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1234 towin=towin)) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1235 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1236 return outstr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1237 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1238 def getnumlinesdisplayed(self, item=None, ignorefolding=False, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1239 recursechildren=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1240 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1241 return the number of lines which would be displayed if the item were |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1242 to be printed to the display. the item will not be printed to the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1243 display (pad). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1244 if no item is given, assume the entire patch. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1245 if ignorefolding is True, folded items will be unfolded when counting |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1246 the number of lines. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1247 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1248 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1249 # temporarily disable printing to windows by printstring |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1250 patchdisplaystring = self.printitem(item, ignorefolding, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1251 recursechildren, towin=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1252 numlines = len(patchdisplaystring) / self.xscreensize |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1253 return numlines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1254 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1255 def sigwinchhandler(self, n, frame): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1256 "handle window resizing" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1257 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1258 curses.endwin() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1259 self.yscreensize, self.xscreensize = gethw() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1260 self.statuswin.resize(self.numstatuslines, self.xscreensize) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1261 self.numpadlines = self.getnumlinesdisplayed(ignorefolding=True) + 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1262 self.chunkpad = curses.newpad(self.numpadlines, self.xscreensize) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1263 # todo: try to resize commit message window if possible |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1264 except curses.error: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1265 pass |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1266 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1267 def getcolorpair(self, fgcolor=None, bgcolor=None, name=None, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1268 attrlist=None): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1269 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1270 get a curses color pair, adding it to self.colorpairs if it is not |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1271 already defined. an optional string, name, can be passed as a shortcut |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1272 for referring to the color-pair. by default, if no arguments are |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1273 specified, the white foreground / black background color-pair is |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1274 returned. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1275 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1276 it is expected that this function will be used exclusively for |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1277 initializing color pairs, and not curses.init_pair(). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1278 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1279 attrlist is used to 'flavor' the returned color-pair. this information |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1280 is not stored in self.colorpairs. it contains attribute values like |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1281 curses.A_BOLD. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1282 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1283 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1284 if (name is not None) and name in self.colorpairnames: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1285 # then get the associated color pair and return it |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1286 colorpair = self.colorpairnames[name] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1287 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1288 if fgcolor is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1289 fgcolor = -1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1290 if bgcolor is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1291 bgcolor = -1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1292 if (fgcolor, bgcolor) in self.colorpairs: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1293 colorpair = self.colorpairs[(fgcolor, bgcolor)] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1294 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1295 pairindex = len(self.colorpairs) + 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1296 curses.init_pair(pairindex, fgcolor, bgcolor) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1297 colorpair = self.colorpairs[(fgcolor, bgcolor)] = ( |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1298 curses.color_pair(pairindex)) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1299 if name is not None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1300 self.colorpairnames[name] = curses.color_pair(pairindex) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1301 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1302 # add attributes if possible |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1303 if attrlist is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1304 attrlist = [] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1305 if colorpair < 256: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1306 # then it is safe to apply all attributes |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1307 for textattr in attrlist: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1308 colorpair |= textattr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1309 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1310 # just apply a select few (safe?) attributes |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1311 for textattrib in (curses.A_UNDERLINE, curses.A_BOLD): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1312 if textattrib in attrlist: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1313 colorpair |= textattrib |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1314 return colorpair |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1315 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1316 def initcolorpair(self, *args, **kwargs): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1317 "same as getcolorpair." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1318 self.getcolorpair(*args, **kwargs) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1319 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1320 def helpwindow(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1321 "print a help window to the screen. exit after any keypress." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1322 helptext = """ [press any key to return to the patch-display] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1323 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1324 crecord allows you to interactively choose among the changes you have made, |
24840
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1325 and confirm only those changes you select for further processing by the command |
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1326 you are running (commit/shelve/revert), after confirming the selected |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1327 changes, the unselected changes are still present in your working copy, so you |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1328 can use crecord multiple times to split large changes into smaller changesets. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1329 the following are valid keystrokes: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1330 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1331 [space] : (un-)select item ([~]/[x] = partly/fully applied) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1332 a : (un-)select all items |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1333 up/down-arrow [k/j] : go to previous/next unfolded item |
25460
bd4bcfa48c9e
crecord: fix three typos introduced while moving crecord into core
Laurent Charignon <lcharignon@fb.com>
parents:
25447
diff
changeset
|
1334 pgup/pgdn [K/J] : go to previous/next item of same type |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1335 right/left-arrow [l/h] : go to child item / parent item |
25460
bd4bcfa48c9e
crecord: fix three typos introduced while moving crecord into core
Laurent Charignon <lcharignon@fb.com>
parents:
25447
diff
changeset
|
1336 shift-left-arrow [H] : go to parent header / fold selected header |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1337 f : fold / unfold item, hiding/revealing its children |
25447
093d38165e5a
crecord: fix a typo introduced when moving crecord to core
Laurent Charignon <lcharignon@fb.com>
parents:
24840
diff
changeset
|
1338 F : fold / unfold parent item and all of its ancestors |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1339 m : edit / resume editing the commit message |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1340 e : edit the currently selected hunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1341 a : toggle amend mode (hg rev >= 2.2) |
24840
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1342 c : confirm selected changes |
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1343 r : review/edit and confirm selected changes |
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1344 q : quit without confirming (no changes will be made) |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1345 ? : help (what you're currently reading)""" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1346 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1347 helpwin = curses.newwin(self.yscreensize, 0, 0, 0) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1348 helplines = helptext.split("\n") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1349 helplines = helplines + [" "]*( |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1350 self.yscreensize - self.numstatuslines - len(helplines) - 1) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1351 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1352 for line in helplines: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1353 self.printstring(helpwin, line, pairname="legend") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1354 except curses.error: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1355 pass |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1356 helpwin.refresh() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1357 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1358 helpwin.getkey() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1359 except curses.error: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1360 pass |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1361 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1362 def confirmationwindow(self, windowtext): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1363 "display an informational window, then wait for and return a keypress." |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1364 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1365 confirmwin = curses.newwin(self.yscreensize, 0, 0, 0) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1366 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1367 lines = windowtext.split("\n") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1368 for line in lines: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1369 self.printstring(confirmwin, line, pairname="selected") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1370 except curses.error: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1371 pass |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1372 self.stdscr.refresh() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1373 confirmwin.refresh() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1374 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1375 response = chr(self.stdscr.getch()) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1376 except ValueError: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1377 response = None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1378 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1379 return response |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1380 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1381 def confirmcommit(self, review=False): |
24840
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1382 """ask for 'y' to be pressed to confirm selected. return True if |
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1383 confirmed.""" |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1384 if review: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1385 confirmtext = ( |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1386 """if you answer yes to the following, the your currently chosen patch chunks |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1387 will be loaded into an editor. you may modify the patch from the editor, and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1388 save the changes if you wish to change the patch. otherwise, you can just |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1389 close the editor without saving to accept the current patch as-is. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1390 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1391 note: don't add/remove lines unless you also modify the range information. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1392 failing to follow this rule will result in the commit aborting. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1393 |
24840
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1394 are you sure you want to review/edit and confirm the selected changes [yn]? |
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1395 """) |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1396 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1397 confirmtext = ( |
24840
a5e3634ba024
record: change wording for record curses interface
Laurent Charignon <lcharignon@fb.com>
parents:
24779
diff
changeset
|
1398 "are you sure you want to confirm the selected changes [yn]? ") |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1399 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1400 response = self.confirmationwindow(confirmtext) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1401 if response is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1402 response = "n" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1403 if response.lower().startswith("y"): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1404 return True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1405 else: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1406 return False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1407 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1408 def recenterdisplayedarea(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1409 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1410 once we scrolled with pg up pg down we can be pointing outside of the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1411 display zone. we print the patch with towin=False to compute the |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1412 location of the selected item eventhough it is outside of the displayed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1413 zone and then update the scroll. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1414 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1415 self.printitem(towin=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1416 self.updatescroll() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1417 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1418 def toggleedit(self, item=None, test=False): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1419 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1420 edit the currently chelected chunk |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1421 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1422 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1423 def editpatchwitheditor(self, chunk): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1424 if chunk is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1425 self.ui.write(_('cannot edit patch for whole file')) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1426 self.ui.write("\n") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1427 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1428 if chunk.header.binary(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1429 self.ui.write(_('cannot edit patch for binary file')) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1430 self.ui.write("\n") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1431 return None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1432 # patch comment based on the git one (based on comment at end of |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1433 # http://mercurial.selenic.com/wiki/recordextension) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1434 phelp = '---' + _(""" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1435 to remove '-' lines, make them ' ' lines (context). |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1436 to remove '+' lines, delete them. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1437 lines starting with # will be removed from the patch. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1438 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1439 if the patch applies cleanly, the edited hunk will immediately be |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1440 added to the record list. if it does not apply cleanly, a rejects |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1441 file will be generated: you can use that when you try again. if |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1442 all lines of the hunk are removed, then the edit is aborted and |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1443 the hunk is left unchanged. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1444 """) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1445 (patchfd, patchfn) = tempfile.mkstemp(prefix="hg-editor-", |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1446 suffix=".diff", text=True) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1447 ncpatchfp = None |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1448 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1449 # write the initial patch |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1450 f = os.fdopen(patchfd, "w") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1451 chunk.header.write(f) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1452 chunk.write(f) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1453 f.write('\n'.join(['# ' + i for i in phelp.splitlines()])) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1454 f.close() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1455 # start the editor and wait for it to complete |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1456 editor = self.ui.geteditor() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1457 self.ui.system("%s \"%s\"" % (editor, patchfn), |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1458 environ={'hguser': self.ui.username()}, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1459 onerr=util.Abort, errprefix=_("edit failed")) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1460 # remove comment lines |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1461 patchfp = open(patchfn) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1462 ncpatchfp = cStringIO.StringIO() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1463 for line in patchfp: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1464 if not line.startswith('#'): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1465 ncpatchfp.write(line) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1466 patchfp.close() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1467 ncpatchfp.seek(0) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1468 newpatches = patchmod.parsepatch(ncpatchfp) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1469 finally: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1470 os.unlink(patchfn) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1471 del ncpatchfp |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1472 return newpatches |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1473 if item is None: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1474 item = self.currentselecteditem |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1475 if isinstance(item, uiheader): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1476 return |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1477 if isinstance(item, uihunkline): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1478 item = item.parentitem() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1479 if not isinstance(item, uihunk): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1480 return |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1481 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1482 beforeadded, beforeremoved = item.added, item.removed |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1483 newpatches = editpatchwitheditor(self, item) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1484 header = item.header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1485 editedhunkindex = header.hunks.index(item) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1486 hunksbefore = header.hunks[:editedhunkindex] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1487 hunksafter = header.hunks[editedhunkindex + 1:] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1488 newpatchheader = newpatches[0] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1489 newhunks = [uihunk(h, header) for h in newpatchheader.hunks] |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1490 newadded = sum([h.added for h in newhunks]) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1491 newremoved = sum([h.removed for h in newhunks]) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1492 offset = (newadded - beforeadded) - (newremoved - beforeremoved) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1493 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1494 for h in hunksafter: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1495 h.toline += offset |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1496 for h in newhunks: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1497 h.folded = False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1498 header.hunks = hunksbefore + newhunks + hunksafter |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1499 if self.emptypatch(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1500 header.hunks = hunksbefore + [item] + hunksafter |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1501 self.currentselecteditem = header |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1502 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1503 if not test: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1504 self.numpadlines = self.getnumlinesdisplayed(ignorefolding=True) + 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1505 self.chunkpad = curses.newpad(self.numpadlines, self.xscreensize) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1506 self.updatescroll() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1507 self.stdscr.refresh() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1508 self.statuswin.refresh() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1509 self.stdscr.keypad(1) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1510 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1511 def emptypatch(self): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1512 item = self.headerlist |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1513 if not item: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1514 return True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1515 for header in item: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1516 if header.hunks: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1517 return False |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1518 return True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1519 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1520 def handlekeypressed(self, keypressed, test=False): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1521 if keypressed in ["k", "KEY_UP"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1522 self.uparrowevent() |
25460
bd4bcfa48c9e
crecord: fix three typos introduced while moving crecord into core
Laurent Charignon <lcharignon@fb.com>
parents:
25447
diff
changeset
|
1523 if keypressed in ["K", "KEY_PPAGE"]: |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1524 self.uparrowshiftevent() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1525 elif keypressed in ["j", "KEY_DOWN"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1526 self.downarrowevent() |
25460
bd4bcfa48c9e
crecord: fix three typos introduced while moving crecord into core
Laurent Charignon <lcharignon@fb.com>
parents:
25447
diff
changeset
|
1527 elif keypressed in ["J", "KEY_NPAGE"]: |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1528 self.downarrowshiftevent() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1529 elif keypressed in ["l", "KEY_RIGHT"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1530 self.rightarrowevent() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1531 elif keypressed in ["h", "KEY_LEFT"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1532 self.leftarrowevent() |
25460
bd4bcfa48c9e
crecord: fix three typos introduced while moving crecord into core
Laurent Charignon <lcharignon@fb.com>
parents:
25447
diff
changeset
|
1533 elif keypressed in ["H", "KEY_SLEFT"]: |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1534 self.leftarrowshiftevent() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1535 elif keypressed in ["q"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1536 raise util.Abort(_('user quit')) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1537 elif keypressed in ["c"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1538 if self.confirmcommit(): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1539 return True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1540 elif keypressed in ["r"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1541 if self.confirmcommit(review=True): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1542 return True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1543 elif test and keypressed in ['X']: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1544 return True |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1545 elif keypressed in [' '] or (test and keypressed in ["TOGGLE"]): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1546 self.toggleapply() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1547 elif keypressed in ['A']: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1548 self.toggleall() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1549 elif keypressed in ['e']: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1550 self.toggleedit(test=test) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1551 elif keypressed in ["f"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1552 self.togglefolded() |
25447
093d38165e5a
crecord: fix a typo introduced when moving crecord to core
Laurent Charignon <lcharignon@fb.com>
parents:
24840
diff
changeset
|
1553 elif keypressed in ["F"]: |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1554 self.togglefolded(foldparent=True) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1555 elif keypressed in ["?"]: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1556 self.helpwindow() |
25419
6e62a5b3442d
crecord: fix blue artifact bug coming back from help screen
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1557 self.stdscr.clear() |
6e62a5b3442d
crecord: fix blue artifact bug coming back from help screen
Laurent Charignon <lcharignon@fb.com>
parents:
25359
diff
changeset
|
1558 self.stdscr.refresh() |
24310
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1559 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1560 def main(self, stdscr): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1561 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1562 method to be wrapped by curses.wrapper() for selecting chunks. |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1563 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1564 """ |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1565 signal.signal(signal.SIGWINCH, self.sigwinchhandler) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1566 self.stdscr = stdscr |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1567 self.yscreensize, self.xscreensize = self.stdscr.getmaxyx() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1568 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1569 curses.start_color() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1570 curses.use_default_colors() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1571 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1572 # available colors: black, blue, cyan, green, magenta, white, yellow |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1573 # init_pair(color_id, foreground_color, background_color) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1574 self.initcolorpair(None, None, name="normal") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1575 self.initcolorpair(curses.COLOR_WHITE, curses.COLOR_MAGENTA, |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1576 name="selected") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1577 self.initcolorpair(curses.COLOR_RED, None, name="deletion") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1578 self.initcolorpair(curses.COLOR_GREEN, None, name="addition") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1579 self.initcolorpair(curses.COLOR_WHITE, curses.COLOR_BLUE, name="legend") |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1580 # newwin([height, width,] begin_y, begin_x) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1581 self.statuswin = curses.newwin(self.numstatuslines, 0, 0, 0) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1582 self.statuswin.keypad(1) # interpret arrow-key, etc. esc sequences |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1583 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1584 # figure out how much space to allocate for the chunk-pad which is |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1585 # used for displaying the patch |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1586 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1587 # stupid hack to prevent getnumlinesdisplayed from failing |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1588 self.chunkpad = curses.newpad(1, self.xscreensize) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1589 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1590 # add 1 so to account for last line text reaching end of line |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1591 self.numpadlines = self.getnumlinesdisplayed(ignorefolding=True) + 1 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1592 self.chunkpad = curses.newpad(self.numpadlines, self.xscreensize) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1593 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1594 # initialize selecteitemendline (initial start-line is 0) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1595 self.selecteditemendline = self.getnumlinesdisplayed( |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1596 self.currentselecteditem, recursechildren=False) |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1597 |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1598 while True: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1599 self.updatescreen() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1600 try: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1601 keypressed = self.statuswin.getkey() |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1602 except curses.error: |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1603 keypressed = "foobar" |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1604 if self.handlekeypressed(keypressed): |
6409fb6c934d
record: add crecord's ui logic to core
Laurent Charignon <lcharignon@fb.com>
parents:
diff
changeset
|
1605 break |