#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@文件    ：配置.py
@作者    ：寻觅
@时间    ：2021/10/17 14:30
"""
import json
import os
import shutil
import subprocess

# 此库对中文极其不友好,无论是中文路径,还是中文分支都会报错,已向官方提交相关说明,等待官方修复吧
# (https://github.com/gitpython-developers/GitPython/issues/1362)
import time
import uuid

import git
from git import Repo

from 开源网安脚本.底层脚本.配置 import 项目_目录, git冲突_备份_目录, 当前时间_时分秒


# def 本地git读取():
#     # print(subprocess.check_output(["powershell", "ls"]))
#     print(subprocess.call(执行命令, shell=True))


class git操作:
    def __init__(self, 目录=项目_目录, 克隆地址=None, 远程分支=0, 保留本地=True):
        """

        :param 目录: 项目所在的目录
        :param 克隆地址: 如果需要克隆新项目请在此处输入项目地址
        :param 远程分支: 如果存在多个远程分支请选择一个
        :param 保留本地: 发生冲突时保留本地的文件
        """
        self.目录 = 目录
        if 克隆地址:
            self.实例 = git.Repo.clone_from(url=克隆地址, to_path=self.目录)
        else:
            self.实例 = Repo(目录)
        self.命令 = self.实例.git
        self.远程分支 = self.实例.remotes[远程分支]
        self.本地版本 = self.实例.head.commit
        self.远程版本 = self.远程分支.fetch()[0].commit
        self.信息 = {
            "存储目录": self.实例.working_tree_dir,
            "远程分支": [分支名称.name for 分支名称 in self.远程分支.refs],
            "远程地址": self.远程分支.url,
            "是否_修改": [i.a_path for i in self.本地版本.diff(None)] if self.实例.is_dirty() else [],
            "是否_新建": self.实例.untracked_files if self.实例.untracked_files else [],
            "更新_内容": False if self.本地版本 == self.远程版本 else self.远程版本.message
        }
        self.保留本地 = 保留本地

    # def 创建新库(self):
    #     # 新建_Git = Repo.init(存放地址, bare=True)
    #     新建_Git = Repo.init(self.目录)
    #     print(新建_Git.bare)
    #     return 新建_Git

    def 拉去(self):
        if self.信息['是否_修改']:
            pass
        if self.信息['更新_内容']:
            try:
                拉去结果 = self.远程分支.pull()
            except git.exc.GitCommandError:
                if self.信息['是否_修改']:
                    项目名称 = self.信息['存储目录'].split("\\")[-1]
                    时间戳 = str(int(time.time()))
                    # 这里把整数位时间戳当成唯一标识码吧,uuid有点太长了
                    日志信息 = {
                        "时间戳": 时间戳,
                        "项目名称": 项目名称,
                        "当前日期": 当前时间_时分秒,
                        "项目路径": self.信息['存储目录'],
                        "备份目录": os.path.join(os.path.join(git冲突_备份_目录, 项目名称), 时间戳),
                        "备份文件": self.信息['是否_修改'],
                    }
                    # 创建文件夹,把冲突的文件保存备份一下
                    os.makedirs(日志信息["备份目录"])
                    for 目录 in self.信息['是否_修改']:
                        目录拼接 = os.path.join(日志信息['项目路径'], 目录)
                        shutil.copy(目录拼接, 日志信息["备份目录"])
                    日志文件 = os.path.join(git冲突_备份_目录, "冲突备份日志.json")
                    # 创建日志文件
                    open(日志文件, "a").close()
                    with open(日志文件, "r+") as 读取日志:
                        try:
                            保存日志 = json.load(读取日志).copy()
                            保存日志.append(日志信息)
                        except:
                            保存日志 = [日志信息]
                        with open(日志文件, "w") as 写入日志:
                            json.dump(保存日志, 写入日志)
                    # 先清除修改,然后回到最新的分支上,然后在清除一次修改
                    self.命令.reset('--hard')
                    self.实例.head.reference = self.实例.commit(self.远程版本)
                    self.命令.reset('--hard')
                    # 撤销修改
                    # if self.保留本地:
                else:
                    assert SystemError("除了我以外应该没人用中文分支名吧!")
                拉去结果 = None

            except:
                assert SystemError("如果你看到这句话就代表发生了很不科学的bug!")
            else:
                return 拉去结果
        else:
            return False

    def 运行(self):
        # print(self.信息)
        self.拉去()


if __name__ == '__main__':
    测试项目 = [
        "C:\\Users\\asus\\3D Objects\\个人项目\\miku",
        "C:\\Users\\asus\\个人应用\\渗透测试\\工具包\\代理工具\\Stowaway",
        "C:\\Users\\asus\\个人应用\\渗透测试\\工具包\\信息收集\\子域名信息收集\\OneForAll",
        "C:\\Users\\asus\\3D Objects\\个人项目\\test",
        "C:\\test"
    ]
    下载项目 = [
        "git@gitee.com:xun-mi-git/test-e.git",
        "git@gitee.com:xun-mi-git/test-x.git",
    ]
    使用项目 = 测试项目[4]
    git操作(使用项目).运行()
    pass

    # # 报错测试
    # 中文路径报错
    # git.Repo.clone_from(url="git@gitee.com:xun-mi-git/test-x.git", to_path="C:\\Users\\asus\\3D Objects\\个人项目\\test")
    # 中文分支拉去报错
    # git.Repo.clone_from(url="git@gitee.com:xun-mi-git/test-x.git", to_path="C:\\test")
    # a = Repo("C:\\test").remotes[0]
    # for i in a.refs:
    #     print(i.name)
    # a = a.pull()
