public List<String> getSourceTree(String commitID)
	{
		try
		{
			List<String> fileList = new ArrayList<String>();
			List<CommitFamily> commitPath = getCommitPathToRoot(commitID);
			List<CommitFamily> shortestCommitPath = new ArrayList<CommitFamily>();
			Map<String, List<String>> commitCaches = getCommitCachesFromCommit(commitID);
			
			// Build the shortest commit path
			for(CommitFamily cf: commitPath)
			{
				// Start from the commit, moving backward until the root or hit a cached commit
				if(commitCaches.containsKey(cf.getChildId()))
				{
					fileList.addAll(commitCaches.get(cf.getChildId()));
					break;
				}
				else
				{
					shortestCommitPath.add(cf);
				}
			}
			
			// Get all the commit file history for every commit in the shortest path
			if(shortestCommitPath.size() == 0)
				return fileList;
			
			String oldCommit = shortestCommitPath.get(shortestCommitPath.size() - 1).getChildId();
			Map<String, Map<String, List<String>>> commitHistoryMap = getAddDeleteFileForCommitRange(oldCommit, commitID);
	
			// Create list of file from the beginning of shortest path
			for(int i =shortestCommitPath.size() - 1; i >= 0; i--)
			{
				// get all the add or delete files and update file list
				String currentCommit = shortestCommitPath.get(i).getChildId();
				if(commitHistoryMap.containsKey(currentCommit))
				{
					List<String> addedFiles   = commitHistoryMap.get(currentCommit).get("DIFF_ADD");
					List<String> deletedFiles = commitHistoryMap.get(currentCommit).get("DIFF_DELETE");
					if(addedFiles!=null)
						fileList.addAll(addedFiles);
					if(deletedFiles!=null)
						fileList.removeAll(deletedFiles);
				}
			}
			
			return fileList;
		}
		catch (Exception e)
		{
			e.printStackTrace();
			System.out.print(e.getMessage());
			return null;
		}
	}