Найти, что Mercurial commit изменил исполняемый бит в файле - PullRequest
4 голосов
/ 05 октября 2011

Я знаю, как использовать hg blame, чтобы найти, какой именно коммит изменил строку в файле, но я не могу найти аналогичный способ найти, когда исполняемый бит в файле был изменен.

Ответы [ 2 ]

16 голосов
/ 05 октября 2011

Во-первых, обратите внимание, что, поскольку изменения в бите exec не влияют на файл содержимое , как и удаления, они не обязательно будут отображаться как «hg log filename».(Ботаники Unix могут сравнить правила ctime / mtime для файлов и каталогов по отношению к rm / chmod, чтобы понять это различие.) Поэтому вам нужно будет использовать что-то вроде:

$ hg log --deleted file

, чтобы показать все наборов изменений, которые касаются файла, включают в себя изменения exec, удаления и дубликаты.Это не включено по умолчанию по разным причинам, включая то, что это может быть на порядок медленнее.

Поиск битов exec при просмотре журнала также будет означать, что патчи в стиле git рассматриваются как стандартные, совместимые с patch (1)патчи не знают о битах exec.Таким образом, команда total может выглядеть примерно так:

$ hg log --removed -pg contrib/simplemerge | grep "^new mode" -B 10
+    import os
     sys.exit(main(sys.argv))

changeset:   4363:2e3c54fb79a3
user:        Alexis S. L. Carvalho <alexis@cecm.usp.br>
date:        Mon Apr 16 20:17:39 2007 -0300
summary:     actually port simplemerge to hg

diff --git a/contrib/simplemerge b/contrib/simplemerge
old mode 100644
new mode 100755

Это гласит: «искать все git-патчи на simplemerge для строк, начинающихся с« new mode »и показывать предыдущие 10 строк».

Другой альтернативой является использование bisect.Это может быть использовано для поиска практически любых изменений, которые вы можете проверить.Например, если вы ищете, где установлен бит X:

$ hg bisect -g 1000  # some past revision without the X bit
$ hg bisect -b tip   # some recent revision with the X bit
Testing changeset 8114:ad3ba2de2cba (14179 changesets remaining, ~13 tests)
993 files updated, 0 files merged, 716 files removed, 0 files unresolved
$ hg bisect -c "[ ! -x contrib/simplemerge ]"  # shell expression returns 0 (good) if no x bit
Changeset 8114:ad3ba2de2cba: bad
Changeset 4566:087b3ae4f08a: bad
Changeset 2797:a3c6e7888abf: good
Changeset 3678:7e622c9a9707: good
Changeset 4121:d250076824e3: good
Changeset 4345:ec64f263e49a: good
Changeset 4454:28778dc77a4b: bad
Changeset 4403:15289406f89c: bad
Changeset 4371:d7ad1e42a368: bad
Changeset 4355:10edaed7f909: good
Changeset 4366:390d110a57b8: bad
Changeset 4363:2e3c54fb79a3: bad
Changeset 4361:99c853a1408c: good
Changeset 4362:465b9ea02868: good
The first bad revision is:
changeset:   4363:2e3c54fb79a3
user:        Alexis S. L. Carvalho <alexis@cecm.usp.br>
date:        Mon Apr 16 20:17:39 2007 -0300
summary:     actually port simplemerge to hg

Здесь мы автоматизировали тест со стандартным выражением оболочки Bourne для проверки бита exec файла, а затем Mercurial проходит проверкупроверок и тестирования для нас.

4 голосов
/ 05 октября 2011

Может не быть простого встроенного метода а-ля hg blame (или, может быть, есть, и я просто не знаю этого!), Но вы должны быть в состоянии использовать метод грубой силы, чтобы выследить набор изменений, глядя на различия.

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

[diff]
git = True

Затем вы можете просмотреть все различия для интересующего вас файла и найти коммит, который изменил режим, запустив:

hg log -p file_of_interest

Если вы работаете в системе * nix, это помогает направить на less или grep, чтобы легко найти результаты. Изменения режима должны отображаться чуть ниже начала строки патча, которая начинается с:

diff --git a/file_of_interest b/file_of_interest
old mode ....
new mode ....

Так, например, вы можете искать изменение режима с 644 (без exec) на 755 (установлен бит exec), в этом случае вы увидите что-то вроде:

old mode 100644
new mode 100755

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

Не так просто, как hg blame, но это должно работать в некоторой степени. Надеюсь, это поможет.

...