679
|
1 module cn.kuehne.uniquefile;
|
|
2
|
|
3 private import std.file;
|
|
4 private import std.stdio;
|
|
5 private import std.path;
|
|
6
|
|
7 private char[][char[]] known;
|
|
8 private uint doppelgaenger;
|
|
9
|
741
|
10 version(reporters){
|
|
11 private import std.string;
|
|
12 private uint[char[]] reporters;
|
|
13 }
|
|
14
|
679
|
15 private char[] lastPathElem(char[] path){
|
|
16 size_t end=path.length-1;
|
|
17 size_t start;
|
|
18
|
|
19 for(end = path.length-1; path[end]==std.path.sep[0]; end--){
|
|
20 if(end==0){
|
|
21 return std.path.sep;
|
|
22 }
|
|
23 }
|
|
24
|
|
25 for(start = end-1; start<start.max; start--){
|
|
26 if(path[start]==std.path.sep[0]){
|
|
27 break;
|
|
28 }
|
|
29 }
|
|
30
|
|
31 if(start==start.max){
|
|
32 start=0;
|
|
33 }else{
|
|
34 start+=1;
|
|
35 }
|
|
36 return path[start .. end+1];
|
|
37 }
|
|
38
|
|
39 private void add(char[] file){
|
|
40 char[] base = lastPathElem(file);
|
|
41
|
|
42 if(isfile(file)){
|
|
43 char[]* tmp = base in known;
|
|
44 if(tmp){
|
703
|
45 fwritef(stdout, "%s :\n\t%s\n\t%s\n", base, file, *tmp);
|
679
|
46 doppelgaenger++;
|
|
47 }else{
|
|
48 known[base] = file;
|
|
49 }
|
741
|
50
|
|
51 version(reporters){
|
|
52 // only works for UTF-8
|
|
53 char[] data=cast(char[]) read(file);
|
|
54
|
|
55 size_t index = find(data, "@author@");
|
|
56 if(index != index.max){
|
|
57 data = data[index + "@author@".length .. data.length];
|
|
58
|
|
59 foreach(char end; "\r\n\x00\x0A"){
|
|
60 index = find(data, end);
|
|
61 if(index != index.max){
|
|
62 data = data[0 .. index];
|
|
63 }
|
|
64 }
|
|
65
|
|
66 data = strip(data);
|
|
67
|
|
68 version(verbose){
|
|
69 if(data in reporters){
|
|
70 reporters[data]++;
|
|
71 }else{
|
|
72 reporters[data]=1;
|
|
73 }
|
|
74 }else{
|
|
75 reporters[data]=1;
|
|
76 }
|
|
77 }
|
|
78 }
|
679
|
79 }
|
|
80
|
|
81 if(isdir(file) && (base[0]!='.')){
|
|
82 foreach(char[] entry; listdir(file)){
|
|
83 add(file~std.path.sep~entry);
|
|
84 }
|
|
85 }
|
|
86 }
|
|
87
|
|
88 int main(char[][] args){
|
|
89 if(args.length<2){
|
|
90 fwritef(stderr, "at least one directory name is required as argument\n");
|
|
91 return -1;
|
|
92 }
|
|
93
|
|
94 doppelgaenger = 0;
|
|
95
|
|
96 foreach(char[] file; args[1 .. args.length]){
|
|
97 if(file=="."){
|
|
98 file=getcwd();
|
|
99 }
|
|
100 add(file);
|
|
101 }
|
696
|
102
|
|
103 version(verbose){
|
|
104 foreach(char[] entry; known.keys.sort){
|
707
|
105 fwritef(stderr, "\t%s\n", known[entry]);
|
696
|
106 }
|
|
107 }
|
679
|
108
|
741
|
109 version(reporters){
|
|
110 foreach(char[] entry; reporters.keys.sort){
|
|
111 version(verbose){
|
|
112 fprintf(stderr, "%i\t%.*s\n", reporters[entry], entry);
|
|
113 }else{
|
|
114 fprintf(stderr, "%.*s\n", entry);
|
|
115 }
|
|
116 }
|
|
117 }
|
|
118
|
703
|
119 fwritef(stdout, "hits : %s\n", doppelgaenger);
|
679
|
120
|
|
121 return doppelgaenger > 0;
|
703
|
122 }
|