svn возвращает недопустимый управляющий символ «0x0d» в пути «Icon\015» при попытке добавить файл пользовательского значка Mac

У меня есть проект, который создает образ диска и хотел бы использовать собственный значок для загруженного тома. У меня есть файл .VolumeIcon.icns, который выглядит великолепно, но чтобы его использовать в Finder, мне пришлось включить пустой файл с именем Icon^M (Icon\r, Icon‹cr>). Мой пользовательский значок появляется, и все работает отлично.

Кроме. Когда я пытаюсь проверить файл Icon^M в моем репозитории svn, я получаю:

svn: Invalid control character '0x0d' in path 'Icon\015'

Subversion имеет более строгие стандарты имен файлов, чем Mac, и разумно не допускает возврата каретки. Эта проблема обсуждалась в старой ветке списка рассылки svn, и было рекомендовано просто создать файл с помощью сценария оболочки как часть процесса сборки. Я мог бы сделать это, но мой процесс сборки сейчас очень прост, и я не хочу усложнять его.

Есть ли более элегантное решение?


person blahdiblah    schedule 09.06.2011    source источник
comment
какого черта у тебя вообще \r в имени файла?   -  person Ярослав Рахматуллин    schedule 21.06.2011
comment
Я думаю, это было неясно из моего описания. Файл Iconr\r является пережитком MacOS 9 для информации о пользовательских значках. В этом случае он не используется напрямую, но его присутствие вызывает использование файла .VolumeIcon.icns, который в противном случае игнорируется. Правильный способ сделать собственный значок — SetFile -a C <volume>, но я делаю эти изображения на компьютере с Linux с mkisofs и не имею SetFile.   -  person blahdiblah    schedule 21.06.2011


Ответы (5)


Я думаю, ты облажался. Что вы используете для сборки сейчас? Я снимаю шляпу перед любым, кто может предложить лучший ответ, чем тот, который вы сами предложили - написать его в сборке.

person thekbb    schedule 23.06.2011

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

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

По сути, я создал 3 сценария для решения проблемы с иконкой Mac\r.

  1. repoMacPrepare.sh
  2. repoMacRestore.sh
  3. gitAliasScript.sh

Эти три скрипта используются для добавления значков Mac в формате, который git или svn могут принять и сохранить. Первый сценарий подготавливает репозиторий для поиска файлов на основе значков в каталогах и пользовательских форматов значков в файлах. Затем сохраняет их как .jdIcnd или .jdIcnf (d для каталога f для папки) в соответствующих путях.

Второй сценарий позволяет вернуть его к жизни на Mac путем поиска файлов .jdIcnd и .jdIcnf.

Последний скрипт показывает, как автоматизировать процесс. Я использую псевдоним для git, который ссылается на скрипт gitAliasScript.sh в моем файле .bashrc. Теперь я переключился на git (лучшее, что я сделал), поэтому скрипт показан для git, но основы такие же, как и в svn. Я надеюсь, что это поможет пользователям Mac, использующим системы управления версиями, которые не потеряют свои значки в процессе регистрации или проверки. Также обратите внимание, что у тех, кто не использует этот скрипт, не будет проблем, поскольку значки хранятся в виде двоичных файлов с префиксом в виде точки, что делает их невидимыми. Ооо да...

файл: repoMacPrepare.sh

#! /bin/bash
#
# Author: Joshua Demori
# Email: [email protected]
#
# This script is used to prepare a repository
# to still record the Icons used on a mac for files or directories
#
# First
# DeRez Icon^M > .IconCntrlR
# (hit control-v then enter to get the carriage return vi)
# 
# Store in Repository
# then to bring back
# Rez -append IconCopy -o Icon
# # may need to set the Folders Icon Info
# SetFile -a C /Path/To/Custom/Folder/With/Icon/
# 
# if I need to SetFile the folder I can do this 2 ways
# a main file which has all this data at base of repository (bad)
# as it finds those files it does the folder below it
#
#

#=======================================================#
# Defines
readonly  VERSION=1.00

#=======================================================#
# Variables
varVerbose=false

#=======================================================#
# Functions
setupDirIcon () {
    DeRez "${file}"/Icon
 > "${file}"/.Icon.jdIcnd
if [ $varVerbose == true ]; then
    echo Adding Icon File: "$file"/.Icon.jdIcnd
fi
}


setupFileIcon () {
    base=`basename "$file"` 
    path=`dirname "$file"`  
    DeRez "$file" > "${path}"/."${base}".jdIcnf
if [ $varVerbose == true ]; then
    echo Adding Icon File: "$file"/."${base}".jdIcnf
fi
}

# cmd line functions
function funcOptionVersion {
    echo "Reposiotry Mac Icon Preperation Script Version: $VERSION"
    exit 0
}


function funcOptionHelp {
    name=`basename $0`
    echo $name Help Screen
    echo '-h help'
    echo '-v verbose'
    echo '-n version'
    echo ' '
    exit 0
}

function funcOptionVerbose {
    varVerbose=true
}


#=======================================================#
# process cmd line arguments
while getopts "vhn" optionName; do
case "$optionName" in
n) funcOptionVersion ;;
h) funcOptionHelp ;;
v) funcOptionVerbose ;;
[?]) printErrorHelpAndExit "$badOptionHelp";;
esac
done

#=======================================================#
#=======================================================#
# Start main portion of script

# ignore . .DS_Store .git folders and files
find . | grep -v ^.$ | grep -v .DS_Store | grep -v .git | grep -v .svn | while read file
do

# does this file have an icon attribute
GetFileInfo -a "$file" | grep C > /dev/null
if [ $? = 0 ]; then
    if [ -d "$file" ]; then
        setupDirIcon
    else
        setupFileIcon
    fi
fi # end if for icon test

done

# Remove Only the Icon file used by directories
echo Removing Icon File

if [ $varVerbose == true ]; then
    find . -name Icon
 -print -exec rm {} \;
else
    find . -name Icon
 -exec rm {} \;
fi

файл: repoMacRestore.sh

#! /bin/bash
#
# Author: Joshua Demori
# Email: [email protected]
#
# This Script complemnts xxxx by reversing the icons as derez to rez
# then setting the proper file attributes to view the icons
#
# First
# DeRez Icon^M > .IconCntrlR
# (hit control-v then enter to get the carriage return vi)
# 
# Store in Repository
# then to bring back
# Rez -append IconCopy -o Icon
# # may need to set the Folders Icon Info
# SetFile -a C /Path/To/Custom/Folder/With/Icon/
# 
# if I need to SetFile the folder I can do this 2 ways
# a main file which has all this data at base of repository (bad)
# as it finds those files it does the folder below it
#
#


#=======================================================#
# Defines
readonly  VERSION=1.00

#=======================================================#
# Variables
varVerbose=false

#=======================================================#
# Functions
# cmd line functions
function funcOptionVersion {
  echo "Repository Mac Icon Restore Script Version: $VERSION"
  exit 0
}


function funcOptionHelp {
  name=`basename $0`
  echo $name Help Screen
  echo '-h help'
  echo '-v verbose'
  echo '-n version'
    echo ' '
  exit 0
}

function funcOptionVerbose {
    varVerbose=true
}


#=======================================================#
# process cmd line arguments
while getopts "vhn" optionName; do
case "$optionName" in
n) funcOptionVersion ;;
h) funcOptionHelp ;;
v) funcOptionVerbose ;;
[?]) printErrorHelpAndExit "$badOptionHelp";;
esac
done


#=======================================================#
#=======================================================#
# Start main portion of script


#=======================================================#
# Go thourgh directories
find . -name *.jdIcnd |  while read file
do

# is it a dir - restore dir icon
echo "$file" | grep jdIcnd
if [ $? = 0 ]; then
    if [ $varVerbose == true ]; then
        echo Fixing Directory Icon: "$file"
    fi
    path=`dirname "$file"`  
    Rez "$file" -o "${path}"/Icon
    SetFile -a V "${path}"/Icon
    SetFile -a C "${path}"
fi

done

# Go thourgh files
# is it a file - restore file icon
find . -name *.jdIcnf |  while read file
do
echo "$file" | grep jdIcnf
if [ $? = 0 ]; then
    path=`dirname "$file"`
    base=`basename "$file"`
    origFileName=`echo "$base" | sed 's/\.jdIcnf//'`
    origFileName=`echo "${origFileName:1}"`
    fileWithPath="${path}"/"${origFileName}"
    if [ $varVerbose == true ]; then
        echo Restoring File Icon: "$path"
    fi
    #echo origFileName: "$origFileName"
    #echo filesWithPath: "$fileWithPath"
    Rez -append "$file" -o "$fileWithPath"
    SetFile -a C "$fileWithPath"
fi

done

gitAliasScript.sh

#! /bin/bash

found=false
args=("$@")
for var in "$@"
do
    x=`echo $var | grep -ic commit`
    if [ $x == 1 ]; then
        # prepare icons to be saved
        # add them to repository
        # at the end git is run
        repoMacPrepare.sh
        find . -name *.jdIcnd -exec git add {} \;
        find . -name *.jdIcnf -exec git add {} \;
        found=true
    fi
done

#runs git cmd here
cmdPart='git '
cmd=${cmdPart}${@}
$cmd

# finish by bringing back icons
# if commit was called
if [ $found == true ]; then
    repoMacRestore.sh
fi

exit 0
person Joshua Demori    schedule 22.03.2012

Я предполагаю, что размещение файла в архиве, таком как tar, позволит вам загрузить его. Позвольте мне посмотреть, действительно ли это работает... похоже, я прав:

$ touch  hello^Mhaha
$ svn add hello^Mhaha 
svn: Invalid control character '0x0d' in path 'hello\015haha'
$ tar cf hellorhaha.tar hello^Mhaha 
$ svn add hellorhaha.tar 
A  (bin)  hellorhaha.tar

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

person Ярослав Рахматуллин    schedule 17.06.2011
comment
Это все еще оставляет меня с добавлением шага распаковки в процесс сборки. - person blahdiblah; 17.06.2011
comment
Обновлена ​​ссылка на руководство: svnbook. red-bean.com/en/1.7/ - person Peter Hosey; 09.04.2013
comment
Subversion не допускает CR в именах файлов. См. третий абзац по ссылке (что в имени) @PeterHosey. - person Ярослав Рахматуллин; 09.04.2013

Это происходит со мной, потому что был файл значка без расширения (в данном случае .png), после того, как я переименовал файл значка в Icon.png, все было в порядке :)

person Chamira Fernando    schedule 10.02.2014

Сделайте копию ~/.subversion/config Затем отредактируйте ~/.subversion/config, сначала найдя строку, которая выглядит так:

global-ignores = *.o *.lo *.la *.al .libs *.so .so.[0-9] *.a *.pyc *.pyo

Затем добавьте после этого новую строку в конфиг:

глобальное игнорирование = Значок?

Сохраните файл конфигурации. При этом будут игнорироваться все файлы, имя которых начинается с «Значок» плюс один дополнительный символ.

Не так хорошо, как игнорировать, игнорируя именно то, как называется этот файл. Но работает с оговоркой.

person tim    schedule 22.04.2014