Mercurial > hg4j
comparison test/org/tmatesoft/hg/tools/ChangelogEntryBuilder.java @ 384:4b97847d0b2d
Auxilary builders for manifest and changelog to create test repositories
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 13 Feb 2012 13:20:06 +0100 |
parents | |
children | 73e875154afb |
comparison
equal
deleted
inserted
replaced
383:994b5813a925 | 384:4b97847d0b2d |
---|---|
1 /* | |
2 * Copyright (c) 2012 TMate Software Ltd | |
3 * | |
4 * This program is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; version 2 of the License. | |
7 * | |
8 * This program is distributed in the hope that it will be useful, | |
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 * GNU General Public License for more details. | |
12 * | |
13 * For information on how to redistribute this software under | |
14 * the terms of a license other than GNU General Public License | |
15 * contact TMate Software at support@hg4j.com | |
16 */ | |
17 package org.tmatesoft.hg.tools; | |
18 | |
19 import java.util.ArrayList; | |
20 import java.util.Collections; | |
21 import java.util.Iterator; | |
22 import java.util.LinkedHashMap; | |
23 import java.util.List; | |
24 import java.util.Map; | |
25 import java.util.TimeZone; | |
26 import java.util.Map.Entry; | |
27 | |
28 import org.tmatesoft.hg.core.Nodeid; | |
29 | |
30 /** | |
31 * | |
32 * @author Artem Tikhomirov | |
33 * @author TMate Software Ltd. | |
34 */ | |
35 public class ChangelogEntryBuilder { | |
36 | |
37 private String user; | |
38 private List<String> modifiedFiles; | |
39 private final Map<String, String> extrasMap = new LinkedHashMap<String, String>(); | |
40 private Integer tzOffset; | |
41 private Long csetTime; | |
42 | |
43 public ChangelogEntryBuilder user(String username) { | |
44 user = username; | |
45 return this; | |
46 } | |
47 | |
48 public String user() { | |
49 if (user == null) { | |
50 // for our testing purposes anything but null is ok. no reason to follow Hg username lookup conventions | |
51 user = System.getProperty("user.name"); | |
52 } | |
53 return user; | |
54 } | |
55 | |
56 public ChangelogEntryBuilder setModified(List<String> files) { | |
57 modifiedFiles = new ArrayList<String>(files == null ? Collections.<String>emptyList() : files); | |
58 return this; | |
59 } | |
60 | |
61 public ChangelogEntryBuilder addModified(List<String> files) { | |
62 if (modifiedFiles == null) { | |
63 return setModified(files); | |
64 } | |
65 modifiedFiles.addAll(files); | |
66 return this; | |
67 } | |
68 | |
69 public ChangelogEntryBuilder branch(String branchName) { | |
70 if (branchName == null) { | |
71 extrasMap.remove("branch"); | |
72 } else { | |
73 extrasMap.put("branch", branchName); | |
74 } | |
75 return this; | |
76 } | |
77 | |
78 public ChangelogEntryBuilder extras(Map<String, String> extras) { | |
79 extrasMap.clear(); | |
80 extrasMap.putAll(extras); | |
81 return this; | |
82 } | |
83 | |
84 public ChangelogEntryBuilder date(long seconds, int timezoneOffset) { | |
85 csetTime = seconds; | |
86 tzOffset = timezoneOffset; | |
87 return this; | |
88 } | |
89 | |
90 private long csetTime() { | |
91 if (csetTime != null) { | |
92 return csetTime; | |
93 } | |
94 return System.currentTimeMillis() / 1000; | |
95 } | |
96 | |
97 private int csetTimezone(long time) { | |
98 if (tzOffset != null) { | |
99 return tzOffset; | |
100 } | |
101 return -(TimeZone.getDefault().getOffset(time) / 1000); | |
102 } | |
103 | |
104 public byte[] build(Nodeid manifestRevision, String comment) { | |
105 String f = "%s\n%s\n%d %d %s\n%s\n\n%s"; | |
106 StringBuilder extras = new StringBuilder(); | |
107 for (Iterator<Entry<String, String>> it = extrasMap.entrySet().iterator(); it.hasNext();) { | |
108 final Entry<String, String> next = it.next(); | |
109 extras.append(encodeExtrasPair(next.getKey())); | |
110 extras.append(':'); | |
111 extras.append(encodeExtrasPair(next.getValue())); | |
112 if (it.hasNext()) { | |
113 extras.append('\00'); | |
114 } | |
115 } | |
116 StringBuilder files = new StringBuilder(); | |
117 for (Iterator<String> it = modifiedFiles.iterator(); it.hasNext(); ) { | |
118 files.append(it.next()); | |
119 if (it.hasNext()) { | |
120 files.append('\n'); | |
121 } | |
122 } | |
123 final long date = csetTime(); | |
124 final int tz = csetTimezone(date); | |
125 return String.format(f, manifestRevision.toString(), user, date, tz, extras, files, comment).getBytes(); | |
126 } | |
127 | |
128 private final static CharSequence encodeExtrasPair(String s) { | |
129 if (s != null) { | |
130 return s.replace("\\", "\\\\").replace("\n", "\\n").replace("\r", "\\r").replace("\00", "\\0"); | |
131 } | |
132 return s; | |
133 } | |
134 } |