Формат файлов в папке .git/objects

- А не запилить ли мне свой .git с преферансом и блудницами, — подумал я. И запилил! По крайней мере, малюсенькую часть, а именно папку .git/objects. Формат хранения обычных файлов простой — берем sha1 от данных этого файла, создаем папку из первых двух символов этого хеша, а внутрь заливаем пакованные данные с именем оставшегося хеша.

Вот такой скрипт получился на питоне. Зачем делал — не спрашивайте, не знаю. :)

import os
import hashlib
import zlib
 
# Какие папки сканируем
directories = ( "D:\\resources", )
# Какие файлы учитываем
extensions = ( '.png', '.wav', '.jpg', '.dds' )
 
# Количество повторов
numDuplicates = 0
# Общее количество обработанных файлов
numFiles = 0
 
for directory in directories:
    for root, dirs, files in os.walk(directory):
        for filename in files:
            basename, ext = os.path.splitext(filename)
            full = os.path.join(root, filename)
            # Пропустим неизвестный файл
            if ext not in extensions:
                print 'Skip %s' % full
                continue
 
            # Понеслась!
            print 'Processing %s' % full,
 
            # Возьмем хеш от содержимого файлов
            data = open(full, 'rb').read()
            hash = hashlib.sha1(data).hexdigest()
            print '.. done'
 
            # Название папки - первые два символа от хеша
            prefix = hash[:2]
            # Название файла - остальные символы хеша
            postfix = hash[2:]
 
            # Создадим подпапку в папочке objects
            dirname = os.path.join('objects', prefix)
            if not os.path.isdir(dirname):
                os.makedirs(dirname)
 
            # Выходной файл с данными
            filename = os.path.join(dirname, postfix)
            if not os.path.isfile(filename):
                # Пишем данные, предварительно запаковав их с помощью zlib
                open(filename, 'wb').write(zlib.compress(data))
            else:
                # Такой файл уже есть, найден дубликат, куда смотрел дизайнер?!
                numDuplicates += 1
            numFiles += 1
 
# Краткий отчет
print 'Total: %d, duplicates: %d' % (numFiles, numDuplicates)
Комментариев нет. Будьте первым!
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Блог Евгения Жирнова