habrahabr

Разработка собственной «git» для маленького государственного предприятия от начинающего разработчика

  • вторник, 29 января 2019 г. в 00:21:43
https://habr.com/ru/post/437866/
  • Python


История


Доброго времени суток, хабровцы. Данная проблема возникла у меня еще с августа 2018 г. А дело все в том, что работники организации в которой я провожу основную часть своего времени очень много работают с различными файлами, копируют их себе, передают работу другому и осуществляя данные действия в большинстве случаев порядка 30% а то и больше информации теряется.

Одним из основных решений, которое я видел, является написание "git" системы для работы с данными.

Алгоритм


Алгоритм имеет следующую структуру:

image

На сервере находится скрытая папка с данными. С помощью Python-модуля можно копировать данные с сервера и загружать их обратно на сервер (в скрытую папку).

Начинаем работу


Для реализации проекта я использую две библиотеки:

import shutil
import os

Пропишем основные моменты, которые нам пригодятся в ходе работы:

# в данном списке мы будем хранить основные ошибки, возникающие в ходе работы программы
err = ['>> Ошибка ввода команд', '>> Выбранная Вами дирректория отсутствует'] 
# пропишем цикл, который позволит нам запускать множество команд за один запуск программы
while True:
    level = -1 # уровень команды
    command = input('>> ') #ввод самой программы
    commandDetail = command.split(' ') #детальное чтение команды
    gitResult = [] # список произведенных действий
    complete = '' #определение комманды предыдущего уровня

после основных моментов, пропишем первую команду, я ее назвал `git` (собственно говоря для прикола).

Для начала запустим цикл для детального чтения команд и продолжим:

for x in commandDetail:
    level += 1 #сообщим уровень команды
    if (x == 'git') and (level == 0) and (len(command) == 3):
        print('>> Hi, my name`s git')
        continue

Обговорим «Почему так много параметров сравнения?». Рассмотрим детально по пунктам и продолжим писать:

  1. (x == 'git') собственно отвечает за саму команду, которая была получена на вход;
  2. (level == 0) определить уровень нужно для того, чтобы выполнялась конкретно команда git и не выполнялась команда типа hdsfb git;
  3. (len(command) == 3) т.к. в дальнейшем команда git будет использоваться еще во многих командах типа git copy Folder или git push Folder, поэтому определим просто команду git;

Опишем еще парочку команд, например команду копирования из секретной папки в рабочую

# определим git команду git copy Folder
if (x == 'git') and (level == 0) and (complete == ''):
    complete = 'git' #комплектуем git для дальнейшей обработки
    continue

elif (x == 'copy') and (level == 1) and (complete == 'git') and (len(commandDetail) - level) > 1:
    complete = 'copy'
    continue

elif (x != '') and (level == 2) and (complete == 'copy'):
    try:
        shutil.copytree(r'.secretFiles/{0}'.format(x), r'.{0}'.format(x))
        listsDirrectiry = os.listdir(r'.secretFiles/{}'.format(x))
        gitResult.append('Скопированные файлы:')
        for listsDirrectiryRead in listsDirrectiry:
            gitResult.append('- ' + listsDirrectiryRead)
    except FileNotFoundError:
        gitResult.append(err[1])
# опишем выход из программы 
elif (x == 'close') and (level == 0) and (len(command) == 5) and (complete == ''):
    exit()
# опишем обработку командных ошибок
else:
    print(err[0])
    gitResult = []
    break
# вывод в console
for readResult in gitResult:
    print(readResult)

Собственно говоря вот и вся суть программы на первом этапе. Очень хочу поделиться, чтобы получить критику от настоящих профессионалов.

Все коды с примерами вы можете взять на GitHub