Skip to content

Commit e633439

Browse files
Parsing configuration.
1 parent cf9a7be commit e633439

File tree

7 files changed

+186
-0
lines changed

7 files changed

+186
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.byteimagination.gitomater;
2+
3+
public class Gitomater {
4+
5+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.byteimagination.gitomater.helpers;
2+
3+
import com.byteimagination.gitomater.models.Repository;
4+
5+
import java.io.BufferedReader;
6+
import java.io.File;
7+
import java.io.FileReader;
8+
import java.io.IOException;
9+
import java.util.ArrayList;
10+
import java.util.Collections;
11+
import java.util.Comparator;
12+
import java.util.List;
13+
14+
public class ConfigurationParser {
15+
16+
public List<Repository> parse(String path) {
17+
File file = new File(path);
18+
if (!file.exists())
19+
throw new RuntimeException("File '" + path + "' does not exist.");
20+
List<String> lines = readFile(file);
21+
List<Repository> repositories = new ArrayList<Repository>();
22+
int nextRepositoryLine = 0;
23+
do {
24+
nextRepositoryLine = findNextRepositoryLine(nextRepositoryLine, lines);
25+
if (nextRepositoryLine < 0)
26+
break;
27+
Repository repository = new Repository();
28+
repositories.add(repository);
29+
repository.name = lines.get(nextRepositoryLine).split(" ")[1].trim();
30+
parsePrivileges(repository, nextRepositoryLine + 1, lines);
31+
} while ((nextRepositoryLine = findNextRepositoryLine(nextRepositoryLine + 1, lines)) >= 0);
32+
Collections.sort(repositories, new Comparator<Repository>() {
33+
public int compare(Repository r1, Repository r2) {
34+
return r1.name.compareTo(r2.name);
35+
}
36+
});
37+
return repositories;
38+
}
39+
40+
private List<String> readFile(File file) {
41+
try {
42+
BufferedReader reader = new BufferedReader(new FileReader(file));
43+
List<String> lines = new ArrayList<String>();
44+
String line;
45+
while ((line = reader.readLine()) != null)
46+
lines.add(line);
47+
return lines;
48+
} catch (IOException e) {
49+
throw new RuntimeException(e);
50+
}
51+
}
52+
53+
private int findNextRepositoryLine(int previousIndex, List<String> lines) {
54+
for (int i = previousIndex; i < lines.size(); i++)
55+
if (lines.get(i).startsWith("repo"))
56+
return i;
57+
return -1;
58+
}
59+
60+
private void parsePrivileges(Repository repository, int repositoryStartingLine, List<String> lines) {
61+
for (int i = repositoryStartingLine; i < lines.size(); i++) {
62+
String line = lines.get(i);
63+
if (line.startsWith("repo") || line.trim().isEmpty())
64+
break;
65+
String[] lineParts = line.split("=");
66+
String privilegesType = lineParts[0].trim();
67+
if (!repository.privileges.containsKey(privilegesType))
68+
repository.privileges.put(privilegesType, new ArrayList<String>());
69+
String[] users = lineParts[1].split("\\s+");
70+
List<String> usersList = repository.privileges.get(privilegesType);
71+
for (String user : users)
72+
if (!user.trim().isEmpty())
73+
usersList.add(user);
74+
}
75+
}
76+
77+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.byteimagination.gitomater.models;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
public class Repository {
8+
9+
public String name;
10+
public Map<String, List<String>> privileges = new HashMap<String, List<String>>();
11+
12+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package unit.helpers;
2+
3+
import com.byteimagination.gitomater.helpers.ConfigurationParser;
4+
import com.byteimagination.gitomater.models.Repository;
5+
import org.junit.Test;
6+
7+
import java.util.List;
8+
9+
public class ConfigurationParserTest {
10+
11+
@Test
12+
public void parsesTypicalConfiguration() {
13+
ConfigurationParser configurationParser = new ConfigurationParser();
14+
List<Repository> repositories = configurationParser.parse("src/test/resources/gitolite.conf");
15+
assert repositories.size() == 6;
16+
assert repositories.get(0).name.equals("android/AndroidLib");
17+
assert repositories.get(0).privileges.containsKey("RW+");
18+
assert repositories.get(0).privileges.get("RW+").size() == 1;
19+
assert repositories.get(0).privileges.get("RW+").contains("roger");
20+
assert repositories.get(1).name.equals("android/ForestGame");
21+
assert repositories.get(1).privileges.containsKey("RW+");
22+
assert repositories.get(1).privileges.get("RW+").size() == 1;
23+
assert repositories.get(1).privileges.get("RW+").contains("roger");
24+
assert repositories.get(1).privileges.containsKey("RW");
25+
assert repositories.get(1).privileges.get("RW").size() == 2;
26+
assert repositories.get(1).privileges.get("RW").contains("dtabisz");
27+
assert repositories.get(1).privileges.get("RW").contains("mtelesz");
28+
assert repositories.get(2).name.equals("android/LiceumBedzin");
29+
assert repositories.get(2).privileges.containsKey("RW+");
30+
assert repositories.get(2).privileges.get("RW+").size() == 1;
31+
assert repositories.get(2).privileges.get("RW+").contains("roger");
32+
assert repositories.get(2).privileges.containsKey("RW");
33+
assert repositories.get(2).privileges.get("RW").size() == 1;
34+
assert repositories.get(2).privileges.get("RW").contains("dtabisz");
35+
assert repositories.get(2).privileges.containsKey("R");
36+
assert repositories.get(2).privileges.get("R").size() == 1;
37+
assert repositories.get(2).privileges.get("R").contains("mtelesz");
38+
assert repositories.get(3).name.equals("gitolite-admin");
39+
assert repositories.get(3).privileges.containsKey("RW+");
40+
assert repositories.get(3).privileges.get("RW+").size() == 1;
41+
assert repositories.get(3).privileges.get("RW+").contains("roger");
42+
assert repositories.get(4).name.equals("gitomater");
43+
assert repositories.get(4).privileges.containsKey("RW+");
44+
assert repositories.get(4).privileges.get("RW+").size() == 1;
45+
assert repositories.get(4).privileges.get("RW+").contains("roger");
46+
assert repositories.get(5).name.equals("mobile/Krasnik");
47+
assert repositories.get(5).privileges.containsKey("RW+");
48+
assert repositories.get(5).privileges.get("RW+").size() == 1;
49+
assert repositories.get(5).privileges.get("RW+").contains("roger");
50+
}
51+
52+
@Test
53+
public void parsesSingleEntryConfiguration() {
54+
ConfigurationParser configurationParser = new ConfigurationParser();
55+
List<Repository> repositories = configurationParser.parse("src/test/resources/gitolite2.conf");
56+
assert repositories.size() == 1;
57+
assert repositories.get(0).name.equals("gitolite-admin");
58+
assert repositories.get(0).privileges.containsKey("RW+");
59+
assert repositories.get(0).privileges.get("RW+").size() == 1;
60+
assert repositories.get(0).privileges.get("RW+").contains("roger");
61+
}
62+
63+
@Test
64+
public void parsesEmptyConfiguration() {
65+
ConfigurationParser configurationParser = new ConfigurationParser();
66+
List<Repository> repositories = configurationParser.parse("src/test/resources/gitolite3.conf");
67+
assert repositories.size() == 0;
68+
}
69+
70+
}

src/test/resources/gitolite.conf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
repo gitolite-admin
2+
RW+ = roger
3+
4+
repo gitomater
5+
RW+ = roger
6+
7+
repo android/AndroidLib
8+
RW+ = roger
9+
10+
repo android/ForestGame
11+
RW+ = roger
12+
RW = dtabisz mtelesz
13+
14+
repo mobile/Krasnik
15+
RW+ = roger
16+
17+
repo android/LiceumBedzin
18+
RW+ = roger
19+
RW = dtabisz
20+
R = mtelesz

src/test/resources/gitolite2.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
repo gitolite-admin
2+
RW+ = roger

src/test/resources/gitolite3.conf

Whitespace-only changes.

0 commit comments

Comments
 (0)