View Javadoc
1   /*
2    * Copyright (C) 2009, Google Inc.
3    * Copyright (C) 2009, Yann Simon <yann.simon.fr@gmail.com>
4    * Copyright (C) 2011, Matthias Sohn <matthias.sohn@sap.com>
5    * and other copyright owners as documented in the project's IP log.
6    *
7    * This program and the accompanying materials are made available
8    * under the terms of the Eclipse Distribution License v1.0 which
9    * accompanies this distribution, is reproduced below, and is
10   * available at http://www.eclipse.org/org/documents/edl-v10.php
11   *
12   * All rights reserved.
13   *
14   * Redistribution and use in source and binary forms, with or
15   * without modification, are permitted provided that the following
16   * conditions are met:
17   *
18   * - Redistributions of source code must retain the above copyright
19   *   notice, this list of conditions and the following disclaimer.
20   *
21   * - Redistributions in binary form must reproduce the above
22   *   copyright notice, this list of conditions and the following
23   *   disclaimer in the documentation and/or other materials provided
24   *   with the distribution.
25   *
26   * - Neither the name of the Eclipse Foundation, Inc. nor the
27   *   names of its contributors may be used to endorse or promote
28   *   products derived from this software without specific prior
29   *   written permission.
30   *
31   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
32   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
33   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
34   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
36   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
38   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
39   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
40   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
41   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
43   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44   */
45  
46  package org.eclipse.jgit.lib;
47  
48  import org.eclipse.jgit.lib.Config.SectionParser;
49  import org.eclipse.jgit.util.SystemReader;
50  
51  /** The standard "user" configuration parameters. */
52  public class UserConfig {
53  	/** Key for {@link Config#get(SectionParser)}. */
54  	public static final Config.SectionParser<UserConfig> KEY = new SectionParser<UserConfig>() {
55  		public UserConfig parse(final Config cfg) {
56  			return new UserConfig(cfg);
57  		}
58  	};
59  
60  	private String authorName;
61  
62  	private String authorEmail;
63  
64  	private String committerName;
65  
66  	private String committerEmail;
67  
68  	private boolean isAuthorNameImplicit;
69  
70  	private boolean isAuthorEmailImplicit;
71  
72  	private boolean isCommitterNameImplicit;
73  
74  	private boolean isCommitterEmailImplicit;
75  
76  	private UserConfig(final Config rc) {
77  		authorName = getNameInternal(rc, Constants.GIT_AUTHOR_NAME_KEY);
78  		if (authorName == null) {
79  			authorName = getDefaultUserName();
80  			isAuthorNameImplicit = true;
81  		}
82  		authorEmail = getEmailInternal(rc, Constants.GIT_AUTHOR_EMAIL_KEY);
83  		if (authorEmail == null) {
84  			authorEmail = getDefaultEmail();
85  			isAuthorEmailImplicit = true;
86  		}
87  
88  		committerName = getNameInternal(rc, Constants.GIT_COMMITTER_NAME_KEY);
89  		if (committerName == null) {
90  			committerName = getDefaultUserName();
91  			isCommitterNameImplicit = true;
92  		}
93  		committerEmail = getEmailInternal(rc, Constants.GIT_COMMITTER_EMAIL_KEY);
94  		if (committerEmail == null) {
95  			committerEmail = getDefaultEmail();
96  			isCommitterEmailImplicit = true;
97  		}
98  	}
99  
100 	/**
101 	 * @return the author name as defined in the git variables and
102 	 *         configurations. If no name could be found, try to use the system
103 	 *         user name instead.
104 	 */
105 	public String getAuthorName() {
106 		return authorName;
107 	}
108 
109 	/**
110 	 * @return the committer name as defined in the git variables and
111 	 *         configurations. If no name could be found, try to use the system
112 	 *         user name instead.
113 	 */
114 	public String getCommitterName() {
115 		return committerName;
116 	}
117 
118 	/**
119 	 * @return the author email as defined in git variables and
120 	 *         configurations. If no email could be found, try to
121 	 *         propose one default with the user name and the
122 	 *         host name.
123 	 */
124 	public String getAuthorEmail() {
125 		return authorEmail;
126 	}
127 
128 	/**
129 	 * @return the committer email as defined in git variables and
130 	 *         configurations. If no email could be found, try to
131 	 *         propose one default with the user name and the
132 	 *         host name.
133 	 */
134 	public String getCommitterEmail() {
135 		return committerEmail;
136 	}
137 
138 	/**
139 	 * @return true if the author name was not explicitly configured but
140 	 *         constructed from information the system has about the logged on
141 	 *         user
142 	 */
143 	public boolean isAuthorNameImplicit() {
144 		return isAuthorNameImplicit;
145 	}
146 
147 	/**
148 	 * @return true if the author email was not explicitly configured but
149 	 *         constructed from information the system has about the logged on
150 	 *         user
151 	 */
152 	public boolean isAuthorEmailImplicit() {
153 		return isAuthorEmailImplicit;
154 	}
155 
156 	/**
157 	 * @return true if the committer name was not explicitly configured but
158 	 *         constructed from information the system has about the logged on
159 	 *         user
160 	 */
161 	public boolean isCommitterNameImplicit() {
162 		return isCommitterNameImplicit;
163 	}
164 
165 	/**
166 	 * @return true if the author email was not explicitly configured but
167 	 *         constructed from information the system has about the logged on
168 	 *         user
169 	 */
170 	public boolean isCommitterEmailImplicit() {
171 		return isCommitterEmailImplicit;
172 	}
173 
174 	private static String getNameInternal(Config rc, String envKey) {
175 		// try to get the user name for the system property GIT_XXX_NAME
176 		String username = system().getenv(envKey);
177 
178 		if (username == null) {
179 			// try to get the user name from the local and global
180 			// configurations.
181 			username = rc.getString("user", null, "name"); //$NON-NLS-1$ //$NON-NLS-2$
182 		}
183 
184 		return stripInvalidCharacters(username);
185 	}
186 
187 	/**
188 	 * @return try to get user name of the logged on user from the operating
189 	 *         system
190 	 */
191 	private static String getDefaultUserName() {
192 		// get the system user name
193 		String username = system().getProperty(Constants.OS_USER_NAME_KEY);
194 		if (username == null)
195 			username = Constants.UNKNOWN_USER_DEFAULT;
196 		return username;
197 	}
198 
199 	private static String getEmailInternal(Config rc, String envKey) {
200 		// try to get the email for the system property GIT_XXX_EMAIL
201 		String email = system().getenv(envKey);
202 
203 		if (email == null) {
204 			// try to get the email from the local and global configurations.
205 			email = rc.getString("user", null, "email"); //$NON-NLS-1$ //$NON-NLS-2$
206 		}
207 
208 		return stripInvalidCharacters(email);
209 	}
210 
211 	private static String stripInvalidCharacters(String s) {
212 		return s == null ? null : s.replaceAll("<|>|\n", ""); //$NON-NLS-1$//$NON-NLS-2$
213 	}
214 
215 	/**
216 	 * @return try to construct email for logged on user using system
217 	 *         information
218 	 */
219 	private static String getDefaultEmail() {
220 		// try to construct an email
221 		String username = getDefaultUserName();
222 		return username + "@" + system().getHostname(); //$NON-NLS-1$
223 	}
224 
225 	private static SystemReader system() {
226 		return SystemReader.getInstance();
227 	}
228 }