среда, 23 мая 2012 г.

Ubuntu 12.04: git, merge, mergetool, meld

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

Отмечу, что я уже давно традиционно разрешаю конфликты при слиянии и рибэйзе с помощью связки git mergetool и meld.

Разрешение конфликтов в Git

Краткий экскурс в процесс. Когда git в процессе слияния обнаруживает конфликты в файлах он прямо в этих же файлах устанавливает маркеры конфликтов в виде секций с разделителями "<<<<<<<" и ">>>>>>>". Нужно вручную убрать эти разделители и выбрать нужный код, после чего добавить файл в индекс git и сделать коммит. Конфликт считается разрешенным

Чтобы автоматизировать и облегчить процесс при большом количестве файлов, а также визуализировать различие в изменениях существует утилита git mergetool. Для каждого из конфликтных файлов она создает еще четыре вспомогательных служебных файла. На примере файла test.txt такими файлами будут:

  • test.txt.BACKUP.4071.txt - копия текущего файла test.txt (с маркерами конфликтов внутри)
  • test.txt.BASE.4071.txt - файл в ревизии, которая являющется базовой для обоих конфликтных версий
  • test.txt.LOCAL.4071.txt - "наша" версия файла
  • test.txt.REMOTE.4071.txt - "чужая" версия файла

После создания вспомогательных файлов mergetool вызывает любую указанную в параметрах команду и передает созданные файлы в качестве параметров. Это может быть консольная утилита автоматического слияния, полноценная GUI-программа для ручного слияния или любая другая команда. После того как устранение конфликтов в файле завершено mergetool сам добавляет файл в индекс и удаляет все вспомогательные файлы.

Я, как уже отметил ранее, использую в качестве такой команды утилиту meld.

Кто виноват?

Так вот - есть проблема. После обновления до 12.04 обновилось множество пакетов, в том числе и git и meld. Если раньше mergetool вызывал meld в режиме 2-way-merge, то сейчас meld вызываетcя в режиме 3-way-merge.

Ubuntu 11.10, Git 1:1.7.5.4-1, Meld 1.5.2-1ubuntu2

До обновления meld вызывался в режиме 2-way-merge. Это очень простой режим в котором все конфликты помечаются самим движком git, а meld используется только как удобный визуальный редактор. В трех панелях meld показываются три файла: "наш", конфликтный файл с маркерами конфликтов, "чужой" файл. Как я уже отметил, режим очень прост и в своей сути мало отличается от прямого редактирования конфликтного файла в любом текстовом редакторе.

Ubuntu 12.04, Git 1:1.7.9.5-1, Meld 1.5.3-1ubuntu1

После обновления Ubuntu новая версия meld вызывается (внезапно!) в режиме 3-way-merge. В этом режиме mergetool передает в meld три файла: "наш" файл, базовую для для обоих конфликтных версий ревизию файла, "чужой" файл. Сам конфликтный файл, в котором git сделал соответствующие метки конфликтов в утилиту не передается. Таким образом все сделанные в git маркеры конфликтов игнорируются, а весь процесс определения и разрешения конфликтов отдается на откуп самому meld.

Вот такой вот сюрприз. Есть люди, которым такое новое поведение видимо нравится. И действительно - в простейших случаях конфликты разрешать очень удобно: видно начальную версию файла до изменений, а также видно два последующих изменения, которые и привели к конфликту. В предыдущем же варианте вызова были видны только два изменения, оформленные в виде конфликтной секции - а вот что было до этих изменений (базовую версию) meld не показывал.

К сожалению, на практике новый режим работы meld к использованию не пригоден. Скорее всего дело в том, что git априори обладает более полной информацией о всех сделанных изменениях и, используя ее, git помечает конфликты точно и аккуратно, тогда же как meld вынужден работать только с тремя слепками файлов, а вся история ему недоступна.

Что делать?

К счастью, можно настроить mergetool как угодно и после этого не зависеть от изменений в запрограммированном по-умолчанию поведении git и mergetool. Сначала программируем оба варианта поведения и даем им уникальные имена.

git config --global mergetool.meld2way.cmd 'meld "$LOCAL" "$MERGED" "$REMOTE"'
git config --global mergetool.meld3way.cmd 'meld --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"'

После этого можно вызывать команды "git mergetool -t meld2way" и "git mergetool -t meld3way". Также можно указать установку старого поведения в качестве варианта по умолчанию.

git config --global merge.tool meld2way

После этого git mergetool/meld ведут себя также покладисто как и раньше.

вторник, 8 мая 2012 г.

Ubuntu 12.04 - новый софт

С новым дистрибутивом пришел и новый софт

  • В штатном репозитории появился MySQL Workbench. Старые инструменты работы с MySQL (Query, Admin) убраны
  • VLC 2.0.1 имеет проблему при работе с большим буфером. Я ставлю буфер на 5-10 секунд для предотвращения лагов на динамичных сценах с большим битрейтом при Wi-Fi подключении. Поставил новый VLC 2.1 - вроде таких проблем нет.
  • Новый Conky 1.8.1-6 теперь некорректно обрабатывает команды ${execi} - выводит "(null)" если период обновления больше чем uptime системы. Откомпилированной новой версии 1.9 в PPA не нашел, самому пакетировать лень. Пока сделал хак в конфиге и вручную заапдейтил до 1.9 (но можно и задаунгрейдить до 1.8.1-2).
  • Кто-то срет при загрузке системы в домашнюю директорию файлами .goutputstream
  • Уровень подсветки у меня так же не сохраняется (как и в 11.10) при перезагрузке. Более того теперь иногда не помогает даже "cat 5 > /sys/class/backlight/acpi_video0/brightness" в rc.local - видимо при загрузке иксов кто-то некорректно переустанавливает уровень. Поставил из репы утилитку xbacklight и прописал ее в автозагрузку Unity благо прав суперпользователя она не требует в отличие от прямой записи в "/sys/*".

Текущий конфиг Conky

# Conky configuration file (~/.conkyrc)
# http://ubuntudrom.blogspot.com/search/label/conky

own_window yes
own_window_type override
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
own_window_colour brown

alignment top_right
minimum_size 240 700
maximum_width 240
gap_x 20
gap_y 40

double_buffer yes
use_spacer right
use_xft yes

update_interval 2.0
update_interval_on_battery 5.0
cpu_avg_samples 2

draw_shades no
draw_outline no
draw_graph_borders yes
draw_borders no
stippled_borders 0
border_width 0
border_inner_margin 10
border_outer_margin 0

default_color grey
default_bar_size 10 60

xftfont ubuntu:size=8
xftalpha 1
text_buffer_size 512

imlib_cache_size 4194304
imlib_cache_flush_interval 10

uppercase no
format_human_readable yes

top_name_width 18
top_cpu_separate false

TEXT
# ------ System
${time} ${alignr} ${nodename}
Kernel: ${kernel} ${alignr} Uptime: ${uptime}

# ------ Weather
# http://info.weather.yandex.net/yoshkar-ola/2_white.png
# http://info.weather.yandex.net/moscow/2_white.png
${color orange}Weather${color}
${execi 600 wget -q --timeout=10 -O- "http://info.weather.yandex.net/moscow/2_white.png" | convert -crop "200x54+0+28" -alpha Activate -channel alpha -evaluate multiply 0.7 "png:-" "png:${HOME}/.conkyweather" }
${voffset 18}
${alignc}${image ~/.conkyweather -f 30 -p 20,58}

# ------ CPU
${color orange}CPU${color}
Total: ${cpu cpu0}% ${alignr} Temp: ${acpitemp}°C
${alignc}${cpugraph 0 20,240 e5e5e5 F1AA0E}
${freq_g 1}GHz${goto 74}${freq_g 2}GHz${goto 136}${freq_g 3}GHz${goto 198}${freq_g 4}GHz
${cpugraph 1 10,52 e5e5e5 F1AA0E}${goto 74}${cpugraph 10,52 e5e5e5 F1AA0E}${goto 136}${cpugraph 3 10,52 e5e5e5 F1AA0E}${goto 198}${cpugraph 4 10,52 e5e5e5 F1AA0E}
${voffset 2}
Load: ${loadavg}
${alignc}${loadgraph 20,240 e5e5e5 F1AA0E}
${top name 1}${goto 120}${top pid 1}${goto 150}${top cpu 1}${goto 180}${top mem 1}${goto 210}${top time 1}
${top name 2}${goto 120}${top pid 2}${goto 150}${top cpu 2}${goto 180}${top mem 2}${goto 210}${top time 2}

# ------ Memory
${color orange}Memory${color}
Used: ${mem} / ${memmax} (${memperc}%) ${alignr} Swap: ${swapperc}%
${memgraph 20,170 e5e5e5 F1AA0E} ${alignr} ${swapbar 20,60}
${top_mem name 1}${goto 120}${top_mem pid 1}${goto 150}${top_mem cpu 1}${goto 180}${top_mem mem 1}${goto 210}${top_mem time 1}
${top_mem name 2}${goto 120}${top_mem pid 2}${goto 150}${top_mem cpu 2}${goto 180}${top_mem mem 2}${goto 210}${top_mem time 2}

# ------ Disk
${color orange}Disk${color}
${alignc}${diskiograph /dev/sda 20,240 e5e5e5 F1AA0E}
root: ${fs_used_perc /}% ${alignr} ${fs_bar 10,180 /}

# ------ Network
${if_up wlan0}\
${if_existing /sys/class/net/wlan0/operstate up}\
${color orange}Network${color} ${alignr} wlan0: ${addr wlan0}
essid: ${wireless_essid wlan0} (${wireless_bitrate wlan0}) ${alignr} q: ${wireless_link_qual_perc wlan0}
${downspeedgraph wlan0 20,110 e5e5e5 F1AA0E} ${alignr} ${upspeedgraph wlan0 20,110 e5e5e5 F1AA0E}
<< ${totaldown wlan0} / ${downspeed wlan0} ${alignr} ${totalup wlan0} / ${upspeed wlan0} >>

${endif}\
${endif}\
${if_up eth0}\
${if_existing /sys/class/net/eth0/operstate up}\
${color orange}Network${color} ${alignr} eth0: ${addr eth0}
${downspeedgraph eth0 20,110 e5e5e5 F1AA0E} ${alignr} ${upspeedgraph eth0 20,110 e5e5e5 F1AA0E}
<< ${totaldown eth0} / ${downspeed eth0} ${alignr} ${totalup eth0} / ${upspeed eth0} >>

${endif}\
${endif}\
\
# ------ Battery
${if_existing /proc/acpi/battery/BAT0/info}\
${color orange}Battery${color}
cap: ${battery_percent BAT0}% ${alignr} ${battery_bar 10,180 BAT0}
${endif}\
\
# ------ Misc

пятница, 4 мая 2012 г.

Ubuntu 12.04 - энергопотребление

По всей видимости в новой Ubuntu 12.04 с новым же ядром 3.2 наконец-то пофиксили позорную проблему с энергопотреблением последних версий ядра на лэптопах. Посмотрел на своем Asus - среднее потребление в простое стало 12-14W/h вместо 17-18W/h

С другой стороны average load стал гораздо выше - и это визуально видно по всем приборам. Старшие говорят, что есть проблема в ядре и обещали разобраться.

четверг, 3 мая 2012 г.

Ubuntu 12.04

Обновил рабочий десктоп до версии 12.04

  • Guake все так же некорректно вычисляет свою ширину при фиксированном лаунчере. Фиксить так же как и раньше.
  • Установленный ранее консольный шрифт Monospaced 9 превратился во что-то отвратительно-нечитаемое. Сильно расстроился, но потом нашел, что надо просто в глобальных настройках поставить в качестве моноширийного шрифт DejaVu Sans Mono 9 - все стало так же как и раньше
  • Шрифт в чате Skype стал ужасным. Оказалось надо установить пакет qt4-qtconfig и с помощью утилиты qtconfig-qt4 установить (главное не забыть про команду save) стандартный шрифт Ubuntu.
  • Клавиша Alt теперь вызывает HUD. Полезность пока сомнительна, а недостаток налицо - в mc невозможно выполнить команду "Alt+." и другие команды с модификатором Alt. Отключается в настройках плагина Unity в Compiz Settings Manager. Я пока перекинул команду вызова HUD на "Super+Q".
  • Клавиша F10 теперь вызывает контекстное меню. Соответственно в mc, htop и других консольных утилитах использовать ее нельзя и просто отключить ее в настройках терминала уже не выйдет, потому как это поведение стало ключевой фичей GTK3. Решение проблемы заключается в создании специального файла настроек GTK3
  • Хинтинг кириллических шрифтов местами стал очень странным (по крайней мере в Firefox). Похоже замешан шрифт Arial, но я пока еще до конца не понял в чем дело.
  • Вот такой файлик в Firefox неправильно рендерит лигатуру "бл":
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        </head>
        <body>
            <div style="font-family: Arial; font-size: 13px;">Бла, бла, бла</div>
        </body>
    </html>
    
  • Вроде все грузится быстрее. Падений пока не замечено.

UPD1: Проверил хинтинг под Firefox 12 && Ubuntu 11.10 - все то же самое.