Show More
@@ -3950,13 +3950,16 b' def remove(ui, repo, *pats, **opts):' | |||
|
3950 | 3950 | file states (columns) and option combinations (rows). The file |
|
3951 | 3951 | states are Added [A], Clean [C], Modified [M] and Missing [!] (as |
|
3952 | 3952 | reported by :hg:`status`). The actions are Warn, Remove (from |
|
3953 |
branch) and Delete (from disk): |
|
|
3954 | ||
|
3955 | A C M ! | |
|
3956 | none W RD W R | |
|
3957 | -f R RD RD R | |
|
3958 |
|
|
|
3959 |
- |
|
|
3953 | branch) and Delete (from disk): | |
|
3954 | ||
|
3955 | ======= == == == == | |
|
3956 | A C M ! | |
|
3957 | ======= == == == == | |
|
3958 | none W RD W R | |
|
3959 | -f R RD RD R | |
|
3960 | -A W W W R | |
|
3961 | -Af R R R R | |
|
3962 | ======= == == == == | |
|
3960 | 3963 | |
|
3961 | 3964 | Note that remove never deletes files in Added [A] state from the |
|
3962 | 3965 | working directory, not even if option --force is specified. |
@@ -103,6 +103,7 b' def findliteralblocks(blocks):' | |||
|
103 | 103 | r'((.*) +)(.*)$') |
|
104 | 104 | _fieldre = re.compile(r':(?![: ])([^:]*)(?<! ):[ ]+(.*)') |
|
105 | 105 | _definitionre = re.compile(r'[^ ]') |
|
106 | _tablere = re.compile(r'(=+\s+)*=+') | |
|
106 | 107 | |
|
107 | 108 | def splitparagraphs(blocks): |
|
108 | 109 | """Split paragraphs into lists.""" |
@@ -251,6 +252,46 b' def prunecontainers(blocks, keep):' | |||
|
251 | 252 | |
|
252 | 253 | _sectionre = re.compile(r"""^([-=`:.'"~^_*+#])\1+$""") |
|
253 | 254 | |
|
255 | def findtables(blocks): | |
|
256 | '''Find simple tables | |
|
257 | ||
|
258 | Only simple one-line table elements are supported | |
|
259 | ''' | |
|
260 | ||
|
261 | for block in blocks: | |
|
262 | # Searching for a block that looks like this: | |
|
263 | # | |
|
264 | # === ==== === | |
|
265 | # A B C | |
|
266 | # === ==== === <- optional | |
|
267 | # 1 2 3 | |
|
268 | # x y z | |
|
269 | # === ==== === | |
|
270 | if (block['type'] == 'paragraph' and | |
|
271 | len(block['lines']) > 4 and | |
|
272 | _tablere.match(block['lines'][0]) and | |
|
273 | block['lines'][0] == block['lines'][-1]): | |
|
274 | block['type'] = 'table' | |
|
275 | block['header'] = False | |
|
276 | div = block['lines'][0] | |
|
277 | columns = [x for x in xrange(len(div)) | |
|
278 | if div[x] == '=' and (x == 0 or div[x - 1] == ' ')] | |
|
279 | rows = [] | |
|
280 | for l in block['lines'][1:-1]: | |
|
281 | if l == div: | |
|
282 | block['header'] = True | |
|
283 | continue | |
|
284 | row = [] | |
|
285 | for n, start in enumerate(columns): | |
|
286 | if n + 1 < len(columns): | |
|
287 | row.append(l[start:columns[n + 1]].strip()) | |
|
288 | else: | |
|
289 | row.append(l[start:].strip()) | |
|
290 | rows.append(row) | |
|
291 | block['table'] = rows | |
|
292 | ||
|
293 | return blocks | |
|
294 | ||
|
254 | 295 | def findsections(blocks): |
|
255 | 296 | """Finds sections. |
|
256 | 297 | |
@@ -392,6 +433,24 b' def formatblock(block, width):' | |||
|
392 | 433 | if block['type'] == 'section': |
|
393 | 434 | underline = encoding.colwidth(block['lines'][0]) * block['underline'] |
|
394 | 435 | return "%s%s\n%s%s" % (indent, block['lines'][0],indent, underline) |
|
436 | if block['type'] == 'table': | |
|
437 | table = block['table'] | |
|
438 | # compute column widths | |
|
439 | widths = [max([encoding.colwidth(e) for e in c]) for c in zip(*table)] | |
|
440 | text = '' | |
|
441 | span = sum(widths) + len(widths) - 1 | |
|
442 | indent = ' ' * block['indent'] | |
|
443 | hang = ' ' * (len(indent) + span - widths[-1]) | |
|
444 | f = ' '.join('%%-%ds' % n for n in widths) | |
|
445 | ||
|
446 | for row in table: | |
|
447 | l = f % tuple(row) | |
|
448 | l = util.wrap(l, width=width, initindent=indent, hangindent=hang) | |
|
449 | if not text and block['header']: | |
|
450 | text = l + '\n' + indent + '-' * (min(width, span)) + '\n' | |
|
451 | else: | |
|
452 | text += l + "\n" | |
|
453 | return text | |
|
395 | 454 | if block['type'] == 'definition': |
|
396 | 455 | term = indent + block['lines'][0] |
|
397 | 456 | hang = len(block['lines'][-1]) - len(block['lines'][-1].lstrip()) |
@@ -440,6 +499,7 b' def parse(text, indent=0, keep=None):' | |||
|
440 | 499 | for b in blocks: |
|
441 | 500 | b['indent'] += indent |
|
442 | 501 | blocks = findliteralblocks(blocks) |
|
502 | blocks = findtables(blocks) | |
|
443 | 503 | blocks, pruned = prunecontainers(blocks, keep or []) |
|
444 | 504 | blocks = findsections(blocks) |
|
445 | 505 | blocks = inlineliterals(blocks) |
@@ -231,3 +231,15 b' Empty comment above' | |||
|
231 | 231 | """ |
|
232 | 232 | |
|
233 | 233 | debugformat('comments', comments, 30) |
|
234 | ||
|
235 | table = """ | |
|
236 | === === === | |
|
237 | a b c | |
|
238 | === === === | |
|
239 | 1 2 3 | |
|
240 | foo bar baz | |
|
241 | aa bb sdfsdfsdf this line is way too long for this cell. | |
|
242 | === === === | |
|
243 | """ | |
|
244 | ||
|
245 | debugformat('table', table, 30) |
@@ -388,3 +388,15 b' Some text.' | |||
|
388 | 388 | Empty comment above |
|
389 | 389 | ---------------------------------------------------------------------- |
|
390 | 390 | |
|
391 | table formatted to fit within 30 characters: | |
|
392 | ---------------------------------------------------------------------- | |
|
393 | a b c | |
|
394 | ------------------------------ | |
|
395 | 1 2 3 | |
|
396 | foo bar baz | |
|
397 | aa bb sdfsdfsdf this line | |
|
398 | is way too long for | |
|
399 | this cell. | |
|
400 | ||
|
401 | ---------------------------------------------------------------------- | |
|
402 |
General Comments 0
You need to be logged in to leave comments.
Login now