Если удалить ветку через веб-интерфейс, она остается в локальном репозитории даже если
git fetch origin
Для очистки от удаленной ветки нужно использовать опцию --prune
git remote prune origin --dry-run (для проверки) или
git fetch origin --prune
Ссылки
четверг, 27 июня 2019 г.
Python generate ssh key for server ssh access
Установка
pip3 install pycryptodome
Пример:
from os import chmod
from Crypto.PublicKey import RSA
key = RSA.generate(4096)
with open("id_rsa", 'wb') as content_file:
chmod("id_rsa", 0o600)
content_file.write(key.exportKey('PEM'))
pubkey = key.publickey()
with open("id_rsa.pub", 'wb') as content_file:
chmod("id_rsa.pub", 0o600)
content_file.write(pubkey.exportKey('OpenSSH'))
exportKey('PEM') exportKey('OpenSSH') PEM формат нужен для приватного ключа, OpenSSH - для паблик ключа.
В chmod permissions указаны в соответствии python-дружественным синтаксисом 0o600.
pip3 install pycryptodome
Пример:
from os import chmod
from Crypto.PublicKey import RSA
key = RSA.generate(4096)
with open("id_rsa", 'wb') as content_file:
chmod("id_rsa", 0o600)
content_file.write(key.exportKey('PEM'))
pubkey = key.publickey()
with open("id_rsa.pub", 'wb') as content_file:
chmod("id_rsa.pub", 0o600)
content_file.write(pubkey.exportKey('OpenSSH'))
exportKey('PEM') exportKey('OpenSSH') PEM формат нужен для приватного ключа, OpenSSH - для паблик ключа.
В chmod permissions указаны в соответствии python-дружественным синтаксисом 0o600.
среда, 26 июня 2019 г.
Python OptionParser парсер аргументов строки запуска приложения
link
if __name__ == "__main__":
parser = OptionParser()
group = OptionGroup(parser, "Merge Options",
"By default, only issues with status "
"['To Test' and 'Pending'] will be merged")
group.add_option("--merge-status-in-progress",
action="store_true",
dest="merge_in_progress",
default=False,
help="Merge issue branches with status"
"In progress + 100 % [default: False]")
group.add_option("--merge-all-outdated-branches",
action="store_true",
dest="merge_all_outdated_branches",
default=False,
help="Merge all outdated branches")
parser.add_option_group(group)
(options, args) = parser.parse_args()
if options.merge_all_outdated_branches:
sys.exit(merge_outdated_branches())
sys.exit(auto_merge(options.merge_in_progress))
Запуск app-merge.py --merge-status-in-progress и без опции вызовет выполнение функции auto_merge(), app-merge.py --merge-all-outdated-branches вызовет выполнение функции merge_outdated_branches()
action="store_true" аргумент без параметров (--a)
if __name__ == "__main__":
parser = OptionParser()
group = OptionGroup(parser, "Merge Options",
"By default, only issues with status "
"['To Test' and 'Pending'] will be merged")
group.add_option("--merge-status-in-progress",
action="store_true",
dest="merge_in_progress",
default=False,
help="Merge issue branches with status"
"In progress + 100 % [default: False]")
group.add_option("--merge-all-outdated-branches",
action="store_true",
dest="merge_all_outdated_branches",
default=False,
help="Merge all outdated branches")
parser.add_option_group(group)
(options, args) = parser.parse_args()
if options.merge_all_outdated_branches:
sys.exit(merge_outdated_branches())
sys.exit(auto_merge(options.merge_in_progress))
action="store_true" аргумент без параметров (--a)
action="store" аргумент с параметрами (--a 10)
Python форматирование даты
Дату из формата 2019-06-25T09:10:50 +0000 преобразовать в формат 25-06-2019
import datetime
datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y")
переменную v iso формата преобразуем в нужный формат %d-%m-%Y (+0000 - это %z)
Пример со сравнением дат:
current_date = datetime.datetime.now()
# дата старше на две недели в iso формате
curr_time_minus_two_weeks = datetime.datetime.isoformat(current_date - timedelta(weeks=2))
for br in branches:
branches = project.branches.list(all=True)
for k, v in br.commit.items():
# check whether commited date older tnan current date in two weeks
if k == "committed_date" and v < curr_time_minus_two_weeks:
logger.info("Branch: %s", br.name)
logger.info("committed date %s is older than two weeks ago %s", datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y"), datetime.datetime.strptime(curr_time_minus_two_weeks, '%Y-%m-%dT%H:%M:%S.%f').strftime("%d-%m-%Y"))
import datetime
datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y")
переменную v iso формата преобразуем в нужный формат %d-%m-%Y (+0000 - это %z)
Пример со сравнением дат:
current_date = datetime.datetime.now()
# дата старше на две недели в iso формате
curr_time_minus_two_weeks = datetime.datetime.isoformat(current_date - timedelta(weeks=2))
for br in branches:
branches = project.branches.list(all=True)
for k, v in br.commit.items():
# check whether commited date older tnan current date in two weeks
if k == "committed_date" and v < curr_time_minus_two_weeks:
logger.info("Branch: %s", br.name)
logger.info("committed date %s is older than two weeks ago %s", datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f%z').strftime("%d-%m-%Y"), datetime.datetime.strptime(curr_time_minus_two_weeks, '%Y-%m-%dT%H:%M:%S.%f').strftime("%d-%m-%Y"))
PHP Laravel add user
Задача добавить нового юзера в приложение
php artisan tinker
>>> DB::table('users')->insert(['name'=>'MyUsername','email'=>'thisis@myemail.com','password'=>Hash::make('123456')])
вторник, 25 июня 2019 г.
вторник, 18 июня 2019 г.
Linux nginx proxy_pass
Make port with basic http authentication for json requests
server {
listen 3001;
location /
{
access_log off;
error_log /var/log/nginx/error_gateway.log;
auth_basic "gateway";
auth_basic_user_file /etc/nginx/gateway;
default_type application/json;
proxy_pass http://127.0.0.1:3000;
}
}
server {
listen 3001;
location /
{
access_log off;
error_log /var/log/nginx/error_gateway.log;
auth_basic "gateway";
auth_basic_user_file /etc/nginx/gateway;
default_type application/json;
proxy_pass http://127.0.0.1:3000;
}
}
Python gitlab branches
List of branches with excluding protected branches and cherry-pick hotfix revert patch words in name of branches
gitlab_abc = gitlab.Gitlab(GITLAB_URL, TOKEN, api_version=4)
project = gitlab_abc.projects.get(ABC_PROJECT)
branches = project.branches.list(all=True)
for br in branches:
if not(br.protected) and "cherry-pick" not in br.name and "revert" not in br.name and "hotfix" not in br.name and "patch" not in br.name:
print("br.name: ", br.name)
for k, v in br.commit.items():
if k == "committed_date":
print("committed_date: ", v)
gitlab_abc = gitlab.Gitlab(GITLAB_URL, TOKEN, api_version=4)
project = gitlab_abc.projects.get(ABC_PROJECT)
branches = project.branches.list(all=True)
for br in branches:
if not(br.protected) and "cherry-pick" not in br.name and "revert" not in br.name and "hotfix" not in br.name and "patch" not in br.name:
print("br.name: ", br.name)
for k, v in br.commit.items():
if k == "committed_date":
print("committed_date: ", v)
br.name: issue-1234
committed_date: 2019-05-15T14:39:35.000+00:00
четверг, 13 июня 2019 г.
пятница, 7 июня 2019 г.
Node debug app.js
В помощь по отлову ошибок
node --inspect app.js
node --inspect app.js
help покажет доступные команды,
run - запустить приложение,
n (next) - выполнять строка за строкой
.exit - выйти
четверг, 6 июня 2019 г.
Facebook Permanent Page Access Token
Для скрипта, который отслеживает новые сообщения на странице, нужно получить постоянный токен (маркер в русском переводе)
Я добавлен в администраторы https://developers.facebook.com для нужного мне приложения.
Использую этот мануал https://stackoverflow.com/questions/17197970/facebook-permanent-page-access-token
1) Get Short-Lived Access Token
На этой странице, в инструментах https://developers.facebook.com/tools/accesstoken/ , есть краткосрочный токен/маркер
2) Generate Long-Lived Access Token (long_lived_access_token)
Если там нажать отладка/debug можно увидеть срок действия, если краткосрочный, то будет активна кнопка продлить маркер дотупа/токен. Поэтому второй пункт прошел не так как в мануале
3) Get User ID (account_id)
там же в отладке видно user ID
4) Get Permanent Page Access Token
https://graph.facebook.com/v2.10/{account_id}/accounts?access_token={long_lived_access_token}
В отладчике https://developers.facebook.com/tools/debug/accesstoken проверить статус
Отладка новых сообщений:
{app_id}/conversations?fields=updated_time,senders,unread_count
запускать с Permanent Page Access Token
Я добавлен в администраторы https://developers.facebook.com для нужного мне приложения.
Использую этот мануал https://stackoverflow.com/questions/17197970/facebook-permanent-page-access-token
1) Get Short-Lived Access Token
На этой странице, в инструментах https://developers.facebook.com/tools/accesstoken/ , есть краткосрочный токен/маркер
2) Generate Long-Lived Access Token (long_lived_access_token)
Если там нажать отладка/debug можно увидеть срок действия, если краткосрочный, то будет активна кнопка продлить маркер дотупа/токен. Поэтому второй пункт прошел не так как в мануале
3) Get User ID (account_id)
там же в отладке видно user ID
4) Get Permanent Page Access Token
https://graph.facebook.com/v2.10/{account_id}/accounts?access_token={long_lived_access_token}
В отладчике https://developers.facebook.com/tools/debug/accesstoken проверить статус
Отладка новых сообщений:
{app_id}/conversations?fields=updated_time,senders,unread_count
запускать с Permanent Page Access Token
Подписаться на:
Сообщения (Atom)