项目任务2 创建GIT命令行执行文件
解析 git 命令
命令如下:
盘符:
cd 【项目路径】
for /F %%i in ('git config --get user.name') do ( set name=%%i)
git log --author=%name% --since ==【开始时间】 --until=【结束时间】 > 【输出路径\tmp】\【项目名称英文】.txt
盘符:
第一行的盘符冒号,windows 需要, linux 不需要,这个盘符可以用第一个冒号前的部分来抓取,不如d:\a\b,通过冒号分割,可拿到盘符 d,再拼接冒号可拿到 d:
for /F %%i in ('git config --get user.name') do ( set name=%%i)
第二行进入项目路径 cd 【项目路径】,这个没什么好说,配置文件的 projectPaths
git log --author=%name% --since ==【开始时间】 --until=【结束时间】 > 【输出路径\tmp】\【项目名称英文】.txt
第三行的开始时间,结束时间,输出路径已经给出了,项目英文名称可通过项目路径创建file,然后 getFileName() 拿到,这句命令的意思是抓取 (开始时间,结束时间] 的日志,注意左侧为开区间,需要把日期忘前挪一位
创建日期工具类
由于在 ConfigData 内部设置了一些日期转换文件,而第二步中生成git指令也需要这些日期工具类,因此把他们独立出来成为一个文件,如下:
DateUtil.java
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class DateUtil {
public static Date getDefaultStart() {
Calendar cld = Calendar.getInstance(Locale.CHINA);
cld.setFirstDayOfWeek(Calendar.MONDAY);//以周一为首日
cld.setTimeInMillis(System.currentTimeMillis());//当前时间
cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//周一
return cld.getTime();
}
public static String getPreDayStr(Date d){
Calendar cld = Calendar.getInstance(Locale.CHINA);
cld.setTime(d);
cld.add(Calendar.DATE, -1);// 日期减1
return toString(cld.getTime());
}
public static String toString(Date d){
SimpleDateFormat sdfFormat = new SimpleDateFormat("yyyy-MM-dd");
return sdfFormat.format(d);
}
public static Date toDate(String str){
SimpleDateFormat sdfFormat = new SimpleDateFormat("yyyy-MM-dd");
// 严格模式
sdfFormat.setLenient(false);
try {
return sdfFormat.parse(str);
} catch (ParseException e) {
return null;
}
}
}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
添加文件处理方法
1. 保存git指令
2. 获取标准文件路径
3. 重建文件
FileUtil.java
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import com.weekpaper.bean.ConfigData;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class FileUtil {
/**
* 获取文件标准绝对路径
* @param path
* @return
*/
public static String getFilePath(String path){
try {
return new File(path).getCanonicalPath();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
/**
* 加载配置文件
* @param configPath
* @return
*/
public static ConfigData loadConfigData(String configPath){
FileInputStream fis = null;
try {
fis = new FileInputStream(configPath);
ConfigData cd = new ConfigData();
cd.readObject(fis);
return cd;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}finally {
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 保存git指令
* @param lines
* @param path
*/
public static void storeGitCommands(List<String> lines,String path){
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
for(String line:lines){
fos.write(line.getBytes());
fos.write('\n');
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取标准文件路径
* @param file
* @return
*/
public static String getShortPath(File file) {
try {
return file.getCanonicalPath();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
/**
* 重建文件
* @param path
* @return
*/
public static File reCreateFile(String path) {
File f = new File(path);
try {
File parent = f.getParentFile();
if(!parent.exists()){
parent.mkdirs();
}
if(f.exists()){
f.delete();
}
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return f;
}
}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
执行生成 git 命令文件
由于代码变长,此处稍做整理,把加载配置文件信息这步放入一个单独的方法中处理
生成git命令,保存到文件
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import com.weekpaper.bean.ConfigData;
import com.weekpaper.util.DateUtil;
import com.weekpaper.util.FileUtil;
import com.weekpaper.util.LogUtil;
import java.io.*;
import java.util.*;
public class WeekPaper {
public static void main(String[] args) {
if(args==null || args.length<1){
LogUtil.severe("找不到配置文件!");
System.exit(0);
}
//1.加载配置文件信息
ConfigData cd = loadConfigFile(args[0]);
//2. 生成 git 执行命令行(windows,linux的类似,进入盘符的几个步骤有差别)
createGitCommandFile(cd);
}
private static void createGitCommandFile(ConfigData cd) {
LogUtil.info("开始生成"+DateUtil.toString(cd.getStartDate())+"到"+DateUtil.toString(cd.getEndDate())+"git 命令行,如下:");
// 盘符:
// cd 【项目路径】
// for /F %%i in ('git config --get user.name') do ( set name=%%i)
// git log --author=%name% --since ==【开始时间】 --until=【结束时间】 > 【输出路径\tmp】\【项目名称英文】.txt
if(cd.getProjectPaths()==null || cd.getProjectPaths().isEmpty()){
LogUtil.severe("无可用项目!");
System.exit(0);
}
int n = cd.getProjectPaths().size();
if(cd.getProjectNames().size()<n){
LogUtil.severe("项目中文名称和项目路径数目不匹配!");
System.exit(0);
}
List<String> commands = new ArrayList<String>();
for(int i = 0; i < n; i++){
String path = cd.getProjectPaths().get(i);
String name = cd.getProjectNames().get(i);
LogUtil.info("开始创建项目"+name+"的 GIT 命令...");
File f = new File(path);
if(f.exists() && f.isDirectory()){
// 盘符:[linux不用写这个]
commands.add(path.split(":")[0]+":");
// cd 【项目路径】
commands.add("cd "+path);
// for /F %%i in ('git config --get user.name') do ( set name=%%i)
commands.add("for /F %%i in ('git config --get user.name') do ( set name=%%i)");
// git log --author=%name% --since ==【开始时间】 --until=【结束时间】 > D:\program\eclipse\work\DEST\config\【项目名称英文】.txt
File targetFilePath = FileUtil.reCreateFile(cd.getOutputPath()+File.separator+"tmp"+File.separator+f.getName()+".txt");
//注意:不包含第一天,需要向前挪动1天
commands.add("git log --author=%name% --since =="+DateUtil.getPreDayStr(cd.getStartDate())+" --until="+DateUtil.toString(cd.getEndDate())+" > "+
FileUtil.getShortPath(targetFilePath));
LogUtil.info("创建项目"+name+"的 GIT 命令成功!");
}else{
LogUtil.info("创建项目"+name+"的 GIT 命令失败,找不到文件夹!");
}
}
for(String command:commands){
System.out.println(command);
}
if(!commands.isEmpty()){
File commandFilePath = FileUtil.reCreateFile(cd.getOutputPath()+File.separator+"tmp"+File.separator+"cmd.bat");
FileUtil.storeGitCommands(commands,FileUtil.getShortPath(commandFilePath));
}
}
private static ConfigData loadConfigFile(String path) {
ConfigData cd = FileUtil.loadConfigData(path);
if(cd == null){
LogUtil.severe("配置内容有误!");
System.exit(0);
}else{
LogUtil.info("获取配置文件"+ FileUtil.getFilePath(path)+"成功!");
// LogUtil.info("获取配置文件"+ FileUtil.getFilePath(args[0])+"成功!信息如下:");
// LogUtil.info(cd.toString());
}
return cd;
}
}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
执行结果:
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
注意:
如果不是bat执行,而是直接在git cmd执行,for那句需要改为:
for /F %i in ('git config --get user.name') do ( set name=%i)
cmd中两个百分号相当于普通执行的一个百分号
当然,你也可以手工执行一下 cmd.bat 试试,如下:
产生了一个git抓取日期日志的文件