-
bash에서 Git 저장소 파일내용 추가하기웹개발/시리얼통신 2019. 4. 17. 16:58
git api를 이용해서 git 저장소 파일 내용을 새로운 내용으로 업데이트하는 것을 했었다.
그런데 새로운 문자열을 기존파일에 추가하는 api는 따로 없는 듯하다.
update 엔드포인트를 그대로 이용하되 업데이트하는 내용을 기존내용+추가내용으로 보내는 방법으로 시도했다.
잘되긴하는데 절차가 번거롭다
설정파일yml에 새로운 문자열(새로운 설정)을 추가하는 상황이다.
원래 bash라는 값만 있던 파일에 append라는 값을 새로 추가하는 과정이다.
기존내용과 새로운 내용 사이에 엔터 개행이 되어야한다.
1 기존 content를 불러와 디코딩한후 변수에 저장
처음 시도할때는 기존 content를 불러와 새로운 내용을 base64 인코딩후 append하면 된다고 생각했다.
그런데 그러면 안된다....
왜냐면 base64인코딩 방식이 원래 문자열과 1:1대응되지 않고 원본을 통채로 인코딩하는 방식이기에
인코딩 결과일부가 원본 일부와 대응한다고 보면 안된다.
인코딩 결과는 더이상 쪼갤수없는 단위로 봐야한다.
따라서 content를 불러와서 디코딩한후 추가하려는 문자열과 합쳐 인코딩해야한다..
$ result=$(echo $(cURL -X GET https://api.github.com/repos/유저이름/저장소이름/contents/파일명|jq -r .content)|base64 --decode)
curl로 content값을 불러와 ""는 제외해주고(jq다음의 -r) 디코딩한 값을 result라는 변수에 저장했다.
2 추가할 문자열을 변수에 저장한다.
$ str='append : this is the appended property'
3 1과 2의 결과 사이에 \n 개행하여 base64 인코딩한 결과를 저장
raw라는 변수에 1에서 만든 result와 2에서 만든 str변수값 사이에 개행을하고 base64로 인코딩하라는 명령이다.
-e를 넣어준 이유는 \n 개행명령을 문자열로 해석하지 말라는 뜻이다. -e가 없으면 역슬래쉬+n이라는 문자열그대로 인식된다.
$ raw=$(echo -e $result\n$str|base64)
YmFzaCA6IHRoaXMgaXMgZnJvbSBiYXNoblxuYXBwZW5kIDogdGhpcyBpcyB0aGUgYXBwZW5kZWQg cHJvcGVydHkK
변수 raw를 불러온 결과이다. 왜인지는 모르지만 중간에 공백이 생겼다.
중간에 공백이 있으면 나중에 전송할때 JSON parsing 오류가 난다. 공백을 없앤다고 해서 원본이 달라지는것도 아니므로 공백을 없애주기로 한다.
4 3의 결과에서 공백을 없앰
$ raw=$(echo $raw|sed "s/ //g")
echo 문자열|sed "s/바꿀문자열/새로운문자열/g" : 문자열에 포함된 바꿀문자열 모두 새로운 문자열로 바꾸라는 명령
공백을 삭제하는 명령이다. g가 없으면 최초의 공백 1개만 제거한다.
5 curl로 git 저장소파일 업데이트
cURL -i -X PUT -H "Authorization: token 내토큰값" -d "{\"message\": \"커밋메세지\", \"content\": \"$raw\", \"sha\": $(cURL -X GET https://api.github.com/repos/유저이름/저장소명/contents/파일명|jq .sha)}" https://api.github.com/repos/유저이름/저장소명/contents/파일명
JSON 파싱오류가 날 경우 {"key":"value",...} JSON 고유의 형식이 지켜지고 있는지 확인하자.
예를들어
"key":"value"trashstring, ...
더블쿼트안에 값이 제대로 안들어간 경우
"key":value
값이 더블쿼트안에 있지 않은 경우
"key1":"value1" "key2":"value2"
키값쌍 사이에 ,로 분리되지 않은경우
등등
JSON 파싱이 안되는 원인은 다양하지만 아무튼 형식이 안지켜진것.
value가 명령어로 구성된 경우 컴파일 결과를 볼수없어 어디가 틀렸는지 알아내기 쉽지않을수도 있다.
'웹개발 > 시리얼통신' 카테고리의 다른 글
bash 변수선언시 띄어쓰기 주의 (0) 2019.04.17 bash command안에서 base64로 텍스트 인코딩하기 (0) 2019.04.16 윈도우에 jq(JSON Parser) 설치 (0) 2019.04.16 댓글