skilleter-thingy 0.0.50__tar.gz → 0.0.52__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of skilleter-thingy might be problematic. Click here for more details.

Files changed (74) hide show
  1. {skilleter_thingy-0.0.50/skilleter_thingy.egg-info → skilleter_thingy-0.0.52}/PKG-INFO +1 -1
  2. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/pyproject.toml +1 -1
  3. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_mr.py +3 -2
  4. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/files.py +16 -3
  5. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/git.py +36 -15
  6. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/git2.py +1 -1
  7. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/run.py +1 -1
  8. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/tfm_pane.py +3 -5
  9. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52/skilleter_thingy.egg-info}/PKG-INFO +1 -1
  10. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/LICENSE +0 -0
  11. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/README.md +0 -0
  12. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/setup.cfg +0 -0
  13. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/__init__.py +0 -0
  14. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/addpath.py +0 -0
  15. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/borger.py +0 -0
  16. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/box.py +0 -0
  17. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/console_colours.py +0 -0
  18. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/diskspacecheck.py +0 -0
  19. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/docker_purge.py +0 -0
  20. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/ffind.py +0 -0
  21. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/ggit.py +0 -0
  22. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/ggrep.py +0 -0
  23. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_br.py +0 -0
  24. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_ca.py +0 -0
  25. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_cleanup.py +0 -0
  26. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_co.py +0 -0
  27. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_common.py +0 -0
  28. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_hold.py +0 -0
  29. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_parent.py +0 -0
  30. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_review.py +0 -0
  31. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_update.py +0 -0
  32. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/git_wt.py +0 -0
  33. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/gitcmp_helper.py +0 -0
  34. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/gitprompt.py +0 -0
  35. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/gl.py +0 -0
  36. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/gphotosync.py +0 -0
  37. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/linecount.py +0 -0
  38. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/moviemover.py +0 -0
  39. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/photodupe.py +0 -0
  40. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/phototidier.py +0 -0
  41. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/py_audit.py +0 -0
  42. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/readable.py +0 -0
  43. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/remdir.py +0 -0
  44. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/rmdupe.py +0 -0
  45. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/rpylint.py +0 -0
  46. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/splitpics.py +0 -0
  47. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/strreplace.py +0 -0
  48. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/sysmon.py +0 -0
  49. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/tfm.py +0 -0
  50. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/tfparse.py +0 -0
  51. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/__init__.py +0 -0
  52. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/colour.py +0 -0
  53. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/dc_curses.py +0 -0
  54. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/dc_defaults.py +0 -0
  55. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/dc_util.py +0 -0
  56. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/dircolors.py +0 -0
  57. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/docker.py +0 -0
  58. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/gitlab.py +0 -0
  59. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/logger.py +0 -0
  60. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/path.py +0 -0
  61. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/popup.py +0 -0
  62. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/process.py +0 -0
  63. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/tidy.py +0 -0
  64. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/thingy/venv_template.py +0 -0
  65. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/trimpath.py +0 -0
  66. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/venv_create.py +0 -0
  67. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/window_rename.py +0 -0
  68. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/xchmod.py +0 -0
  69. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy/yamlcheck.py +0 -0
  70. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy.egg-info/SOURCES.txt +0 -0
  71. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy.egg-info/dependency_links.txt +0 -0
  72. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy.egg-info/entry_points.txt +0 -0
  73. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy.egg-info/requires.txt +0 -0
  74. {skilleter_thingy-0.0.50 → skilleter_thingy-0.0.52}/skilleter_thingy.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skilleter_thingy
3
- Version: 0.0.50
3
+ Version: 0.0.52
4
4
  Summary: A collection of useful utilities, mainly aimed at making Git more friendly
5
5
  Author-email: John Skilleter <john@skilleter.org.uk>
6
6
  Project-URL: Home, https://skilleter.org.uk
@@ -7,7 +7,7 @@ name = "skilleter_thingy"
7
7
 
8
8
  # Version must be incremented to install updated Thingy
9
9
 
10
- version = "0.0.50"
10
+ version = "0.0.52"
11
11
 
12
12
  authors = [
13
13
  {name="John Skilleter", email="john@skilleter.org.uk"},
@@ -49,12 +49,13 @@ def main():
49
49
  else:
50
50
  parents, _ = git.parents()
51
51
 
52
+ if not parents:
53
+ colour.error('Unable to determine parent branch. Use the [BLUE]--parent[NORMAL] option to specify the appropriate one.')
54
+
52
55
  if len(parents) > 1:
53
56
  parent_list = ', '.join(parents)
54
57
  colour.error(
55
58
  f'Branch has multiple potential parents: [BLUE]{parent_list}[NORMAL]. Use the [BLUE]--parent[NORMAL] option to specify the appropriate one.')
56
- elif not parents:
57
- colour.error('Unable to determine parent branch. Use the [BLUE]--parent[NORMAL] option to specify the appropriate one.')
58
59
 
59
60
  options = ['merge_request.create', f'merge_request.target={parents[0]}']
60
61
 
@@ -73,6 +73,8 @@ def format_size(size, always_suffix=False):
73
73
  # to 1 (set to 0 when we don't have a divisor).
74
74
 
75
75
  div *= 1024
76
+ else:
77
+ units = ' PiB'
76
78
 
77
79
  # Calculate the size in 10ths so the we get the first digit after
78
80
  # the decimal point, doing all the work in the integer domain to
@@ -89,9 +91,13 @@ def format_size(size, always_suffix=False):
89
91
 
90
92
  ################################################################################
91
93
 
92
- def backup(filename, extension='bak', copyfile=True):
94
+ def backup(filename, extension='bak', copyfile=True, timestamps=True):
93
95
  """ Create a backup of a file by copying or renaming it into a file with extension
94
- .bak, deleting any existing file with that name """
96
+ .bak, deleting any existing file with that name.
97
+
98
+ Copies the file by default, unless copyfile is False
99
+ Sets the timetamps of the backup file to be the same as the original, unless
100
+ timestamps is False."""
95
101
 
96
102
  # Do nothing if the file does not exist
97
103
 
@@ -117,13 +123,20 @@ def backup(filename, extension='bak', copyfile=True):
117
123
  if os.path.isfile(backupname):
118
124
  os.unlink(backupname)
119
125
 
120
- # Create the backup by copying or renaming the file
126
+ # Create the backup by copying or renaming the file, optionally preserving the
127
+ # timestamp of the original file
128
+
129
+ if timestamps:
130
+ file_info = os.stat(filename)
121
131
 
122
132
  if copyfile:
123
133
  shutil.copyfile(filename, backupname)
124
134
  else:
125
135
  os.rename(filename, backupname)
126
136
 
137
+ if timestamps:
138
+ os.utime(backupname, ns=(file_info.st_atime_ns, file_info.st_mtime_ns))
139
+
127
140
  ################################################################################
128
141
  # Test code
129
142
 
@@ -515,6 +515,13 @@ def difftool(commit_1=None, commit_2=None, files=None, tool=None):
515
515
 
516
516
  ################################################################################
517
517
 
518
+ # Match 'git diff --numstat' output - first re splits into lines added, removed
519
+ # and name. Second one is used if a file has been renamed, to get the old and
520
+ # new name components.
521
+
522
+ _DIFF_OUTPUT_RE = re.compile(r'(-|\d+)\s+(-|\d+)\s+(.*)')
523
+ _DIFF_OUTPUT_RENAME_RE = re.compile(r'(.*)\{(.*) => (.*)\}(.*)')
524
+
518
525
  def commit_info(commit_1=None, commit_2=None, paths=None, diff_stats=False):
519
526
  """ Return details of changes either in single commit (defaulting to the most
520
527
  recent one) or between two commits, optionally restricted a path or paths
@@ -523,22 +530,35 @@ def commit_info(commit_1=None, commit_2=None, paths=None, diff_stats=False):
523
530
  """
524
531
 
525
532
  def parse_diff_output(result):
526
- """Extract current filename and lines added/deleted from output from git diff --numstat"""
533
+ """Extract previous and current filename (which may be the same) and lines added/deleted
534
+ from output from git diff --numstat"""
535
+
536
+ p = _DIFF_OUTPUT_RE.fullmatch(result)
537
+
538
+ # This shouldn't happen...
527
539
 
528
- p = re.fullmatch(r'(-|\d+)\s+(-|\d+)\s+(.*)', result)
540
+ if not p:
541
+ return 'ERROR', 'ERROR', 0, 0
542
+
543
+ # Extract number of lines added/removed
529
544
 
530
545
  lines_ins = 0 if p.group(1) == '-' else int(p.group(1))
531
546
  lines_del = 0 if p.group(2) == '-' else int(p.group(2))
532
547
 
548
+ # Check for rename and get both old and new names
549
+
533
550
  if ' => ' in p.group(3):
534
- filepath = p.group(3).split('{')[0]
535
- filename = p.group(3).split(' => ')[1]
536
- filename = filename.replace('}', '')
537
- filename = os.path.join(filepath, filename)
551
+ q = _DIFF_OUTPUT_RENAME_RE.fullmatch(p.group(3))
552
+
553
+ if q:
554
+ old_filename = q.group(1) + q.group(2) + q.group(4)
555
+ new_filename = q.group(1) + q.group(3) + q.group(4)
556
+ else:
557
+ old_filename, new_filename = p.group(3).split(' => ')
538
558
  else:
539
- filename = p.group(3)
559
+ old_filename = new_filename = p.group(3)
540
560
 
541
- return filename, lines_ins, lines_del
561
+ return old_filename, new_filename, lines_ins, lines_del
542
562
 
543
563
  # Either get changes between the two commits, or changes in the specified commit
544
564
 
@@ -588,22 +608,23 @@ def commit_info(commit_1=None, commit_2=None, paths=None, diff_stats=False):
588
608
  results = git(['diff', '--numstat'] + params)
589
609
 
590
610
  for result in results:
591
- filename, lines_ins, lines_del = parse_diff_output(result)
611
+ old_filename, new_filename, lines_ins, lines_del = parse_diff_output(result)
592
612
 
593
- info[filename]['deleted'] = lines_del
594
- info[filename]['added'] = lines_ins
613
+ info[new_filename]['deleted'] = lines_del
614
+ info[new_filename]['added'] = lines_ins
595
615
 
596
616
  # Run git diff to get stats ignoring whitespace changes and add them
597
617
 
598
618
  results = git(['diff', '--numstat', '--ignore-all-space', '--ignore-blank-lines'] + params)
599
619
 
600
620
  for result in results:
601
- filename, lines_ins, lines_del = parse_diff_output(result)
621
+ old_filename, new_filename, lines_ins, lines_del = parse_diff_output(result)
602
622
 
603
- info[filename]['non-ws deleted'] = lines_del
604
- info[filename]['non-ws added'] = lines_ins
623
+ info[new_filename]['non-ws deleted'] = lines_del
624
+ info[new_filename]['non-ws added'] = lines_ins
605
625
 
606
626
  # Fill in the blanks - files
627
+
607
628
  for filename in info:
608
629
  if 'deleted' not in info[filename]:
609
630
  info[filename]['deleted'] = info[filename]['added'] = 0
@@ -1326,7 +1347,7 @@ def run_tests():
1326
1347
  if value is None:
1327
1348
  print(' Successfully failed to read the newly-deleted config data')
1328
1349
  else:
1329
- raise GitError
1350
+ raise GitError('Unexpected lack of error reading configuration data', 1)
1330
1351
 
1331
1352
  config_set('user', 'email', 'user@localhost')
1332
1353
  config_set('user', 'name', 'User Name')
@@ -1259,7 +1259,7 @@ if __name__ == '__main__':
1259
1259
  if value is None:
1260
1260
  print(' Successfully failed to read the newly-deleted config data')
1261
1261
  else:
1262
- raise GitError
1262
+ raise GitError('Unexpectd lack of error reading configuration data', 1)
1263
1263
 
1264
1264
  config_set('user', 'email', 'user@localhost')
1265
1265
  config_set('user', 'name', 'User Name')
@@ -60,7 +60,7 @@ def capture_output(cmd, input_stream, output_streams, ansi_clean):
60
60
  if stream in (sys.stdout, sys.stderr):
61
61
  stream.write(tidy.convert_ansi(output))
62
62
  elif ansi_clean:
63
- stream.write(colour.clean(output))
63
+ stream.write(tidy.remove_ansi(output))
64
64
  else:
65
65
  stream.write(output)
66
66
 
@@ -63,7 +63,7 @@ class Pane():
63
63
 
64
64
  self.index = index
65
65
 
66
- self.current_dir = None
66
+ self.current_dir = ''
67
67
 
68
68
  self.ino = inotify.adapters.Inotify() if sys.platform == 'linux' else None
69
69
 
@@ -290,13 +290,11 @@ class Pane():
290
290
  else:
291
291
  entry = name + ' ' * (self.width - len(name) - len(data)) + data
292
292
 
293
+ file_colour = self.dircolours.get_colour_pair(current_file['name'], current_file['mode'])
293
294
  else:
294
295
  filename = entry = None
295
296
  current = False
296
-
297
- # Render the current line
298
-
299
- file_colour = self.dircolours.get_colour_pair(current_file['name'], current_file['mode']) if filename else normal_colour
297
+ file_colour = normal_colour
300
298
 
301
299
  # Reverse the colours if this the cursor line
302
300
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skilleter_thingy
3
- Version: 0.0.50
3
+ Version: 0.0.52
4
4
  Summary: A collection of useful utilities, mainly aimed at making Git more friendly
5
5
  Author-email: John Skilleter <john@skilleter.org.uk>
6
6
  Project-URL: Home, https://skilleter.org.uk