diff --git a/README.md b/README.md
index 195a81c..17490c8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-
+
## Standard Notes Extensions - Self-Hosted Repository
Host Standard Notes extensions on your own server. This utility parses most of the open-source extensions available from original repository as well as from other authors and builds an extensions repository which then can be plugged directly into Standard Notes Web/Desktop Clients. (https://standardnotes.org/)
diff --git a/build_repo.py b/build_repo.py
index c2e7c51..a4f0a1e 100644
--- a/build_repo.py
+++ b/build_repo.py
@@ -20,6 +20,7 @@ from zipfile import ZipFile
import requests
import yaml
+
def get_environment(base_dir):
"""
Parse the environment variables from .env
@@ -29,18 +30,21 @@ def get_environment(base_dir):
github:
username:
token:
- """, Loader=yaml.FullLoader)
+ """,
+ Loader=yaml.FullLoader)
if os.path.isfile(os.path.join(base_dir, ".env")):
with open(os.path.join(base_dir, ".env")) as temp_env_file:
temp_envvar = yaml.load(temp_env_file, Loader=yaml.FullLoader)
return temp_envvar
+
def process_zipball(repo_dir, release_version):
"""
Grab the release zipball and extract it without the root/parent/top directory
"""
- with ZipFile(os.path.join(repo_dir, release_version) + ".zip", 'r') as zipball:
+ with ZipFile(os.path.join(repo_dir, release_version) + ".zip",
+ 'r') as zipball:
for member in zipball.namelist():
# Parse files list excluding the top/parent/root directory
filename = '/'.join(member.split('/')[1:])
@@ -50,13 +54,18 @@ def process_zipball(repo_dir, release_version):
if filename.startswith('.'): continue
source = zipball.open(member)
try:
- target = open(os.path.join(repo_dir, release_version, filename), "wb")
+ target = open(
+ os.path.join(repo_dir, release_version, filename), "wb")
with source, target:
- target = open(os.path.join(repo_dir, release_version, filename), "wb")
+ target = open(
+ os.path.join(repo_dir, release_version, filename),
+ "wb")
shutil.copyfileobj(source, target)
except FileNotFoundError:
# Create the directory
- os.makedirs(os.path.dirname(os.path.join(repo_dir, release_version, filename)))
+ os.makedirs(
+ os.path.dirname(
+ os.path.join(repo_dir, release_version, filename)))
continue
# Delete the archive zip
os.remove(os.path.join(repo_dir, release_version) + ".zip")
@@ -76,24 +85,29 @@ def git_clone_method(ext_yaml, public_dir, ext_has_update):
ext_last_commit = (run([
'git', '--git-dir=' +
os.path.join(public_dir, '{}_tmp'.format(repo_name), '.git'),
- 'rev-list', '--tags', '--max-count=1'], stdout=PIPE, check=True).stdout.decode('utf-8').replace("\n", ""))
+ 'rev-list', '--tags', '--max-count=1'
+ ],
+ stdout=PIPE,
+ check=True).stdout.decode('utf-8').replace(
+ "\n", ""))
ext_version = run([
'git', '--git-dir',
os.path.join(public_dir, '{}_tmp'.format(repo_name), '.git'),
- 'describe', '--tags', ext_last_commit], stdout=PIPE, check=True).stdout.decode('utf-8').replace("\n", "")
+ 'describe', '--tags', ext_last_commit
+ ],
+ stdout=PIPE,
+ check=True).stdout.decode('utf-8').replace("\n", "")
# check if the latest version already exist
- if not os.path.exists(
- os.path.join(repo_dir, ext_version)):
+ if not os.path.exists(os.path.join(repo_dir, ext_version)):
ext_has_update = True
shutil.move(
os.path.join(public_dir, '{}_tmp'.format(repo_name)),
- os.path.join(public_dir, repo_name,
- '{}'.format(ext_version)))
+ os.path.join(public_dir, repo_name, '{}'.format(ext_version)))
# Delete .git resource from the directory
shutil.rmtree(
- os.path.join(public_dir, repo_name,
- '{}'.format(ext_version), '.git'))
+ os.path.join(public_dir, repo_name, '{}'.format(ext_version),
+ '.git'))
else:
# ext already up-to-date
# print('Extension: {} - {} (already up-to-date)'.format(ext_yaml['name'], ext_version))
@@ -121,7 +135,6 @@ def parse_extensions(base_dir, base_url, ghub_session):
with open(os.path.join(extension_dir, extfiles)) as extyaml:
ext_yaml = yaml.load(extyaml, Loader=yaml.FullLoader)
-
ext_has_update = False
repo_name = ext_yaml['github'].split('/')[-1]
repo_dir = os.path.join(public_dir, repo_name)
@@ -130,8 +143,17 @@ def parse_extensions(base_dir, base_url, ghub_session):
if ghub_session is not None:
# Github API Method
# Get extension Github meta-data
- ext_git_info = json.loads(ghub_session.get('https://api.github.com/repos/{github}/releases/latest'.format(**ext_yaml)).text)
- ext_version = ext_git_info['tag_name']
+ ext_git_info = json.loads(
+ ghub_session.get(
+ 'https://api.github.com/repos/{github}/releases/latest'.
+ format(**ext_yaml)).text)
+ try:
+ ext_version = ext_git_info['tag_name']
+ except KeyError:
+ print(
+ "Error: Unable to update %s (%s) does it have a release at Github?"
+ % (ext_yaml['name'], extfiles))
+ continue
# Check if extension directory alredy exists
if not os.path.exists(repo_dir):
os.makedirs(repo_dir)
@@ -140,13 +162,17 @@ def parse_extensions(base_dir, base_url, ghub_session):
ext_has_update = True
os.makedirs(os.path.join(repo_dir, ext_version))
# Grab the release and then unpack it
- with requests.get(ext_git_info['zipball_url'], stream=True) as zipball_stream:
- with open(os.path.join(repo_dir, ext_version) + ".zip", 'wb') as zipball_file:
+ with requests.get(ext_git_info['zipball_url'],
+ stream=True) as zipball_stream:
+ with open(
+ os.path.join(repo_dir, ext_version) + ".zip",
+ 'wb') as zipball_file:
shutil.copyfileobj(zipball_stream.raw, zipball_file)
# unpack the zipball
process_zipball(repo_dir, ext_version)
else:
- ext_version, ext_has_update = git_clone_method(ext_yaml, public_dir, ext_has_update)
+ ext_version, ext_has_update = git_clone_method(
+ ext_yaml, public_dir, ext_has_update)
# Build extension info (stateless)
# https://domain.com/sub-domain/my-extension/index.json
@@ -161,8 +187,8 @@ def parse_extensions(base_dir, base_url, ghub_session):
thumbnail_url=ext_yaml.get('thumbnail_url', None),
valid_until='2030-05-16T18:35:33.000Z',
url='/'.join([base_url, repo_name, ext_version, ext_yaml['main']]),
- download_url='https://github.com/{}/archive/{}.zip'.
- format(ext_yaml['github'], ext_version),
+ download_url='https://github.com/{}/archive/{}.zip'.format(
+ ext_yaml['github'], ext_version),
latest_url='/'.join([base_url, repo_name, 'index.json']),
flags=ext_yaml.get('flags', []),
dock_icon=ext_yaml.get('dock_icon', {}),
@@ -179,10 +205,12 @@ def parse_extensions(base_dir, base_url, ghub_session):
with open(os.path.join(public_dir, repo_name, 'index.json'),
'w') as ext_json:
json.dump(extension, ext_json, indent=4)
- print('Extension: {:30s} {:6s}\t(updated)'.format(ext_yaml['name'], ext_version))
+ print('Extension: {:30s} {:6s}\t(updated)'.format(
+ ext_yaml['name'], ext_version))
else:
# ext already up-to-date
- print('Extension: {:30s} {:6s}\t(already up-to-date)'.format(ext_yaml['name'], ext_version))
+ print('Extension: {:30s} {:6s}\t(already up-to-date)'.format(
+ ext_yaml['name'], ext_version))
extensions.append(extension)
os.chdir('..')
@@ -214,12 +242,15 @@ def main():
if (env_var['github']['username'] and env_var['github']['token']):
# Get a re-usable session object using user credentials
ghub_session = requests.Session()
- ghub_session.auth = (env_var['github']['username'], env_var['github']['token'])
+ ghub_session.auth = (env_var['github']['username'],
+ env_var['github']['token'])
try:
ghub_verify = ghub_session.get("https://api.github.com/")
if not ghub_verify.headers['status'] == "200 OK":
print("Error: %s " % ghub_verify.headers['status'])
- print("Bad Github credentials in the .env file, check and try again.")
+ print(
+ "Bad Github credentials in the .env file, check and try again."
+ )
sys.exit(1)
except Exception as e:
print("Unknown error occured: %s" % e)
@@ -229,10 +260,14 @@ def main():
ghub_session.close()
else:
# Environment file missing
- print("Environment not set (read env.sample)")
- input("⚠️ This method is set to be deprecated soon, Press any key to continue:\n")
+ print(
+ "Environment variables not set (read env.sample). Using Git Clone method instead"
+ )
+ input(
+ "⚠️ This method in't that efficient, Press any key to continue:\n")
parse_extensions(base_dir, base_url, None)
sys.exit(0)
+
if __name__ == '__main__':
main()
diff --git a/extensions/no-distraction-dynamic.yaml b/extensions/no-distraction-dynamic.yaml
new file mode 100644
index 0000000..9c7502a
--- /dev/null
+++ b/extensions/no-distraction-dynamic.yaml
@@ -0,0 +1,19 @@
+---
+id: com.iganesh.theme-no-distraction-dynamic
+github: iganeshk/sn-theme-no-distraction-dynamic
+main: dist/dist.css
+
+name: No Distraction (Dynamic)
+layerable: true
+content_type: SN|Theme
+area: themes
+version: 1.0.0
+marketing_url: https://standardnotes.org/extensions/dynamic
+description: A smart theme that minimizes the tags and notes panels when they are not in use.
+
+dock_icon:
+ type: svg
+ source: |-
+
+ # Shuffle Icon from Entypo by Daniel Bruce
+...