Skip to content

Commit 076de13

Browse files
committedApr 2, 2013
Add --match option (and tests)
Uses shell filename pattern
1 parent 7b66fa1 commit 076de13

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed
 

‎hardlink.py

+8
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import sys
5252
import time
5353
import filecmp
54+
import fnmatch
5455

5556
from optparse import OptionParser
5657

@@ -226,6 +227,9 @@ def hardlink_identical_files(directories, filename, options):
226227
directories.append(filename)
227228
# Is it a regular file?
228229
elif stat.S_ISREG(stat_info.st_mode):
230+
if options.match:
231+
if not fnmatch.fnmatch(filename, options.match):
232+
return
229233
# Create the hash for the file.
230234
file_hash = hash_value(stat_info.st_size, stat_info.st_mtime,
231235
options.notimestamp or options.contentonly)
@@ -398,6 +402,10 @@ def parse_command_line():
398402
help="Regular expression used to exclude files/dirs (may specify multiple times)",
399403
action="append", dest="excludes", default=[],)
400404

405+
parser.add_option("-m", "--match",
406+
help="Shell pattern used to match files", metavar="PATTERN",
407+
action="store", dest="match", default=None,)
408+
401409
(options, args) = parser.parse_args()
402410
if not args:
403411
parser.print_help()

‎tests.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ def setUp(self):
5454

5555
self.verify_file_contents()
5656

57-
5857
def verify_file_contents(self):
5958
for filename, contents in self.testfs.items():
6059
with open(filename, "r") as f:
@@ -64,22 +63,20 @@ def verify_file_contents(self):
6463
# Bug? Should hardlink to the file with most existing links?
6564
# self.assertEqual(get_inode("dir1/name1.ext"), get_inode("dir1/link"))
6665

67-
6866
def test_hardlink_tree_dryrun(self):
6967
sys.argv = ["hardlink.py", "-v", "0", "--no-stats", "--dry-run", self.root]
7068
hardlink.main()
7169

7270
self.verify_file_contents()
7371

74-
self.assertEqual(os.lstat("dir1/name1.ext").st_nlink, 2) # Existing link
72+
self.assertEqual(os.lstat("dir1/name1.ext").st_nlink, 2) # Existing link
7573
self.assertEqual(os.lstat("dir1/name2.ext").st_nlink, 1)
7674
self.assertEqual(os.lstat("dir1/name3.ext").st_nlink, 1)
7775
self.assertEqual(os.lstat("dir2/name1.ext").st_nlink, 1)
7876
self.assertEqual(os.lstat("dir3/name1.ext").st_nlink, 1)
7977
self.assertEqual(os.lstat("dir3/name1.noext").st_nlink, 1)
8078
self.assertEqual(os.lstat("dir4/name1.ext").st_nlink, 1)
8179

82-
8380
def test_hardlink_tree(self):
8481
sys.argv = ["hardlink.py", "-v", "0", "--no-stats", self.root]
8582
hardlink.main()
@@ -94,7 +91,6 @@ def test_hardlink_tree(self):
9491

9592
self.assertNotEqual(get_inode("dir1/name1.ext"), get_inode("dir4/name1.ext"))
9693

97-
9894
def test_hardlink_tree_filenames_equal(self):
9995
sys.argv = ["hardlink.py", "-v", "0", "--no-stats", "--filenames-equal", self.root]
10096
hardlink.main()
@@ -109,7 +105,6 @@ def test_hardlink_tree_filenames_equal(self):
109105

110106
self.assertNotEqual(get_inode("dir1/name1.ext"), get_inode("dir4/name1.ext"))
111107

112-
113108
def test_hardlink_tree_exclude(self):
114109
sys.argv = ["hardlink.py", "-v", "0", "--no-stats", "--exclude", ".*noext$", self.root]
115110
hardlink.main()
@@ -124,7 +119,6 @@ def test_hardlink_tree_exclude(self):
124119

125120
self.assertNotEqual(get_inode("dir1/name1.ext"), get_inode("dir4/name1.ext"))
126121

127-
128122
def test_hardlink_tree_timestamp_ignore(self):
129123
sys.argv = ["hardlink.py", "-v", "0", "--no-stats", "--timestamp-ignore", self.root]
130124
hardlink.main()
@@ -139,6 +133,20 @@ def test_hardlink_tree_timestamp_ignore(self):
139133

140134
self.assertEqual(get_inode("dir1/name1.ext"), get_inode("dir4/name1.ext"))
141135

136+
def test_hardlink_tree_match(self):
137+
sys.argv = ["hardlink.py", "-v", "0", "--no-stats", "--match", "*.ext", self.root]
138+
hardlink.main()
139+
140+
self.verify_file_contents()
141+
142+
self.assertEqual(get_inode("dir1/name1.ext"), get_inode("dir1/name2.ext"))
143+
self.assertEqual(get_inode("dir1/name1.ext"), get_inode("dir2/name1.ext"))
144+
self.assertNotEqual(get_inode("dir1/name1.ext"), get_inode("dir3/name1.noext"))
145+
146+
self.assertEqual(get_inode("dir1/name3.ext"), get_inode("dir3/name1.ext"))
147+
148+
self.assertNotEqual(get_inode("dir1/name1.ext"), get_inode("dir4/name1.ext"))
149+
142150

143151
if __name__ == '__main__':
144152
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.